第8講 4次魔方陣と6次魔方陣の作成
第10話 6次魔方陣コード解説その4(左右線対称移動)
最後にコード
'左右下対称移動
For i = 0 To m - 1
w = a((i + 1) Mod 3, i)
a((i + 1) Mod 3, i) = a((i + 1) Mod 3, n - 1 - i)
a((i + 1) Mod 3, n - 1 - i) = w
Next
の動きを追いましょう。
まず、a((i + 1) Mod 3, i)は
i=0とのき、a((i + 1) Mod 3, i)=a((0 + 1) Mod 3, 0)=a(1, 0)
i=1とのき、a((i + 1) Mod 3, i)=a((1 + 1) Mod 3, 1)=a(2, 1)
i=2とのき、a((i + 1) Mod 3, i)=a((2 + 1) Mod 3, 2)=a(0, 2)
なので、
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 1 | 2 | 3 | 4 | 5 | 6 |
1 | 7 | 8 | 9 | 10 | 11 | 12 |
2 | 13 | 14 | 15 | 16 | 17 | 18 |
3 | 19 | 20 | 21 | 22 | 23 | 24 |
4 | 25 | 26 | 27 | 28 | 29 | 30 |
5 | 31 | 32 | 33 | 34 | 35 | 36 |
7→14→3と動いていきます。
a((i + 1) Mod 3, n - 1 - i)は
i=0とのき、a((i + 1) Mod 3, n - 1 - i)=a((0 + 1) Mod 3, 6 - 1 - 0)=a(1, 5)
i=1とのき、a((i + 1) Mod 3, n - 1 - i)=a((1 + 1) Mod 3, 6 - 1 - 1)=a(2, 4)
i=2とのき、a((i + 1) Mod 3, n - 1 - i)=a((2 + 1) Mod 3, 6 - 1 - 2)=a(0, 3)
ですから、
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 1 | 2 | 3 | 4 | 5 | 6 |
1 | 7 | 8 | 9 | 10 | 11 | 12 |
2 | 13 | 14 | 15 | 16 | 17 | 18 |
3 | 19 | 20 | 21 | 22 | 23 | 24 |
4 | 25 | 26 | 27 | 28 | 29 | 30 |
5 | 31 | 32 | 33 | 34 | 35 | 36 |
12→17→12と動きます。
結局、最後のコード
'左右下対称移動
For i = 0 To m - 1
w = a((i + 1) Mod 3, i)
a((i + 1) Mod 3, i) = a((i + 1) Mod 3, n - 1 - i)
a((i + 1) Mod 3, n - 1 - i) = w
Next
0 | 1 | 2 | 3 | 4 | 5 | |
0 | 1 | 2 | 3 | 4 | 5 | 6 |
1 | 7 | 8 | 9 | 10 | 11 | 12 |
2 | 13 | 14 | 15 | 16 | 17 | 18 |
3 | 19 | 20 | 21 | 22 | 23 | 24 |
4 | 25 | 26 | 27 | 28 | 29 | 30 |
5 | 31 | 32 | 33 | 34 | 35 | 36 |
の紺の交換となります。
以上、対角線の点対称移動・逆対角線の点対称移動・中央の直線に対する上下線対称移動・中央の直線に対する左右線対称移動
のすべてが遂行され、6次魔方陣が完成します。
'検証
Sub f5(n As Byte)
Dim i As Byte, j As Byte, w As Byte
Cells(21, 1) = "検証"
'6次魔方陣再表示
For i = 0 To n - 1
For j = 0 To n - 1
Cells(22 + i, 1 + j) = a(i, j)
Next
Next
'行合計の算出と表示
For i = 0 To n - 1
w = 0
For j = 0 To n - 1
w = w + a(i, j)
Next
Cells(22 + i, 7) = w
Next
'列合計の算出と表示
For i = 0 To n - 1
w = 0
For j = 0 To n - 1
w = w + a(j, i)
Next
Cells(28, 1 + i) = w
Next
'対角線合計の算出と表示
w = 0
For i = 0 To n - 1
w = w + a(i, i)
Next
Cells(21, 7) = "対角線合計"
Cells(21, 9) = w
'対角線合計の算出と表示
w = 0
For i = 0 To n - 1
w = w + a(n - 1 - i, n - 1 - i)
Next
Cells(28, 7) = "対角線合計"
Cells(28, 9) = w
End Sub
の部分は解説していませんが、
皆さんはご自分でトレースしてみましょう。
以上の解説を終わりとして、第8講4次魔方陣と6次魔方陣の作成 を閉じたいと思います。
以後の予定を述べておくと
第9講 For文以外の様々なループ文
第10講 Subプロシージャの再帰的使用
第11講 Funcitonプロシージャの再帰的使用
第12講 高次元ループと高次元配列
第13講 高次元配列と1次元配列の関係
の順に進めていくつもりです。
第9話へ 第9講第1話へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る