プロが教えるわが家の防犯対策術!

下記のsample.cを修正して以下の内容のプログラムにしたいと思っています。

貸出のあったボートに対してそれぞれのボートの貸出時間の総計を算出し、貸出時間の長
い順に並べるとともに,全ボートの貸出時間の総計を算出し,それらの結果を標準出力に
出力する

ボート屋はボートを10隻所有しているとし,各ボート名は大文字アルファベット1文字で
「A」,「B」,「C」,「D」,「E」,「F」,「G」,「H」,「I」,「J」であるとする.
ボートの数以外の仕様(基本仕様,機能仕様,詳細仕様)は以下の通りとする.
➀基本仕様
 [ボート名,貸出/返却,時刻]の列→貸出時間の総計
 列:貸出→返却の組が並ぶ(各ボート名に対して)
 貸出時間:返却時刻–貸出時刻
➁機能仕様
 ボート名:10種類(アルファベット1文字)
 時刻:同一日内の時刻(原則09:00〜18:00)
 列の長さ:最大10(台)×9(時間)×6(10分単位)×2(貸出/返却)
➂詳細仕様
入力形式行(貸出・返却の情報)の列
 各行に次のものが並ぶ(区切り:空白1文字)
 ・ボート名:英大文字1文字(A, B, C, D, E, F, G, H, I, J)
 ・貸出/返却:英大文字1文字(「O」:貸出,「I」:返却)
 ・時刻:数字2文字:数字2文字(例:12:34)
 出力形式 時間:分(例:3:45)
【入力】
コマンドライン入力にデータファイル名(data.txt)を半角文字で入力する.
data.txtの内容
F O 09:00
G O 09:20
B O 09:30
I O 09:30
C O 09:40
F I 09:50
A O 10:00
I I 10:00
E O 10:10
F O 10:10
G I 10:10
B I 10:20
C I 10:20
A I 10:40
E I 11:00
B O 11:10
F I 11:10
J O 11:20
D O 11:30
I O 11:30
B I 11:40
E O 11:40
E I 12:10
I I 12:10
J I 12:10
D I 12:30
G O 13:10
A O 13:30
I O 13:50
A I 14:00
G I 14:00
H O 14:00
C O 14:30
I I 14:30
E O 14:40
H I 14:50
B O 15:00
E I 15:20
J O 15:30
C I 15:40
B I 15:50
J I 16:00
F O 16:40
I O 16:50
F I 17:30
I I 17:30
【出力】
F 2:40
I 2:30
B 2:10
E 2:00
C 1:50
G 1:40
J 1:20
A 1:10
D 1:00
H 0:50
17:10
*/

以下のプログラムは
コマンドライン入力 data.txt
標準出力
A 1:10↵
B 2:10↵
C 1:50↵
D 1:00↵
E 2:00↵
F 2:40↵
G 1:40↵
H 0:50↵
I 2:30↵
J 1:20↵
17:10↵
となります。
貸出時間の長い順に並べるとともに,全ボートの貸出時間の総計を算出し,それらの結果を標準出力に出力するためには、どのように修正すべきかお教えください。

sample.c
#include <stdio.h>
#define LINESIZE 256

int main(int argc, char* argv[]){
FILE *fp;
char line[LINESIZE];
char b, io;
int h, m, tm;

//エラー処理
if ((fp= fopen(argv[1], "r")) == NULL) {
printf("Can't open the file.\n");
return 1;
}

//全貸出時間の総計を0で初期化
tm = 0;
//ボートA~J 10隻のそれぞれの貸出時間を0で初期化
int tms[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
for(; fgets(line, LINESIZE, fp)!=NULL;){
// ボートの貸出/返却時間の処理
sscanf(line, "%c %c %d:%d", &b, &io, &h, &m);
switch(io){
//貸出・返却について
//返却の場合、その時刻を、総計及び各ボートそれぞれについて分単位に
//変換し加算する
case 'I':
tm += 60*h+m;
tms[b - 'A'] += 60*h+m;
break;
//貸出の場合、その時刻を、総計及び各ボートそれぞれについて分単位に
//変換し加算後、符号をマイナスにする
case 'O':
tm -= 60*h+m;
tms[b - 'A'] -= 60*h+m;
break;
}
}

for (int i = 0; i < 10; i++) {
if (tms[i] != 0) {
//各ボートの貸出時間
printf("%c %d:%02d\n", 'A' + i, tms[i]/60, tms[i]%60);
}
}
//全貸出時間の総計
printf("%d:%02d\n", tm/60, tm%60);

fclose(fp);

return 0;
}

A 回答 (1件)

課題は自分でやりましょ。

    • good
    • 0
この回答へのお礼

分かりました

お礼日時:2021/08/07 17:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!