配列のトレース
配列も表の列にして追う
前回、配列の添字が1から始まることを確認しました。ここからは、その配列が書き換わっていく様子をトレース表で追います。
第2章では、変数を1本ずつ列にして表を作りました。配列でも考え方は同じです。ちがうのは、1つの列に配列全体を書くという点だけです。値は {3, 1, 4} のように波かっこで並べて書きます。要素が書き換わったら、その要素の数字だけを差し替えます。
今回のコード
配列を前から順に足しこんで、各位置までの合計に作り替えるコードです。累積和と呼ばれる形で、後の章でもよく出てきます。
○整数型の配列: ruiseki(整数型の配列: data)
整数型: i
for (i を 2 から dataの要素数 まで 1 ずつ増やす)
data[i] ← data[i] + data[i - 1]
endfor
return dataなぜ i は 2 から始まるのか
for の開始値が 1 ではなく 2 になっている点に注目してください。理由は data[i - 1] にあります。
もし i が 1 から始まると、1回目に data[1 - 1]、つまり data[0] を読むことになります。前回のとおり、擬似言語の配列に0番はありません。存在しない要素を読むコードになってしまいます。
だから、1つ前を見るループは 2 から始めます。逆に、1つ先の data[i + 1] を見るループは 要素数 - 1 で止めます。この2つは科目Bの定番なので、形で覚えるのではなく「はみ出さないため」と理解しておいてください。
追うときのこつ
代入の行を追うときは、右辺を先に確定させます。data[i] ← data[i] + data[i - 1] なら、まず今の配列の中身を見て右辺の数を出し、そのあとで左辺の位置に書き込みます。書き込む前の値で右辺を計算する、という順番を崩さないでください。
もう1つ、for の行を実行した直後は、繰返し変数だけが変わって配列は変わりません。逆に、中の代入の行では繰返し変数は変わりません。1行につき動くものは1つだけ、と意識すると表がぶれません。
配列の列を書くときの決まり
配列の列には、そのときの中身をまるごと書きます。要素数3なら、必ず3つの数を書いてください。書き換わっていない要素も省略せずに書きます。
{3, 1, 4} /* 開始時 */
{3, 4, 4} /* data[2] を書き換えたあと */面倒に見えますが、この書き方には理由があります。1つ前の行の配列を見ながら次の行の右辺を計算するので、全部書いてあれば見に戻る必要がありません。省略すると、どこかで前の行に戻って確かめることになり、そこで読み間違えます。本番の問題用紙でも同じように書きます。
どこで差がつくか
配列のトレース問題で受験者の答えが割れるのは、たいてい次の2か所です。
- 書き換え済みの要素を、もとの値のまま計算してしまう
- ループの開始値と終了値を、コードを見ずに 1 から 要素数 まわると思い込む
どちらも、丁寧に表を書けば防げます。逆に、頭の中だけで追うとほぼ確実にどちらかを踏みます。1行1行、手を動かして埋めてください。
初期値は {3, 1, 4} です。表を埋めてから答え合わせをしてください。
課題
- 各行を実行したあとの値を入れる
- 値が変わらない変数はそのままの値を入れる
- 配列は {3, 1, 4} の形で、要素の区切りにカンマと空白を入れて書く