- 締切済み
C言語のプログラムについて
このプログラムが作れず困っています。分かる方教えてください。 data.datを入力し構造体型の配列に格納する(データ件数は50件以下,EOFになるまで入力) 次に<CTRL>Dが押されるまで学生番号をキー入力し,その氏名と得点を表示する。 学生番号の探索には二分探索法を使い構造体の配列を調べた回数も表示する。学生番号が存在しない場合は、存在しないことを 示すメッセージを表示する。 [実行例] 学生番号を入力してください ←入力要求のメッセージ(scanfの前に毎回入れる) 1012 1012番Sonoda Mari 得点=42点 探索回数=3回 ←学生番号,氏名,得点,探索回数を表示 学生番号を入力してください 1001 1001番Ando Ichiro 得点=73点 探索回数=1回 学生番号を入力してください 1016 1016番Nakai Kanji 得点=49点 探索回数=2回 学生番号を入力してください 1000 1000番なし 学生番号を入力してください(<CTRL>D=終了) <CTRL>D いちよ私が書いてみたものを載せます。 #include<stdio.h> #include<stdlib.h> int main(void) { struct GDATA { int bango; char sei[11],mei[11]; int tokuten; }; struct GDATA seiseki[50], tmp; int i,lo,hi,flg, kensuu, bango; FILE*fp; if((fp=fopen("data-a.dat","r"))==NULL) { printf("data-a.dat OPEN ERROR!\n"); exit(1); } for(kensuu=0;fscanf(fp,"%d%s%s%d",&tmp.bango, tmp.sei, tmp.mei, &tmp.tokuten)!= EOF;kensuu++) { seiseki[kensuu] = tmp; } printf("学生番号を入力してください\n"); while(scanf("%d", &bango)!= EOF) lo=0; hi=50 flg=0; while(flg==0&&lo<=hi) { i=(lo+hi)/2; if(bango!=seiseki[i].bango) { if(bango<seiseki[i])hi=i-1; elselo=i+1; } else flg=1; } if(flg==1)printf("%d番%s %s 得点=%d点\n",seiseki[i].bango,seiseki[i].sei,seiseki[i].mei,seiseki[i],tokuten); else printf("%d番なし\n",seiseki[i].bango); return 0; }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- jppy
- ベストアンサー率14% (14/99)
while(scanf("%d", &bango)!= EOF) lo=0; を回してもしかたがないのではなかろうか? ちなみに中括弧は省略しないほうよいかと私は思います ちなみに探索対象のデータが学生番号でソートされていると思うのですが・・・? 昇順?降順?どちらですかね?
何に困っているのか,もう少し具体的に書きましょう. 些細なミスが目立ちますが,プログラムがコンパイルできないのですか.それとも単にコピーミスしただけで,プログラムの実行結果がおかしい点について困っているのですか. また,正確に質問しましょう.それにdata.datではなくdata-a.datファイルを開くのではないでしょうか.このファイルの中に,データがどう記録されているのかの書式についても説明がありません. とりあえず気がついて点だけ挙げます. ・最初のfor文は,for(kensuu=0; kensuu < 50; kensuu++) としないとファイルに51行以上あったら正常に動作しません. ・fscanf()はforの繰り返し文の中に入れて,戻り値がEOFだったらbreakすればよいでしょう. ・fscanf()の第二引数は,"%d%s%s%d"ではなく"%d %s %s %d"などファイルを空白区切りにするなどにしないと,どこまでがseiでどこからmeiか区別できません(ファイルの書式が不明なので,空白区切りでよいのかも不明ですが) ・while文が一行で終わっていますが,lo=0の直前に { を,return文の直前に } を入れるべきでしょう. ・hi=50の終わりに ; がありません. ・elselo=i+1;は,elseとlo=i+1;の間の空白が消えています. ・ if(bango<seiseki[i])hi=i-1;のif文の条件式は,bango<seiseki[i].bangoの間違いでは? ・最後のif文のprintf()で引数のseiseki[i],tokutenは,seiseki[i].tokutenの間違いでは?
補足
回答ありがとうございます。 コンパイルがうまくいかずに困っていました。 ミスに気づくことができました。 回答を参考に作り直してみます。
補足
回答ありがとうございます。 降順です。