今回は、曜日を調べる関数例です。
年月日を入力すると、Zeller の公式を使って曜日を調べて表示します。
特定の日付が何曜日になるかを計算するための公式です。
週の何日目になるか(0 から 6 まで)を計算し、その値を使って曜日を求めます。
0 を日曜日として、1 なら月曜日、… 6 なら土曜日
公式の内容については特に意識せず、公式としてそのまま使います。
すると、下に示すプログラムの関数 subZellerのようになります。
この関数は、引数 y, m, d に指定した日付が週の何日目になるかを返します。
#include <stdio.h>
// Zeller の公式で週の何日目か調べる
int subZeller( int y, int m, int d )
{
if( m < 3 ) {
y--; m += 12;
}
return ( y + y/4 - y/100 + y/400 + ( 13*m + 8 )/5 + d )%7;
}
main()
{
int year, month, day;
char *dayname[] = {"日曜日","月曜日","火曜日","水曜日"
,"木曜日","金曜日","土曜日"};
while( 1 ) {
printf( "年月日は?(yyyy/mm/dd)> " );
if( scanf("%d/%d/%d", &year, &month, &day) != 3 ) break;
printf( "--> %s\n", dayname[subZeller(year,month,day)] );
}
}
実行結果例
年月日は?(yyyy/mm/dd)> 2000/1/1 --> 土曜日 年月日は?(yyyy/mm/dd)> 2013/12/24 --> 火曜日 年月日は?(yyyy/mm/dd)> q
char *dayname[] = {"日曜日","月曜日","火曜日","水曜日" ,"木曜日","金曜日","土曜日"};次のように書き換えたとき、プログラムは動きますか? これらの宣言は何がどう違うかも説明してみましょう。
char dayname[][8] = {"日曜日","月曜日","火曜日","水曜日" ,"木曜日","金曜日","土曜日"};(答えは、次回のC言語の Tips で ・・・)
[ 関連記事 ] 有効な日付か調べる関数