二次元配列

表の形をしたデータ

前回まで扱った配列は、値が一列に並んだものでした。ところが、実際のデータは表の形をしていることがよくあります。行が生徒、列が教科、というような並びです。これを扱うのが二次元配列です。

擬似言語では次のように宣言します。

整数型の二次元配列: 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}} です。

課題

  1. 各行を実行したあとの値を入れる
  2. 値が変わらない変数はそのままの値を入れる
  3. data[i, j] は前が行、後ろが列として読む

ヒント

1 / 12 行目のトレース

1○整数型: goukei(整数型の二次元配列: data)
2 整数型: i, j, sum
3 sum ← 0
4 for (i を 1 から dataの行数 まで 1 ずつ増やす)
5 for (j を 1 から dataの列数 まで 1 ずつ増やす)
6 sum ← sum + data[i, j]
7 endfor
8 endfor
9 return sum
実行した行ijsumdata
実行前{{3, 1, 4}, {2, 5, 8}}
3 行目

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