トレース表の書き方
まず結論
科目Bの擬似コード問題は「トレース表」を書きながら解くのが唯一の確実な方法です。全ての変数を列にして、1行ずつ実行するたびに値を書き込む。頭だけで追おうとすると必ず間違えます。これが科目B突破の核心スキルです。
トレース表のイメージ
例:goukei←0 / i を 1 から 3 まで繰り返す / goukei ← goukei + i
変化した値を都度書き込む。変わっていない変数は前の行の値をそのまま引き継ぐ。
トレース表の書き方(手順)
1
登場する変数を全て列挙する
コードを最初に流し読みして変数名を全部書き出す(i, j, tmp, max, count…)
2
表の列に変数名を並べる
「行番号」「実行内容」「変数1」「変数2」…という列の表を紙に書く
3
初期値を1行目に記入する
「←」による代入文で初期値が確定したらすぐに書く
4
1行ずつ実行して変化した変数だけ更新する
変わった値を書き込み、変わっていない変数は前の行の値をそのまま使う
5
ループ終了条件を毎回確認する
ループ条件が偽になった瞬間を見逃さない。そこがループの出口
実例1:フィボナッチ数列
a ← 1
b ← 1
i を 1 から 5 まで繰り返す
c ← a + b
a ← b
b ← c
繰り返し終わり
b を表示する
| i | c = a+b | a ← b | b ← c |
|---|---|---|---|
| (初期) | — | 1 | 1 |
| 1 | 1+1=2 | 1 | 2 |
| 2 | 1+2=3 | 2 | 3 |
| 3 | 2+3=5 | 3 | 5 |
| 4 | 3+5=8 | 5 | 8 |
| 5 | 5+8=13 | 8 | 13 |
出力は13(フィボナッチ数列の8番目の値)
実例2:最大値と最大インデックスを求める
a ← {3, 8, 2, 9, 5}
max ← a[1]
maxIdx ← 1
i を 2 から 5 まで繰り返す
もし a[i] > max ならば
max ← a[i]
maxIdx ← i
もし終わり
繰り返し終わり
maxIdx を表示する
| i | a[i] | a[i]>max? | max | maxIdx |
|---|---|---|---|---|
| (初期) | — | — | 3 | 1 |
| 2 | 8 | 8>3 真 | 8 | 2 |
| 3 | 2 | 2>8 偽 | 8 | 2 |
| 4 | 9 | 9>8 真 | 9 | 4 |
| 5 | 5 | 5>9 偽 | 9 | 4 |
出力は4(最大値9がインデックス4にある)
実例3:二重ループのトレース
count ← 0
i を 1 から 3 まで繰り返す
j を 1 から i まで繰り返す
count ← count + 1
繰り返し終わり
繰り返し終わり
count を表示する
| i | j(範囲) | 内ループ実行回数 | count |
|---|---|---|---|
| 1 | 1〜1(1回) | 1回 | 1 |
| 2 | 1〜2(2回) | 2回 | 3 |
| 3 | 1〜3(3回) | 3回 | 6 |
ポイント:内ループの回数が外ループのiに依存している。1+2+3=6回。このように内ループ境界が変わる二重ループは慎重にトレースする。
🎯 試験での出方
- 擬似コードを実行した結果の変数の値を問う問題(科目B最頻出)
- 「3回目のループ終了後のxの値はいくつか」→ トレース表で追う
- 「このコードは何を求めるアルゴリズムか」→ トレースして目的を把握
- 空欄補充問題:トレースして矛盾しない条件を選ぶ
⚠️ よくある間違い
- 「頭の中でトレースしようとする」→ ✗ 必ず紙(またはメモ)に書く。変数が3個以上あると頭の中では追えない
- 「変数の更新順序を間違える」→ ✗ a←b→b←cの順で実行する。b←cを先にするとaの更新がbの新しい値になってしまう
- 「ループを1回多く、または少なく回す」→ ✗ 終了条件を毎回確認する
✍️ 確認クイズ
Q1. a←3, b←5として「c←a / a←b / b←c」を実行後のaとbの値はどれか。
✅ 正解は②。c←3(aの値を退避)→a←5(bの値をaに)→b←3(cの値=元のaをbに)。これがtmpを使った変数交換の典型パターン。
Q2. x←1として「x が 100 未満の間, 繰り返す / x ← x × 2」の終了時のxの値はどれか。
✅ 正解は②。1→2→4→8→16→32→64→128。x=64のとき64<100は真でループ実行→x=128。128<100は偽→終了。終了時x=128。
Q3. トレース表で「変化していない変数」はどう記入するか。
✅ 正解は②。変化していない変数は前の行と同じ値のまま。空白にすると読み返したとき混乱するので、値を書くか矢印で示す。表が読みやすくなります。
Q4. 以下のコードで a=10, b=3 のとき、r ← a mod b の値はどれか。「(mod は剰余演算、整数除算)」
✅ 正解は②。「mod」は剰余演算(割り算の余り)。10 ÷ 3 = 商3 余り1。よって10 mod 3 = 1。よく使われるmod演算の例:偶数判定(n mod 2 = 0)、循環インデックス(i mod n)。ユークリッドの互除法でもmod演算が核心です。
Q5. 以下の擬似コードの実行後のresultの値はどれか。「result ← 0 / i を 1 から 5 まで繰り返す / もし i mod 2 = 0 ならば / result ← result + i / もし終わり / 繰り返し終わり」
✅ 正解は②。i mod 2 = 0 は偶数のとき真。i=1(奇数):スキップ、i=2(偶数):result=2、i=3(奇数):スキップ、i=4(偶数):result=6、i=5(奇数):スキップ。1〜5の偶数(2+4)=6。条件付きループはmodと組み合わせた問題が頻出です。
Sponsor Link