第18講 一般種法×末項確定法(魔方陣作成マクロVer.4)への挑戦
第7話 番号付けのコード解説その3
すでに、第5話までで主要な説明は終わっていますので、
ここでは具体的にトレースしてみましょう。
5次の場合でトレースしてみます。
皆さんは、4次、6次なでもトレースをしてみましょう。
Sub zhy()
Dim i As Byte
For i = 0 To n - 1
a(i, i) =
i
Next
For i = 0 To n - 1
If a(i, n - 1 - i) = -1
Then
a(i, n - 1 - i) = gk
gk = gk + 1
End
If
Next
End Sub
Sub zhy1(g As Byte)
Dim i As Byte
For i
= g + 1 To n - 1
If a(g, i) = -1 Then
a(g, i) = gk
gk =
gk + 1
End If
Next
zhy2 (g)
End Sub
Subプロシージャのsyokikaによって
0 | 1 | 2 | 3 | 4 | |
0 | -1 | -1 | -1 | -1 | -1 |
1 | -1 | -1 | -1 | -1 | -1 |
2 | -1 | -1 | -1 | -1 | -1 |
3 | -1 | -1 | -1 | -1 | -1 |
4 | -1 | -1 | -1 | -1 | -1 |
となっていることは解説は不要でしょう。
ですから、
Sub zhy()
Dim i As Byte
For i = 0 To n - 1
a(i, i) =
i
Next
For i = 0 To n - 1
If a(i, n - 1 - i) = -1
Then
a(i, n - 1 - i) = gk
gk = gk + 1
End If
Next
End Sub
の部分をトレースしてみましょう。
まず、対角線は初めて本番号を入れるので上書きの心配がいりません。
なので
For i = 0 To n - 1
a(i, i) =
i
Next
でよいわけです。この繰り返し処理によって、先の表は
0 | 1 | 2 | 3 | 4 | |
0 | 0 | -1 | -1 | -1 | -1 |
1 | -1 | 1 | -1 | -1 | -1 |
2 | -1 | -1 | 2 | -1 | -1 |
3 | -1 | -1 | -1 | 3 | -1 |
4 | -1 | -1 | -1 | -1 | 4 |
となります。次に、逆対角線
For i = 0 To n - 1
If a(i, n - 1 - i) = -1
Then
a(i, n - 1 - i) = gk
gk = gk + 1
End If
Next
は書き換えの心配がありますので、If文がついています。
仮番号−1の場合だけ書き換え、本番号のときは書き換えないようにしてあります。
i=0とき、
a(i, n - 1 - i)=a(0, 5 - 1 - 0)=a(0, 4)ですから
a(i, n - 1 - i)=−1です。
したがって、If文が実行されますが、
Subプロシージャsyokikia
Sub syokika()
Dim i As Byte
Dim j As Byte
For i = 0 To n * n -
1
p(i) = 0
Next
sk = 0
cn = 0
gk = n
For i = 0
To n - 1
For j = 0 To n - 1
a(i, j) =
-1
Next
Next
End Sub
において、gk = n(=5)とされていましたので、
0 | 1 | 2 | 3 | 4 | |
0 | 0 | -1 | -1 | -1 | 5 |
1 | -1 | 1 | -1 | -1 | -1 |
2 | -1 | -1 | 2 | -1 | -1 |
3 | -1 | -1 | -1 | 3 | -1 |
4 | -1 | -1 | -1 | -1 | 4 |
となります。
次に、i=1のとき、
a(i, n - 1 - i)=a(1, 5 - 1 - 1)=a(1, 3)ですから
a(i, n - 1 - i)=−1です。
したがって、If文が実行されます。
i=0のときのIf文においてgk = gk + 1が実行されていて
gk=6ですので
For i = 0 To n - 1
If a(i, n - 1 - i) = -1
Then
a(i, n - 1 - i) = gk
gk = gk + 1
End If
Next
によって
0 | 1 | 2 | 3 | 4 | |
0 | 0 | -1 | -1 | -1 | 5 |
1 | -1 | 1 | -1 | 6 | -1 |
2 | -1 | -1 | 2 | -1 | -1 |
3 | -1 | -1 | -1 | 3 | -1 |
4 | -1 | -1 | -1 | -1 | 4 |
となります。
次にi=2のとき、
a(i, n - 1 - i)=a(2, 5 - 1 - 2)=a(2, 2)ですから
a(i, n - 1 - i)=2です。
したがって、If文
If a(i, n - 1 - i) = -1
Then
a(i, n - 1 - i) = gk
gk = gk + 1
End If
は実行されず
0 | 1 | 2 | 3 | 4 | |
0 | 0 | -1 | -1 | -1 | 5 |
1 | -1 | 1 | -1 | 6 | -1 |
2 | -1 | -1 | 2 | -1 | -1 |
3 | -1 | -1 | -1 | 3 | -1 |
4 | -1 | -1 | -1 | -1 | 4 |
のままとなります。
i=3のとき、
a(i, n - 1 - i)=a(3, 5 - 1 - 3)=a(3, 2)ですから
a(i, n - 1 - i)=−1です。
したがって、If文が実行され
0 | 1 | 2 | 3 | 4 | |
0 | 0 | -1 | -1 | -1 | 5 |
1 | -1 | 1 | -1 | 6 | -1 |
2 | -1 | -1 | 2 | -1 | -1 |
3 | -1 | 7 | -1 | 3 | -1 |
4 | -1 | -1 | -1 | -1 | 4 |
となります。
見事に重複を避けています。
これが最初に仮番号−1を付ける意味です。
最後は同様にして
0 | 1 | 2 | 3 | 4 | |
0 | 0 | -1 | -1 | -1 | 5 |
1 | -1 | 1 | -1 | 6 | -1 |
2 | -1 | -1 | 2 | -1 | -1 |
3 | -1 | 7 | -1 | 3 | -1 |
4 | 8 | -1 | -1 | -1 | 4 |
となります。
第6話へ 第8話へ
VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る