第7講 Subプロシージャ

第6話 重複チェックを重複してチェックしてしまうことの改善

改善例
Public Class Form1
   Dim a(4, 4) As Integer, b(24) As Integer, s As Integer
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     '変数の宣言
     Dim i As Integer, w As String
     s = 0 '総数カウンタの初期化
     f1() 'ランダム行列の作成
     f2() '行列内の数字の重複の検査
     If s = 0 Then w = "数字の重複がありませんでした。"
     If s > 0 Then
       w = "数字の重複がありました。" + vbNewLine + "その数字は" + vbNewLine
       For i = 0 To s - 1
         w = w + b(i).ToString + " "
       Next
     End If
     Label2.Text = w
   End Sub

   Sub f1()
     '変数の宣言
     Dim i As Integer, j As Integer
     Dim w As String

     'ランダム行列の発生
     For i = 0 To 4
       For j = 0 To 4
         a(i, j) = Int(300 * Rnd())  '300は好みで調整
       Next
     Next
     'ランダム行列の表示
     For i = 0 To 4
       For j = 0 To 4
         If a(i, j) < 10 Then w = w + "00" + a(i, j).ToString + " "
         If a(i, j) >= 10 And a(i, j) < 100 Then w = w + "0" + a(i, j).ToString + " "
         If a(i, j) >= 100 Then w = w + a(i, j).ToString + " "
       Next
       w = w + vbNewLine
     Next
     Label1.Text = w
   End Sub

   Sub f2()
     '変数の宣言
     Dim i As Integer, j As Integer

     '重複検査 比べる側
     For i = 0 To 4
       For j = 0 To 4
         f3(i, j)
       Next
     Next
   End Sub

   Sub f3(ByVal p As Integer, ByVal q As Integer)
     '変数の宣言
     Dim i As Integer, j As Integer

     '重複検査  比べられる側
     For i = p To 4
       If i = p Then k = q + 1
       If i > p Then k = 0
       For j = k To 4
         If a(p, q) = a(i, j) Then
           b(s) = a(i, j)
           s = s + 1
         End If
       Next

     Next
   End Sub

End Class

実行例


皆さんの頭には?が浮かんでいますよね。

29 62 64 26 27 82 82 58 98 91 22 69 98 24 53 10 99 67 57 10 10 79 28
29
62
64
26
27
82
82
58
98
91
22
69
98
24
53
10
99                                  
67                                    
                                     
57                                        
10                                          
10                                            
79                                              
28                                                
                                                 


解説を読むときに、a(p, q)は比べられる数字で、 a(i, j)は比べる数字であることの注意されてください。

一番最初の29は、29以降の62,64,26,・・・,4と重複がないか調べます。
次の62は29とは一回比較されていますから、重複チェックは必要ありません。
64以降と比較をすればよいわけです。

次の64は29と62とは重複チェックは済んでいるので、
26以降の数字と比較すればよいのです。
If i = p Then k = q + 1となっているのは自分自身の次の数字と比較させるためです。
2行目以降ではどうでしょうか。

98は前の29〜69とは一度チェックされているので調べる必要はありません。
なので、For i = p To 4 かつ If i = p Then k = q + 1となっているのです。
つまり、98との比較は98ある行の98の次の24との比較から始まるわけです。
ではIf i > p Then k = 0 の意味は何でしょうか。98の次行からは0列目の10から比較させるためです。
98と同じ行では24と53のみと比較すればよいのに対して、
次の行は、10,99,67,1,157とすべてと比較する必要があります。
次の次の行もすべてと比較する必要があります。
ですから、If i > p Then k = 0
となっているわけです。


今回は、難解になって申し訳ありません。
プロシージャの意義をまとめて、この講を閉じることにしましょう。
T プロシージャに分けることによって、それぞれのプログラムが短くなって分業が可能になる。
U プロシージャに分けることによって、それぞれのプログラムが短くなってわかりやすくなる。
V プロシージャに分けることによって、プログラムの構造がより単純になる。
   例 4次元ループが2次元ループに落とされる。
W プロシージャの独立性により、構造化プログラミング(プラモデルの独立部品からプラモデルを組み立てるように、独立したプロシージャから全体を組み立てること)が可能になる。




第5話へ 第8講第1話へ

006

VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座

数学研究室に戻る