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

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

コード主要部分再掲

  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

トレースその2
1回目のループによって、vに

  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
 
が入りました。 

この状態で、2回目のループに入ります。
i = 1(2回目のループ)のとき
    a = 1 Mod 9
    s = Int(1 / 9)

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

 から
    a = 1

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

 から
    a3a = 1

    a3s = 0

  0
0 1 2
3 4 5
6 7 8

茶色a3aに対応 a3sに対応)
    s3a = 0
    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 * 0 + 1))
 から
    v = v * CLng(Cells(7, 10))

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

 は 
    v = 7 * 6

  (6は 
6
 
  です。)

 から
    v = 42
 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
 によって3回目のループと相成ります。
 2回目終了時点では

 
7 6
 
の2つがかけられv = 7×6が実現しています。   

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

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

 から
    a = 2

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 = 2 Mod 3    'a3aは内側の正方形の横を制御する変数
    a3s = Int(2 / 3)   'a3s は内側の正方形の縦を制御する変数
    s3a = 0 Mod 3    's3aはブロックの横を制御する変数
    s3s = Int(0 / 3)   's3sはブロックの縦を制御する変数

 から
    a3a = 2

    a3s = 0


  0
0 1 2
3 4 5
6 7 8

茶色a3aに対応 a3sに対応)
    s3a = 0
    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 * 0 + 2))
 から
    v = v * CLng(Cells(7, 11))

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


  10 
11
 
に対応)

 は 
    v = 42 * 5

  (5は 
5
 
  です。)

 から
    v = 210
 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
 によって4回目のループと相成ります。

 3回目終了時点では

 
7 6 5
 
の3つがかけられv = 7×6×5が実現しています。   

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

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

 から
    a = 3

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 = 3 Mod 3    'a3aは内側の正方形の横を制御する変数
    a3s = Int(3 / 3)   'a3s は内側の正方形の縦を制御する変数
    s3a = 0 Mod 3    's3aはブロックの横を制御する変数
    s3s = Int(0 / 3)   's3sはブロックの縦を制御する変数

 から
    a3a = 0

    a3s = 1 (はじめてa3sが動きました。)

  0
0 1 2
3 4 5
6 7 8

茶色a3aに対応 a3sに対応)
    s3a = 0
    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 + 1, 9 + 3 * 0 + 0))
 から
    v = v * CLng(Cells(8, 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


  8 
8
 
に対応)


  9 
9
 
に対応)

 は 
    v = 210 * 1

  (1は 
1
 
  です。)

 から
    v = 210
 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
 によって5回目のループと相成ります。

 4回目終了時点では

 
7 6 5
1 * *
 
の4つがかけられv = 7×6×5×1が実現しています。   


ファイルが大分大きくなりました。
以降は次回に譲りたいと思います。




17話へ 第19話へ


トップ

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

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