C言語ケーススタディ 1970年以前でも使える日付の処理(曜日の取得)




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



C言語標準の時間関数は1970年1月1日からの経過時間で処理するためそれ以前の日付を処理することができません。 たとえば生年月日を処理したいときなどは、この制限で時間関数を使用することができません。 ちょうど手元にあった古い本に次の式が載っていたので、これを使用して曜日を調べるプログラムを作成します。 式の内容(そのまま転載します)を以下に示します。この公式は1582年以降の日付に対して使用できます。
1、2月に対して
        係数 = 365(YYYY) + DD + 31(MM - 1) + INT[(YYYY - 1)/4]
                        - INT[(3/4[INT[(YYYY - 1)/100) + 1)]

3〜12月に対して
        係数 = 365(YYYY) + DD + 31(MM - 1) - INT(.4MM + 2.3)
                        + INT(YYYY/4) - INT(3/4[INT(YYYY/100) + 1])

INTは式の整数部分のみを用いることを示します。

曜日 = 係数 + [INT(-係数/7)×7]
        曜日は土曜から金曜に対して0から6までの1桁の数字で表されます。
上記の式を使用して入力した年月日の曜日を調べるプログラムを作成します。 式の意味はよく理解できませんが、式をそのままプログラムに書き換えCalcIndex関数を作成します。 求められた係数から曜日(0〜6の数値)を算出しそれに相当する曜日を表示します。
int     CalcIndex(int yyyy, int mm, int dd);


main()
{
        static char
                *youbi[] = {"土", "日", "月", "火", "水", "木", "金"};

        int     yyyy, mm, dd, idx;

        printf("年 : ");
        scanf("%d", &yyyy);
        printf("月 : ");
        scanf("%d", &mm);
        printf("日 : ");
        scanf("%d", &dd);
        idx = CalcIndex(yyyy, mm, dd);
        printf(">>>%s曜日\n", youbi[idx + (-idx/7) * 7]);
}


CalcIndex(int yyyy, int mm, int dd)
{
        int     idx;

        if(mm == 1 || mm == 2){
                idx = 365 * yyyy + dd + 31 * (mm - 1) + (yyyy - 1) / 4 -
                        ((yyyy - 1) / 1000 + 1) * 3 / 4;
                return(idx);
        }
        idx = 365 * yyyy + dd + 31 * (mm - 1) - (int)(0.4 * mm + 2.3) +
                yyyy / 4 - (yyyy / 100 + 1) * 3 / 4;
        return(idx);
}
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて...
同じ本に載っていた例です。
例) 1941/12/7 日曜日
作成したプログラムでも同じ結果が得られました。