今回は、西暦年・月・日を読み込んで、その曜日を表示するプログラムをご紹介しよう。
なお、本プログラムは、
Windows 11 Home(23H2)上で、Visual Studio Code(1.95.3)を使用して作成し、gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0で コンパイルしている。
//曜日を求める(その1)
#include <time.h>
#include <stdio.h>
//year年month月day日の曜日を求める
int dayofweek(int year,int month,int day)
{
struct tm t;
t.tm_year = year - 1900; //年を調整
t.tm_mon = month -1; //月を調整
t.tm_mday = day; //日
t.tm_hour = 0; //時
t.tm_min = 0; //分
t.tm_sec = 0; //秒
t.tm_isdst = -1; //夏時間
if (mktime(&t) == (time_t)-1) //変更に失敗したら
return -1; //-1を返却
return t.tm_wday; //mktime関数によって、曜日を返却
}
int main(void)
{
int y,m,d,w;
char *ws[] = {"日","月","火","水","木","金","土"};
printf("曜日を求めます\n");
printf("年:"); scanf("%d",&y);
printf("月:"); scanf("%d",&m);
printf("日:"); scanf("%d",&d);
w = dayofweek(y,m,d);
if( w != -1)
printf("それは%s曜日です\n",ws[w]);
else
printf("求められません\n");
return 0;
}
実行結果
曜日を求めます
年:2024
月:12
日:4
それは水曜日です
曜日を求めるのに利用しているのは、mktime関数である。
この関数は、要素別の時刻tm構造体型の時刻(地方時)を、暦時刻time_t型の値に変換する。
本プログラムで定義している関数dayofweekは、受け取った年・月・日の3値を基に要素別の時刻を作り、それからmktime関数を呼び出している。
(参考)新・明解C言語 中級編 柴田 望洋(著)SBクリエイティブ
コメント