条件分岐のトレース
上から下へ進まなくなります
ここまでのコードは、上の行から下の行へ順に進むだけでした。今回から、その順番が崩れます。分岐が入ると、実行される行と、まるごと飛ばされる行が出てきます。トレース表の行番号の列が本当に効いてくるのはここからです。
分岐で追いかけるものは 2 つあります。1 つは変数の値、もう 1 つはどの枝を通ったかです。値だけ見ていると、飛ばされた行の中身をうっかり実行してしまい、答えが変わります。
if は条件が偽なら中身を実行しない
もっとも単純な形は次のとおりです。
if (n > 0)
sign ← 1
endifif の丸括弧の中を評価して、真なら次の行へ進み、偽なら endif の次の行までまるごと飛びます。偽だったときに sign へ何かが入ることはありません。値なしのままです。ここを「とりあえず 0 が入る」と勝手に補ってしまう間違いが多いので、宣言しただけの変数には値が無いことを思い出してください。
elseif は上から順に、最初の 1 つだけ
枝が 3 つ以上になると elseif が出てきます。
if (ten ≧ 80)
rank ← 3
elseif (ten ≧ 60)
rank ← 2
else
rank ← 1
endif判定は必ず上から順に行われます。そして真になった枝を 1 つ実行したら、残りの条件は評価すらされずに endif へ飛びます。この性質が問題の作りどころになります。上の例で ten が 90 のとき、90 は 60 以上でもありますが、rank に 2 が入ることはありません。先に 80 以上の枝が真になって、そこで終わるからです。
逆に言えば、条件を書く順番を入れ替えると結果が変わります。80 以上より先に 60 以上を判定する形にすると、どんな高得点でも 60 以上の枝で止まってしまい、いちばん上の枝には二度と入りません。科目 B では、この順番を入れ替えた選択肢が誤答として並びます。
else は「上のどれも偽だったとき」に入る枝です。else が無い形なら、どれも偽のときは何も実行せずに endif へ抜けます。
条件の行も表に書く
条件を判定した行は、変数の値を変えません。それでも表には書きます。行番号を書き、値は前の行の写しにして、備考の欄に真か偽かを残します。これを残しておくと、答えが合わなかったときに、値を間違えたのか枝を間違えたのかが一目で分かります。
やってみます
下の演習は、点数から評価の段階を求めるコードです。渡される点数は 72 です。どの条件が真になり、どの行が飛ばされるかを意識しながら、1 行ずつ追ってください。
課題
- 各行を実行したあとの値を入れる
- 値が変わらない変数はそのままの値を入れる
- 実行されない行はトレースに現れない