第3話 for文型プログラムの解説その2
お約束の通り、後2,3回かけてプログラムを解説していきます。
第11講のプログラムは初心者の方には、
かなり難解かと思われますので、
順を追って説明したいと思います。
Private Sub CommandButton1_Click()
Dim i As Integer, j As Integer, k As Integer, l As Integer, h1 As Integer,
h2 As Integer, jyn(3) As Integer
Dim sousuu As Long
For i = 1 To 3
jyn(1) = i
For j = 1 To 3
jyn(2) = j
h1 = 1
For k = 1 To 1
If jyn(2) = jyn(k) Then
h1 = 0
Exit For
End If
Next
If h1 = 1 Then
For k = 1 To 3
jyn(3) = k
h2 = 1
For l = 1 To 2
If jyn(3) = jyn(l) Then
h2 = 0
Exit For
End If
Next
If h2 = 1 Then
sousuua = sousuu Mod 8
sousuus = Int(sousuu / 8)
sousuu = sousuu + 1
For l = 1 To 3
Cells(5 + sousuus * 2, 1 + l + sousuua * 4)
= jyn(l)
Next
End If
Next
End If
Next
Next
End Sub
まず、最初のループ
For i = 1 To 3
jyn(1) = i
・
・
・
Next
は何をやっているのでしょうか。
1 | 2 | 3 |
ここでは、ピンクのマスに1から3まで入れています。
jyn(1)は1マス目を意味しているわけです。
これがわかれば、次のループ
For j = 1 To 3
jyn(2) = j
h1 = 1
For k = 1 To 1
If jyn(2) = jyn(k) Then
h1 = 0
Exit For
End If
Next
・
・
・
Next
はもうおわかりでしょう。
1 | 2 | 3 |
のピンクに1から3まで入れループです。
では
For k = 1 To 1
h1 = 1
If jyn(2) = jyn(k) Then
h1 = 0
Exit For
End If
Next
の部分では何をしているのでしょうか。
それはjyn(2)とjyn(1)の数字が重ならないようにしているのです。
For k = 1 To 1は結局k = 1しか動きません。
したがって、
If jyn(2) = jyn(k) Then
h1 = 0
Exit For
End If
では、もしjyn(2)=jyn(1)ならばh1=0として
If h1 = 1 Then
・
・
・
End If
を実行させないわけです。
例えば、一番最初のループi = 1、j= 1では
jyn(1)=1 、jyn(2)=1で
If h1 = 1 Then
・
・
・
End If
は実行されずに、Nextによってj=2となり、
1 | 2 | 3 |
となるのです。
If h1 = 1 Then
For k = 1 To 3
jyn(3) = k
h2 = 1
For l = 1 To 2
If jyn(3) = jyn(l) Then
h2 = 0
Exit For
End If
Next
Next
・
・
・
End If
も同様で、jyn(3)=jyn(1)またはjyn(3)=jyn(2)ならば、
If h2 = 1 Then
sousuua = sousuu Mod 8
sousuus = Int(sousuu / 8)
sousuu = sousuu + 1
For l = 1 To 3
Cells(5 + sousuus * 2, 1 + l + sousuua * 4)
= jyn(l)
Next
End If
実行されず、Nextが2回行われて、
k=3になって、
1 | 2 | 3 |
となり、1個目の順列ができあがるのです。
kは3が最後ですから、2番目のループ
For j = 1 To 3
jyn(2) = j
h1 = 1
For k = 1 To 1
If jyn(2) = jyn(k) Then
h1 = 0
Exit For
End If
Next
・
・
・
Next
に戻り、j=3となり再び3番目のループ
For k = 1 To 3
jyn(3) = k
h2 = 1
For l = 1 To 2
If jyn(3) = jyn(l) Then
h2 = 0
Exit For
End If
Next
に入ります。k=1のとき、jyn(1)とjyn(3)がそれぞれ1になり
If h2 = 1 Then
sousuua = sousuu Mod 8
sousuus = Int(sousuu / 8)
sousuu = sousuu + 1
For l = 1 To 3
Cells(5 + sousuus * 2, 1 + l + sousuua * 4)
= jyn(l)
Next
End If
は実行されずNextによってk=2となり、
1 | 3 | 2 |
の2番目の順列ができあがります。
k=3のときは、2マス目と3マス目が同じになってしまうので
If h2 = 1 Then
sousuua = sousuu Mod 8
sousuus = Int(sousuu / 8)
sousuu = sousuu + 1
For l = 1 To 3
Cells(5 + sousuus * 2, 1 + l + sousuua * 4)
= jyn(l)
Next
End If
は実行されず、jの1回目のループ、kの2回目のループが終了となり、
For i = 1 To 3
jyn(1) = i
・
・
・
Next
のNextによってi=2となります。
こうして、jの2回目のループ、kの3回目のループに入り、
3個目の順列
2 | 1 | 3 |
ができあがります。
続いて、kの4回目のループ(jはまだ2回目のループ)によって、
4個目の順列
2 | 3 | 1 |
つぎに、jの3回目のループ(i=3)、kの5回目のループによって、
5個目の順列
3 | 1 | 2 |
最後に、kの6回目のループ(jはまだ3回目のまま)によって
最後の順列
3 | 2 | 1 |
ができあがるのです。
これで一通りトレースが終わりましたが、もう一度読者の皆さんは、
次のループをご自分でトレースしてみてください。
i | j | k |
1 | 1 | |
1 | 2 | 1 |
1 | 2 | 2 |
1 | 2 | 3 |
1 | 3 | 1 |
1 | 3 | 2 |
1 | 3 | 3 |
2 | 1 | 1 |
2 | 1 | 2 |
2 | 1 | 3 |
2 | 2 | |
2 | 3 | 1 |
2 | 3 | 2 |
3 | 1 | 1 |
3 | 1 | 2 |
3 | 1 | 3 |
3 | 2 | 1 |
3 | 2 | 2 |
3 | 2 | 3 |
3 | 3 |
では、まだ3次順列のループ版の解説が終わっていませんが、
大分長くなったので本日はここまでとします。
第2話へ 第4話へ