先回は、西暦年・月・日を読み込んで、その曜日を表示するプログラムをご紹介した。
ところで、C言語が提供する日付や時間に関するライブラリは、1970年より前の日付を正しく取り扱える保証がない。
そこで、今回は、ツェラーの公式と呼ばれる方法に基づいて曜日を求めるプログラムをご紹介しよう。
なお、ツェラーの公式は、グレゴリオ歴を前提としている。したがって、ここで示す関数dayofweekが曜日を求められるのは、1582年10月15日以降の日付となる。
なお、本プログラムは、
Windows 11 Home(23H2)上で、Visual Studio Code(1.95.3)を使用して作成し、gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0で コンパイルしている。
//曜日を求める(その2)
#include <stdio.h>
//year年month月day日の曜日を求める
int dayofweek(int year,int month,int day)
{
if (month == 1 || month == 2) {
year--;
month += 12;
}
return (year + year/4 - year/100 + year/400 + (13*month+8)/5 + day) % 7;
}
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);
printf("それは、%s曜日です。\n",ws[w]);
return 0;
}
実行結果
曜日を求めます。
年:2024
月:12
日:5
それは、木曜日です。
この曜日なら、手元のカレンダーなどですぐに確認できる。
それでは、「フランス革命」が始まった1789年7月14日の曜日を調べてみよう。
曜日を求めます。
年:1789
月:7
日:14
それは、火曜日です。
ご自身の誕生日などを調べてみてはいかがだろう。
(参考)新・明解C言語 中級編 柴田 望洋(著)SBクリエイティブ
コメント