見出し画像

「情報関係基礎」過去問を教材化する:2011 年:最大・最小・順位づけ

 2011年度の大学入試センター試験「情報関係基礎」の第3問,プログラミングの問題。試験の最高点・最低点・平均を求め,順位付けをする。問題と解説・解答は,大学入試センターのページにはもう載っていなくて,こちらにある。

 この問題では,教材化するにあたって注意すべきことが一つある。配列(リスト)の添え字だ。センター試験の疑似言語では,配列の添え字は基本的には1から始まるのだが,この問題ではテストの得点の度数を数えるため,インデックスが0から始まるものがある。0からのものと1からのものが混在しているのだ。
 生徒は50人で,n番の生徒の得点は Tensu[n] で表される。繰り返しは「1から50まで」となっている。Pythonではインデックスは0からなので,「繰り返しは0から49まで」で,n 番の生徒の得点は Tensu[n-1] になる。しかし,度数の配列 TNin は,0点から100点まで用意するので,インデックスは0からで,要素数は101になる。一方では値の番号と配列の要素番号が1つずれていて,一方では値の番号と配列の要素番号が同じになる。問題文(プログラムコード)では,このことが問われるようなところはないが,実際にコーディングするとなると話は別で,そのままだと混乱する生徒がひとりやふたりではないだろう。
 したがって,「インデックスは0から」に統一し,生徒の得点のリストも要素数は51にして,n 番の生徒の得点が Tensu[n]になるようにする。Tensu[0] は使わない。したがって,この点数データははじめに与えておくが,

Tensu = ['', 60, 92, 75, 95, 75, 64, 82, 77, 84, 78,
68, 76, 82, 64, 82, 76, 72, 64, 74, 84,
83, 66, 81, 61, 84, 78, 80, 66, 67, 61,
68, 67, 77, 67, 72, 71, 83, 75, 77, 70,
71, 77, 75, 74, 92, 90, 60, 75, 85, 90]

とする。第0要素は空文字列にしておく。どうせ使わないので0でもいいが,すると,0点の生徒がいる,と思われるかもしれないので,'' のほうがいいだろう。

====================================


生徒数50人のクラスで,各生徒の試験点数(100点満点)が,次のようにリスト Tensu に入っている。Tensu[i] には,出席番号 i の生徒の得点が入っている。出席番号0はないので,Tensu[0] には空文字 '' を入れてある。

Tensu =  ['', 60, 92, 75, 95, 75, 64, 82, 77, 84, 78,
         68, 76, 82, 64, 82, 76, 72, 64, 74, 84,
         83, 66, 81, 61, 84, 78, 80, 66, 67, 61,
         68, 67, 77, 67, 72, 71, 83, 75, 77, 70,
         71, 77, 75, 74, 92, 90, 60, 75, 85, 90]

問1 このクラスの平均点,最高点と最低点,点数ごとの人数を求めるプログラムを次のように作った。変数 sowa は点数の総和,saikou は最高点,saitei は最低点,heikin は平均点とする。また,リスト TNin を用意し,点数ごとの人数を格納する。空欄( )に適するものを書いてプログラムを完成しなさい。(カッコは消すこと)

TNin = list(range(101))
# TNin のすべての要素を0にする
for i in range(101):
   TNin[i] = 0
sowa = 0
saiko = 0
saitei = 100
for bango in range(1 , 51):
    s = Tensu[bango]
    sowa = (   )
    if s > (   ):
        (   ) = s
    if s < (   ):
        (   ) = s
    TNin[(  )] = TNin[(  )] + 1
heikin = sowa /50
print(heikin, saiko, saitei)print(TNin)

正しくできると,平均点,最高点,最低点とTNin の内容が表示される。
平均点,最高点,最低点は 75.34, 95, 60 で,TNin は次の表のようになる。

画像1

次に,それぞれの点数以上の人数表を表すリスト GNin を作る。GNin の内容は次のようになる。

画像2

表2と見比べていくと,96点以上はいないので Gnin[95] が 1 となり,94,93 点がいなくて 92 点が2人いる,GNin[92] は 3 となる。以下同様。

問2 GNin を作る次のプログラムを問1に続けて書いた。空欄 ( ) に適するものを書きなさい。表3の内容が表示されればよい。

GNin = list(range(101))
GNin[100] = TNin[100]
for ten in range(99, -1, -1):
    GNin[(   )] = GNin[(    )] + TNin[(    )]
print(GNin)

この GNin を使うと,ある得点を取った生徒の順位を求めることができる。しかし,95点なら1位,90点なら4位だが,GNin[90] は 5 なのでこのままでは少しわかりにくい。
 表2(Tnin)と表3(GNin)を見て,点数の高い方からどの生徒がその点をとっているか少し調べてみよう。

画像3

表4

 この表が作れれば,各生徒の順位が決まる。そこで,2つのリスト Tenjun と Tenban を用意し,50番の生徒から順に得点を調べ,点数を Tenjun に,生徒の番号を Tenban に格納していく。
 たとえば,50番の生徒は90点で,GNin[90] は5なので,この生徒は上から5人目までに入る。そこで,Tenjun[5] に 90 を,Tenban[5] に50 を入れる。少し進んで,46番の生徒も90点である。Tenjun[5]はすでに埋まっているので,その一つ前の Tenjun[4] に90を,Tenban[4]に46を入れる。そのために,50番の生徒の処理をした時点で,GNin[90]を4にしておくとよい。そうすれば,GNin[90]が4なので,Tenjun[4]とTenban[4]に点と生徒番号を入れればよいことになる。

問3 この処理を行うプログラムを問2のプログラムに続いて書いた。空欄 ( ) に適するものを書きなさい。

Tenjun = list(range(51))
Tenban = list(range(51))
for bango in range(50, 0, -1):
    s = Tensu[bango]
    Tenjun[(      )] = s
    Tenban[(      )] = bango
    GNin[(  )] = GNin[(  )] - 1

プログラムが書けたら

for i in range(1, 6):
    print(Tenjun[i], Tenban[I])

で,できた Tenjun と Tenban のはじめの5つを表示してみよう。表4と同じものが表示されれば正しくできたことになる。
正しくできたことがわかったら,この2行は消してよい。

問4 最後に順位付けを行う。表4で,上から1,2,と順位をつける。ただし,同じ点のときは同じ順位にする。そのプログラムを書いた。空所を補充して完成しなさい。次のように表示されればよい。

画像4

juni = 1
print(juni,Tenjun[1],Tenban[1])
for i in range(2, 51):
   if    <      :
       juni = 
   print(juni, Tenjun[i], Tenban[i])

==================================

教材化にあたっての注意

・題材としてはあまり面白くないが,アルゴリズムを考える力をつけるにはよい問題である。しかし,元の問題文で,Tenjun と Tenban を作るところは少し分かりにくい。説明は書いてあるが,Tenjun がどのようなものであるかの説明が不十分だからだ。そこで,上のように,説明を変えた。

・Tensu データは,問題文に合致するように適当に作った。
・TNin[s] = TNin[s] + 1 
 のところは,問題文では
       TNin[ キ ] を1増やす
 になっている。したがって,Pythonなら 
       TNin[  ] += 1
 と書くことができる。しかし,TNin[s] = キ の形で出題されることも考えら
 れるので,代入演算子 += を使わない形で書いている。 GNin[セ] を1減らす
 についても同様である。
・実習用のテキストでは,行番号を付けて,説明や問題指示で何行目かを明示するのもよいだろう。