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重ループの処理について、問題を解いて慣れていきましょう。