/* 西暦y年m月d日の《前の日》あるいは《次の日》の日付を求めてセットする関数 void yesterday(int *y, int *m, int *d) {} void tomorrow(int *y, int *m, int *d) {} を作成せよ(閏年などもきちんと判別すること)。 */ /* メモ グレゴリオ暦では、次の規則に従って、400年に97回の閏年が設けられる。 西暦年が、400で割り切れる年のうち、10000で割り切れる年は平年とする。 西暦年が、400で割り切れる年のうち、4000で割り切れる年は平年とする。 西暦年が、100で割り切れる年のうち、400で割り切れる年は閏年とする。 西暦年が、4で割り切れる年は閏年とする。 西暦年が、4で割り切れる年のうち、100で割り切れる年は平年とする。 if( (((y % 400) == 0) && (((y % 10000) != 0) || ((y % 4000) != 0))) || (((y % 100) == 0) && ((y % 400) == 0)) || (((y % 4) == 0) && ((y % 100) != 0)) ) */ #include int err = 0; /*エラーフラグ*/ /*閏年かどうか判定する*/ int IsLeepYear(int y) { return ( (((y % 400) == 0) && (((y % 10000) != 0) || ((y % 4000) != 0))) || (((y % 100) == 0) && ((y % 400) == 0)) || (((y % 4) == 0) && ((y % 100) != 0)) ) ? 1 : 0; } /*西暦y年m月d日の前の日の日付を求めてセットする*/ void yesterday(int *y, int *m, int *d) { /*最終日の配列*/ int ld[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if(IsLeepYear(*y)) ld[1]++; /*閏年なら2月の最終日を+1する*/ if(*d == 1) { *d = ld[(*m) - 2]; /*1日なら日に最終日を代入*/ if (--(*m) <= 0) { /*月を-1して0以下か比較*/ *m = 12; /*0以下なら月に12を代入*/ (*y)--; /*年を-1する*/ } } else /*その他は日を-1するだけ*/ (*d)--; } /*西暦y年m月d日の次の日の日付を求めてセットする*/ void tomorrow(int *y, int *m, int *d) { /*最終日の配列*/ int ld[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if(IsLeepYear(*y)) ld[1]++; /*閏年なら2月の最終日を+1する*/ if(*d == ld[(*m) - 1]) { *d = 1; /*日が最終日なら日に1を代入する*/ if (++(*m) > 12) { /*月を+1して月が12より大きいか比較*/ *m = 1; /*大きければ月に1を代入*/ (*y)++; /*年を+1する*/ } } else (*d)++; /*その他は日を+1するだけ*/ } /*年を入力する*/ void syear(int *y) { err = 0; printf("西暦を入力してください:"); scanf("%d", y); while(getchar() != '\n'); /*バッファを空にする*/ if(*y < 1900 || *y > 3000) { err = 1; puts("無効な年を入力しないでください!"); } } /*月を入力する*/ void smanth(int *m) { err = 0; printf("月を入力してください:"); scanf("%d", m); while(getchar() != '\n'); /*バッファを空にする*/ if(*m < 1 || *m > 12) { err = 1; puts("無効な月を入力しないでください!"); } } /*日を入力する*/ void sday(const int *y, const int *m, int *d) { /*最終日の配列*/ int ld[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; err = 0; if(IsLeepYear(*y)) ld[1]++; /*閏年なら2月の最終日を+1する*/ printf("日を入力してください:"); scanf("%d", d); while(getchar() != '\n'); /*バッファを空にする*/ if(*d < 1 || *d > ld[*m - 1]) { err = 1; puts("無効な日を入力しないでください!"); } } int main(void) { int y, m, d; /*西暦、月、日の変数*/ int yy, my, dy; /*前日の変数*/ int yt, mt, dt; /*後日の変数*/ do { syear(&y); } while(err); do { smanth(&m); } while(err); do { sday(&y, &m, &d); } while(err); yy = yt = y; my = mt = m; dy = dt = d; printf("%04d/%02d/%02dの前の日は", y, m, d); yesterday(&yy, &my, &dy); printf("%04d/%02d/%02dです。\n", yy, my, dy); printf("%04d/%02d/%02dの次の日は", y, m, d); tomorrow(&yt, &mt, &dt); printf("%04d/%02d/%02dです。\n", yt, mt, dt); return 0; }