情報Ⅰのプログラミング読解|配列と繰り返しを手で追う

情報Ⅰのプログラミング読解|配列と繰り返しを手で追う

「文法は覚えたのに、共通テスト情報Ⅰのプログラムを読むと途中で数字が分からなくなる」。その原因は、プログラミングの才能ではなく、変数・配列・反復を同時に頭の中で処理しようとしていることかもしれません。この記事は解説を読むだけではなく、実際に手を動かして実行結果を再現する授業です。高校2年生が手元の紙1枚で取り組めるよう、例題はすべて本記事用に作りました。大学入試センターの過去問を転載したものではありません。

目次

シェア:

最初の結論――「コードの意味を読む」のと「値を追う」のは別作業

共通テスト型のプログラム読解では、まず「この処理は何をしたいか」を把握し、次に「実際にどの順番でどの値へ変わったか」を確かめます。最初から完成した答えを予測すると、一回目のループで合っていても三回目で崩れます。紙に変数表を作り、代入のたびに数値を書き換える。これが最も再現性の高い基本です。実際の出題形式は年度ごとの大学入試センター公表資料を優先してください。

実習1:変数の上書きを見落とさない

次の処理を考えます。x ← 3、y ← 7、x ← x+y、y ← x-y、x ← x-y。最終的なx、yはいくつでしょうか。初めに「xとyの値を交換している」と気づけたとしても、計算過程を追い切れなければ似た問題で間違えます。初期状態は(x,y)=(3,7)。3行目で(10,7)、4行目で(10,3)、5行目で(7,3)。つまり値が入れ替わります。

ここで重要なのは「←」の意味です。右側の式を現在の値で評価し、その結果を左側に代入します。数学の等号と混同して「x=x+yという方程式はおかしい」と考えると最初から迷います。たとえば「x ← x+2」が3回行われたら、xは元の値から6増えます。右辺に現れるxは更新前の値であり、左辺のxは更新後の値です。

一行トレースの練習として、a←4、b←2、a←a×b、b←a+b、a←b-aの実行結果も解いてみましょう。答えは(a,b)=(2,10)。途中は(4,2)→(8,2)→(8,10)→(2,10)です。最後だけ当たっても、表の各行を正確に書けなければ本番の安定性にはつながりません。

実習2:繰り返しの境界を確認する

「iを1から4まで1ずつ増やし、sumにiを加える」。sumの初期値が0なら結果は10です。表を作ると、i=1の終了後sum=1、i=2で3、i=3で6、i=4で10。ここで「4回実行した」ことと「最後にiがいくつになるか」は擬似言語の仕様によって表記が異なります。必ず問題文にある反復範囲と終了条件を確認しましょう。

もう少し難しくします。iを0から4までとし、「iが偶数のときだけcountを1増やす」なら、条件を満たすのは0、2、4の3回です。「0を数え忘れる」「4を範囲に含めない」「countの初期値を1と思い込む」の3つが典型的なずれです。テストでは0始まりの配列が出る可能性もあるため、問題文に示された添字の約束を最優先します。

単純な練習を5回連続で正答するまで次へ進まない方が、難問を何問も眺めるより効果的です。毎回、開始値・終了値・増加量・更新処理を独立して記録してください。特に「iを1ずつ増やす」のか「iを2ずつ増やす」のかは、問題の見た目が同じでも結果を大きく変えます。

実習3:配列の添字が一つずれるだけで答えが変わる

例として、1番目から順にA=[6,2,9,4,7]という5個の要素を持つ配列を考えます。ここでは「最初の要素をA[1]と呼ぶ」というルールを明示します。A[3]は9です。A[2]+A[5]は2+7=9です。添字を0から数える形式なら意味が変わるので、慣れで決めてはいけません。

次の処理は、配列から最も大きい値を見つける基本形です。max←A[1]とし、iを2から5まで動かして「もしA[i]>maxならmax←A[i]」とします。i=2では2>6は偽、max=6のまま。i=3では9>6が真、max=9。i=4で4>9は偽、i=5で7>9は偽。答えは9です。これを「最大値探索」と名前だけで覚えていても、「等号を含むか」「比較する値が更新されるか」を問われると対応できません。

さらに比較条件を「A[i]≧max」へ変えた場合、最大値そのものは同じですが、最大値を持つ添字も同時に記録しているプログラムでは結果が変わることがあります。たとえばB=[5,8,8,1]で、更新条件が「>」なら最初の8の位置を、更新条件が「≧」なら最後の8の位置を保存します。目的によって正解となる実装が異なることが分かります。

実習4:入れ子のループを「外側一回ずつ」に分ける

外側のiを1から3、内側のjを1から2とし、毎回「value←10×i+j」を実行して出力するとします。出力は11、12、21、22、31、32の順です。ありがちな誤答は11、21、31、12、22、32。これは内側のjを固定したまま外側を全部回してしまう読み違いです。

「内側が何回動くか」を先に囲み、外側のi=1の間にj=1→2、次にi=2の間にj=1→2、と小さく分解します。二重ループでも三重ループでも基本は同じです。変数表にi、j、valueという三列を作り、値が変わる順番を書いてください。試験時間を意識して途中式を省くのは、正しい手順が身についてからで十分です。

ここに条件分岐を加え、「i+jが偶数の場合だけ出力」とします。組合せを順に調べると(1,1)→11、(1,2)は出力なし、(2,1)は出力なし、(2,2)→22、(3,1)→31、(3,2)はなし。出力は11、22、31。コードが複雑に見えるのは処理が重なっているからで、変数表では一つひとつの操作に還元できます。

誤答分析:実際には何を間違えているのか

間違いを「プログラムが苦手」とまとめると次の勉強が決まりません。誤りは少なくとも六つに分類できます。代入前の値と代入後の値の混同、繰り返し回数の数え違い、添字の開始位置の見落とし、条件式の真偽の判断違い、ループのネストの取り違え、そしてプログラム全体の目的の誤解です。たとえば同じ「答えが1ずれた」でも、原因が0始まりなのか終了条件が<か≦かなのかで修正課題は変わります。

誤答ノートには設問番号だけでなく「誤った直前の一行」を必ず記録します。「i=4でループが終わると思ったが、実際は4も実行した」のように、自分の勘違いを動作として説明できる形にします。解説を読んで分かったつもりでも、何も見ずに別の数値で再実行できなければ完成ではありません。

高2の14日間:コードを「書く」前に正確に「読む」

1〜3日目は代入だけを各日15分、式の評価順序を練習します。4〜6日目は単一ループで開始値・終了値・増分・合計を変えます。7〜9日目は配列の最大値・個数・合計を解きます。10〜11日目は条件分岐を含む配列走査。12〜13日目は二重ループ。14日目には初見問題を時間を測って解き、自分の誤りを六分類します。これは一つの学習例であり、学校進度や他科目との兼ね合いで調整してください。

毎回の終了条件は「解説を読めた」ではなく、「動作を表で再現できた」「数字を変えても説明できた」「似た題材で境界を見落とさない」の三つです。特に情報Ⅰは知識用語を暗記する勉強と問題文を読み解く勉強が混ざる科目です。プログラミングの得意不得意を早々に決めつける必要はありません。

追加実習:配列の「個数」と「合計」を同じループで求める

次の配列C=[3,8,5,10,4,9]で、「6以上の値だけを集計する」としましょう。ここではC[1]が3で、C[6]が9という添字の約束を使います。sum←0、count←0として、iを1から6まで動かし、C[i]≧6なら「sum←sum+C[i]」「count←count+1」をこの順に行います。途中を列挙すると、i=1では更新なし。i=2でsum=8、count=1。i=3では更新なし。i=4でsum=18、count=2。i=5では更新なし。i=6でsum=27、count=3です。したがって条件を満たす値の平均は27÷3=9となります。

ここで「平均←sum÷count」をループの中に置くプログラムと、ループの外に置くプログラムは意味が違います。前者なら各周回で平均を計算し、後者なら最後の集計結果から一度計算します。さらに、条件を満たす要素がゼロ個ならcount=0です。sum÷countはゼロ除算になるため、実際のプログラムでは「countが0より大きい場合のみ平均を求める」という条件が必要です。設問ではこの例外条件が用意されているかを確認してください。

設問を一つ作り替えてみます。条件を「6より大きい値」に変えたら、配列の中の6があれば結果が変わります。しかし今回の配列には6が含まれていないため、結果は変わりません。条件式を変えても結果が変わらないデータでは、プログラムの誤りを発見できないことがあります。だからテストでは境界値を含むデータを追加するのが有効です。

境界値テスト――「通ったから正しい」わけではない

ある入場料計算プログラムが「12歳未満は子ども料金」と判定するとします。テストに8歳と18歳だけを使い、どちらも期待どおりなら安心でしょうか。12歳ちょうどの場合に誤りが残っていても気づきません。境界の一つ下、ちょうど、ひとつ上である11・12・13歳を使えば「<12」と「≦12」の違いが分かります。

同様に配列では要素が1個の場合、空の場合、同じ値が重複する場合、最大値が先頭・末尾にある場合を試します。最小値を探すプログラムで初期値を0にしてしまうと、正の数だけの配列で0が最小値だと誤判定するかもしれません。最初の要素を初期値にする方法はこの問題を避ける基本例です。ただし空配列なら最初の要素がないため、別の処理が必要です。

共通テスト形式では直接「単体テスト」という名前を問わなくても、どの入力ならプログラムの特徴や不具合を明らかにできるかを考えさせる可能性があります。コードを追跡する練習の次に、コードを疑う練習を入れると理解が一段深くなります。

探索アルゴリズムの違いを動かして理解する

配列D=[4,7,2,7,9]から値7を探すとします。先頭から順に比較する線形探索なら、i=1で4は不一致、i=2で7が一致します。「最初に見つかった位置」を返すなら答えは2です。しかし最後まで探索して、一致するたび位置を更新するプログラムなら答えは4になることがあります。両方の実装はどちらかが必ず間違いというわけではありません。求める仕様が「最初の位置」か「最後の位置」かで変わります。

次に整列済みの配列E=[2,4,6,8,10,12,14]から10を探す場合、中央の8を見て右半分へ進み、次の10を見つけるような二分探索が使えます。ただし整列されていない配列に同じ探索手順を適用すると、途中で候補を捨てた根拠が成立しません。アルゴリズムが効率的に動く条件は、コードの外にある「入力の前提」にも依存します。

この二つを比べるとき、「二分探索は常に速い」と断言するのではなく、配列が整列済みであること、データ数、整列そのものにかかる手間を考えます。試験の文章で「事前に昇順に並べられている」と書かれているのは単なる飾りではありません。

反復からの脱出と「出力の時点」を間違えない

例えばfound←falseとし、配列を先頭から順に調べて7が見つかった時点でfound←trueとして反復を終了する処理を考えます。Dではi=2で止まるため、4番目の7は見に行きません。ところが繰り返しの外で「最後に調べたi」を表示するならi=2が答えでも、「発見した回数」を返す処理なら1回となります。似た変数が登場しても意味は異なります。

さらに「出力」をループの中に置くか外に置くかで、出力される回数が変わります。i=1から4までsumにiを加えた直後にsumを出力すれば1、3、6、10の4つが表示されます。ループが終わった後に一度だけ出力すれば10だけです。試験問題が「画面に順に表示された数字」を問うのか「最終的な変数の値」を問うのか、設問を最初に確かめましょう。

トレース表の書式――必要な列だけを作る

紙にすべての変数を並べると、大問によっては時間を使いすぎます。初めは「繰り返し変数」「判定に使う値」「更新される変数」「出力」の4列を基本として、値が変わらない定数を省略する方法が考えられます。たとえば配列Eを走査して偶数の合計を出す処理なら、i・E[i]・条件の真偽・sumの4列で十分なことがあります。配列そのものは問題文にあるなら、毎行書き写す必要はありません。

表の利用目的は「丁寧に書くこと」ではなく、頭の中で同時に保持する情報を減らすことです。表を何十行も書かなければならない場合は、規則を見つけられないか考えます。たとえば1から100までの合計を1行ずつ計算するより、問題で許されるなら数列の規則を利用した方が速いでしょう。正確な追跡力を身につけた後で、規則を使う効率化へ進みます。

学びを確かめる自作ミニテスト

問題1。F=[1,3,3,6,9]について、2以上かつ6未満の個数はいくつか。答えは2で、3が二つ該当します。問題2。同じ配列から最大値を探索し、最大値と同じ値が現れたら添字を更新する場合、最大値が二つある配列では先と後のどちらの位置になるか。最後の位置です。問題3。合計0・個数0で始めて「条件を満たした要素の平均」を出す処理では、要素数0の場合に何を確認すべきか。ゼロ除算を避ける条件です。

できれば、これらの答えを丸暗記せず、配列の値を自分で変更して再テストしてください。「同じ説明を別の数字で再現できるか」が、問題集の解説を理解したつもりかどうかを見分ける基準です。

よくある質問

Q.Pythonの文法を全部覚える必要はありますか。A.実際の試験は問題で示される疑似コードの仕様を理解することが基本です。特定の言語を学ぶことは理解の助けになりますが、文法暗記だけではトレース力は身につきません。

Q.プログラムを実行する環境が必要ですか。A.手計算による追跡を優先し、答え合わせに実行環境を使う順番がおすすめです。最初から実行結果だけを見てしまうと、自分のどの推論がずれたか分かりにくくなります。

Q.一番短時間で点数が伸びるのはどの部分ですか。A.個人差があります。特に変数の更新・条件分岐・配列の添字が混ざるところで誤答するなら、同じ論点を数値だけ変えて繰り返す方が有効です。

まとめ――試験会場で再現できる技術に変える

プログラミングの設問が難しく感じるときほど、処理を少なく分けて紙に書きます。疑似コードの約束を読み、初期値を確認し、実行順を追い、終了時点の値を確かめる。この方法が定着したら、大学入試センターが公表する過去問の該当箇所で、数値の追跡と問題設定の理解を一緒に確かめましょう。学校や塾で相談するなら「プログラム全体が分からない」ではなく、自分が見失った一行と表を持参すると指導が具体的になります。

参考資料:大学入試センター「過去3年分の試験問題」https://www.dnc.ac.jp/kyotsu/kakomondai/index.html /文部科学省「情報Ⅰ」教員研修用教材(第3章)https://www.mext.go.jp/a_menu/shotou/zyouhou/detail/1416756.htm

あわせて読みたい記事

情報Ⅰの他の分野と、共通テスト全体の時間設計もあわせて確認しておくと、得点が安定します。

現論会で相談するときに持ってくるとよいもの

現論会で相談する場合も、次のものを持ってくると、情報Ⅰの弱点を具体的にできます。

1.直近の模試の情報Ⅰの結果
2.間違えた問題と自分の解答
3.学校で使っている教材
4.履修済みの単元
5.苦手だと感じる分野
6.1週間に使える時間

相談では、失点を6分類に分け、次に解く問題の順番まで決めます。

この記事を読んだ人はこちらも読んでいます

情報Ⅰの読解を、無料で一緒に整理しませんか?

模試の結果と学校教材をもとに、次に練習する単元を整理します。

現論会 大阪梅田校

中津駅から徒歩1分。京大・阪大・医学部志望の生徒が多い、大阪の校舎です。

現論会 四条烏丸校

四条烏丸駅から徒歩すぐ。京都・滋賀から通いやすい立地の校舎です。

現論会 茨木校

阪急茨木市駅から徒歩1分。阪大・神大・公立大を目指す北摂の高校生が通っています。

この記事が役に立ったらシェアしてください