プログラミング+α学習ブログ

勉強したことの備忘録です。

読み込んだ日付の前の日付および次の日付を求めるプログラム

#include <stdio.h>

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 },
};

/*--- yearが閏年であれば1をそうでなければ0を返す ---*/
int isleap(int year)
{
    return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}

/*--- 受け取った日付の前の日を求める ---*/
void yesterday(int *y, int *m, int *d)
{
    if (*d != 1)    // 1日でなければ*dをデクリメント
        (*d)--;
    else {
        if (*m != 1)    // 1月以外の1日
            (*m)--;
        else {
            (*y)--;
            *m = 12;
        }
        *d = day[isleap(*y)][*m];
    }
}

/*--- 受け取った日付の次の日を求める ---*/
void tomorrow(int *y, int *m, int *d)
{
    if (*d != day[isleap(*y)][*m]) // 最終日でなければ*dをインクリメント
        (*d)++;
    else {
        if (*m != 12)   // 12月以外の最終日
            (*m)++;
        else {      // 12月31日
            (*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);
}

実行結果

年:2000
月:2
日:20
前の日:2000年2月19日
次の日:2000年2月21日