第14講 高次元配列と低次元配列の関係
第4話 1次元配列を3次元配列で表現する
解答コード例
Private Sub CommandButton1_Click()
Dim a(3, 2, 4) As Integer
Dim b(59) As Integer
Dim i As Integer
For i = 0 To 59
b(i) = i + 1
Next
Dim j As Integer, k As Integer, l As Integer
For i = 0 To 59
j = Int(i / 15)
k = Int(i / 5) Mod 3
l = i Mod 5
a(j, k, l) = b(i)
Next
For i = 0 To 3
For j = 0 To 2
For k = 0 To 4
Cells(5 + 4 * i + j, 1 + k) = a(i, j, k)
Next
Next
Next
End Sub
実行シート
解説
ポイントは、1次元の並び0,1,2,・・・,59を如何に3次元にするかです。
次のように並べたいわけです。
0 | 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 |
30 | 31 | 32 | 33 | 34 |
35 | 36 | 37 | 38 | 39 |
40 | 41 | 42 | 43 | 44 |
45 | 46 | 47 | 48 | 49 |
50 | 51 | 52 | 53 | 54 |
55 | 56 | 57 | 58 | 59 |
まず、
0 | 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 |
30 | 31 | 32 | 33 | 34 |
35 | 36 | 37 | 38 | 39 |
40 | 41 | 42 | 43 | 44 |
45 | 46 | 47 | 48 | 49 |
50 | 51 | 52 | 53 | 54 |
55 | 56 | 57 | 58 | 59 |
と4つのブロックに分けるには、j = Int(i / 15)でよいわけです。
というのはブロックのデータ数が15です。
Dim a(3, 2, 4) As Integer
この15は、(2+1)×(4+1)=15の計算から求めるのでしたね。
iが0〜14なら、j = Int(i / 15)=0です。
iが15〜29なら、j = Int(i / 15)=1です。
iが30〜44なら、j = Int(i / 15)=2です。
iが45〜59なら、j = Int(i / 15)=3です。
うまく、4つのブロックに分けられていることがわかります。
尚、4ブロックに分ける必要がある理由は、3+1=4です。
次の課題は、4ブロックに分けられた0,1,2,・・・,14などを如何に3行に割り振るかです。
k = Int(i / 5) Mod 3
なぜ、これでうまくいくのでしょうか。
まず、Int(i / 5)で0,1,2,3,4,5,6,7,8,9,10,11,12,13,14は、
0,0,0,0,0,1,1,1,1,1,2,2,2となります。
さらに、Mod 3で3で割った余りを求めても、
0,0,0,0,0,1,1,1,1,1,2,2,2で変わりありません。
しかし、0,1,2,3,4,5,6,7,8,9,10,11,12,13,14のデータが3行にうまく割り振られています。
次の15,16,17,18,19,20,21,22,23,24,25,26,27,28,29についてはどうでしょうか。
まず、Int(i / 5)によって、
3,3,3,3,3,4,4,4,4,4,5,5,5,5,5となります。
そして、Mod 3によって3で割った余りにすると、
0,0,0,0,0,1,1,1,1,1,2,2,2で今回も3行にうまく分割できています。
次の29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44についても
Int(i / 5)によって、
4,4,4,4,4,5,5,5,5,5,6,6,6,6,6となり、
Mod 3によって、
0,0,0,0,0,1,1,1,1,1,2,2,2とうまく3群に分割できています。
最後の45,46,47,48,49,50,51,52,53,54,55,56,57,58,59も
7,7,7,7,7,8,8,8,8,8,9,9,9,9,9から
0,0,0,0,0,1,1,1,1,1,2,2,2となり、望みの通りになります。
k = Int(i / 5) Mod 3
のInt(i / 5)を実行したときに、0,1,2,3,4,5,6,7,8,9となります。
これを Mod 3によって0,1,2,0,1,2,0,1,2,0,1,2とすれば意図したとおりに実現できるわけです。
j = Int(i / 15)
k = Int(i / 5) Mod 3
l = i Mod 5
これは、頭が爆発しそうなほど、難しかったですね。
さて、次の課題です。
4次元配列を1次元配列で表現してみましょう。
まず、4次元データを用意し、
Private Sub CommandButton1_Click()
Dim a(2, 3, 4, 5) As Integer
Dim b(359) As Integer
Dim i As Integer, j As Integer, k As Integer, l As Integer
For i = 0 To 2
For j = 0 To 3
For k = 0 To 4
For l = 0 To 5
a(i, j, k, l) = Int(Rnd * 100)
Next
Next
Next
Next
End Sub
次のように表示させてください。
そして、次に1次元配列に対応させてください。
対応後、シートに表示されているデータの2行下に1元配列を利用して同様に表示してください。
第3話へ 第5話へ
VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual aasic入門基礎講座へ
数学研究室に戻る