情報Ⅰ プログラミング演習

第7章 共通テスト表記との対応 ― 試験の言葉に翻訳する

この章で学べること
この章のゴール:試験の表記で書かれたプログラムを、Pythonの知識で読み解けるようになること。第1〜6章で身につけた力を、本番の紙面で使える形に仕上げる章です。
この章の進め方
これまでと少しちがい、「試験の表記で読む → Pythonに翻訳する → 実行して確かめる」をくり返します。自分の答えが合っているかを、自分の翻訳と実行で検証できるのがこの章の練習法です。
目次
  1. STEP 1 見比べる ― 対応表
  2. STEP 2 差がつく3か所 ― 翻訳ドリル
  3. エラー例 ― エラーが出ないのに答えがちがう!
  4. STEP 3 トレース道場 ― 手で追う
  5. STEP 4 ミニ模試 ― 空欄をうめる
  6. 過去問への橋渡し
  7. 自由実行スペース

STEP 1見比べる ― 対応表

共通テストのプログラミング問題は、Pythonではなく「共通テスト用プログラム表記」という日本語まじりの表記で出題されます。でも心配はいりません。順次・分岐・反復・配列という設計はPythonとそっくりで、下の対応表のとおり読み替えるだけです。しかも、記号や関数の意味は毎回問題の中で説明されます。暗記ではなく「読み替えの練習」がそのまま得点になります。

やりたいことPython(このサイト)共通テストの表記
表示するprint('合計は', goukei)表示する("合計は", goukei)
代入x = 3x = 3 (同じ!)
わり算17 / 5 → 3.417 / 5 (同じ)
商とあまり17 // 5 → 3
17 % 5 → 2
17 ÷ 5 → 3 (÷が「商」)
17 % 5 → 2 (同じ)
くり返しfor i in range(5):
iは0〜4。5は含まない
i を 0 から 4 まで 1 ずつ増やしながら繰り返す:
4を含む
もし〜ならif x >= 60:
elif x >= 30:
else:
もし x >= 60 ならば:
そうでなくもし x >= 30 ならば:
そうでなければ:
※「そうでなくもし」は情報Ⅰではまだ出題例がありません
くらべる== != < > <= >=まったく同じ。毎回、問題文に「== は両辺が等しいときに真」と説明がつく
かつ・またはandor英語のまま同じ。意味は毎回、問題文に説明がつく
入力n = int(input())
s = input()
n =【整数を入力】
s =【文字列を入力】
配列tokuten = [80, 92]Tokuten = [80, 92]
配列名は先頭が大文字添字は0から始まる年と1から始まる年があるので、問題文の最初で必ず確認する
関数len(a)random.randint(1, 6)要素数(Tokuten)乱数(1, 6) のような日本語名。使い方は問題文の説明枠に毎回書いてある
乱数() は情報Ⅰではまだ出題例がありません

字下げ(インデント)が「くり返しの中」「もしの中」を表すルールも同じです。試験の紙面では各行に (1) (2) のような行番号がつき、字下げの範囲が線で示されることもありますが、意味は今まで学んだとおりです。

例題 1

まずは1つ、読み替えを体験しましょう。次の「試験の表記」のプログラムを——

(1) Tokuten = [80, 92, 67] (2) goukei = 0 (3) i を 0 から 2 まで 1 ずつ増やしながら繰り返す: (4)   goukei = goukei + Tokuten[i] (5) 表示する("合計は", goukei)

Pythonに翻訳すると、こうなります。実行して、第5章でやった「合計の走査」と同じものだと確かめてください。

アラン先生
新しい言語に見えますが、順次・分岐・反復・配列という骨組みは全部同じですよ。プログラムの本質は「どう書くか」ではなく「どう動くか」です。みなさんはもう、この表記を読む力を持っているはずですよ。

STEP 2差がつく3か所 ― 翻訳ドリル

対応表のほとんどは「見ればわかる」読み替えですが、まちがいが多いのは決まって3か所です。1つずつ、翻訳の練習で体にしみこませましょう。

差分1 くり返しの「終わりの値」が含まれる

最重要ポイントです。試験の表記の「i を 1 から 4 まで」は4を含む(1, 2, 3, 4 の4回)。Pythonの range(1, 4)4を含まない(1, 2, 3 の3回)。だから翻訳するときは終わりの値に1を足して range(1, 5) と書く必要があります。

やってみよう 7-1

次の試験表記のプログラムをPythonに翻訳します。for文の1行を書き加えなさい。

(1) kaisu = 0 (2) i を 1 から 4 まで 1 ずつ増やしながら繰り返す: (3)   kaisu = kaisu + i (4) 表示する(kaisu)
<実行結果例>10
解答例を見る(まず自分で書いてから開きましょう)
kaisu = 0
for i in range(1, 5):
  kaisu = kaisu + i
print(kaisu)
1+2+3+4=10 です。もし range(1, 4) と書くと6になってしまいます。「〜まで、は含む。rangeは含まない」——この章でいちばん大事な1行です。

差分2 「÷」は商(Pythonの //)

試験の表記の ÷ は「商」、つまりPythonの // です。ふつうのわり算は試験でも /、あまりは試験でも %。第2章の「商とあまり」がここで効いてきます。

やってみよう 7-2

次は、17を5で割ったときの商とあまりを出す試験表記のプログラムです。これをPythonに翻訳します。2行を書き加えなさい。

(1) shou = 17 ÷ 5 (2) nokori = 17 % 5 (3) 表示する(shou, "あまり", nokori)
<実行結果例>3 あまり 2
解答例を見る(まず自分で書いてから開きましょう)
shou = 17 // 5
nokori = 17 % 5
print(shou, 'あまり', nokori)
÷/ と訳すと 3.4 になり、答えがずれます。÷を見たら //、と条件反射にしておきましょう。

差分3 見た目のちがい(表示する・配列名・日本語の関数)

残りは「見た目」の差です。表示する( )print( )、先頭大文字の配列名 Namae はPythonでは小文字 namae でかまいません。要素数( ) のような日本語の関数が出てきたら、問題文の説明枠を読んで len( ) のような知っている道具に置き換えます——第6章STEP2でやった「説明を読んで使う」練習そのものです。

やってみよう 7-3

仕上げに、次のプログラム全体を自分で考えてPythonに翻訳しなさい。

(1) Namae = ["あさひ", "つばさ"] (2) i を 0 から 1 まで 1 ずつ増やしながら繰り返す: (3)   表示する(Namae[i], "さん")
<実行結果例>あさひ さん つばさ さん
解答例を見る(まず自分で書いてから開きましょう)
namae = ['あさひ', 'つばさ']
for i in range(2):
  print(namae[i], 'さん')
「0から1まで」は2回なので range(2)。「終わりの値」と「見た目のちがい」——2つの差分が入った翻訳でした。ここまでできれば読み替えは合格です。

エラー例 ― エラーが出ないのに答えがちがう!

この章のこわさは、これまでとちがってエラーメッセージが出ないことです。翻訳をまちがえても、プログラムは動いて「ちがう答え」を出します。わざとまちがえて、事故の現場を見ておきましょう。

エラー例 1 終わりの値をそのまま range に書いた

やってみよう 7-1 と同じ「1から4まで」の合計を、range(1, 4) と訳してしまいました。正しい答えは10です。

何が起きたかを見る(実行してから開くこと)
エラーは出ず、6 と表示されます。最後の1回(i=4)が実行されず、正解の10より小さくなりました。本番でこれをやると、まちがった選択肢がちゃんと用意されています。「〜まで、は含む」を思い出して range(1, 5) に直しましょう。

エラー例 2 ÷ を / と訳した

「17 ÷ 5」(商なので正解は3)を、そのまま / で訳してしまいました。

何が起きたかを見る(実行してから開くこと)
これもエラーは出ず、3.4 と表示されます。トレース問題で「この時点の値は?」と問われたとき、3と3.4のどちらの選択肢もならんでいるのが本番です。÷//(商)——差がつくのはいつもここです。
ノイマン先生
いいかね、エラーが出るまちがいはまだ気付けるからいいんだ。本当にこわいのは、黙ってちがう答えを出すまちがいだよ。だからこそトレース——手で追って確かめることを徹底して、細かいミスをなくすんだ。

STEP 3トレース道場 ― 手で追う

共通テストで直接問われるのは「読む」力です。でも、その読む力は、自分で書いてきた経験からしか育ちません。その中心がトレース——1行ずつ実行したつもりになって、変数の値の変化を表に記録していく作業です。第4章で使ったトレース表を、今度は試験の表記で使います。

例題 2

次のプログラムは、配列の中の奇数だけを合計します。下のトレース表の「?」を、紙の上で(または頭の中で)うめてから、表の下の答え合わせに進んでください。

(1) Kazu = [3, 1, 4, 1, 5] (2) goukei = 0 (3) i を 0 から 4 まで 1 ずつ増やしながら繰り返す: (4)   もし Kazu[i] % 2 == 1 ならば: (5)     goukei = goukei + Kazu[i] (6) 表示する(goukei)
iKazu[i]奇数?goukei
(始まる前)0
033
11
24
3
4
トレース表の答えを見る(自分でうめてから開くこと)
上から順に、goukei は 0 → 3 → 4 → 4(4は偶数なので×、変わらない)→ 5(Kazu[3]=1、○)→ 10(Kazu[4]=5、○)。最後に表示されるのは 10 です。

本当に10になるか、Python訳を実行して確かめましょう。

やってみよう 7-4

次のプログラムは、となりどうしの差のいちばん大きいものをさがします(第5章STEP 6の [i-1] の技です)。まず紙でトレースして表示される値を予想し、それからPythonに自分で考えて翻訳・実行して、予想と合うか確かめなさい。

(1) Data = [2, 5, 3, 6] (2) saidai = 0 (3) i を 1 から 3 まで 1 ずつ増やしながら繰り返す: (4)   もし Data[i] - Data[i-1] > saidai ならば: (5)     saidai = Data[i] - Data[i-1] (6) 表示する(saidai)
解答例を見る(まず自分で書いてから開きましょう)
data = [2, 5, 3, 6]
saidai = 0
for i in range(1, 4):
  if data[i] - data[i-1] > saidai:
    saidai = data[i] - data[i-1]
print(saidai)
差は順に 3、-2、3。最大は 3 です。「1から3まで」なので range(1, 4)——差分1がここでも登場しました。

STEP 4ミニ模試 ― 空欄をうめる

本番の問題は「プログラムの空欄に入るものを選ぶ」形式です。ここでは本番風の小問を2つ。答えを決めてから、Pythonに翻訳・実行して自分で検証する——これがこのサイト流の模試です。

問 7-A

3つの商品の値段の平均を求めるプログラムである。空欄に入るものを選び、Python訳を完成させて確かめなさい。

(1) Nedan = [120, 80, 220] (2) goukei = 0 (3) i を 0 から まで 1 ずつ増やしながら繰り返す: (4)   goukei = goukei + (5) heikin = goukei / 3 (6) 表示する("平均は", heikin)

の選択肢:⓪ 2 ① 3 ② 4
の選択肢:⓪ Nedan ① Nedan[i] ② i

<実行結果例>平均は 140.0
解答を見る(実行して検証してから開くこと)
ア=⓪の2、イ=①のNedan[i] です。
nedan = [120, 80, 220]
goukei = 0
for i in range(3):
  goukei = goukei + nedan[i]
heikin = goukei / 3
print('平均は', heikin)
要素は3つ、添字は0〜2なので「2まで」(2を含んで3回)。もし①の3を選ぶと4回まわって配列の外に出てしまいます——エラー例1の逆パターンですね。
問 7-B(発展)

生徒6人の所属クラス(0組・1組・2組)から、各クラスの人数を数えるプログラムである。空欄に入るものを選び、Python訳を完成させて確かめなさい。

(1) Kumi = [1, 0, 2, 1, 1, 0] (2) Ninzu = [0, 0, 0] (3) i を 0 から 5 まで 1 ずつ増やしながら繰り返す: (4)   Ninzu[] = Ninzu[] + 1 (5) 表示する(Ninzu)

の選択肢:⓪ i ① Kumi[i] ② Ninzu[i]

<実行結果例>[2, 3, 1]
解答を見る(実行して検証してから開くこと)
ウ=①のKumi[i] です。
kumi = [1, 0, 2, 1, 1, 0]
ninzu = [0, 0, 0]
for i in range(6):
  ninzu[kumi[i]] = ninzu[kumi[i]] + 1
print(ninzu)
第5章の問5-5とまったく同じ「記録のパターン」でした。試験の表記になっても、中身は知っているパターン——これが実感できたら、この章は合格です。

過去問への橋渡し

ノイマン先生
いいかね、ここから先の教材は過去問そのものなんだ。表記の説明は毎回問題に載っているから、暗記は不要。時間を計って解き、まちがえた問題はこの章に戻って「3つの差分」のどれで転んだかを確かめる——それが最短の得点ルートだよ。
過去問を解くときの3か条
① まず全体をながめて「何を計算する話か」をつかむ(1行目から読み始めない)
② 空欄の行だけを見ず、前後の行とセットで読む
③ 決めた答えは、頭の中でトレースして(家ではPythonに翻訳・実行して)確かめる
アラン先生
空欄に何が入るか迷ったら、「第1〜6章のどのパターンか」を探してみてください。積み上げ、最大値さがし、記録、[i-1]……試験のプログラムは、必ずみなさんの知っているどれかの顔をしていますよ。ここまで自分の手で書いてきたのですから、大丈夫です。

自由実行スペース

思いついたことを自由に試すための場所です。過去問で見かけた試験表記のプログラムを、ここでPythonに翻訳して動かしてみるのがおすすめです。

ノイマン先生
これで全7章、完走だ。あとは過去問で場数を踏むだけ——健闘を祈っているよ。いいかね、本番で迷ったら思い出したまえ。君はぜんぶ、自分の手で書いてきたのだ。
実行環境を準備中…