見出し画像

大学入学共通テスト「情報」(プログラミング)サンプル問題 第2問 動画解説 【高校 情報Ⅰ】


はじめに

第1問に引き続き第2問のプログラミングを解説していきます。

練習すれば、解くことは出来るけど、これを書籍ベースで教えるのは
教える方も、教わる方も結構大変だと感じています。

今回の解説も、動画をメインにして、文字おこしも動画と突き合わせて確認頂けると幸いです。

プログラミングのペーパーテストのコツは、変数(特にカウントアップ系、配列系)に実際に値を渡してシミュレーションをペーパー上で行うことです。

画像62

穴埋めなので、自分自身ならこんなプログラムにしない!という突っ込み問題も今後出てくると思いますが、実際の開発現場でも他人のコードに突っ込み入れながら、退職者の作業を引き継ぐことは普通にあるので、ヒントとなる処理の日本語説明と突き合わせながらソースコードの意図を読み取れるように頑張りましょう。

プログラミング問題は、初めの問題で意図を読み取れないと、芋づる式に全問落とす可能性もあるので、あせらず初めの問題から丁寧にプログラム仕様を把握していきましょう。

■■動画解説■■



■■文字おこし■■

まずは、本文を読みながらプログラムの「仕様」を把握していきましょう。

画像1


画像2

画像3

Python超入門講座で扱った内容ですが、 配列は値の入った箱を複数保持できるロッカーみたいなものです。
箱の1つ1つを要素といい、その箱の住所を添え字といいます。Python講座ではインデックス番号とお伝えしていますが、日本語で添え字といいます。

注意すべき点は、添え字は0番から使うので配列Tomeiの1番目のA党を取り出したい場合は Tomei[0]と記載します。

画像4

画像5

上記プログラムの内容と、必要に応じて 表示結果を突き合わせながら見ていくことが大切です。

画像6

4行目まで見え行きましょう

画像7

画像8


画像9

sousuuという変数名とTokuhyo配列から得票配列の中身を合計していることが、想像がつきます。
mを0から順番に増やしていきましょう。
1ループ目(m=0)   sousuu →0  Tokuhyo[0] →1200 なので
         sousuu = 0 +1200 =1200

2ループ目(m=1)   sousuu →1200  Tokuhyo[1] →660 なので
         sousuu = 1200 +660 =1860

3ループ目(m=2)   sousuu →1860  Tokuhyo[2] →1440 なので
         sousuu = 1860 + 1440  =3300

4ループ目(m=3)   sousuu →3300  Tokuhyo[3] →180 なので
         sousuu = 3300 + 180  =3480

ここでTokuhyo配列が最後まで行ったので アは3ということが分かる。
ただ、単純に配列全部の合計ということは予想がつくため、いきなり添え字の3ということを答えられるレベルにある問題。(解説の為とりこんでいるが上記をやっていると試験時間が足りない)


画像10

上記と 08に対応する出力結果は580が対応している。

画像11

 さっきのトレース結果よりsousuu は3480 なのでそれをgisekiの6で割ればkizyunsuuの580となる。

画像12

上記に対応する表示は以下の部分

画像13

Kさんの言葉に得票数に比例して配分すると小数点のある人数になる というのもヒントとなる。
例えばA党の得票数は1200で基準得票数は580なので 1200÷580で当選人数が求められる。
 各党の得票数/基準得票数 なので変数に置き換えると
 Tokuhyo[m]/kizyunsuu となり、
選択肢に当てはめると イは⑧ ウはbとなる。

次の問2は、文書の内容の理解力が問われている問題になります。

画像14

画像15

画像16

そして、読み取った内容が理解できているかということで以下の問題が準備されています。

画像17

処理を順番にみていきましょう。

画像18

上記の結果として Tokuhyo配列の中身とHikaku配列の中身がおなじになる。

画像19

★1ループ目

画像20

画像21

上記より添え字は2なので Tosen[2]に1を加える

画像22

画像23

Tokuhyo[2]は1440、Tosen[2]は1なのでそれに1を足すと2となる
1440を2で割ると商は720となりHikaku[2]に格納する。

画像24


★2ループ目

画像20

画像29


上記より添え字は0なので Tosen[0]に1を加える

画像29


画像23

Tokuhyo[0]は1200、Tosen[0]は1なのでそれに1を足すと2となる
1200を2で割ると商は600となりHikaku[0]に格納する。

画像29


★3ループ目

画像20

画像34


上記より添え字は2なので Tosen[2]に1を加える

画像34


画像23

Tokuhyo[2]は1440、Tosen[2]は2なのでそれに1を足すと3となる
1440を3で割ると商は480となりHikaku[2]に格納する。

画像34


★4ループ目

画像20

画像39


上記より添え字は1なので Tosen[1]に1を加える

画像39


画像23

Tokuhyo[1]は660、Tosen[1]は1なのでそれに1を足すと2となる
660を2で割ると商は330となりHikaku[1]に格納する。

画像39


★5ループ目

画像20

画像44


上記より添え字は0なので Tosen[0]に1を加える

画像44


画像23

Tokuhyo[0]は1200、Tosen[0]は2なのでそれに1を足すと3となる
1200を3で割ると商は400となりHikaku[0]に格納する。

画像44


★6ループ目

画像20

画像49


上記より添え字は2なので Tosen[2]に1を加える

画像49


画像23

Tokuhyo[2]は1440、Tosen[2]は3なのでそれに1を足すと4となる
1440を4で割ると商は360となりHikaku[2]に格納する。

画像49


上記の処理を実際に、プログラムに置き換えるのが問3になります。

画像50

で、以下は問1と同じ

画像51

以下の部分をさっきの問2と突き合わせながらトレースする必要がある。

画像52

09~13までは何をやっているかというと

画像53

さっきの問2でいうとHikaku配列のなかでの最大値をmax変数に入れる処理になる。
配列番号0~3まで くりかえす


1ループ目 max → 0
  Hikaku[0] が 1200なので max<Hikaku[0] がTrueとなる。
  ソ の部分は Hikaku配列の最も大きい数を取っておく必要があるので
   max = Hikaku[i]  が答えとなる。
 ここでは max変数に1200が代入される。
    そして maxi に 添え字の0が格納される maxiはTosen配列の位置を特定するために用いられる。
※iは3まで増えてしまうので、最大値をもつ配列の添え字を別変数に格納しておく必要があります。

2ループ目 max → 1200
  Hikaku[1] が 660なので max<Hikaku[1] が1200<660 はFalseとなり次のループとなる。

3ループ目 max → 1200
  hikaku[2] が 1440なので max<Hikaku[2] が1200<1440 はTrueとなり
maxに1440が代入される。
そしてmaxi は2となる。

4ループ目 max → 1440
  Hikaku[3] が 180なので max<Hikaku[3] が1440<180 はFalseとなり
ループを抜ける。

抜けた時点では
maxは1440 
maxiは 2となる。

画像54

14行目でTosen配列を更新する 
以下のイメージ

画像55

15行目で tosenkei(当選数の合計?)をプラス1するので、初回は初期値の0+1で1となる。

16行目は先ほどの問2で手順3が対応する

画像57

今回のループで言うとTokuhyo[maxi] はTokuhyo[2]なので1440
Tosen[maxi]+1は、Tosen[2] は1(14行目で更新)で プラス1して 2
よって、切り捨て(1440/2)で770が格納される。

これを変数に置き換えると。
切り捨て(Tokuhyo[maxi]/(Tosen[maxi]+1) がタ、チに該当する。


画像57

画像58

Koho配列の考慮が追加になっている。
すでに、当選している人数が、候補者を超えてはだめということで、さらに条件を厳しくする必要がある。

画像59

なので、ッは and 条件が妥当。
さらに 当選条件を満たした判定をするタイミングはTosen配列は未だ前回の数のままである。 
候補者の数と、Tosen配列にあるすでに、当選した人数にプラスした人数と比較して、候補者数 >= 今回の当選者を含めた当選者数でなければならない。

ということを 変数に置き換えると以下が妥当。

画像60

画像61


この記事が気に入ったらサポートをしてみませんか?