ポインタ
Posted: 2009年2月24日(火) 21:21
以下はポインタを使って西暦y年m月d日の≪前の日≫あるいは≪次の日≫の日付を求めてプログラムです。
#include <stdio.h>
int day[2][13] = {
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
};
/*-- yearが閏年であれば1そうでなければ0を返す --*/
int isleap(int year)
{
return (year % 4 == 0 && year % 100 != 0 || year % 400);
}
/*-- 受け取った日付の前の日を求める --*/
void yesterday(int *y, int *m, int *d)
{
if (*d != 1) {
(*d)--;
}
else {
if (*m != 1) {
(*m)--;
}
else {
(*y)--;
*m = 12;
}
*d = day[isleap(*y)][*m];
}
}
/*-- 受け取った日付の次の日を求める --*/
void tommorow(int *y, int *m, int *d)
{
if (*d != day[isleap(*y)][*m]) {
(*d)++;
}
else {
if (*m != 12) {
(*m)++;
}
else {
(*y)++;
*m = 1;
}
*d = 1;
}
}
int main(void)
{
int y, m, d;
int ay, am, ad;
int by, bm, bd;
printf("年:"); scanf("%d", &y);
printf("月:"); scanf("%d", &m);
printf("日:"); scanf("%d", &d);
ay = by = y;
am = bm = m;
ad = bd = d;
yesterday(&ay, &am, &ad);
tomorrow(&by, &bm, &bd);
printf("前の日:%d年%d月%d日\n", ay, am, ad);
printf("次の日:%d年%d月%d日\n", by, bm, bd);
return 0;
}
<質問>
・*d = day[isleap(*y)][*m];
たとえば、日付が2000年3月31日だとして、isleap関数に引数として2000が渡されますよね?
そして、閏年かどうかの判断がされて、この場合閏年なので1が返されます。
*d = day[1][3]?となりますよね?
そして、day関数に[1][3]が渡されますよね?
int day[2][13] = {
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
{ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
};
この場合、[1][3]といったら、29なのに31になってません?
あと、day関数でreturnで数値を返していないのはどうしてでしょうか?