条件分岐のトレース

上から下へ進まなくなります

ここまでのコードは、上の行から下の行へ順に進むだけでした。今回から、その順番が崩れます。分岐が入ると、実行される行と、まるごと飛ばされる行が出てきます。トレース表の行番号の列が本当に効いてくるのはここからです。

分岐で追いかけるものは 2 つあります。1 つは変数の値、もう 1 つはどの枝を通ったかです。値だけ見ていると、飛ばされた行の中身をうっかり実行してしまい、答えが変わります。

if は条件が偽なら中身を実行しない

もっとも単純な形は次のとおりです。

if (n > 0) sign ← 1 endif

if の丸括弧の中を評価して、真なら次の行へ進み、偽なら 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 行ずつ追ってください。

課題

  1. 各行を実行したあとの値を入れる
  2. 値が変わらない変数はそのままの値を入れる
  3. 実行されない行はトレースに現れない

ヒント

1 / 6 行目のトレース

1○整数型: hantei(整数型: ten)
2 整数型: rank
3 rank ← 0
4 if (ten ≧ 80)
5 rank ← 3
6 elseif (ten ≧ 60)
7 rank ← 2
8 else
9 rank ← 1
10 endif
11 return rank
実行した行tenrank
実行前72
3 行目

3 行目を実行したあとの値を入れてください。変わらない変数は、 そのままの値を入れます。まだ値が入っていない変数は「」と入れます。