第10講 Sub プロシージャと Function プロシージャの呼び出し
第5話 Function プロシージャ
Subプロシージャは引数だけで、戻り値を持っていませんでした。
それに対してFunction プロシージャは戻り値を持ちます。
これは数学の関数と同じです。
例として、f(x)=3xー1をとりましょう。
xに2を入れるとf(x)は5の値を返します。
つまりf(2)=5です。
引数2に対して戻り値として5を返すのです。
Functionプロシージャも同じで引数と戻り値を持ちます。
だから、Function プロシージャを関数とも言います。
さて、それでは戻り値を持つFunctionプロシージャを用いて、
1から10,000までの素数をすべて表示させ、
その個数を求めるプログラムを考えましょう。
Functionプロシージャで素数の判定をし、
素数の場合は戻り値1、
素数でない場合は戻り値0
を返すようにして戻り値が1のときのみエクセルのシートに表示させ、
同時に表示させるようにしましょう。
Functionプロシージャ名をsosuuhanteiとしましょう。
Functionプロシージャsosuuhanteiの作り方は、
Subプロシージャの作り方と同じです。
Private Sub CommandButton1_Click()
・
・
・
End Sub
の外側でFunction sosuuhantei(g as integer)と打って、
エンターキーを押せばよいのです。
そうすると自動的にFunctionプロシージャ
Function sosuuhantei(g as integer)
End Function
ができあがります。
素数の判定は、2以上の整数については
対象の整数を2以上でその数の半分以下のすべて整数で対象の整数を割って、
すべて割り切れなけれがよいのです。
逆に言うと、1つでも割り切れれば素数ではないとなります。
つまり次のようにプログラムすればよいのです。
Function sosuuhantei(g As Integer)
Dim i As Integer, h As Integer, o As Integer
sosuuhantei = 1
o = Int(g / 2)
For i = 2 To o
If g Mod i = 0 Then
sosuuhantei = 0
Exit For
End If
Next
End Function
上のプログラム一見すると2も素数でないと判定してしまいそうですが、
oは1なので
For i = 2 To o
If g Mod i = 0 Then
sosuuhantei = 0
Exit For
End If
Next
の部分は実行されませんので、sosuuhantei が0になる心配はありません。
実は、このプログラム少し無駄があります。
なぜなら2以外は素数は奇数ですから
3以上については奇数のみを判定すればよいのです。
さらに、割る数にしても判定しようとしている整数の半分まで調べる必要はありません。
対象の整数のルートまでで十分です。
例えば、9ならルート9=3までで十分です。
なぜなら、ルート9で割った商もルート9だからです。
そこで改良して
Private Sub CommandButton1_Click()
Dim i As Integer
Dim h As Integer
Dim sousuu As Integer
Dim sousuua As Integer
Dim sousuus As Integer
sousuu = 1
Cells(5, 1) = "1から10,000までの素数個数="
Cells(6, 1) = 2
For i = 3 To 10000 Step 2
h = sosuuhantei(i)
If h = 1 Then
sousuua = sousuu Mod 20
sousuus = Int(sousuu / 20)
Cells(6 + sousuus, 1 + sousuua) = i
sousuu = sousuu + 1
Cells(5, 6) = sousuu
End If
Next
End Sub
Function sosuuhantei(g As Integer)
Dim i As Integer, h As Integer, o As Integer
sosuuhantei = 1
o = Int(Sqr(g))
For i = 3 To o Step 2
If g Mod i = 0 Then
sosuuhantei = 0
Exit For
End If
Next
End Function