配列のトレース

配列も表の列にして追う

前回、配列の添字が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} です。表を埋めてから答え合わせをしてください。

課題

  1. 各行を実行したあとの値を入れる
  2. 値が変わらない変数はそのままの値を入れる
  3. 配列は {3, 1, 4} の形で、要素の区切りにカンマと空白を入れて書く

ヒント

1 / 7 行目のトレース

1○整数型の配列: ruiseki(整数型の配列: data)
2 整数型: i
3 for (i を 2 から dataの要素数 まで 1 ずつ増やす)
4 data[i] ← data[i] + data[i - 1]
5 endfor
6 return data
実行した行idata
実行前{3, 1, 4}
2 行目

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