第6講 If文(分岐)を理解しよう

第19話 数独のブロック部分を1次元For文によって4次元ループする方法による改良トレースその3

コード主要部分再掲

  Dim a3a As Byte, a3s As Byte 'a3aはaを3で割った余り。a3saを3で割った余り。aはiを9で割った余り。
  Dim s3a As Byte, s3s As Byte 's3aはsを3で割った余り。s3ssを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

トレースその3
皆さん今までのトレースから、
iが0から8までは

7 6 5
1 4 8
2 3 9
 
 
7 6 5
1 4 8
2 3 9
 
 
7 6 5
1 4 8
2 3 9
 
7 6 5
1 4 8
2 3 9
 
 
7 6 5
1 4 8
2 3 9
 
 
7 6 5
1 4 8
2 3 9
 
7 6 5
1 4 8
2 3 9
 
 
7 6 5
1 4 8
2 3 9
 
 
7 6 5
1 4 8
2 3 9
 

と動いていきその間に
v=7×6×5×1×4×8×2×3×9
を実現することは、理解されたでしょうか。
さて、i = 8のとき、
    a = i Mod 9 
からaは8ですから、はじめて
    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

が実行されます。
また、
    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はブロックの縦を制御する変数
からそれぞれs=0 a3a=2 a3s=2 s3a=0 s3a=0ですから
Cells(17 + s3s, 5 + 6 * s3a)などはそれぞれ
Cells(17 , 5) Cells(17 , 6) Cells(17 , 7) Cells(9 , 12)です。
      If v = x Then Cells(17 + s3s, 9 + 6 * s3a) = "○" Else Cells(17 + s3s, 9 + 6 * s3a) = "×"
の条件式は当然正しいですからThenの行程部分が遂行され、
Cells(9 , 12)はI17ですから


となります。
そして、
      v = 1
によって、vは初期化されます。

さて、i = 9(すなわち、10回目のループはどうなるでしょうか。)

i = 9(10回目のループ)のとき
    a = 9 Mod 9
    s = Int(9 / 9)

 は
    a = 9 Mod 9
    s = Int(9 / 9)

 から
    a = 0


0 1 2
3 4 5
6 7 8

(番号を0から割り振っています。色が対応させてあります。)
    s = 1 (10回目にしてはじめてsが動きました。)


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 = 1 Mod 3    's3aはブロックの横を制御する変数
    s3s = Int(1 / 3)   's3sはブロックの縦を制御する変数

 から
    a3a = 0

    a3s = 0

  0
0 1 2
3 4 5
6 7 8

茶色a3aに対応 a3sに対応)
    s3a = 1
    s3s =
0

   0
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 * 1 + 0))
 から
    v = v * CLng(Cells(7, 12))

  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 
7
 
に対応)


  12 
12
 
に対応)

 は 
    v = 1 * 4

  (4は 
4
 
  です。)

 から
    v = 4
 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
 によって11回目のループと相成ります。
i = 9 においてはじめてブロックをまたぎました。

次は少し飛ばしてi = 27ならどうでしょうか。

    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はブロックの縦を制御する変数
からそれぞれ
    a = 0
    
s = 3
    
a3a = 0
    a3s = 0
    s3a = 0
    s3s = 1
ですから

    v = v * CLng(Cells(7 + 3 * s3s + a3s, 9 + 3 * s3a + a3a))
 は
    v = v * CLng(Cells(7 + 3 * 1 + 0, 9 + 3 * 0 + 0))
 から
    v = v * CLng(Cells(10, 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


これ以上トレースを繰り返すとくどくなります。
次話でまとめをしてトレースを締めくくりましょう。


18話へ 第20話へ


トップ

初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ