###前提
書籍で勉強している学生です。
書籍の解答がないため問題のヒントや解説をしていただけると嬉しいです。
###問題
西暦 *y年 *m月 *d日の日付を、”前の日”あるいは”次の日”の日付に更新する関数を作成せよ。
lang
1void decrement_date(int *y, int *m, int *d){/*...*/} 2void increment_date(int *y, int *m, int *d){/*...*/}
閏年を考慮して計算を行うこと。
###コード
lang
1void decrement_date(int *y, int *m, int *d) 2{ 3 *d -= 1; 4 if(*d == 0){ 5 switch(*m){ 6 //前月が31日 7 case 2: 8 case 4: 9 case 6: 10 case 8: 11 case 10: 12 case 11: 13 *m -= 1; 14 *d = 31; 15 break; 16 17 //前月が30日 18 case 5: 19 case 7: 20 case 9: 21 case 12: 22 *m -= 1; 23 *d = 30; 24 break; 25 26 //前月が閏年によって変化する 27 case 3: 28 *m -= 1; 29 if(*y % 4 == 0){ 30 *d = 29; 31 }else{ 32 *d = 28; 33 } 34 break; 35 36 //年が変わる 37 case 1: 38 *y -= 1; 39 *m = 12; 40 *d = 31; 41 break; 42 } 43 } 44}
increment_date()は省略しました。
###疑問点
閏年の計算方法がよく分からずに行っているので、厳密な計算方法を知りたいです。
少し調べてみましたが、しっかりとした理解が出来なかったため、解説をして頂けると有り難いです。
蛇足になるのですが、変数の数字を1減らしたい時に
*m --;
では、上手く動作せず
*m -= 1;
としたら上手く動作したのがなぜだか分からないため、それもできれば教えて頂きたいです。
###補足情報
書籍: 新明解C言語 入門編
演習 10-2
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/11 16:03