第6講 If文(分岐)を理解しよう
第17話 数独のブロック部分を1次元For文によって4次元ループする方法による改良トレースその1
コード主要部分再掲
Dim a3a As Byte, a3s As Byte 'a3aはaを3で割った余り。a3sはaを3で割った余り。aはiを9で割った余り。
Dim s3a As Byte, s3s As Byte 's3aはsを3で割った余り。s3sはsを3で割った余り。sはiを9で割った余り。
v = 1
For i = 0 To 80
a = i Mod 9 'aは内側の正方形の番号 ただし、0から番号が割り振られています。
s = Int(i / 9) 'sはブロックの番号 ただし、0から番号が割り振られています。
a3a = a Mod 3 'a3aは内側の正方形の横を制御する変数
a3s = Int(a / 3) 'a3s は内側の正方形の縦を制御する変数
s3a = s Mod 3 's3aはブロックの横を制御する変数
s3s = Int(s / 3) 's3sはブロックの縦を制御する変数
v = v * CLng(Cells(7 + 3 * s3s + a3s, 9 + 3 * s3a + a3a))
If a = 8 Then
Cells(17 + s3s, 5 + 6 * s3a) = "第"
Cells(17 + s3s, 6 + 6 * s3a) = s + 1
Cells(17 + s3s, 7 + 6 * s3a) = "ブロック"
If v = x Then Cells(17 + s3s, 9 + 6 * s3a) = "○" Else Cells(17
+ s3s, 9 + 6 * s3a) = "×"
v = 1
End If
Next
トレースその1
色が対応させてありますので、
色対応に注意しながらお読みください。
1行目
v = 1
によって、vは1に初期化されます。
2行目以降にループ処理に入ります。
i = 0(1回目のループ)のとき
a = i Mod 9
s = Int(i / 9)
は
a = 0 Mod 9
s = Int(0 / 9)
から
a = 0
0 | 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
(番号を0から割り振っています。色が対応させてあります。)
s = 0
0 | 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
(ブロック番号を0から割り振っています。色が対応させてあります。)
ですから、
a3a = a Mod 3 'a3aは内側の正方形の横を制御する変数
a3s = Int(a / 3) 'a3s は内側の正方形の縦を制御する変数
s3a = s Mod 3 's3aはブロックの横を制御する変数
s3s = Int(s / 3) 's3sはブロックの縦を制御する変数
は
a3a = 0 Mod 3 'a3aは内側の正方形の横を制御する変数
a3s = Int(0 / 3) 'a3s は内側の正方形の縦を制御する変数
s3a = 0 Mod 3 's3aはブロックの横を制御する変数
s3s = Int(0 / 3) 's3sはブロックの縦を制御する変数
から
a3a = 0
a3s = 0
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
2 | 6 | 7 | 8 |
(茶色がa3aに対応 紫がa3sに対応)
s3a = 0
s3s = 0
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
2 | 6 | 7 | 8 |
(茶色がs3aに対応 紫がs3sに対応)
次の
v = v * CLng(Cells(7 + 3 * s3s + a3s, 9 + 3 * s3a + a3a))
は
v = v * CLng(Cells(7 + 3 * 0 + 0, 9 + 3 * 0 + 0))
から
v = v * CLng(Cells(7, 9))
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | |
7 | 7 | 6 | 5 | 4 | 8 | 3 | 9 | 1 | 2 |
8 | 1 | 4 | 8 | 9 | 2 | 5 | 7 | 6 | 3 |
9 | 2 | 3 | 9 | 7 | 6 | 1 | 4 | 5 | 8 |
10 | 3 | 2 | 4 | 1 | 7 | 6 | 5 | 8 | 9 |
11 | 5 | 9 | 1 | 8 | 3 | 4 | 6 | 2 | 7 |
12 | 8 | 7 | 6 | 5 | 9 | 2 | 1 | 3 | 4 |
13 | 9 | 1 | 2 | 6 | 4 | 8 | 3 | 7 | 5 |
14 | 4 | 5 | 3 | 2 | 1 | 7 | 8 | 9 | 6 |
15 | 6 | 8 | 7 | 3 | 5 | 9 | 2 | 4 | 1 |
(7は |
|
に対応) |
(9は |
|
に対応) |
は
v = 1 * 7
(7は |
|
です。) |
から
v = 7
aは0ですから、
If a = 8 Then
Cells(17 + s3s, 5 + 6 * s3a) = "第"
Cells(17 + s3s, 6 + 6 * s3a) = s + 1
Cells(17 + s3s, 7 + 6 * s3a) = "ブロック"
If v = x Then Cells(17 + s3s, 9 + 6 * s3a) = "○" Else Cells(17
+ s3s, 9 + 6 * s3a) = "×"
v = 1
End If
は遂行されません。
そして、
Next
によって2回目のループと相成ります。
初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門
数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ