日付x のn 日後の日付を返す以下の関数を作成せよ。 YMD after (YMD x , int n ); 日付xのn日前の日付を返す以下の関数を作成せよ。 YMD before (YMD x , int n ); |
/* 演習2-7 n日後/n日前の日付を求める */ #include <stdio.h> typedef struct { int y; /* 西暦年 */ int m; /* 月(1~12) */ int d; /* 日(1~31) */ } YMD; YMD before(YMD x, int n); YMD after( YMD x, int n); /*--- 各月の日数 ---*/ static int mdays[2][13] = { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, /* 平年 */ {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, /* 閏年 */ }; /*--- 西暦year年は閏年か ---*/ int isleap(int year) { return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0); } /*--- 日付xのn日後の日付を返す ---*/ YMD after(YMD x, int n) { if (n < 0) return (before(x, -n)); x.d += n; while (x.d > mdays[isleap(x.y)][x.m - 1]) { x.d -= mdays[isleap(x.y)][x.m - 1]; if (++x.m > 12) { x.y++; x.m = 1; } } return (x); } /*--- 日付xのn日前の日付を返す ---*/ YMD before(YMD x, int n) { if (n < 0) return (after(x, -n)); x.d -= n; while (x.d < 1) { if (--x.m < 1) { x.y--; x.m = 12; } x.d += mdays[isleap(x.y)][x.m - 1]; } return (x); } int main(void) { int n; YMD x, t; printf("日付を入力してください。\n"); printf("年:"); scanf("%d", &x.y); printf("月:"); scanf("%d", &x.m); printf("日:"); scanf("%d", &x.d); printf("何日前/後の日付を求めますか:"); scanf("%d", &n); t = after(x, n); printf("%d日後の日付は%d年%d月%d日です。\n", n, t.y, t.m, t.d); t = before(x, n); printf("%d日前の日付は%d年%d月%d日です。\n", n, t.y, t.m, t.d); return (0); }