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

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

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

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Q&A

解決済

3回答

879閲覧

C言語のfor文による足し算

honmaaaa

総合スコア1

C

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

0グッド

0クリップ

投稿2022/06/13 00:19

任意の期間の起床時間と就寝時刻から睡眠時間を分単位で表示するプログラムを作っているのですが、合計時間がどうも合いません。以下のプログラムをどのように改善すればよいか教えていただきたいです。

C

1#include <stdio.h> 2int main() 3{ 4 int n,d; //日、条件 5 int h,m; //睡眠時刻 h:m 6 int H,M; //起床時刻 H:M 7 int sum,ave; //合計時間、平均時間 8 9 printf("何日分の睡眠時間を記録しますか?\n"); 10 scanf("%d",&n); 11 printf("%d日分の睡眠記録を集計します。\n",n); 12 printf("睡眠時間を次の例のように入力してください。\n"); 13 printf("22:24 5:09\n\n"); 14 sum=0; 15 for(d=1; d<=n; d++) 16 { 17 scanf("%d:%d %d:%d", &h, &m,&H, &M); 18 if(m>M) 19 { 20 sum = sum+(H+23-h)*60+(M+60-m); 21 } 22 else if(m<=M) 23 { 24 sum = sum+(H+24-h)*60+(m-M); 25 } 26 } 27 ave = sum/n; 28 printf("睡眠時間の合計は%d分、1日の平均睡眠時間は%d分です。\n",sum,ave); 29 30return 0; 31} 32

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

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

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

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

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

jimbe

2022/06/13 03:11

どのような時間を入力した時にどのような値になってしまうのでしょうか。
honmaaaa

2022/06/13 04:53

n=3以上の場合、n回分の足し算がされておらず少ない値になってしまいました。ベストアンサーにしていただいた方のプログラムを参考にしたところ解決しました。
honmaaaa

2022/06/13 04:54

scanf("%d:%d %d:%d", &h, &m,&H, &M); if(m>M) { sum = sum+(H+23-h)*60+(M+60-m); } else if(m<=M) { sum = sum+(H+24-h)*60+(m-M); } このプログラムではn回分の足し算はおこなわれないのでしょうか。
guest

回答3

0

if(m>M) のように分を比較する必要はまったくないと思いますよ。
やりたいことは、「就寝時刻 > 起床時刻 だったら 起床時刻+24時間 - 就寝時刻 を合計に足す、そうでないなら 起床時刻 - 就寝時刻 を合計に足す」でしょう。まずは int start_time = h * 60 + m; int end_time = H * 60 + M; として、if (start_time > end_time) のチェックをしてから計算してはどうでしょうか。

投稿2022/06/13 00:31

int32_t

総合スコア20659

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

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

0

時と分だけなら、まずは全て通算分に換算してから計算しよう
引いて結果がマイナスなら一日分足せばよろしい

投稿2022/06/13 00:29

y_waiwai

総合スコア87719

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

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

0

ベストアンサー

以下のようにしてください。

C

1#include <stdio.h> 2int main() 3{ 4 int n,d; //日、条件 5 int h,m; //睡眠時刻 h:m 6 int H,M; //起床時刻 H:M 7 int sum,ave; //合計時間、平均時間 8 9 printf("何日分の睡眠時間を記録しますか?\n"); 10 scanf("%d",&n); 11 printf("%d日分の睡眠記録を集計します。\n",n); 12 printf("睡眠時間を次の例のように入力してください。\n"); 13 printf("22:24 5:09\n\n"); 14 sum=0; 15 for(d=1; d<=n; d++) 16 { 17 scanf("%d:%d %d:%d", &h, &m,&H, &M); 18 if (H<h){ 19 H = H + 24; 20 } 21 sum = sum+(H-h)*60+(M-m); 22 } 23 ave = sum/n; 24 printf("睡眠時間の合計は%d分、1日の平均睡眠時間は%d分です。\n",sum,ave); 25 26return 0; 27} 28

上記は、HH=hh かつ M<m の時、不具合が発生します。(負の睡眠時間になります)
修正版は以下になります。

C

1#include <stdio.h> 2int main() 3{ 4 int n,d; //日、条件 5 int h,m; //睡眠時刻 h:m 6 int H,M; //起床時刻 H:M 7 int stime; //睡眠時価 8 int sum,ave; //合計時間、平均時間 9 10 printf("何日分の睡眠時間を記録しますか?\n"); 11 scanf("%d",&n); 12 printf("%d日分の睡眠記録を集計します。\n",n); 13 printf("睡眠時間を次の例のように入力してください。\n"); 14 printf("22:24 5:09\n\n"); 15 sum=0; 16 for(d=1; d<=n; d++) 17 { 18 scanf("%d:%d %d:%d", &h, &m,&H, &M); 19 stime = (H-h)*60+(M-m); 20 if (stime<0){ 21 stime = stime + 24 * 60; 22 } 23 sum = sum+stime; 24 } 25 ave = sum/n; 26 printf("睡眠時間の合計は%d分、1日の平均睡眠時間は%d分です。\n",sum,ave); 27 28return 0; 29} 30

投稿2022/06/13 02:58

編集2022/06/13 08:23
tatsu99

総合スコア5424

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

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

episteme

2022/06/13 07:57

H == h かつ M < m のとき を判定しなくていいのかしら? じゃないと sum に 負数を加えることになる。
tatsu99

2022/06/13 08:19

ああ、そうですね。見事にバグってますね。ご指摘ありがとうございました。 修正しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問