質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

3353閲覧

C言語 二つの日付を入力してその間の日数を計算するプログラムがうまく動作しません

Domyyyy

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/09/16 16:51

コンパイルは通ります。しかし日付によってうまく動作しないときがあるのですが、何が原因かがわかりません。教えていただきたいです。

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1T2R3M4

2020/09/16 17:14

うまく動作しない日付とはどんな日付ですか。
Domyyyy

2020/09/16 17:20

生年月日 2020 4 6 参照日 2020 5 8 生年月日 2020 4 6 参照日 2020 7 8 生年月日 2020 5 6 参照日 2021 5 6 365 三回試したのですが、1,2回目は日数が表示されません
1T2R3M4

2020/09/16 17:34 編集

年月日をスペースで区切るならば scanf( "%d%d%d" も scanf( "%d %d %d" にしましょう。 また、入力データのチェックもした方がよいです。 2月35日とか入力できてしまいます。
Domyyyy

2020/09/16 17:35

ありがとうございます。
1T2R3M4

2020/09/16 17:42

解決したならば質問Closeしてくださいね。
kazuma-s

2020/09/16 17:49

2020 4 6 2020 5 8 で 32 が表示されました。 2020 4 6 2020 7 8 で 93 が表示されました。 2020 5 6 2021 5 6 で 365 が表示されました。 何もおかしくありません。
thkana

2020/09/16 22:48

1T2R3M4さん > scanf( "%d %d %d" > にしましょう。 その必要はありません。%dは先頭のホワイトスペースを読み飛ばした後に出てきたデータを処理します。空白はホワイトスペースをを読み飛ばします。結果、"%d"と" %d"は同じ動作になります。
guest

回答1

0

ベストアンサー

コードには、インデント以外特に問題はないようですが、この問題はもっと簡単に書けます。

C

1#include <stdio.h> 2 3int days(int y, int m, int d) 4{ 5 static int t[] = { 306,337,0,31,61,92,122,153,184,214,245,275 }; 6 y -= m < 3; 7 return 365*y + y/4 - y/100 + y/400 + t[m-1] + d; 8} 9 10int main(void) 11{ 12 int y1, m1, d1, y2, m2, d2; 13 scanf("%d%d%d%d%d%d", &y1, &m1, &d1, &y2, &m2, &d2); 14 printf("%d\n", days(y2, m2, d2) - days(y1, m1, d1)); 15}

投稿2020/09/16 18:11

編集2020/09/16 18:13
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Domyyyy

2020/09/17 01:53

試してみたら正しい値が表示されました!こんなに簡潔に書けるんですね。 参考にします。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問