曜日の特定日

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int dayofweek(int year, int month, int day){
   struct tm t;
   t.tm_year = year -1900; //年 1900~
   t.tm_mon = month - 1;   //月 0-11
   t.tm_mday = day;        //日 1-31
   t.tm_hour = 0;          //時 0-23
   t.tm_min = 0;           //分 0-59
   t.tm_sec = 0;           //秒 0-61
   t.tm_isdst = -1;        //夏時間 無効なら0
   
   if(mktime(&t) == -1) return(-1);  //変換失敗
   return (t.tm_wday);     //曜日返却添字返却
}

int main(int argc, char *argv[]){
   
   //・・・課題の仕様を満たすプログラムの本体とその必要な宣言
   int y, m, d, w;
   char *ws[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
   
   y= atoi(argv[1]);
   m= atoi(argv[2]);
   d= atoi(argv[3]);
   
   w= dayofweek(y, m, d);
   
   if(w != -1) printf("%s\n", ws[w]);
   
   return 0;
}

⇒変数y, m, d, w;
指定日の取得
y= atoi(argv[1]);
m= atoi(argv[2]);
d= atoi(argv[3]);

曜日を求める
wday= dayofweek(y, m, d);

int dayofwek(int year, int month, int day){
struct tm t;
t.tm_year = year -1900; 年 1900~
t.tm_mon = month - 1; 月 0-11
t.tm_mday = day; 日 1-31
t.tm_hour = 0; 時 0-23
t.tm_min = 0; 分 0-59
t.tm_sec = 0; 秒 0-61
t.tm_isdst = -1; 夏時間 無効なら0

if(mktime(&t) == -1) return(-1); 変換失敗
return (t.tm_wday); 曜日返却
}

⇒返却値が-1でなければ曜日の添字が返ってくるので表示指定して出力


localtime関数 (time_t型のエポック秒) ⇒tm構造体を返す
mktime関数 (tm構造体) ⇒tm_t型のエポック秒を返す(tm構造体調整)


tm構造体をmktime関数に渡した時点でメンバの値が調整されるので
そのままt.tm_wdayで参照しても曜日の添え字が返ってくる


構造体 tm はtime.h の中で宣言され、以下のような内容

struct tm {
int tm_sec; 秒 [0-61] 最大2秒までのうるう秒を考慮
int tm_min; 分 [0-59]
int tm_hour; 時 [0-23]
int tm_mday; 日 [1-31]
int tm_mon; 月 [0-11] 0から始まることに注意
int tm_year; 年 [1900からの経過年数]
int tm_wday; 曜日 [0:日 1:月 ... 6:土]
int tm_yday; 年内の通し日数 [0-365] 0から始まることに注意
int tm_isdst; 夏時間フラグ 
[夏時間を採用しているときに正、採用していないときに 0、この情報が得られないときに負]

いいなと思ったら応援しよう!