第7講 多次元配列と1次元配列の関係
第4話 第6講第4話の課題を1次元配列によって実現する
を1次元配列とデータ生成とデータ表示をすべて2次元For文で実現するコード例
Module Module1
Sub Main() '私は社長だ。
'Rnd(-1)
'Randomize(Timer())
f()
End Sub
Sub f()
Dim a(11) As Integer '配列aの宣言
Dim i, j As Integer
'ランダムデータ生成
For i = 0 To 2
For j = 0 To 3
a(4 * i + j) = Int(Rnd() * 100)
Next
Next
'データ表示
For i = 0 To 2
For j = 0 To 3
If a(4 * i + j) < 10 Then Console.Write(" {0:d} ", a(4 * i + j)) '右端をそろえるための半角スペース
If a(4 * i + j) >= 10 Then Console.Write("{0:d} ", a(4 * i + j))
Next
Console.WriteLine() '改行
Next
Console.WriteLine() '改行
'左右反転行列の表示
For i = 0 To 2
For j = 0 To 3
If a(4 * i + 3 - j) < 10 Then Console.Write(" {0:d} ", a(4 * i + 3 - j)) '右端をそろえるための半角スペース
If a(4 * i + 3 - j) >= 10 Then Console.Write("{0:d} ", a(4 * i + 3 - j))
Next
Console.WriteLine() '改行
Next
Console.WriteLine() '改行
'上下反転行列の表示
For i = 0 To 2
For j = 0 To 3
If a(4 * (2 - i) + j) < 10 Then Console.Write(" {0:d} ", a(4 * (2 - i) + j)) '右端をそろえるための半角スペース
If a(4 * (2 - i) + j) >= 10 Then Console.Write("{0:d} ", a(4 * (2 - i) + j))
Next
Console.WriteLine() '改行
Next
Console.WriteLine() '改行
'転置行列の表示
For i = 0 To 3
For j = 0 To 2
If a(4 * j + i) < 10 Then Console.Write(" {0:d} ", a(4 * j + i)) '右端をそろえるための半角スペース
If a(4 * j + i) >= 10 Then Console.Write("{0:d} ", a(4 * j + i))
Next
Console.WriteLine() '改行
Next
End Sub
End Module
第5話の課題は、
'左右反転行列の表示
For i = 0 To 2
For j = 0 To 3
If a(4 * i + 3 - j) < 10 Then Console.Write(" {0:d} ", a(4 * i + 3 - j)) '右端をそろえるための半角スペース
If a(4 * i + 3 - j) >= 10 Then Console.Write("{0:d} ", a(4 * i + 3 - j))
Next
Console.WriteLine() '改行
Next
Console.WriteLine() '改行
の部分を1次元For文で実現するです。
ノーヒントでは難しすぎる課題ですから、
ヒントを出しておきます。
改行のタイミングは、第3話の
For i = 0 To 11
If i > 0 And (i Mod 4) = 0 Then Console.WriteLine() '改行
If a(i) < 10 Then Console.Write(" {0:d} ", a(i)) '右端をそろえるための半角スペース
If a(i) >= 10 Then Console.Write("{0:d} ", a(i))
Next
赤
If i > 0 And (i Mod 4) = 0 Then Console.WriteLine() '改行
で良いわけですが、表示内容を左右反転にするのが難問中の難問です。
|
0 | 1 | 2 | 3 | ||||||
0 | 0 | 1 | 2 | 3 | ||||||
1 | 4 | 5 | 6 | 7 | ||||||
2 | 8 | 9 | 10 | 11 |
1次元配列の添え字0は3に、
1次元配列の添え字1は2に、
1次元配列の添え字2は1に、
1次元配列の添え字3は0に、
1次元配列の添え字4は7に、
1次元配列の添え字5は6に、
1次元配列の添え字6は5に、
・
・
・
1次元配列の添え字11は8に、
に変換できればクリアです。
そんなうまい方法はあるでしょうか。
これを実現するには、
0,1,2,3
4,5,6,7
8,9,10,11
を一方では
0,0,0,0
4,4,4,4
8,8,8,8
に変換し、他方では、
0,1,2,3
0,1,2,3
0,1,2,3
に変換して、
さらに、
0,1,2,3
を
3,2,1,0
に変換する方法を考え組み合わせます。
組み合わせるのは
0,0,0,0
4,4,4,4
8,8,8,8
と
3,2,1,0
3,2,1,0
3,2,1,0
です。
0,1,2,3
4,5,6,7
8,9,10,11
を
0,1,2,3
0,1,2,3
0,1,2,3
に変換するには、Modを利用します。
11 mod 4 =3
ですね。11を4で割った余りを求めます。
0,1,2,3
4,5,6,7
8,9,10,11
を
0,0,0,0
4,4,4,4
8,8,8,8
に変換するには、割り算とInt(*)を利用します。
Int(*)が*の小数部分を切り捨てて整数にする式です。