『新・明解C言語 入門編 第2版』演習問題解答例 10ー2

演習10ー2

問: 西暦*y年*m月*d日の日付を、”前の日”あるいは”次の日”の日付に更新する関数を作成せよ。閏年を考慮して計算すること。

 void invrement_date(int *y, int *m, int *d)
 void decrement_date(int *y, int *m, int *d)

//Ex1002.c

#include <stdio.h>

void invrement_date(int *y, int *m, int *d)
{
    if (*d >= 28) {
        if (*m == 2 || *m == 4 || *m == 6 || *m == 9 || *m == 11) {
            if (*m == 2) {
                if (*y % 4 == 0) {
                    if (*d < 29) {
                        *d = *d + 1;
                    } else if (*d > 28) {
                        *m = *m + 1;
                        *d = 1;
                    }
                } else if (*d < 28) {
                    *d = *d + 1;
                } else if (*d > 27) {
                    *m = *m + 1;
                    *d = 1;
                }
            } else if (*m == 4 || *m == 6 || *m == 9 || *m == 11) {
                if (*d < 30) {
                    *d = *d + 1;
                } else if (*d > 29) {
                    *m = *m + 1;
                    *d = 1;
                }
            } else {
                if (*d < 31) {
                    *d = *d + 1;
                } else if (*d > 30) {
                    *m = *m + 1;
                    *d = 1;
                }
            }
        } else {
            *d = *d + 1;
        }
        
        if (*m == 12 && *d == 32) {
            *d = 1;
            *m = 1;
            *y = *y + 1;
        }
    }
}

void decrement_date(int *y, int *m, int *d)
{
    *d = *d - 1;
    
    if (*d < 1) {
        *m = *m - 1;
        if (*m == 2 || *m == 4 || *m == 6 || *m == 9 || *m == 11) {
            if (*m == 2) {
                if (*y % 4 == 0) {
                    *d = 29;
                } else {
                    *d = 28;
                }
            } else if (*m == 4 || *m == 6 || *m == 9 || *m == 11) {
                *d = 30;
            }
        } else {
            *d = 31;
        }
    }
    if (*m == 0) {
        *m = 12;
        *y = *y - 1;
    }
}


int main(void)
{
    int i;
    int nen,tuki,hi;
    
    printf("西暦:"); scanf("%d",&nen);
    printf("月:"); scanf("%d",&tuki);
    printf("日:"); scanf("%d",&hi);
    printf("%d年%d月%d日\n",nen,tuki,hi);
    
    printf("番号を入力してください。(1_1日増やす、2_1日減らす)\n");
    scanf("%d",&i);
    
    if(i == 1){
        invrement_date(&nen,&tuki,&hi);
        printf("%d年%d月%d日\n",nen,tuki,hi);
    }
    
    if(i == 2){
        decrement_date(&nen,&tuki,&hi);
        printf("%d年%d月%d日\n",nen,tuki,hi);
    }
    
    return 0;
}

コメント

 つくっていて楽しかった問題。ぜひ自力で。
 「西向く侍」を知らなかったらぐぐったほうがいいです。

 


書籍情報


コメント

タイトルとURLをコピーしました