第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 | 01 | 57 | 10 | 10 | 79 | 28 | 04 | |
29 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |
62 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||
64 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||
26 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||||
27 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||||
82 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||||||
82 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||||||
58 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||||||||
98 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||||||||
91 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||||||||||
22 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||||||||||
69 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||||||||||||
98 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||||||||||||
24 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||||||||||||||
53 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||||||||||||||
10 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||||||||||||||||
99 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||||||||||||||||
67 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||||||||||||||||||
01 | ○ | ○ | ○ | ○ | ○ | ○ | |||||||||||||||||||
57 | ○ | ○ | ○ | ○ | ○ | ||||||||||||||||||||
10 | ○ | ○ | ○ | ○ | |||||||||||||||||||||
10 | ○ | ○ | ○ | ||||||||||||||||||||||
79 | ○ | ○ | |||||||||||||||||||||||
28 | ○ | ||||||||||||||||||||||||
04 |
解説を読むときに、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話へ
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
数学研究室に戻る