コンパイルは通ります。しかし日付によってうまく動作しないときがあるのですが、何が原因かがわかりません。教えていただきたいです。
C
1#include <stdio.h> 2 3/* is_leap_year関数:うるう年かどうか判定する */ 4int is_leap_year( int year ) 5{ 6return year % 4 == 0 && ( year % 100 != 0 || year % 400 == 0 ) ? 1 : 0; 7} 8 9/* main関数 */ 10int main( void ) 11{ 12int days_of_month[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 13int yy_1, mm_1, dd_1; 14int yy_2, mm_2, dd_2; 15int leap_years = 0; 16int days = 0; 17int i; 18 19/* 年月日を入力 */ 20scanf( "%d%d%d", &yy_1, &mm_1, &dd_1 ); 21scanf( "%d%d%d", &yy_2, &mm_2, &dd_2 ); 22 23/* うるう年の数 */ 24for ( i = yy_1 + 1; i < yy_2; i++ ) 25{ 26if ( is_leap_year( i ) ) leap_years++; 27} 28 29/* yy_1-yy_2間の日数(yy_1, yy_2の年は含まない) */ 30if ( yy_2 - yy_1 > 1 ) 31{ 32days += ( yy_2 - yy_1 - 1 ) * 365 + leap_years; 33} 34 35/* yy_1, yy_2の年の日数 */ 36/* 同じ年かどうかで振り分け */ 37if ( yy_1 == yy_2 ) 38{ 39/* 同じ月かどうかで振り分け */ 40if ( mm_1 == mm_2 ) 41days += dd_2 - dd_1; 42else 43{ 44 if ( is_leap_year( yy_1 ) ) if ( ( mm_1 == 1 || mm_1 == 2 ) && mm_2 > 2 ) days++; 45for ( i = mm_1 + 1; i <= mm_2 - 1; i++ ) days += days_of_month[i]; 46days += days_of_month[mm_1] - dd_1; 47days += dd_2; 48} 49} 50 51/* if ( yy_1 != yy_2 ) */ 52else 53{ 54if ( is_leap_year( yy_1 ) ) if ( mm_1 == 1 || mm_1 == 2 ) days++; 55if ( is_leap_year( yy_2 ) ) if ( mm_2 > 2 ) days++; 56for ( i = mm_1 + 1; i <= 12; i++ ) days += days_of_month[i]; 57for ( i = 1; i <= mm_2 - 1; i++ ) days += days_of_month[i]; 58days += days_of_month[mm_1] - dd_1; 59days += dd_2; 60} 61 62/* 出力 */ 63printf( "%d\n", days ); 64 65return 0; 66}
うまく動作しない日付とはどんな日付ですか。
生年月日
2020 4 6
参照日
2020 5 8
生年月日
2020 4 6
参照日
2020 7 8
生年月日
2020 5 6
参照日
2021 5 6
365
三回試したのですが、1,2回目は日数が表示されません
年月日をスペースで区切るならば
scanf( "%d%d%d"
も
scanf( "%d %d %d"
にしましょう。
また、入力データのチェックもした方がよいです。
2月35日とか入力できてしまいます。
ありがとうございます。
解決したならば質問Closeしてくださいね。
2020 4 6 2020 5 8 で 32 が表示されました。
2020 4 6 2020 7 8 で 93 が表示されました。
2020 5 6 2021 5 6 で 365 が表示されました。
何もおかしくありません。
1T2R3M4さん
> scanf( "%d %d %d"
> にしましょう。
その必要はありません。%dは先頭のホワイトスペースを読み飛ばした後に出てきたデータを処理します。空白はホワイトスペースをを読み飛ばします。結果、"%d"と" %d"は同じ動作になります。
回答1件
あなたの回答
tips
プレビュー