第14講 高次元配列と低次元配列の関係
第2話 2次元配列が1次元配列で表現できる理由
例えば、
Dim a(1,2) As Integer
の場合データは次のよう2次元に並びます。
a(0,0) | a(0,1) | a(0,2) |
a(1,0) | a(1,1) | a(1,2) |
ですがメモリはどのように配置されているかと申しますと、
アドレス | 00000000 | 0000004 | 00000008 | 00000012 | 0000016 | 00000016 |
2次元配列 | a(0,0) | a(0,1) | a(0,2) | a(1,0) | a(1,1) | a(1,2) |
と直線的に並んでいます。結局2次元配列とは本来的には、1次元データ(直線的データ)を見かけだけ2次元にしたものに過ぎません。
ですから、次のように1次元配列Dim b(5) As Inteherで対応可能なわけです。
2次元配列 | a(0,0) | a(0,1) | a(0,2) | a(1,0) | a(1,1) | a(1,2) |
1次元配列 | b(3*0+0) | b(3*0+1) | b(3*0+2) | b(3*1+0) | b(3*1+1) | b(3*1+2) |
では問題です。
Dim a(2,3) As Integer
Dim b(11) As Inteher
の場合の対応関係はどうなるでしょうか。
尚、データ数の計算ですが(2+1)×(3+1)=11+1と1を加えることを忘れないでください。
VBやVBAの場合、Dim b(11) As Inteherなどと宣言すると、データ数は12でしたね。
理由は、b(0)が入るからです。0を数えるために1を加えなければならないわけです。
解答は30行下。
解答
2次元配列 | a(0,0) | a(0,1) | a(0,2) | a(0,3) | a(1,0) | a(1,1) | a(1,2) | a(1,3) | a(2,0) | a(2,1) | a(2,2) | a(2,3) |
1次元配列 | b(4*0+0) | b(4*0+1) | b(4*0+2) | b(4*0+3) | b(4*1+0) | b(4*1+1) | b(4*1+2) | b(4*1+3) | b(4*2+0) | b(4*2+1) | b(4*2+2) | b(4*2+3) |
次の問題です。
Private Sub CommandButton1_Click()
Dim a(55) As Integer
Dim b(7, 6) As Integer
Dim i As Integer
For i = 0 To 55
a(i) = i + 1
Next
End Sub
1次元配列a(55)を2次元配列b(7, 6)に翻訳して、それを
とシートに表示させるにはどうしたらよいでしょうか。
解答例は、30行下。
解答例
Private Sub CommandButton1_Click()
Dim a(55) As Integer
Dim b(7, 6) As Integer
Dim i As Integer
For i = 0 To 55
a(i) = i + 1
Next
Dim am As Integer, s As Integer
For i = 0 To 55
am = i Mod 7
s = Int(i / 7)
b(s, am) = a(i)
Next
Dim j As Integer
For i = 0 To 7
For j = 0 To 6
Cells(5 + i, 1 + j) = b(i, j)
Next
Next
End Sub
問題2
Private Sub CommandButton1_Click()
Dim a(29) As Integer
Dim b(4, 5) As Integer
Dim i As Integer, j As Integer
For i = 0 To ?
For j = 0 To ?
b(i, j) = ? * i + j + 1
Next
Next
End Sub
今度は、2次元配列を1次元配列に翻訳してから、
とシートに表させるにはどうしたらよいでしょうか。
解答例
Private Sub CommandButton1_Click()
Dim a(29) As Integer
Dim b(4, 5) As Integer
Dim i As Integer, j As Integer
For i = 0 To 4
For j = 0 To 5
b(i, j) = 5 * i + j + 1
Next
Next
For i = 0 To 4
For j = 0 To 5
a(5 * i + j) = b(i, j)
Next
Next
For i = 0 To 4
For j = 0 To 5
Cells(5 + i, 1 + j) = b(i, j)
Next
Next
End Sub
では、今話最後の課題です。
Private Sub CommandButton1_Click()
Dim a(3, 2, 4) As Integer
Dim b(59) As Integer
Dim i As Integer, j As Integer, k As Integer
For i = 0 To 3
For j = 0 To 2
For k = 0 To 4
a(i, j, k) = Int(rand * 100)
Next
Next
Next
End Sub
3次元配列を1次元配列に翻訳してから、
のように表示させるプログラムを考えてください。
第1話へ 第3話へ
VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual aasic入門基礎講座へ
数学研究室に戻る