
1-9. 二次元配列と二重ループ
本記事では、二次元配列と二重ループについて解説します。
配列とは
同じ種類の変数を一行に並べて、複数のデータを入れることができるようにした入れ物です。
2次元配列とは
さらに変数を縦横に並べて、表形式にデータを入れることができるものです。2次元配列は、配列[ i, j ] という形で表します。
表計算ソフトのワークシートを想像してください。
2次元配列は、国語の成績だけでなく、英語や数学の成績も計算して平均や順位を求めたい、という時などに利用します。
2次元配列は、配列[ i, j ]という形で表しますが、このとき、どちらを1次元目 (i) として考えるかということの規則はありません。
しかし、まとまりとして結びつきの強い方を、1次元目にするのが普通で、理解しやすいといえます。
今考えている成績の例では、「科目ごとの平均を出したい。その時に書く学生の成績データが必要」ということですから、同じ「学生」というまとまりよりも、同じ「科目」というまとまりの結びつきの方が強いので、成績 [科目, 学生]というように1次元目は科目として、成績[3, 5], つまり、5個の要素をもつ成績という配列を3行分(3科目分)用意するという考え方になります。
これが、「それぞれの学生の成績の平均を求めたい。ただし、科目は3科目ある」ということであれば、成績データの内訳は3科目分あるのですから、まとまりとしての結びつきは科目よりも、学生の方が強くなります。この場合には、学生を1次元として考えるのが普通です。つまり、成績 [学生, 科目]ですから、成績[5, 3]と指定します。
各科目の平均を求めるアルゴリズムを考える
ここでは、成績[科目, 学生]という配列を使います。
まず、1科目目の英語の平均を求めることを考えてみましょう。
英語の成績は、成績[1, □], つまり、成績[1, 1]~成績[1, 5] に入っています。この5個の成績を順に合計に加えていって、最期に5で割ればよいのですから、英語の成績の平均を求めるアルゴリズムは次のようになります。
i ← 1
合計 ← 0
while (i ≦ 5)
合計 ← 合計 + 成績[1, i]
i ← i + 1
endwhile
平均 ← 合計 ÷ 5
平均を表示
では、数学、国語の平均を求めるにはどうしたらよいでしょうか。
英語の平均を求める「合計 ← 合計 + 成績[1, i]」の部分を、数学なら、「合計 ← 合計 + 成績[2, i]」、国語なら、「合計 ← 合計 + 成績[3, i]」と変えれば、それだけで完成です。
そして、3科目の平均を求めるためには、科目ごとの平均を求めるという処理を3回繰り返すことになります。そのとき繰り返される、科目ごとの平均を求める処理では科目を示す一次元目の要素番号の値を1(英語)、2(数学)、3(国語)と順番に変えていきます。
上記繰り返し処理を、さらに3科目分繰り返すのですから、二重の繰り返し処理になります。
3科目の平均を求めるアルゴリズムの大まかな流れ
i ← 1
while (i ≦ 3)
「科目の平均を求める」
i ← i + 1
endwhile
3科目について平均を求めるアルゴリズム(二次元配列を使用)
i ← 1
while (i ≦ 3)
合計 ← 0
j ← 1
while (j ≦ 5)
合計 ← 合計 + 成績[i , j]
j ← j + 1
endwhile
平均 ← 合計 ÷ 5
平均を表示
i ← i + 1
endwhile
以上です。