擬似言語の制御構造をトレースする実践的な方法。変数の値を1ステップずつ追いかけます。
コード読んでも、何が起こってるのかピンとこないんだよね…
それはトレースの練習が足りないからなのよ。
トレースは、紙の上で変数の値を1行ずつ追いかけていく技法ね。
例題を見てみましょう。
次のコードでループ終了時の sum の値を求めてみて。
○ 手続: calc()
整数型: i, sum
sum ← 0
for (i を 1 から 5 まで 1 ずつ増やす)
if (i mod 2 = 0)
sum ← sum + i
endif
endfor
return sum
うぅ〜ん、すみれは紙に書いて追ってみますぅ
それが正解よ。
紙に変数の表を作って追っていくの。
i = 1, 2, 3, 4, 5 と進む中で、偶数 (mod 2 = 0) のときだけ sum に加算するから…
i = 2 の時 sum = 0 + 2 = 2、i = 4 の時 sum = 2 + 4 = 6。
最終的に sum は 6 を返すの。
なるほど!
あたしも変数表を書きながら追っていけば、複雑な処理もわかりそうじゃん!
コツは「i と sum の両方を表で管理する」こと。
条件分岐の判定もメモしながら進めると、間違いにくいですよ。
変数表で5回のループを完全に追う
頭の中だけで追わず、条件判定の前後を表にします。mod は剰余なので、i mod 2 = 0 は「iを2で割った余りが0」、つまり偶数という意味です。
| i | i mod 2 | 条件 | 処理前sum | 処理後sum |
|---|---|---|---|---|
| 1 | 1 | 偽 | 0 | 0 |
| 2 | 0 | 真 | 0 | 2 |
| 3 | 1 | 偽 | 2 | 2 |
| 4 | 0 | 真 | 2 | 6 |
| 5 | 1 | 偽 | 6 | 6 |
偽の回でも行を省かず、sumが「変化しない」と記録するのがポイントです。選択肢の9は奇数の1+3+5を足した読み違い、15は条件を無視して全てを足した読み違いです。答えだけでなく、どの誤読ならその値になるか逆算すると見直しが速くなります。
境界・更新順・出力を分けて読む
科目Bのトレースでは、まず初期値、次に反復範囲、条件、更新、戻り値の順に印を付けます。この例の「1から5まで」は1と5を含むので5回実行されます。sum ← sum + i は条件が真のときだけ実行され、return sum はループ終了後に一度だけ実行されます。
特に注意したいのが、更新前の値と更新後の値の混同です。代入文の右辺を古い値で計算してから、左辺を新しい値へ置き換えます。たとえばsumが2、iが4なら、右辺の2+4を先に計算し、その結果6をsumへ代入します。表の一つのセル内で暗算せず、「前→後」を分ければ取り違えを防げます。
while文では、条件判定の位置も確認します。whileは本体より先に判定するため、最初から条件が偽なら0回です。一方、問題文に後判定型の反復が示されていれば最低1回は本体が動きます。for・whileという名前だけで回数を決めず、開始値・終了条件・増分を具体的な数に置き換えてから表を作りましょう。
確認クイズ
上記の calc() 手続の戻り値はいくつか。
- 6
- 9
- 10
- 15
こたえを見る
正解: 1. 6
i = 1 (奇数・スキップ), i = 2 (偶数・sum=2), i = 3 (スキップ), i = 4 (偶数・sum=6), i = 5 (スキップ)。最終的な sum は 6 です。