数学とクイズでくつろいで<数学の部屋<どこよりも遅い!センター試験数学 解説<情報関係基礎 第3問 解説
どこよりも遅い!情報関係基礎 第3問 解説
最終更新日2011年6月1日
第3問
生徒50人のクラスで、試験の点数が表1に番号順に整理されている。
表1(配列 Tensu)
| 番号 | 1 | 2 | 3 | 4 | 5 | … | 45 | 46 | 47 | 48 | 49 | 50 |
| 点数 | 60 | 92 | 75 | 95 | 75 | … | 92 | 90 | 60 | 75 | 85 | 90 |
この表から、点数を集計し、順位表を表示する手続きを考える。このデータは、あらかじめ配列 Tensu に格納され Tensu[i] に i 番の生徒の点数が格納されている。
問1.
配列 Tensu のデータから、点数の平均点、最高点、最低点、点数ごとの人数を求める処理を考える。このために以下の変数および配列を用意する。
- sowa :点数の総和を格納する変数
- saiko :最高点を格納する変数
- saitei :最低点を格納する変数
- heikin :点数の平均点を格納する変数
- TNin :点数ごとの人数を格納する配列。添え字は 0〜100 と 101 個の要素からなる。TNin[i] に点数が i 点の人数を格納する。
これらを使い平均点、最高点、最低点、点数ごとの人数を求める手続きを考えると、以下の通りになる。
| (01) | sowa ← 0, saiko ← 0, saitei ← 100 |
| (02) | 配列 TNin のすべての要素を 0 にする。 |
| (03) | bango を 1 から 50 まで 1 ずつ増やしながら |
| (04) | | s ← Tensu[bango] | ( s は bango 番の生徒の点数) |
| (05) | | sowa ← sowa+s | (sowa に点数 s を加える) |
| (06) | | もし s<saiko ならば | (s がこれまでの最高点より |
| (07) | | | saiko ← s | 高ければ saiko を s に代える) |
| (08) | | を実行する。 | |
| (09) | | もし s>saitei ならば | (s がこれまでの最低点より |
| (10) | | | saiko ← s | 低ければ saitei を s に代える) |
| (11) | | を実行する。 | |
| (12) | | TNin[s] を 1 増やす。 | (点数 s の人数を 1 増やす) |
| (13) | を繰り返す。 |
| (14) | heikin ← sowa / 50 |
| (15) | hekin と saiko と saitei を表示する。 |
|
問1の解答
(ア、イの解答は順序を問わない)
問2.
配列 TNin から点数の高い順に点数のデータを並べ替える処理を考える。
- GNin :点数以上の人数の合計を格納する配列。添え字は 0〜100 と 101 個の要素からなる。GNin[i] に点数が i 点以上の人数を格納する。
表2(配列 TNin)
| 点数 | 0 | … | 60 | … | 85 | … |
90 | 91 | 92 | 93 | 94 | 95 | 96 | … | 100 |
| 人数 | 0 | … | 2 | … | 1 | … | 2 | 0 | 2 | 0 | 0 | 1 | 0 | … | 0 |
表3(配列 GNin)
| 点数 | 0 | … | 60 | … | 85 | … |
90 | 91 | 92 | 93 | 94 | 95 | 96 | … | 100 |
| 人数 | 50 | … | 50 | … | 6 | … | 5 | 3 | 3 | 1 | 1 | 1 | 0 | … | 0 |
0 ≦ i ≦ 99 であるとき
i 点以上の人数= (i+1)点以上の人数+ i 点の人数
が成り立つため、配列 GNin について次の式が成り立つ。
GNin[i] = GNin[i+1] + TNin[i] (0 ≦ i ≦ 99)
GNin[100] = TNin[100]
以上から GNin に人数を格納する手続きは以下の通りになる。
| (16) | GNin[100] ← TNin[100] |
| (17) | ten を 99 から 0 まで 1 ずつ減らしながら |
| (18) | | GNin[ten] ← GNin[ten+1] + TNin[ten] |
| (19) | を繰り返す。 |
|
次に点数の高い順に点数と生徒の番号を並べ替えていく処理を考える。このために以下の配列を使う。
- Tenjun :点数の高い順にその点数を格納する配列。添え字は 1〜50。Tenjun[i] に i 番目に高い点数を格納する。
- Tenban :点数の高い順にその点数を取った生徒の番号を格納する配列。添え字は 1〜50。Tenban[i] に i 番目に高い点数を取った生徒の番号を格納する。
複数の生徒が同じ点数を取ることもあるため、これまでの配列の格納結果を例として Tenjun, Tenban への格納を説明していく。
- 最初に 50 番の生徒の点数を調べる。
- 50 番の生徒の点数は 90 点。90 点以上の生徒は 5 人いるため、Tenjun[5] に 90 を、Tenban[5] に 50 を格納する。
- 次に 49 番の生徒、48 番の生徒…と逆順に調べていく。
- 46 番の生徒の点数は 50 番の生徒と同じく 90 点である。この場合は 50 番の生徒の情報が格納されている Tenjun[5], Tenban[5] のひとつ前 Tenjun[4] に 90 を、Tenban[4] に 46 を格納する。
- 以下、同様にして、同じ点数を取った生徒が既にいる場合、それらの生徒のひとつ前の添え字に点数と番号を格納する。
この手順に従った場合、s 点の生徒が n 人、s 点以上の生徒が p 人いる場合、Tenjun[p], Tenjun[p-1], … と順に n 個の要素に点数 s を格納していき、最後に Tenjun[p-n+1] に点数 s が格納される。
このとき p = GNin[s] となり、最初の s 点の生徒に対しては Tenjun[GNin[s]], Tenban[GNin[s]]
に点数と生徒の番号を格納することができるが、次の s 点の生徒に対しては格納すべき添字が GNin[s]-1 となる。
そこで Tenjun[GNin[s]], Tenban[GNin[s]] へ点数、番号を格納したあとに GNin[s] を 1 減らす手続きを行えば、次の s 点の生徒に対しても格納する添字が GNin[s] となり、手続きが簡素化できる。このことから以下の手続きを考えることができる。
| (20) | bango を 50 から 1 まで 1 ずつ減らしながら |
| (21) | | s ← Tensu[bango] |
| (22) | | Tenjun[GNin[s]] ← s |
| (23) | | Tenban[GNin[s]] ← bango |
| (24) | | GNin[s] を 1 減らす。 |
| (25) | を繰り返す。 |
|
問2の解答
問3.
点数順に並べ替えた結果から、順位表を表示する処理を考える。同点の場合は同じ順位とし、同点者の人数だけ以降の順位を繰り下げる。
表4
点数の順位表
| 順位 | 点数 | 番号 |
| 1 | 95 | 4 |
| 2 | 92 | 2 |
| 2 | 92 | 45 |
| 4 | 90 | 46 |
| 4 | 90 | 50 |
| 6 | 85 | 49 |
| … | … | … |
| 49 | 60 | 1 |
| 49 | 60 | 47 |
そのために以下の変数を使う。
順位は以下のように決めることができる。
- まず、点数の高い順から 1, 2, … 49, 50 と順位をつける。
- 前の順位と点数が変わらないならば、順位は「その点数を取っている最高順位」に変更する。
このことから一つ前の順位と点数が違う生徒は順位の変更がない。よって以下の手続きを作ることができる。
| (26) | juni ← 1 |
| (27) | juni と Tenjun[1] と Tenban[1] を表示する。 |
| (28) | i を 2 から 50 まで 1 ずつ増やしながら | (i は同点を考えない順位) |
| (29) | | もし Tenjun[i]<Tenjun[i-1] ならば | (順位を変更するかの判定) |
| (30) | | | juni ← i |
| (31) | | を実行する。 |
| (32) | | juni と Tenjun[i] と Tenban[i] を表示する。 |
| (33) | を繰り返す。 |
|
問2の解答
数学とクイズでくつろいで<数学の部屋<どこよりも遅い!センター試験数学 解説<情報関係基礎 第3問 解説