第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話へ

004
  


VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual aasic入門基礎講座へ

数学研究室に戻る