曜日を求める
code:dayweek.c
int main(void)
{
int y, m, d, w;
printf("年? ");
scanf("%d", &y);
printf("月? ");
scanf("%d", &m);
printf("日? ");
scanf("%d", &d);
if (m < 3) {
y--;
m += 12;
}
w = (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + d) % 7;
if (w == 0) {
printf("日曜日\n");
} else if (w == 1) {
printf("月曜日\n");
} else if (w == 2) {
printf("火曜日\n");
} else if (w == 3) {
printf("水曜日\n");
} else if (w == 4) {
printf("木曜日\n");
} else if (w == 5) {
printf("金曜日\n");
} else {
printf("土曜日\n");
}
return 0;
}
if (m < 3) { ... } は,もし m の値が3未満なら中括弧の中を実行する。これは,1月・2月を前年の13月・14月として処理するためである(2月だけ日数が変則的なのでこのほうが計算が楽)。
y-- は y = y - 1 または y -= 1 と同じ。つまり y を一つ減らす。
m += 12 は m を12だけ増やす。
w = ... という長い式は「ツェラー(Zeller)の公式」と呼ばれる式。最後の % 7 は「7で割った余り」という意味。なお,整数どうしの割り算は切り捨てて整数になることに注意。 if (w == 0) は「もし w が 0 ならば」の意味。このように,等しいかどうか判断するには,== を使う。= なら代入の意味になってしまう。
else は「そうでなくて」の意味。
なお,上のプログラムはもうちょっと縮めて次のように書くこともできる(初心者は真似をしないほうがよい):
code:dayweek2.c
int main(void)
{
int y, m, d, w;
printf("年? "); scanf("%d", &y);
printf("月? "); scanf("%d", &m);
printf("日? "); scanf("%d", &d);
if (m < 3) { y--; m += 12; }
w = (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + d) % 7;
if (w == 0) printf("日曜日\n");
else if (w == 1) printf("月曜日\n");
else if (w == 2) printf("火曜日\n");
else if (w == 3) printf("水曜日\n");
else if (w == 4) printf("木曜日\n");
else if (w == 5) printf("金曜日\n");
else printf("土曜日\n");
return 0;
}
さらに,配列を使えば,次のようにできる:
code:dayweek3.c
int main(void)
{
int y, m, d, w;
char *a7 = { "日", "月", "火", "水", "木", "金", "土" }; printf("年? "); scanf("%d", &y);
printf("月? "); scanf("%d", &m);
printf("日? "); scanf("%d", &d);
if (m < 3) { y--; m += 12; }
w = (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + d) % 7;
return 0;
}