C言語
1 2ある特定のボート(A,B,C...)の貸し出し時間の総計を算出するプログラムを作成したいと考えています。以下のようなデータファイルがあります。「標準入力」欄に入力したボートの名前に対して、「標準出力」欄にそのボートの貸し出し時間の総計が表示されるようにしたいと考えています。プロブラム実行時には「標準入力」欄にA,B,C...と入力します。 3「標準入力」A 4「標準出力」1:53 5となるように考えています。 6 7A O 09:00 8B O 09:05 9B I 09:30 10C O 09:31 11B O 09:45 12A I 10:03 13A O 10:20 14B I 10:38 15C I 10:55 16A I 11:10 17 18 19 20 21 22#include <stdio.h> 23 24#define LINESIZE 256 25 26int main(int argc, char *argv[]) { 27 FILE *fp; 28 char line[LINESIZE]; 29 char b, io; 30 int h, m, tm; 31 32 if ((fp = fopen(argv[1], "r")) == NULL) { 33 printf("Can't open the file.\n"); 34 return 1; 35 } 36 37 tm = 0; 38 for(; fgets(line, LINESIZE, fp)!=NULL;){ 39 sscanf(line, "%c %c %d:%d", &b, &io, &h, &m); 40 switch(io){ 41 case 'I': 42 tm += 60*h+m; 43 break; 44 case 'O': 45 tm -= 60*h+m; 46 break; 47 } 48 } 49 printf("%d:%02d\n", tm/60, tm%60); 50 51 fclose(fp); 52 53 return 0; 54}コード
しつもんはなんでしょうか。
質問文は編集できます。追記修正しよう
> ある特定のボート(A,B,C...)の貸し出し時間の総計を算出するプログラムを作成したいと考えています。
- ファイルに書かれた一行のデータはなにを意味しているのですか?
- 呈示されたコードはなにをするものですか?
- しつもんはなんですか?
現状のコードは
A O 09:00
B O 09:05
B I 09:30
C O 09:31
B O 09:45
A I 10:03
A O 10:20
B I 10:38
C I 10:55
A I 11:10
のA,B,Cのボート全体の1日の総計になっています。これをAのみの総計、Bのみの総計、Cのみの総計とそれぞれの総計を出したいと考えています。よろしくお願いいたします。
- 1つ目はボート名、3つ目は時刻ですね? 2つ目は?
- 2つ目が O または I でなかったら?
- 時刻が昇順に並んでいなかった場合は?
...などなど、あやふやな部分が多すぎます。
> ~と考えています。よろしくお願いいたします。
だから、なにをお願いしているのですか?
説明がわかりずらくて申し訳ありません。
・ボートは15隻所有している(A,B,C...)
・営業時間は09:00~18:00である
・ボート名、貸出/返却、時刻(10分単位)
Oは貸出、Iは返却です。
今はこれらの情報から1日分の記録として、その日の貸し出し時間の総計を算出しています。これを利用して、A,B,Cそれぞれのボートの1日分の記録を出したいと考えています。
しつもんはなんですか?
貸出時間を収める箱(変数)をボート数分(配列で)用意し、
ボート名に応じて、どの変数に対して"時*60+分"を足すか/引くかを決めればいいでしょうね。
どの部分を修正、もしくは加えれば、A,B,Cそれぞれの総計が出せるのかということです。今の状態は、すべてのボートの1日の集計になってしまっています。
少なくとも現時点では貸出時間を積算する tm がひとつしかありません。
そこで int tm を int tm[15] とし、
ボートAなら tm[0], Bならtm[1] ... に対し "時*60+分"を足し/引きすればいい。
tm = 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;
break;
case 'O':
tm -= 60*h+m;
break;
}
}
この部分を15回おこなうのでしょうか。
15回やればできるでしょう。が、もっと短く書けます。
for(; fgets(line, LINESIZE, fp)!=NULL;){
sscanf(line, "%c %c %d:%d", &b, &io, &h, &m);
n = bが 'A'なら0, 'B'なら1, ... // ****
switch(io){
case 'I':
tm[n] += 60*h+m;
break;
case 'O':
tm[n] -= 60*h+m;
break;
}
}
*** のところを何とかして実現するだけです。
n = bが 'A'なら0, 'B'なら1, ... // ****
こちらの部分の理解が出来ないのですが。n=bとはどのような意味なのでしょうか。
n = 「bが 'A'なら0, 'B'なら1, ...」 です。
b はファイルから読み込んだボート名ですよね。
それが 'A' なら tm[0]、'B'ならtm[1]... に対して計算すれば、
ボートAの総貸出時間はtm[0]に求まります。以下同文。
if文ということでしょうか。
あなた次第。ヒントはこれで充分では?
なんとなくは理解できたのですが、解決できるかは不安です。ありがとうございました。
ボート名b は "ABCDEFGHIJKLMNO" の何番目にありますか(先頭を0番目として)? それがnです。
要は 「ボート名(char b) を通し番号(int n)に変換」するってことです。
えーと...テキトーに解決(close)しといて。それともまだできてない?
まだ出来ていないのです。
諦め段階に入ってしまいました。
コレ↓ができないの?
> ボート名b は "ABCDEFGHIJKLMNO" の何番目にありますか(先頭を0番目として)? それがnです。
> 要は 「ボート名(char b) を通し番号(int n)に変換」するってことです。
本気でこの問題に取り組むつもりなら『質問を編集』してください。回答者は基本的に質問本文を見て回答します。
少なくとも『OやIとは何か』とかのようなデータの並びに関しては質問本文では触れていません。
で、退会。