第8回 Functionプロシージャでユーザー独自の関数を定義する:基礎解説 演習方式で身につけるチェック式WSH超入門(3/3 ページ)
Functionプロシージャでユーザー独自の関数を定義してみよう。さまざまなループ・ステートメント構文や再帰呼び出しについても学ぶ。
最後に1つ、今回のまとめとしてSubプロシージャとFunctionプロシージャを組み合わせたものを例題として出題する。与えられた数値が素数(prime number)かどうかを判定し、ブール値を返すFunctionプロシージャIsPrimeと、IsPrimeを呼び出すことで、指定した数値の範囲に含まれる素数を求め、表示するSubプロシージャShowPrimeを作成してみよう。なお、素数とは、1およびその数自身のほかに約数を持たない自然数のことである。整数aが整数bで割り切れるとき、bをaの約数という。
マーカーで隠れたところを選択してチェックしてみよう。
Option Explicit
'1から100までの間に含まれる素数を表示
Call ShowPrime(1, 100)
'1000から2000までの間に含まれる素数を表示
Call ShowPrime(1000, 2000)
'*********************************************************
'用途: 与えられた数値の範囲に含まれる素数を表示する
'受け取る値: intStart: 開始する数値(Integer)
' intEnd: 終了する数値(Integer)
'戻り値: なし
'*********************************************************
Sub ShowPrime(intStart, intEnd)
'開始と終了の値の大きさが逆だったら終了
If intStart > intEnd Then
Exit Sub
End If
Dim intCounter, intPrimeCount, strPrime
strPrime = ""
intPrimeCount = 0
'開始の数値から終了の数値までループする
For intCounter = intStart To intEnd
' intCounterが素数なら
If IsPrime(intCounter) Then
'出力文字列にその値を加える
strPrime = strPrime & intCounter & ","
'素数の数をインクリメント
intPrimeCount = intPrimeCount + 1
'整形のため、10個ごとに改行コードを入れる
If intPrimeCount Mod 10 = 0 Then
strPrime = strPrime & vbCrLf
End If
End If
Next
MsgBox intStart & "から" & intEnd & "までの素数:" & vbCrLf & _
strPrime & vbCrLf & _
"(" & intPrimeCount & "個)"
End Sub
'*********************************************************
'用途: 与えられた数値が素数かどうかを判定する
'受け取る値: intNumber: 判定する数値(Integer)
'戻り値: 与えられた数値の階乗(Boolean)
'*********************************************************
Function IsPrime(intNumber)
'引数が1未満なら終了
If intNumber < 1 Then
IsPrime = False 'Falseを返す
Exit Function
End If
Dim intCounter, intFactorCount
intFactorCount = 0
'1から引数の数値まで繰り返す
For intCounter = 1 To intNumber
'引数がカウンターの数値で割り切れる場合は
If intNumber Mod intCounter = 0 Then
'約数の数をインクリメントする
intFactorCount = intFactorCount + 1
End If
Next
'約数の数が2つならTrue、それ以外ならFalseを返す
If intFactorCount = 2 Then
IsPrime = True
Else
IsPrime = False
End If
End Function
このスクリプトを実行すると、次のようなメッセージ・ボックスが連続して表示される。
指定範囲の素数をピックアップして表示するSubプロシージャShowPrimeと、与えられた数値が素数であるかどうかを判定するFunctionプロシージャIsPrimeを分離して記述している。
このスクリプトにおいては、素数かどうかを判定するFunctionプロシージャと、素数を表示するSubプロシージャをそれぞれ分けて記述することで、それぞれのプロシージャの持つ役割を明確に分離している。スクリプトが長くなるにつれ、スクリプト・レベルに記述する量が増えると、スクリプトが読みにくくなり、保守性も下がる。そのため、処理をプロシージャごとに細かく分けて記述していくのがよい方法である。
今回はSubプロシージャおよびFunctionプロシージャについて取り上げた。両者の違いは値を返すか返さないかであるが、本質は同じで、同じ処理を繰り返して行えるようにすることと、処理を細分化することであることをよく頭に入れておいてほしい。
今回までで、VBScriptの基本的な構文などについては一通り説明が終わった。次回からはVBScript基本編の最後として、オブジェクトの話題について取り上げる。
Copyright© Digital Advantage Corp. All Rights Reserved.