/****************************************************************************** uncal.c 【解 説】 何月何日が何曜日になるのは何年か? を調べるプログラム。あとは ソースファイルを見てください。 【注 意】 グレゴリウス暦で計算しています。実在しない月日を入力してもエラーに はなりません。ネーミングは適当です。:-) 【 付 】 年月日から曜日を求める Zeller の公式は、奥村晴彦氏の「C言語による 最新アルゴリズム事典」(技術評論社)から引用しました。 ******************************************************************************/ #include #include int zeller(int year, int month, int day); int main(int argc, char* argv[]) { int from = 1950; /* この年から */ int to = 2050; /* この年までの範囲で探索を行なう */ int year, month, day, dweek; if (argc != 4 && argc != 6) { fprintf(stderr, "「uncal 2 17 4 [1975 2025]」とすると"); fprintf(stderr, " 1975 年から 2025 年までで"); fprintf(stderr, " 2 月 17 日が木曜日である年を出力します. "); fprintf(stderr, "[ ] 内は省略可で, "); fprintf(stderr, "デフォルトは %d から %d までです. \n", from, to); fprintf(stderr, "(0 … 日、1 … 月、2 … 火、3 … 水、"); fprintf(stderr, "4 … 木、5 … 金、6 … 土)\n"); return 1; } month = atoi(argv[1]); day = atoi(argv[2]); dweek = atoi(argv[3]); if (argc == 6) { from = atoi(argv[4]); to = atoi(argv[5]); } for (year = from; year <= to; year++) { if (month == 2 && day == 29) { /* 2 月 29 日の処理 */ if(year % 4 || (!(year % 100) && (year % 400))) { continue; } } if (dweek == zeller(year, month, day)) { printf("%d ", year); } } printf("\n"); return 0; } /****************************************************************************** 【関数名】 zeller() 【機 能】 引数として与えられた日が何曜日かを返す。0 が日曜日、6 が土曜日。 【引 数】 年、月、日。 【 付 】 奥村晴彦氏の「C言語による最新アルゴリズム事典」(技術評論社)から の引用。 ******************************************************************************/ int zeller(int year, int month, int day) { if (month < 3) { year--; month += 12; } return (year + year / 4 - year / 100 + year / 400 \ + (13 * month + 8) / 5 + day) % 7; } /* zeller() */