Thinkers'Studio
JavaとC言語の自習ツール
曜日を調べるプログラム

 今回は、曜日を調べる関数例です。
 年月日を入力すると、Zeller の公式を使って曜日を調べて表示します。

Zeller の公式

 特定の日付が何曜日になるかを計算するための公式です。
 週の何日目になるか(0 から 6 まで)を計算し、その値を使って曜日を求めます。
   0 を日曜日として、1 なら月曜日、…  6 なら土曜日
 公式の内容については特に意識せず、公式としてそのまま使います。 すると、下に示すプログラムの関数 subZellerのようになります。 この関数は、引数 y, m, d に指定した日付が週の何日目になるかを返します。

曜日を調べるプログラム例 】
 2月の日数はうるう年かどうかで変わるため、1月と 2月は前年の 13月と 14月として計算します。 その他の係数は曜日を求めるために定められたものです。 なお、ここでは 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 で ・・・)
 (前回 クイズはありませんでした)

[ 関連記事 ] 有効な日付か調べる関数