練習 [5] 配列(3/5)

練習 3(提出プログラム名:p0503a.c)

以下の例のように SIZE 人分の成績処理を行うプログラムを p0503a.c として作りなさい.ただし,SIZE はマクロとし,100 と定義せよ.

《成績処理の内容》
 ●各自の成績について「◯番は△点で☆位」と出力する.
  ※「◯番」は出席番号を意味し,成績の入力は 1 番から順に行われるものとする.
  ※「△点」は入力された得点をそのまま用いるものとする.
  ※「☆位」はその学生の得点が(高い方から数えて)第何位なのかを表すものとする.
   (順位の求め方は一般クラス第6回講義資料のサンプルプログラム4を参考にせよ)

 ●SIZE 人分の成績を表示させた後,平均点(小数点以下第 1 位まで)最高点を出力する.

【注意】
この問題では(#define SIZE 100 というマクロの定義部分を除いて) 100 や 99 と直接書いてはいけません

【ヒント1】(順位の算出)
[定番のやり方]
例えば,ある人物の「順位が 3 位」というのは「その人よりも高得点が 2 名いる」ということです.
つまり,自分よりも高得点の人が何人いるかを数えれば,それに 1 を足した値が求める順位になります.こうすれば,わざわざ得点の高い順に並べ替えるといった作業は不要になります.

【ヒント2】(最高点の算出)
[定番のやり方]
ここでは max という変数に最高点が格納されるようにプログラムを作るものとします.
 ①まず, 1 人目の点数(score[0])を仮の最大値としておきます:
    max = score[0];
 ②後は i を使った for 文での繰り返しの中で,
  score[i] の方が(現在の)max より大きければ,score[i] を改めて max と置き直します
    if ( score[i] > max )
    {
     max = score[i];
    }
こうしておけば,最終的に max には最大値(最高点)が入っていることになります.

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

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

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

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


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