プログラムは「読む」ものではなく「表を埋める」ものです。共通テスト情報Ⅰの第3問で点を落とす受験生の大半は、実力ではなく紙に書かなかったことで落としています。この講では、頭の中で追うのをやめて機械的に表を埋めるための手順を、再現できる形で固定します。
こんにちは、数強塾グループ代表の藤原進之介です。本記事は参考書『藤原進之介の最強120講義』第54講のWeb版です。共通テスト重要度はS。情報Ⅰのなかで、私が「ここが一番得点差になる」と考えている技術を扱います。
1. この講の問い と 結論
問いは1行です。プログラムを「読める」のに解けないのはなぜで、どうすれば「読める」を「解ける」に変えられるのか。
結論も短く書きます。行にステップ、列に変数を取り、1行ずつ機械的に値を書き出す。これをトレースといいます。トレース表を書けるかどうかが、第3問の得点をほぼ決めます。
2. なぜ頭の中で追うと溢れるのか
生徒に「このプログラム、読める?」と聞くと、たいてい「読めます」と返ってきます。ところが解かせると途中で止まる。読めているのに解けない。 この現象にはちゃんと理由があります。
プログラムを頭の中で追うとき、私たちは少なくとも次のものを同時に覚えていなければなりません。
- いまループの何周目か(ループ変数の値)
- 累積している値(合計・カウンタなど)
- いま見ている配列の要素の値
- 条件式が真だったか偽だったか
- そもそも何を求めようとしていたか
人間が同時に保持できるかたまりは、ごく少ない。変数が3つを超えたあたりで、最後の「何を求めていたか」が最初に飛びます。「あれ、何を数えてたんだっけ」と戻る。戻ると他の4つも一緒に消える。これが「読めるのに解けない」の正体です。
ですから対処は精神論ではありません。覚えるのをやめて、紙に置く。 頭は計算する係、紙は覚える係。役割を分けるだけです。
3. なぜ「表」でなければならないのか
紙に書けば何でもいいわけではありません。走り書きのメモではダメで、表でなければならない。理由は2つです。
理由1:列が固定されると、書き漏らしが目で見つかる。 表には空欄という概念があります。列を先に決めておくと、埋めていない箇所が視覚的に浮き上がる。メモ書きでは「書かなかったこと」は何の痕跡も残しません。
理由2:縦に読むと変化が見える。 表の本当の利益は、埋め終わったあとにあります。1列を上から下へ眺めると、その変数がどう動いたかが一目で分かる。「合計が途中から増えていない」「添字が1つずれている」といったバグは、横に読んでも見つからず、縦に読むと見つかります。
3-1. 列は「役割」で立てる
では列に何を並べるか。ここが本講で一番大事なところです。変数を全部書く必要はありません。役割ごとに1列立てます。役割は基本的に4種類です。
| 役割 | 何をする変数か | 典型的な名前 | 表での扱い |
|---|---|---|---|
| ループ変数 | 何周目かを数える | i, j, k | 一番左に置く。表の背骨 |
| 累積変数 | 値をため込む | goukei, kosu | 初期値の行を必ず作る |
| 参照値 | いま見ている要素 | Data[i] | ループ変数の隣に置く |
| フラグ/判定 | 真か偽かを持つ | owari, hantei | 真/偽を文字で書く |
この4分類には実用上の意味があります。ループ変数を一番左に置くと、行と周回が1対1で対応して迷子になりません。累積変数に初期値の行を作るのは、累積のバグの過半数が初期値(0にすべきかData[0]にすべきか)で起きるからです。参照値の列を作ると添字のずれが即座に見え、フラグを0と1で書かず真/偽と書くのは、数値と混ざって読めなくなるのを防ぐためです。
逆に、途中計算にしか使わない一時変数は列にしません。列が増えると表が横に伸びて、書くのが嫌になる。トレース表は、書き切れる大きさでなければ意味がありません。
3-2. どこで行を作るか(ブレークポイントの置き方)
もう1つの判断が「何行書くか」です。1文実行するごとに1行書いていたら試験時間内に終わりません。行を作る場所を先に決めておきます。 私の基準は次の3か所です。
- ループの入口(各周の先頭。ループ変数が更新された直後)
- ループの出口(ループを抜けた直後。最終値の確定点)
- 条件分岐の直後(真だったか偽だったかと、その結果変わった値)
この3か所は、後で見るとおり、プロがデバッガで一時停止させる場所とまったく同じです。「なんとなく気になったところで止める」のではなく、構造の切れ目で止める。 順次・分岐・反復のうち、分岐と反復の境目だけを見張れば、値が変わる瞬間は取り逃しません。制御構造そのものの話は第47講 アルゴリズムと流れ図で扱いました。あちらが表記の入門、この講は実行を追う技術です。
逆に言えば、順次(上から下へ流れるだけの区間)は行を作らなくていい。 ここを1文ずつ書いてしまう人が、時間切れになります。
3-3. 手順を6つに固定する
【トレース6手順】
- ゴールを紙に書く(最後に何の値を答えるのかを先に1行で)
- 列を決める(ループ変数 → 参照値 → 累積変数 → フラグ の順に左から)
- 初期値の行を書く(ループに入る前の状態。ここを飛ばさない)
- 1周ごとに1行(ループの入口で行を作る)
- 分岐は真/偽を先に書き、値の更新を後に書く
- 抜けた行に印を付ける(最終値が答えか、途中の値が答えかを混同しない)
「なんとなく読む」を「機械的に埋める」へ変えるのが、この6手順です。再現できることが肝心で、調子が悪い日でも同じ手が打てるから試験で効きます。
4. 手で確かめる
ここからは実際に表を埋めます。以下のプログラムはすべて私の自作で、同じ処理をPythonで実行し、最終値が一致することを確認済みです。表記は大学入試センター「令和7年度大学入学共通テスト 試作問題『情報』の概要」(2022年11月9日公表、令和4年12月23日一部訂正)第5節の例示に従っています。配列名は先頭を大文字にし、添字は特に説明がなければ0から始まる。この2点は覚えておいてください。
例1:累積和のループ
Data = [12, 7, 25, 4]
goukei = 0
i を 0 から 3 まで 1 ずつ増やしながら繰り返す:
| goukei = goukei + Data[i]
表示する(goukei)
ゴールは最後に表示される goukei。列は i(ループ変数)/Data[i](参照値)/goukei(累積変数)の3本です。
| ステップ | i | Data[i] | goukei |
|---|---|---|---|
| 開始(ループ前) | − | − | 0 |
| 1周目 | 0 | 12 | 12 |
| 2周目 | 1 | 7 | 19 |
| 3周目 | 2 | 25 | 44 |
| 4周目 | 3 | 4 | 48 |
答えは48(Python実行結果も48で一致)。注目してほしいのは1行目です。「開始」の行を書かないと goukei = 0 という初期値がどこにも残りません。初期値の行は、面倒でも必ず書く。
例2:配列の最大値探索
Data = [23, 47, 15, 47, 8]
saidai = Data[0]
ichi = 0
i を 1 から 4 まで 1 ずつ増やしながら繰り返す:
| もし Data[i] > saidai ならば:
| | saidai = Data[i]
| | ichi = i
表示する(saidai, ichi)
最大値と、その位置を求めます。判定の列を必ず立てるのがコツです。
| ステップ | i | Data[i] | Data[i] > saidai | saidai | ichi |
|---|---|---|---|---|---|
| 開始 | − | − | − | 23 | 0 |
| 1周目 | 1 | 47 | 真 | 47 | 1 |
| 2周目 | 2 | 15 | 偽 | 47 | 1 |
| 3周目 | 3 | 47 | 偽 | 47 | 1 |
| 4周目 | 4 | 8 | 偽 | 47 | 1 |
答えは saidai = 47、ichi = 1(Python実行結果と一致)。3周目を見てください。Data[3] は 47 で saidai も 47。47 > 47 は偽なので ichi は更新されません。ここで > を >= に変えると、同じデータで ichi = 3 になります(これも実行して確認しました)。
同じ最大値でも、最初の位置を答えるか最後の位置を答えるかが1文字で変わる。 共通テストの選択肢は、まさにこの1文字を入れ替えて並べてきます。判定の列を書いていれば「ここが偽だから更新されない」と目で確認できますが、頭の中で追うと必ず取り違えます。条件式の真偽そのものについては第43講 論理演算とベン図で扱いました。
初期値の罠も見ておきます。saidai の初期値を Data[0] ではなく 0 にしたとしましょう。データが [-5, -12, -3, -40] のように全部負のとき、どの要素も0より大きくないので答えが0になってしまう(実行して確認済み)。正しくは -3 です。初期値の行を書く習慣は、こういう事故を目に見えるようにします。
例3:二重ループ
Data = [3, 1, 4, 1]
kosu = 0
i を 0 から 2 まで 1 ずつ増やしながら繰り返す:
| j を i+1 から 3 まで 1 ずつ増やしながら繰り返す:
| | もし Data[i] + Data[j] == 5 ならば:
| | | kosu = kosu + 1
表示する(kosu)
和が5になる2要素の組が何組あるかを数えます。二重ループでは内側の1周を1行にし、外側の i は左端に書き続けます。
| 手順 | i | j | Data[i] | Data[j] | 和 | ==5 | kosu |
|---|---|---|---|---|---|---|---|
| 開始 | − | − | − | − | − | − | 0 |
| 1 | 0 | 1 | 3 | 1 | 4 | 偽 | 0 |
| 2 | 0 | 2 | 3 | 4 | 7 | 偽 | 0 |
| 3 | 0 | 3 | 3 | 1 | 4 | 偽 | 0 |
| 4 | 1 | 2 | 1 | 4 | 5 | 真 | 1 |
| 5 | 1 | 3 | 1 | 1 | 2 | 偽 | 1 |
| 6 | 2 | 3 | 4 | 1 | 5 | 真 | 2 |
答えは kosu = 2(Python実行結果と一致。内側ループの実行回数も6回で一致)。
二重ループで一番効くのは行数を先に見積もることです。この例は i が 0, 1, 2 と動き、j は毎回 i+1 から 3 まで。だから 3回+2回+1回=6行。先に「6行になるはずだ」と分かっていれば、5行で終わったときに「1行足りない、どこかで j を飛ばした」と気づけます。行数は自分の答え合わせに使えます。
もし内側が「j を 0 から 3 まで」だったら4×3=12行になり、同じ組を2回ずつ数えてしまう。「j を i+1 から」と書いてある理由は、表を書けば1秒で分かります。手で確かめる姿勢そのものは第40講 2進数・10進数・16進数の変換から一貫して同じです。
5. 共通テストではこう出る(重要度 S)
5-1. 第3問は3段構成になっている
第3問(プログラミング)は例年25点。知識で埋まらない大問です。2026年度本試験の第3問は、文化祭の待ち時間を題材に、問1で図表を使って時刻と待ち時間の関係を整理し(プログラミング言語を使わない段階)、問2でその計算を配列でどう表すかを穴埋めし、問3で処理回数を減らす改良を考える、という3段構成でした(予備校各社の設問別分析による。2026年8月時点。問題文・コード・選択肢は転載しません)。
この構造は毎年ほぼ同じで、①の段階でトレースが効きます。 問1は「プログラムを読む問題」ではなく、手で数例作って規則を見つける問題です。ここで具体的な数を3つ4つ入れて表にしてみれば、問2で作るべき式が自分の表の中に既にある。逆に問1を勘で埋めると、問2は根拠のない選択になります。問1はトレースの練習問題として出ていると思ってください。
5-2. 選択肢代入法
穴埋めでは次の戦法が強い。選択肢を1つずつ空欄に入れて、小さいデータでトレースする。 遠回りに見えて最短です。理由は、選択肢が「もっともらしい間違い」で作られているからです。
- 添字が1ずれている(Data[i] と Data[i-1])
- 比較が > と >=
- ループの終わりが kazu と kazu-1
- 初期値が 0 と Data[0]
どれも読んだだけでは区別がつきません。 値を入れて動かして初めて差が出る。2026年度の問2も「来訪者本人と直前の来訪者のそれぞれにどの添字が対応するか」が焦点だったと分析されています。まさに添字のずれで、ここは読解ではなく作業で決着します。代入するデータは極端に小さく。要素3つか4つ、人数なら2人か3人です。大きいデータで確かめようとするのが時間切れの最大の原因です。
5-3. 時間配分
試験は60分・100点、大問4題。2026年度はマーク数が前年の51から60に増えました(予備校各社の分析による。2026年8月時点)。単純計算で1マーク1分を切っています。
| 大問 | 配点 | 目安 | 方針 |
|---|---|---|---|
| 第1問 小問集合 | 20 | 10分 | 知識で即答。迷ったら飛ばす |
| 第2問 | 30 | 15分 | 図表の読み取りに時間を使いすぎない |
| 第3問 プログラミング | 25 | 18分 | 問1に5分かけてよい |
| 第4問 データの活用 | 25 | 15分 | 計算は最後 |
| 見直し | − | 2分 | マークずれの確認 |
第3問に18分、そのうち問1に5分使ってよいというのが私の考えです。問1は配点が小さく見えますが、ここで作った表が問2・問3の土台になる。問1を急いで問3で詰まるのが最悪のパターンです。そして最も大事な原則を1つ。トレース表を書く時間は、削ってはいけない時間です。 頭で追って外した問題は原因が残りませんが、表を書いて解けなかった問題は次に活かせます。
6. 情報Ⅱではこうなる
6-1. 情報Ⅰでは「力」、情報Ⅱでは「技能」
ここが本講の一番面白いところです。制度の文章を並べると、扱いの差がはっきり見えます。高等学校学習指導要領(平成30年告示)解説 情報編の情報Ⅰ (3)イ(イ) にはこうあります。
アルゴリズムを表現する方法を選択し正しく表現する力,アルゴリズムの効率を考える力,プログラムを作成する力,作成したプログラムの動作を確認したり,不具合の修正をしたりする力を養う
文部科学省「高等学校学習指導要領(平成30年告示)解説 情報編」平成30年7月(該当箇所は解説p.32相当)
「動作を確認する」「不具合を修正する」とは書いてある。しかし方法は一切書かれていません。 しかもこれは「知識及び技能」ではなく「思考力,判断力,表現力等」の側、つまり「力を養う」という書き方です。一方、情報Ⅱ (4)ア(ウ) ではこうなります。
プログラムの誤りを見つけて手直しをする方法などについて理解し,必要な技能を身に付けるようにする。その際,プログラムの誤りを発見するために変数の値を表示してチェックする簡便な方法や,それを実現するためのソフトウェア等を使用する方法などについて理解し,必要な技能を身に付けるようにする
同上(該当箇所は解説p.55相当)
「変数の値を表示してチェックする」──これはトレースそのものです。 情報Ⅰでは名前すら与えられなかった作業に、情報Ⅱでは名前と道具(デバッガというソフトウェア)が与えられ、「力を養う」から「理解し,技能を身に付ける」へ格上げされます。
ついでに言うと、文部科学省の「情報Ⅰ」教員研修用教材 第3章(プログラミングの章)を全文検索しても、「トレース」という語は1度も出てきません。 「デバッグ」も1か所だけで、それも「中学校の技術・家庭科で、プログラムの制作、動作の確認及びデバッグができることが示されている」という中学校との接続の説明です。つまり制度上、デバッグは「中学校で済ませたこと」として扱われ、高校の情報Ⅰでは方法として教え直されない。だから受験生は方法論を持たないまま第3問に入ることになる。 この講が存在する理由はそこにあります。
6-2. 情報Ⅱでは、トレースが「工程」になる
文部科学省「情報Ⅱ」教員研修用教材 第4章「情報システムとプログラミング」(令和2年6月)を見ると、この講でやったことが開発工程として制度化されているのが分かります。第4章は学習19〜25の7つで構成され、そのうち学習23「分割したシステムの制作とテスト」と学習24「分割したシステムの結合とテスト」が本講の続きです。学習23は研修の目的として「単体プログラムをテストする方法について理解する」「単体プログラムをデバッグする方法について理解する」を明記しています。
まず、テストが設計されるものになります。 単体テストは「作成したプログラムが内部設計の仕様を満たしているかどうか,また正常に機能するかどうかを確かめるテスト」と定義され、テストデータを勘で選ばない方法が示されます。
| 考え方 | 中身 | 教材の例 |
|---|---|---|
| 命令網羅 | 全ての命令が1回以上実行されるか | ホワイトボックステスト側 |
| 分岐網羅 | 全ての分岐を通るか | 「どの分岐も通らない場合」も設計に入る |
| 同値分割 | 入力を同値クラスに分け各1つだけ試す | 図書館の貸出システム |
| 境界値分割 | クラスの上限・下限とその隣を試す | 貸出14日後と15日後 |
教材の例は図書館の貸出システムです。6月1日に貸し出し、返却期限は2週間。「貸出の当日」「2週間以内」「2週間を越えている」の3クラスに分け、2週間以内のクラスに6月7日と6月10日という候補があるなら同値クラスなのでどちらか1つだけ試せばよいと説明されます。境界値は「ちょうど14日後」と「15日後」。これは受験生にも実用的な話で、選択肢代入法で使う小さいデータの選び方が、まさにこれです。感覚でやっていたことに、情報Ⅱでは名前が付きます。
次に、デバッグに手順が与えられます。 同じ学習23にはこうあります。
デバッグの工程は大きく次の2つに分けられる。・エラーの性質と場所を特定すること ・エラーを修正すること
文部科学省「高等学校情報科『情報Ⅱ』教員研修用教材」第4章(令和2年6月、該当箇所はp.218相当)
「場所の特定」と「修正」を分ける。 これは受験生にもそのまま効きます。間違えた問題で最初にやるべきは答えの訂正ではなく、表のどの行でずれたかの特定でした。同じ構造です。そして場所を特定する手法として、教材は「プログラム中に表示命令を散りばめてデバッグ用メッセージを出力する」「デバッガでプログラム中の変数をトレースしたり、プログラムの任意の箇所で一時停止させるブレークポイントと呼ばれる処理を追加したりできる」ほか、帰納法(正常終了・異常終了の双方のデータを集め、パターンから仮説を立てる)、逆戻りで考える(正しくない結果を返している箇所から逆順にたどり、各箇所で変数が持たなければならなかった値と実際の値を突き合わせる)、テストケースの利用を挙げています。
「トレース」と「ブレークポイント」という語が、ここで初めて公的な教材に登場します。私が3-2で「ループの入口・出口・分岐の直後で行を作れ」と言ったのは、デバッガでブレークポイントを置く場所そのものです。 紙の上でやっているのは、プロが道具でやっていることの手動版なのです。「逆戻りで考える」も受験生がすぐ使えます。選択肢が絞れないとき、答えとして表示される最後の値から逆に、その1つ前に何が入っていなければならないかを詰めていく。 前から追うのと後ろから追うのは別の技で、両方持っていると強い。
さらに学習24では、単体テストを終えたモジュールを組み合わせる結合テストに進みます。「ここで結合するモジュールは単体テストが終わっていることが前提」とされ、呼び出す相手がまだ完成していないときはスタブ、呼び出してくれる相手がいないときはテストドライバというダミーを用意します。情報Ⅰのトレースは「1本のプログラムを1人で追う」作業でしたが、情報Ⅱでは「複数人が別々に作った部品を正しくつなぐ」作業になる。追う対象が、手続きからシステムへ広がります。
6-3. 対比でまとめる
| 情報Ⅰ | 情報Ⅱ | |
|---|---|---|
| 位置づけ | 動作を確認し不具合を修正する「力」 | 誤りを見つけて手直しする「方法」を理解し技能を身に付ける |
| 道具 | 紙と鉛筆(教材に手法の記述なし) | デバッガ・ブレークポイント・テストコード |
| 対象 | 1本のプログラム | 単体プログラム → モジュール → システム全体 |
| テストデータ | 自分で小さい例を作る | 同値分割・境界値分割で設計する |
| 名前 | (なし) | 単体テスト・結合テスト・デバッグ |
トレースは、情報Ⅰでは受験テクニックの顔をしています。しかし正体は、情報Ⅱでソフトウェア開発の工程として制度化されている技術の、いちばん手前の一歩です。共通テストのために覚える表の書き方が、そのまま職業的な技術の入口になっている。第3問のために表を書く受験生は、遠回りをしていません。
まとめ
- 変数が3つを超えると頭では追えない。覚えるのをやめて紙に置く。
- 列は役割で立てる(ループ変数・参照値・累積変数・フラグ)。ループ変数は一番左。
- 行はループの入口・出口・分岐の直後で作る。順次の区間では作らない。
- 初期値の行を必ず書く。累積のバグの過半数は初期値で起きる。
- 穴埋めは選択肢を1つずつ入れ、極端に小さいデータでトレースして決着させる。
- 情報Ⅱでは、これが単体テスト・同値分割・境界値分割・デバッグという工程になる。
この講のシリーズ全体は情報Ⅰ 最強120講義から読めます。
出典(すべて2026年8月3日に取得)
- 文部科学省「高等学校学習指導要領(平成30年告示)解説 情報編」平成30年7月
- 文部科学省「高等学校情報科『情報Ⅱ』教員研修用教材」第4章 情報システムとプログラミング(令和2年6月)
- 文部科学省「高等学校情報科『情報Ⅰ』教員研修用教材」第3章 コンピュータとプログラミング(令和2年)
- 大学入試センター「令和7年度大学入学共通テスト 試作問題『情報』の概要」2022年11月9日公表(令和4年12月23日一部訂正)
- 設問構造・マーク数の分析:Z会および東進の2026年度共通テスト分析(二次情報。設問構造の説明にのみ使用し、問題文・選択肢は転載していません)
執筆:藤原進之介(数強塾グループ代表)
オンライン数学専門塾「数強塾」代表。累計3,500名以上の中高一貫校生を指導。東進ハイスクール・東進衛星予備校・代々木ゼミナールなど出講実績あり。情報Ⅰの参考書を複数執筆しており、KADOKAWA『ゼロから始める情報I』、Gakken『きめる!共通テスト 情報Ⅰ』などがあります。本記事は参考書『藤原進之介の最強120講義』第54講のWeb版です。
「第3問がどうしても時間内に終わらない」という方へ
数強塾では数学と情報Ⅰの両方に対応したオンライン個別指導を行っています。学習相談は無料、体験授業は3,000円(税込)でお受けしています。
