• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語の構造体についての質問です。)

C言語の構造体についての質問です

このQ&Aのポイント
  • C言語の構造体についての質問です。学校でC言語の授業を受けていて、課題が出たのですが、わかりませんでした。回答よろしくお願いします。
  • C言語の構造体を使ったプログラムの課題があります。テキストファイルから番号、名前、英語、国語、数学の得点を読み込み、各自の3科目平均点を計算するプログラムを作成しなければなりません。しかし、プログラムを実行しても出力が正しく表示されません。どこが間違っているのか教えてください。
  • C言語の構造体を使ったプログラムの課題です。ファイルからデータを読み込み、3科目の平均点の高い順に並び替えて表示するプログラムを作成しなければなりません。しかし、プログラムの実行結果が正しく表示されません。どこが間違っているのか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

> ファイルh109113.txtは不完全です > No.0レコード? → この表示はどこか? >if(fgets(bffr,MBFFRL,file)!=NULL){ >printf("ファイル%sは不完全です\n",fnm); >printf("No.%dレコード?\n",i); >exit(2); >} でifの条件が成立ったとき。 →内容からして、エラー時の対策のようだ →→入力ファイルは正しいか? → 正しそうだ →→本当に読めて無いのだろうか?→bffrの内容を確認(デバッガの使用、printfでの表示等)→どうやら入力できているようだ →→そもそも、この判定は正しいか→fgetsのマニュアルを確認→戻り値は「EOF等で正しく読めなかった場合はNULL、それ以外は読み込んだ第1引数のポインタ(!=NULL)」→正常時にエラー処理をしている! 以上、期待する動作→実際の動作の違いから、プログラムの問題点を見つけるまでの一例です。 何がどう「出力がちゃんとでき」ないか、をはっきりさせることが、解決に繋がるのがわかるのではないでしょうか? プログラムの勉強で、文法やコマンドを覚えるのは確かに大事ですが、そんなのは、忘れた時はマニュアル等を読み直せばいいだけのことです。 それよりも、何か不具合があったとき、現象から原因をつきとめらるようにすることが、とても重要です。 これには、ある程度の訓練と経験が必要です。「ちゃんとできません」だけでは訓練になりません。

その他の回答 (3)

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

>上記のように出力したいのですが、 >ファイルh109113.txtは不完全です >No.0レコード? >と出力されます。 ……回答の内容見ています? #1でkmeeさんが >fgetsの戻り値の仕様をよく確認してください。下の内容から、エラー時の処理に見えますが、fgetsの戻り値が !=NULL ならエラーではありません。 と回答されていますよね? # 私はそこまで見ていませんでしたが… !=NULLで正常動作なのにエラー処理として中断しているのですから、その後の動作が続くはずがありませんよね?

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

>出力がちゃんとできません。 とは、「どういう出力」を期待していて、「どういう結果」になったのですか? とりあえず、readin()とdisply()の操作対象はmain()のSTDNT students[0]だけ。 のようですが、期待する動作ですか? # STDNT *pの値が、関数コールされてから変化していないようですが…。 ちなみに、readin()は期待する形式以外のファイルが指定された場合に吹っ飛びます。 1行が 10,聖徳太子,30,100,70 の場合は問題ないでしょうが、 10,聖徳太子,30,,70 や 10,聖徳太子,30,100 の時は……。

stitch-dragons
質問者

補足

番号_名前_英語_国語_数学__平均 ___1_安藤___30___50___90__56.7 ___2_井上___70___80___60__70.0 ___3_上田___80___70___80__76.7 ___4_遠藤___90___80___80__83.3 ___5_岡田___90___70___80__80.0 ___6_加藤___80___80___70__76.7 ___7_木村___70___70___60__66.7 ___8_工藤___80___80___80__80.0 ___9_小林___80___80___80__80.0 __10_佐藤___70___80___80__76.7 reorder_by_descending_mean 番号_名前_英語_国語_数学__平均 ___4_遠藤___90___80___80__83.3 ___5_岡田___90___70___80__80.0 ___8_工藤___80___80___80__80.0 ___9_小林___80___80___80__80.0 ___3_上田___80___70___80__76.7 ___6_加藤___80___80___70__76.7 __10_佐藤___70___80___80__76.7 ___2_井上___70___80___60__70.0 ___7_木村___70___70___60__66.7 ___1_安藤___30___50___90__56.7 上記のように出力したいのですが、 ファイルh109113.txtは不完全です No.0レコード? と出力されます。 テキストファイルの中身は 1, 安藤, 30, 50, 90 2, 井上, 70, 80, 60 3, 上田, 80, 70, 80 4, 遠藤, 90, 80, 80 5, 岡田, 90, 70, 80 6, 加藤, 80, 80, 70 7, 木村, 70, 70, 60 8, 工藤, 80, 80, 80 9, 小林, 80, 80, 80 10, 佐藤, 70, 80, 80 です。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> 出力がちゃんとできません。よろしくお願いします。 どのように「ちゃんとでき」ないのか、自分の期待する結果とどう違うかを、明記するようにしましょう。 自分で解決するにしても、人に頼むにしても、「期待する結果とどう違うか」が解決への第一歩です。 > if(fgets(bffr,MBFFRL,file)!=NULL){ > printf("ファイル%sは不完全です\n",fnm); > printf("No.%dレコード?\n",i); > exit(2); > } fgetsの戻り値の仕様をよく確認してください。下の内容から、エラー時の処理に見えますが、fgetsの戻り値が !=NULL ならエラーではありません。 > for(i=0;i<MSTDNT;i++){ (略) > p->id=atoi(strtok(bffr,",\n")); (略) >p->mean=(float)(p->engl+p->jpan+p->math)/3; >} このループで、ポインタpの値は変化せず、構造体の配列の先頭要素を指したままです。 つまり、main関数の students[0];に全部のデータが上書きされます。 p[i].id 等とするか、(p自体はポインタを値渡ししたもので、p自体を変化させても呼び出し側に影響が無いので) ループ終了前に ++ p ; とするか、です。 > //成績表の格納状況を表示する > void disply(STDNT *p) も同様。 > //(3)3科目の平均点の高い順に並び変える > void dscend(STDNT *p){ このソートのアルゴリズムをよく見てください。 i=0の処理が終った段階で、p[0]に入っていなければならないのは、どんな構造体でしょうか? 実際にはどの構造体が入っているでしょうか?

stitch-dragons
質問者

補足

テキストファイルの中身は 1, 安藤, 30, 50, 90 2, 井上, 70, 80, 60 3, 上田, 80, 70, 80 4, 遠藤, 90, 80, 80 5, 岡田, 90, 70, 80 6, 加藤, 80, 80, 70 7, 木村, 70, 70, 60 8, 工藤, 80, 80, 80 9, 小林, 80, 80, 80 10, 佐藤, 70, 80, 80 です。

関連するQ&A