社長のコラム


センター試験の「情報」(1)

2022.05.05

Mさんは、18歳になって選挙権が得られたのを機に、比例代表選挙の当選者を決定する仕組みに興味を持った。そこで各政党に配分する議席数(当選者数)を決める方法を、友人のKさんとプログラムを用いて検討してみることにした。

これは、大学入試センターという独立行政法人が、2021年3月に公開した「情報」という科目のサンプル試験問題のリード文です。

MさんKさん、いいね。まだ飲酒の禁じられた年齢なのに、しっかり者です。「プログラムを用いて検討してみることにした」というチャレンジ精神に心打たれます。私もプログラムすることで生計を立てているプログラマーではありますが、なかなかそのような思考回路にはなりません。襟を正されます。

そこで、今回から数回に渡りまして、このテキストを題材に、プログラミングとはどういうものか、どのような考え方をするのか、プログラミングを試みること身に付けられる論理的思考力とはいかなるものか、論を進めて参ります。


Mさん : 表1に、最近行われた選挙結果のうち、ある地域のブロックについて、各政党の得票数を書いてみたよ。

表1 各政党の得票数
A党B党C党D党
得票数12006601440180

Kさん : 今回の議席数は6人だったね。得票の総数を議席数で割ると580人なので、これを 基準得票数と呼ぶのがいいかな。平均して1議席が何票分の重みがあるかを表す数ということで。そうすると、各政党の得票数が何議席分に相当するかは、各政党の得票数をこの基準得票数で割れば求められるね。

だいたい600票で1議席取れます。A党、B党、C党、D党と4つの政党があって、得票数がそれぞれ1200、660、1440、180ですから、A党、B党、C党に、2議席、1議席、2議席が入るのは確定でしょう。あとの1議席を、C党が獲得するかD党に割り当てるか、そういう問題であるところは、暗算でも分かります。


Mさん : その考え方に沿って政党ごとの当選者数を計算するプログラムを書いてみよう。まず、プログラムの中で扱うデータを図1と図2にまとめてみたよ。配列Tomeiには 各政党の党名を、配列Tokuhyoには各政党の得票数を格納することにしよう。政党の数は4つなので、各配列の添字は0から3だね。

図1 各政党名が格納されている配列
i0123
TomeiA党B党C党D党
図2 得票数が格納されている配列
i0123
Tokuhyo12006601400180

配列の添字なるものが、唐突に出てきますが、多くのプログラムは配列を使います。有限個の何かを順番に並べて保つものですが、その順番は多くのプログラムにおいて0からカウントされます。


Mさん : では、これらのデータを使って、各政党の当選者数を求める図3のプログラムを書いてみよう。実行したら図4の結果が表示されたよ。

図3 得票に比例した各政党の当選者数を求めるプログラム
(01) Tomei = ["A党", "B党", "C党", "D党"] 
(02) Tokuhyo = [1200, 660, 1440, 180] 
(03) sousuu = 0
(04) giseki = 6
(05) mを0から[ア]まで1ずつ増やしながら繰り返す: 
(06)⎿ sousuu = sousuu + Tokuhyo[m]
(07) kizyunsuu = sousuu / giseki
(08) 表示する("基準得数 : ", kizyunsuu)
(09) 表示する("比例配分")
(10) mを0から[ア]まで1ずつ増やしながら繰り返す: 
(11)⎿ 表示する(Tomei[m], " : ", [イ] / [ウ])

この11行が、いわゆるプログラムです。コードともいいます。1行ごとに意味がありまして、それを読んで理解できるように、という出題者の意図で一部が日本語です。

日本語のプログラムコードなんてあるのか、といぶかしむ人もあるでしょうが、プログラミング言語というものは、人間が読んだり書いたりするためのものです。コンピュータの方は、プログラミング言語をそのまま読んでいるのではなく、コンピュータが使いやすい別の言語に翻訳してから読んでいるのです。


コードについて少し説明をはさみますが、(05)と(06)のところで何をしているのかと言いますと、大したことではありません。1200 + 660 + 1440 + 180 = 3480という足し算をしているだけなのです。

そして3480 ÷ 6 = 580という計算をしているのが(07)です。(10)と(11)では、A党からD党まで、それぞれの得票数を580で割った商を表示します。

[ア] [イ] [ウ]のところが、問題になっていて、答えを選択肢からえらぶのですが、3 と Tokuhyo[m] と kizyunsuu が入ります。

ここで、得票がTokuhyoであるのに対し、基準数はkizyunsuuです。ローマ字表記には、いろいろな方式がありますが、混在するのはおかしいじゃないか、Tokuhyouにするなりkijunsuにするなりして、どちらかに統一すべき、と思われるかもしれません。私も同感です。しかしコンピュータはそのようなことには無頓着です。ただしTokuhyoだったのが途中からTokuhyouに変わったら、コンピュータは怒るかへそを曲げるかします。プログラマーからすると、受け付けてもらえないか思い通りに動かないか、どちらかの結果になります。


この11行のプログラムを動作させた結果は以下です。

図4 各政党の当選者数の表示
基準得票数 : 580
比例配分
A党 : 2.068966
B党 : 1.137931
C党 : 2.482759
D党 : 0.310345

Kさん : 得票数に比例して配分すると小数点のある人数になってしまうね。小数点以下の数はどう考えようか。例えば、A党は2.068966だから2人が当選するのかな。

Mさん : なるほど。切り捨てで計算すると、A党は2人、B党は1人、C党は2人、D党は0人になるね。あれ? 当選者数の合計は5人で、6人に足りないよ。

ここまでの結果としては、暗算のレベルとさほど変わりません。プログラムの醍醐味はもっと違うところにあります。問題は続きます。(次回)

© 2022 ばんな情報システム株式会社