第7講 多次元配列と1次元配列の関係
第1話 多次元配列の正体
を1次元配列で実現することは可能だと思いますか。
もちろん、慧眼な読者は『多次元配列と1次元配列の関係』という講のテーマ名から、
可能にちがいないと考えますよね。
その通りです。
いきなり、3次元配列と1次元配列の関係を考えるのでは複雑ですから、
2次元配列と1次元配列の関係から考えましょう。
第6講第3話で
Dim a(2, 3) As Integr '2次元配列の宣言
とすると、2次元配列となります。
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)
と縦と横を持つ配列になるからです。
と書きましたが、本当は少しレトリック(過剰表現または粉飾)があります。
だって本当は、メモリ上では
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次元ですよね。
だったら、第6講第4話の
を実現するプログラム例
Module Module1
Sub Main() '私は社長だ。
'Rnd(-1)
'Randomize(Timer())
f()
End Sub
Sub f()
Dim a(2, 3) As Integer '配列aの宣言
Dim i, j As Integer
'ランダムデータ生成
For i = 0 To 2
For j = 0 To 3
a(i, j) = Int(Rnd() * 100)
Next
Next
'データ表示
For i = 0 To 2
For j = 0 To 3
If a(i, j) < 10 Then Console.Write(" {0:d} ", a(i, j)) '右端をそろえるための半角スペース
If a(i, j) >= 10 Then Console.Write("{0:d} ", a(i, j))
Next
Console.WriteLine() '改行
Next
End Sub
End Module
の2次元配列
Dim a(2, 3) As Integer '配列aの宣言
は1次元配列
Dim a(*) As Integer '配列aの宣言
に変更しても実現できるはずです。
では、要素数*はいくつですか。
答えは30行下に示します。
答え
を見れば要素数*は、3×4−1=11であることがわかります。
1引いているのは、配列は0から始まるからです。
実際に、
0,1,2,3,4,5,6,7,8,9,10,11
を数えれば12個であることおわかりですね。
実行画面がない場合には次のように計算します。
Dim a(2, 3) As Integer '配列aの宣言
(2+1)×(3+1)−1=11
です。
1を加えている理由はおわかりですね。
0,1,2
0,1,2,3
でしたね。+1は0もカウントするためです。
では、を1次元配列
Dim a(11) As Integer '配列aの宣言
によって実現して下さい。