// 例題3 calendar.c: カレンダー表示 #include #include // 月の日数保持(0:平年, 1:うるう年) int days_in_months[2][12] = { { 31,28,31,30,31,30,31,31,30,31,30,31 }, { 31,29,31,30,31,30,31,31,30,31,30,31 } } ; // 曜日の省略名 char *name[] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT", 0 }; // 曜日の完全名 char *longname[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", 0 }; // うるう年判定 // 引数 y:年(2001<=y<=2099) // 戻り値 うるう年なら1, 平年なら0 int leap(int y) { return (y%4==0)?1:0; } // y年1月1日の曜日 // 引数 y:年(2001<=y<=2099) // 戻り値 曜日(0=日曜 ... 6=土曜) int jan1(int y) { return ((y-2000) + (y-2001)/4)%7; } // 指定日の曜日判定 // 引数 y,m,d // 戻り値 曜日(0=日曜 ... 6=土曜) int days_of_week(int y, int m, int d) { int v = jan1(y); for (int i=0;i 0) printf("\n"); v = (v+d-1) % 7; printf("%02d/%02d/%02d is %s\n", y%100, m, d, longname[v] ); } // 入力範囲エラー表示用マクロ #define errout(m,v) {printf("%d:%s error\n",v,m); err++;} // メインプログラム // 入力範囲エラーがあれば戻り値が0以外 int main() { int y, m, d; int err = 0; // エラーの数 scanf("%d %d %d", &y, &m, &d); if (y < 2001 || y > 2099) errout("year", y); if (m < 1 || m > 12) errout("month", m); if (d < 1 || d > 31) errout("day", d); if (err == 0) output(y,m,d); return err; }