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

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

コード主要部分再掲

  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

トレースその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
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 + 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 
7
 
に対応)
  9 
9
 
に対応)

 は 
    v = 1 * 7

  (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回目のループと相成ります。

 






16話へ 第18話へ


トップ

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

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