第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によって

4
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-1 -1 -1 -1 -1
-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
でよいわけです。この繰り返し処理によって、先の表は

4
-1 -1 -1 -1
-1 -1 -1 -1
-1 -1 -1 -1
-1 -1 -1 -1
4 -1 -1 -1 -1


となります。次に、逆対角線
  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)とされていましたので、

4
-1 -1 -1
-1 -1 -1 -1
-1 -1 -1 -1
-1 -1 -1 -1
4 -1 -1 -1 -1


となります。
次に、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
によって

4
-1 -1 -1
-1 -1 -1
-1 -1 -1 -1
-1 -1 -1 -1
4 -1 -1 -1 -1


となります。
















次に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
は実行されず

4
-1 -1 -1
-1 -1 -1
-1 -1 -1 -1
-1 -1 -1 -1
4 -1 -1 -1 -1


のままとなります。
i=3のとき、
a(i, n - 1 - i)=a(3, 5 - 1 - 3)=a(3, 2)ですから
a(i, n - 1 - i)=−1です。
したがって、If文が実行され

4
-1 -1 -1
-1 -1 -1
-1 -1 -1 -1
-1 -1 -1
4 -1 -1 -1 -1


となります。


見事に重複を避けています。
これが最初に仮番号−1を付ける意味です。
最後は同様にして

4
-1 -1 -1
-1 -1 -1
-1 -1 -1 -1
-1 -1 -1
4 -1 -1 -1


となります。




















第6話へ 第8話へ

004
  

VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る