二次元配列
表の形をしたデータ
前回まで扱った配列は、値が一列に並んだものでした。ところが、実際のデータは表の形をしていることがよくあります。行が生徒、列が教科、というような並びです。これを扱うのが二次元配列です。
擬似言語では次のように宣言します。
整数型の二次元配列: data ← {{3, 1, 4}, {2, 5, 8}}外側の波かっこが表全体、内側の波かっこが1行ぶんです。この例は2行3列の表です。行数は dataの行数、列数は dataの列数 で取り出せます。
添字は行が先、列が後
要素を指すときは、添字をカンマで区切って2つ書きます。
data[2, 3]これは2行目の3列目、つまり 8 です。前が行、後ろが列です。この順番を取り違えると、表の縦と横が入れ替わった読み方になり、答えが根本から変わります。
そして、行も列も添字は1から始まります。左上の要素は data[0, 0] ではなく data[1, 1] です。一次元のときと同じ決まりが、両方の添字に効くと考えてください。
2行3列の表なら、使える添字は次の6通りだけです。
data[1, 1] data[1, 2] data[1, 3]
data[2, 1] data[2, 2] data[2, 3]data[3, 1] は行が足りず、data[1, 4] は列が足りません。どちらも存在しません。
二重ループで走査する
表を全部見るには、ループを2つ重ねます。外側で行、内側で列を回すのがふつうの形です。
for (i を 1 から dataの行数 まで 1 ずつ増やす)
for (j を 1 から dataの列数 まで 1 ずつ増やす)
/* ここで data[i, j] を使う */
endfor
endforこのとき、内側のループが1行ぶんを最後まで回してから、外側が次の行へ進みます。順番は data[1, 1]、data[1, 2]、data[1, 3]、data[2, 1] と続きます。行をまたぐ瞬間に j が 1 に戻ることを、表の上で確かめてください。
外側と内側を入れ替えると、列ごとに縦に見ていく順番になります。合計を出すだけなら答えは同じですが、「何番目に見た要素か」を問う設問では答えが変わります。
添字を取り違えないために
二次元配列の問題では、data[i, j] と data[j, i] の両方が選択肢に並ぶことがよくあります。見分け方は単純で、外側のループ変数が行に対応しているかを確認するだけです。外側が行数まで回っているなら、その変数は行を指しています。
今回は2行3列の表を全部足します。data の初期値は {{3, 1, 4}, {2, 5, 8}} です。
課題
- 各行を実行したあとの値を入れる
- 値が変わらない変数はそのままの値を入れる
- data[i, j] は前が行、後ろが列として読む