練習 [6] 配列(4/5)

練習 4(提出プログラム名:p0604.c)

サンプルプログラム 4 (sample4.c)p0604.c という別の名前のファイルにコピーしなさい.そして,p0604.c を編集して以下の例のように実行できるプログラムを作りなさい.
このプログラムではサンプルプログラム 4 と同様に SIZE 人分の点数を読み込み,それぞれの点数と順位を出力している.ただし,次の点で処理内容が異なっている:
 ● マクロ SIZE の値は 5 ではなく 100 である.
 ● 最後に平均点(小数点以下第 1 位まで)最高点も出力する.

【注意】
この問題では(#define SIZE 100 というマクロの定義部分を除いて) 100 と直接書いてはいけません
それゆえ,平均点を求める際には合計値を 100 で割るのではなく SIZE で割るように書くこと.
(※講義で説明したように,そうすることで後で人数が変更になった場合でも簡単に対応できます)

【ヒント1】(平均点の算出)
SIZE 人分の点数を繰り返し読み込む際に,一緒にそれらの合計値sum という名前の変数にするのが一般的)も求めておくとよいでしょう.そして,合計値 sumSIZE で割れば平均点は簡単に求まります.
ただし,int 型どうしの割り算になってしまうので,割り算の際には sum の方を double 型へキャストする必要があります.
なお,合計を求めるに先立って sum0 で初期化するのを忘れないようにしてください.

【ヒント2】(最高点の算出)
[定番のやり方]
ここでは max という変数に最高点が格納されるようにプログラムを作るものとします.
まずは全員分の得点を配列 score へすべて格納します.その後,
 ① 1 人目の点数(score[0])を仮の最大値としておきます:
    max = score[0];
 ②後は i を使った for 文での繰り返しの中で,
  score[i] の方が(現在の)max より大きければ,score[i] を改めて max と置き直します
    if ( score[i] > max )
    {
     max = score[i];
    }
こうしておけば,最終的に max には最大値(最高点)が入っていることになります.
【注意】
せっかく配列 rank に順位が入っているので,その値が 1 位かどうかで判定できるのではないか?と考える人がいるかもしれませんが,この 2 番目の for 文では順位(rank)を求めている途中ですので,その途中で順位が 1 位だったとしても,それは暫定 1 位に過ぎません.

実際に 100 人分の成績を入力するのは大変なので,以下のデータファイルをダウンロードし,リダイレクトによって入力させると良いです(以下の実行例を参考).
 ● data06-4-1.txt
 ● data06-4-2.txt
 ● data06-4-3.txt
 ● data06-4-4.txt

  • 【プログラムの実行例】(その1)※以前の講義で説明したリダイレクトによる実行(data06-4-1.txt を使用)※ Mac の人は a ではなく ./a.out と入力してください.
    ※平均点が間違っていないか,小数点以下の桁数は正しいか,それぞれ確認せよ.
a < data06-4-1.txt
100 人分の成績を入力してください:
1 番は 28 点で 61 位
2 番は 61 点で 28 位
.... (中略) ....
99 番は 37 点で 54 位
100 番は 51 点で 39 位
平均点は 42.9 点
最高点は 98 点
  • 【プログラムの実行例】(その2~4)

 data06-4-2.txt の場合:平均点 48.7, 最高点 99
 data06-4-3.txt の場合:平均点 53.3, 最高点 98
 data06-4-4.txt の場合:平均点 50.8, 最高点 98

【過去にあったミス(減点となり,やり直しを命じられる)】
4種類の実行例を確認せずに提出してしまっている.
 (例1)マクロ SIZE が 5 のままで実行してしまっている.
 (例2)平均点の出力に際して小数点以下の桁数指定を誤っている.
 (例3)平均点や最高点が間違っている.
■ 平均点を求めるにあたって先に合計値を求めるが,その変数を 0 で初期化するのを忘れている.
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


ミスが無いことを確認したら次の問題へ → [ 練習5 (p0605.c) ]