第12講 配列その2
第3話 1次元配列と高次元配列の関係
まず、次のプログラムを開いて頂きたいと思います。
2次元と1次元の関係を示すプログラム例
プログラムソースは次のようになっています。
Dim h1(10, 10), h2(100) As Integer
Private Sub CommandButton1_Click()
syori1
syori2
End Sub
Sub syori1()
Dim i As Integer, j As Integer
For i = 1 To 10
For j = 1 To 10
h1(i, j) = 10 * (i - 1) + j
Next
Next
For i = 1 To 10
For j = 1 To 10
Cells(5 + i, j) = h1(i, j)
Next
Next
End Sub
Sub syori2()
Dim i As Integer, j As Integer, s As Integer, a As Integer
For i = 1 To 100
h2(i) = i
Next
For i = 1 To 100
a = (i - 1) Mod 10
s = Int((i - 1) / 10)
Cells(6 + s, 12 + a) = h2(i)
Next
End Sub
プログラム実行してみてください。
syori1とsyori2で処理された結果は全く同じです。
実は、2次元配列は1次元配列でも表現できるのです。
同様に3次元以上の高次元配列であっても1次元配列で扱えます。
2次元配列を1次元配列に代入するには、
例えば、次のようにすればよいのです。
For i = 1 To 10
For j = 1 To 10
h2(10 * (i ー 1) +j ) = h1(i, j)
Next
Next
なぜこれでよいか、表を使ってみてみましょう。
次の表はi、jと10 * (i ー 1) +jの関係を示すものです。
j | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
i | |||||||||||
1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
2 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | |
3 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | |
・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | |
・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ |
ピンクの部分が10 * (i ー 1) +j を表しています。
重複なく連続しした整数になることがおわかりいただけると思います。
見事に(i,j)の2次元とピンクの1次元が対応しています。
逆に、1次元配列を2次元配列に代入するためには、
For i = 1 To 100
a = (i - 1) Mod 10
s = Int((i - 1) / 10)
h1(i, j) = h2(s + 1,a + 1)
Next
とすればよいのです。
a = (i - 1) Mod 10はiから1引いた整数を10で割ったときの余り、
s = Int((i - 1) / 10)はiから1引いた整数を10で割ったときの商で対応表は
a+1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
s+1 | |||||||||||
1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
2 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | |
3 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | |
・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | |
・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ | ・ |
となります。ピンクがiを表しています。
1次元iが2次元(s+1,t+1)に対応していることがおわかりかと思います。
C言語あたりでは基本的に多次元配列は使いません。
すべて1次元配列で済むからです。
では皆さん、3次元配列と1次元配列の場合で代入を考え、
同様なプログラムを作ってみてください。
第2話へ 第4話へ