大学入学共通テスト「情報」(プログラミング)サンプル問題 第2問 動画解説 【高校 情報Ⅰ】
はじめに
第1問に引き続き第2問のプログラミングを解説していきます。
練習すれば、解くことは出来るけど、これを書籍ベースで教えるのは
教える方も、教わる方も結構大変だと感じています。
今回の解説も、動画をメインにして、文字おこしも動画と突き合わせて確認頂けると幸いです。
プログラミングのペーパーテストのコツは、変数(特にカウントアップ系、配列系)に実際に値を渡してシミュレーションをペーパー上で行うことです。
穴埋めなので、自分自身ならこんなプログラムにしない!という突っ込み問題も今後出てくると思いますが、実際の開発現場でも他人のコードに突っ込み入れながら、退職者の作業を引き継ぐことは普通にあるので、ヒントとなる処理の日本語説明と突き合わせながらソースコードの意図を読み取れるように頑張りましょう。
プログラミング問題は、初めの問題で意図を読み取れないと、芋づる式に全問落とす可能性もあるので、あせらず初めの問題から丁寧にプログラム仕様を把握していきましょう。
■■動画解説■■
■■文字おこし■■
まずは、本文を読みながらプログラムの「仕様」を把握していきましょう。
Python超入門講座で扱った内容ですが、 配列は値の入った箱を複数保持できるロッカーみたいなものです。
箱の1つ1つを要素といい、その箱の住所を添え字といいます。Python講座ではインデックス番号とお伝えしていますが、日本語で添え字といいます。
注意すべき点は、添え字は0番から使うので配列Tomeiの1番目のA党を取り出したい場合は Tomei[0]と記載します。
上記プログラムの内容と、必要に応じて 表示結果を突き合わせながら見ていくことが大切です。
4行目まで見え行きましょう
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ということを答えられるレベルにある問題。(解説の為とりこんでいるが上記をやっていると試験時間が足りない)
上記と 08に対応する出力結果は580が対応している。
さっきのトレース結果よりsousuu は3480 なのでそれをgisekiの6で割ればkizyunsuuの580となる。
上記に対応する表示は以下の部分
Kさんの言葉に得票数に比例して配分すると小数点のある人数になる というのもヒントとなる。
例えばA党の得票数は1200で基準得票数は580なので 1200÷580で当選人数が求められる。
各党の得票数/基準得票数 なので変数に置き換えると
Tokuhyo[m]/kizyunsuu となり、
選択肢に当てはめると イは⑧ ウはbとなる。
次の問2は、文書の内容の理解力が問われている問題になります。
そして、読み取った内容が理解できているかということで以下の問題が準備されています。
処理を順番にみていきましょう。
上記の結果として Tokuhyo配列の中身とHikaku配列の中身がおなじになる。
★1ループ目
上記より添え字は2なので Tosen[2]に1を加える
Tokuhyo[2]は1440、Tosen[2]は1なのでそれに1を足すと2となる
1440を2で割ると商は720となりHikaku[2]に格納する。
★2ループ目
上記より添え字は0なので Tosen[0]に1を加える
Tokuhyo[0]は1200、Tosen[0]は1なのでそれに1を足すと2となる
1200を2で割ると商は600となりHikaku[0]に格納する。
★3ループ目
上記より添え字は2なので Tosen[2]に1を加える
Tokuhyo[2]は1440、Tosen[2]は2なのでそれに1を足すと3となる
1440を3で割ると商は480となりHikaku[2]に格納する。
★4ループ目
上記より添え字は1なので Tosen[1]に1を加える
Tokuhyo[1]は660、Tosen[1]は1なのでそれに1を足すと2となる
660を2で割ると商は330となりHikaku[1]に格納する。
★5ループ目
上記より添え字は0なので Tosen[0]に1を加える
Tokuhyo[0]は1200、Tosen[0]は2なのでそれに1を足すと3となる
1200を3で割ると商は400となりHikaku[0]に格納する。
★6ループ目
上記より添え字は2なので Tosen[2]に1を加える
Tokuhyo[2]は1440、Tosen[2]は3なのでそれに1を足すと4となる
1440を4で割ると商は360となりHikaku[2]に格納する。
上記の処理を実際に、プログラムに置き換えるのが問3になります。
で、以下は問1と同じ
以下の部分をさっきの問2と突き合わせながらトレースする必要がある。
09~13までは何をやっているかというと
さっきの問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となる。
14行目でTosen配列を更新する
以下のイメージ
15行目で tosenkei(当選数の合計?)をプラス1するので、初回は初期値の0+1で1となる。
16行目は先ほどの問2で手順3が対応する
今回のループで言うとTokuhyo[maxi] はTokuhyo[2]なので1440
Tosen[maxi]+1は、Tosen[2] は1(14行目で更新)で プラス1して 2
よって、切り捨て(1440/2)で770が格納される。
これを変数に置き換えると。
切り捨て(Tokuhyo[maxi]/(Tosen[maxi]+1) がタ、チに該当する。
Koho配列の考慮が追加になっている。
すでに、当選している人数が、候補者を超えてはだめということで、さらに条件を厳しくする必要がある。
なので、ッは and 条件が妥当。
さらに 当選条件を満たした判定をするタイミングはTosen配列は未だ前回の数のままである。
候補者の数と、Tosen配列にあるすでに、当選した人数にプラスした人数と比較して、候補者数 >= 今回の当選者を含めた当選者数でなければならない。
ということを 変数に置き換えると以下が妥当。
この記事が気に入ったらサポートをしてみませんか?