第1講 数字の規則的な配置
第4話 検証Functionプロシージャkensyouの解説
を実現するプログラムのFunctionプロシージャkensyou部分再掲
Function kensyou(a() As Integer, n As Integer)
Dim b(81) As Byte, i As Integer
For i = 0 To n - 1
b(i) = 0
Next
For i = 0 To n - 1
b(a(i)) = 1
Next
For i = 0 To n - 1
If b(i) = 0 Then
kensyou = 0
Exit Function
End If
Next
kensyou = 1
End Function
解説
For i = 0 To n - 1
b(i) = 0
Next
の3行ですべての配列を0に初期化しています。
すなわち、
b(0),b(1)=0,b(2)=0,b(3)=0,b(4)=0,・・・
For i = 0 To n - 1
b(a(i)) = 1
Next
For i = 0 To n - 1
If b(i) = 0 Then
kensyou = 0
Exit Function
End If
Next
kensyou = 1
がkensyouの主要エンジンです。
なぜ、これですべての数字が網羅されていることの証明になるのでしょうか
数字を小さくしてトレースしてみましょう。
0,1,2,3,4
についてはじめの数字を3として2つ飛びに数字を取っていくと
3→0→2→4→1
です。
この場合
a(0)=3,a(1)=0,a(2)=2,a(3)=4,a(4)=1
となります。
For i = 0 To n - 1
b(a(i)) = 1
Next
によって、
b(a(0))=b(3)=1
b(a(1))=b(0)=1
b(a(2))=b(2)=1
b(a(3))=b(4)=1
b(a(4))=b(1)=1
結局b(0)=0,b(1)=0,b(2)=0,b(3)=0,b(4)=0はすべて1に書き換えられています。
ですから、
For i = 0 To n - 1
If b(i) = 0 Then
kensyou = 0
Exit Function
End If
Next
のIf文は一度も実行されずに、
kensyou = 1
によって、1が返されるわけです。
今度は
0,1,2,3,4,5についてはじめの数字を3として2飛びに数字を取っていくと
3→5→1→3→5→1
です。
この場合は
For i = 0 To n - 1
b(a(i)) = 1
Next
によって、
b(a(0))=b(3)=1
b(a(1))=b(5)=1
b(a(2))=b(1)=1
b(a(3))=b(3)=1
b(a(4))=b(5)=1
b(a(5))=b(1)=1
となり、
b(0),b(2),b(4)は0のままです。
すると、
For i = 0 To n - 1
If b(i) = 0 Then
kensyou = 0
Exit Function
End If
Next
の1回目のループのときに、If文が実行されてしまい、
kensyou = 0
Exit Function
によって、0がPrivate Sub CommandButton1_Clickに返されてしまうわけです。
以上のトレースによって、
すべての数字が網羅されていることを確認する作業は、
数字の重複がないことを確認する作業と同じであることが分かります。
第5話の課題です。0からn×n−1までの数字を規則的に2次元に並べるマクロ
を作って下さい。
eclipse c++ 入門
魔方陣 数独(ナンプレ)で学ぶ VBA 入門
数独(ナンプレ)のシンプルな解き方・簡単な解法の研究
vc++講義へ
excel 2013 2010 2007 vba入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門へ
小学生からエンジニアまでのRuby入門へ
本サイトトップへ