二次元配列

学習の目的

  • 1. 二次元配列とは

  • 2. 二次元配列を操作する

1. 二次元配列とは

これまでの配列は一次元配列と呼ばれているものです。それに対し二次元配列は、表や将棋盤のようにデータを行と列の形で管理するデータ構造です。

二次元配列も一次元配列と同様に行の添字と列の添字を使って要素を特定します。

3行4列の二次元配列は次のようなイメージです。

3行4列の二次元配列のイメージ図

表になっているデータをいろんなところで見るので、二次元配列もよく使いそう。

そうですね。売上表やメンバー表など表形式で表されているデータはとても多くあります。

そういったものは、二次元配列で表すときに向いています。

この教材では、二次元配列の要素の表し方は次のように表すこととします。

二次元配列名[行の添字][列の添字]

3行4列の二次元配列dataの場合、それぞれの要素番号は次のように表すことができます。

参 考

二次元配列の表し方は他にも次のようなものがあります。

配列名[行の添字, 列の添字]  例: data[i , j]

この他に添字を表すカッコに ( ) を使う場合もあります。

いずれも同じ二次元配列を表していますので、表現方法に惑わされないようにしましょう。

2. 二次元配列を操作する

例えば、3人の「国語」、「数学」、「英語」、「情報1」の得点を管理する二次元配列scoreを操作する処理を考えます。
二次元配列のイメージは次のとおりです。

この二次元配列は、1行に1人のデータが入るようになっています。

列には各科目の得点が入ります。

ということは、1人目の国語の点数は score[0][0] の場所ということ?

正解です。0列目は国語の点数が入ります。同じように1列目は数学、2列目は英語そして3列目には情報1の得点が入ります。


二次元配列のデータを集計する

3人の得点データが次のようになっている配列scoreの値を集計するプログラムを考えます。

作成するプログラムは、4科目の合計得点を3人分それぞれ集計して表示を行います。

どういう順番で処理をすればよいか考えましょう。

最初に1人目の4科目の集計をした方が良いですよね?

俺もそう思う。1人計算が終わったら2人目、3人目と計算をすればよいと思う。

二人ともよく考えられるようになりましたね。その通りですが、もう少し詳しく見ていきましょう。

1人目のデータは二次元配列の0行目に格納されています。

0行目だけを抜き出すと、一次元配列と同じことに気付くと思います。

この0行目は二次元配列の要素番号で表すと[0][0]、[0][1]、[0][2]、[0][3]になります。

これを踏まえて0行目を集計するフローチャートは次のようになります。

1人目は0行目なので、集計するときは行番号「0」は固定です。変化する列の添字を変数jとして繰り返し処理で集計をしています。

この繰り返し処理なら、変数jが0から1、2、3と増えていくので、4教科分の得点の集計ができます。

はい、そこまで理解できましたね。

この処理を2人目、3人目と繰り返します。

3人分の集計処理は二次元配列の次の要素番号のデータを対象に行います。

1人目はscore[0][0]、[0][1]、[0][2]、[0][3]
2人目はscore[1][0]、[1][1]、[1][2]、[1][3]
3人目はscore[2][0]、[2][1]、[2][2]、[2][3]

1人目、2人目、3人目の集計を比べると、行の添字が異なることがわかります。
行の添字を変数iで表すとフローチャートは次のようになります。

フローチャートについている①~⑤は処理の番号です。

変数がどのように変化していくか確認しましょう。

添字0の行(1人目)

番号 i j sum = sum + score[i,j] sum 説明
① 0 ー ー ー 行の添字 i に0を代入
② 0 ー ー 0 得点集計用 sum に0を代入して初期化
③ 0 0 ー 0 列の添字 j に0を代入
④ 0 0 sum = sum + score[0,0] 50 sumにscore[0][0](国語の点数50)を加算する
③ 0 1 ー 50 列の添字jを1増やす
④ 0 1 sum = sum + score[0][1] 140 sumにscore[0][1](数学の点数90)を加算する
③ 0 2 ー 140 列の添字jを1増やす
④ 0 2 sum = sum + score[0][2] 200 sumにscore[0][2](英語の点数60)を加算する
③ 0 3 ー 200 列の添字jを1増やす
④ 0 3 sum = sum + score[0][3] 280 sumにscore[0,3](情報1の点数80)を加算する
⑤ 0 3 ー 280 sumの値(合計得点)を表示する

添字1の行(2人目)

番号 i j sum = sum + score[i][j] sum 説明
① 1 3 ー 280 行の添字 i を1増やす
② 1 3 ー 0 得点集計用 sum に0を代入して初期化
③ 1 0 ー 0 列の添字 j に0を代入
④ 1 0 sum = sum + score[1][0] 40 sumにscore[1][0](国語の点数40)を加算する
③ 1 1 ー 40 列の添字jを1増やす
④ 1 1 sum = sum + score[1][1] 70 sumにscore[1][1](数学の点数30)を加算する
③ 1 2 ー 70 列の添字jを1増やす
④ 1 2 sum = sum + score[1][2] 160 sumにscore[1][2](英語の点数90)を加算する
③ 1 3 ー 160 列の添字jを1増やす
④ 1 3 sum = sum + score[1][3] 235 sumにscore[1][3](情報1の点数75)を加算する
⑤ 1 3 ー 235 sumの値(合計得点)を表示する

添字2の行(3人目)

番号 i j sum = sum + score[i][j] sum 説明
① 2 3 ー 235 行の添字 i を1増やす
② 2 3 ー 0 得点集計用 sum に0を代入して初期化
③ 2 0 ー 0 列の添字 j に0を代入
④ 2 0 sum = sum + score[2][0] 70 sumにscore[2][0](国語の点数70)を加算する
③ 2 1 ー 70 列の添字jを1増やす
④ 2 1 sum = sum + score[2][1] 140 sumにscore[2,1](数学の点数70)を加算する
③ 2 2 ー 140 列の添字jを1増やす
④ 2 2 sum = sum + score[2][2] 205 sumにscore[2][2](英語の点数65)を加算する
③ 2 3 ー 205 列の添字jを1増やす
④ 2 3 sum = sum + score[2][3] 275 sumにscore[2,3](情報1の点数75)を加算する
⑤ 2 3 ー 275 sumの値(合計得点)を表示する

このように、二次元配列を操作するときは、2重ループといわれる繰り返し処理の中に繰り返し処理を入れて行います。

うーん、i と j が出てくるけど、どっちが行でどっちが列か、ちょっと混乱するなあ・・・

わかる!私も最初は迷ったよ。トレース表をよく見ると、i が 0 のときは 1行目をずっと計算してるよね。

ほんとだ!i=0 のとき、j が 0,1,2,3 と増えて、列の位置が動いてる!

そうそう。だから i が行、j が列ってことなんだよね。

なるほど!i が変わると次の行に進むのか。例えば i=1 になったら 2行目を計算してる。

うん!i が外側のループで“行”を決めて、j が内側のループで“列”を動かしてるんだね。

その通り!いい観察ですね。プログラムでは、

  • 外側のループ i → 行を管理
  • 内側のループ j → 列を管理

という役割が多いんです。九九表や座席表と同じ考え方ですよ。

あ、なるほど!座席表の行と列のイメージならわかりやすい!

うん!i が行、j が列ってイメージで覚えておこう!

それでは、二次元配列を操作する2重ループの処理について、問題を解いて慣れていきましょう。

Well done!

次のステップに進みましょう!

次のステップに進む

← 前のステップにもどる