問 6(提出プログラム名:ex1306.c)
このプログラム(ex1306.c)をダウンロードし,
その中の関数 read_data と get_average を完成させなさい.
このプログラムは,データファイルの名前(256 文字未満)を読み込み,
そのデータファイルに書かれている n 人分の成績(整数)を読み出して,
平均点を表示させようとしている.
ただし,人数の n はデータファイルの 1 行目に書かれているものとする.
ここでは n は 200 以下の整数であると仮定してよいものとする.
作成目標の 2 つの関数はそれぞれ上記の作業の一部を担当するものとなっている:
【関数 read_data の仕様】
第 1 引数のファイルポインタ fp を使い,それが参照しているデータファイルから
人数の n とそれに続く n 人分の成績を読み込む.
n 人分の成績は第 2 引数の配列 score へ格納し,最後に人数の n を返す(return する).
要は,fscanf を使ってファイルから数値を順番に読み込むだけである.
つまり,最初に n の値をファイルから読み込み,引き続いて
for ( i = 0; i < n; i++ ) といった繰り返しでもって score[i] の値を読み込んでいけばよい.
※例年よくある間違いとして,人数の「n」と「n 人分の成績」をまとめて 1 つの for 文の繰り返しで読み込もうとする人がいるが,先に n の値が確定しないと for 文の繰り返し回数が決まらないのでうまくいかない.結局,別々の fscanf で読み込むしかないのである.
【関数 get_average の仕様】
第 1 引数の配列 score の内容について,そこに格納されている n 人分の成績の平均を求めて返す.
なお,具体的な人数は第 2 引数の n で与えられる.
配列 score には int 型の整数値が格納されているが,関数の戻り値である平均値は実数(double型)なので,適切なキャストが必要である点に注意せよ.
【注意】
この問題では関数 main の内容は一切書き換えないこと.
【注意すべき点】
この問題も問 4 と同様に扱うデータはいずれも数値であって文字ではありませんので,ファイルからの読み出しには fscanf を使います.
ここでは文字データは一切扱いませんので fgetc が登場することは無いです.
なお,平均値を求める過程でいったん合計値を求めることになりますが,その際に使う変数を 0 で初期化するのを忘れないように気をつけてください.
- 【プログラムの実行結果】(その1)※赤字は実行時にキーボードから入力する内容
(このデータファイル data1306-1.txt をダウンロードして使ってください)
データファイル名を入力してください: data1306-1.txt 平均点 = 51.6⏎
- 【プログラムの実行結果】(その2)※赤字は実行時にキーボードから入力する内容
(このデータファイル data1306-2.txt をダウンロードして使ってください)
データファイル名を入力してください: data1306-2.txt 平均点 = 48.8⏎
【過去にあったミス(実際に減点となり,やり直しを命じられた例)】
■ 実行の画面出力が上の例と違う(きちんと確認していない).
(例1)データファイルの 1 行目に書いてある n を人数ではなく点数として扱っている.
(例2)n に関係なく常に 200 人分の成績を読み込もうとしている.
■ 平均値を求めるにあたって合計値を求める必要があるが,
そのための変数を 0 に初期化するのを忘れてしまっている.
■ main 関数を書き換えてしまっている.
■ インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).
← [ 問 5 (ex1305.c) ]
ミスが無いことを確認したら次の問題へ → [ 問 7 (ex1307.c) ]