LOTUSSCRIPT 言語
条件があるかどうか、条件がステートメント内のどこにあるかによって、3 種類の異なる Do ステートメントがあります。条件がまったくない場合も、While 句または Until 句を使って、最初または最後で指定される場合もあります。
構文は次のとおりです。
条件はありません。
条件は、各繰り返しの前に評価されます。
条件は、各繰り返しの後で評価されます。
doCount% = 0 Do doCount% = doCount% + 1 If doCount% >= 1000 Then Exit Do Loop
次の例では、各 Do ステートメントは前の例の Do ステートメントと同等です。
Dim doCount As Integer
' A Do While statement (condition at the beginning) doCount% = 0 Do While doCount% < 1000 doCount% = doCount% + 1 Loop
' A Do Until statement (condition at the beginning) doCount% = 0 Do Until doCount% >= 1000 doCount% = doCount% + 1 Loop
' A Do...Loop While statement (condition at the end) doCount% = 0 Do doCount% = doCount% + 1 Loop While doCount% < 1000
' A Do...Loop Until statement (condition at the end) doCount% = 0 Do doCount% = doCount% + 1 Loop Until doCount% > 1000
条件がループの最初の繰り返しの前で検査されるか、後で検査されるかという点で、Do ステートメントの形式が異なります。Do While または Do Until 条件ステートメントにある条件は最初の繰り返しの前に検査されますが、Do...Loop While または Do...Loop Until 条件ステートメントにある条件は、最初の繰り返しの後まで検査されません。この結果次のようになります。
doCount% = 1 Do While doCount% < 1 doCount% = doCount% + 1 Loop Print "Do While...Loop counter reached" doCount%
doCount% = 1 Do doCount% = doCount% + 1 Loop While doCount% < 1 Print "Do...Loop While counter reached" doCount% ' Output: ' Do While...Loop counter reached 1 ' Do...Loop While counter reached 2
Do ステートメントは、ステートメント内の変数ごとに別のスコープを設定しません。While condition 句または Until condition 句で使われる変数は、スクリプトの他の変数と同様です。前に変数が使われていない場合、condition に現れた時点で暗黙的に宣言され、初期化されます。
次に例を示します。
' Suppose that the variable named doCount% ' has not appeared in a script prior to its appearance here. Do While doCount% < 1 doCount% = doCount% + 1 Loop Print "Do While...Loop counter reached" doCount% ' Output: ' Do While...Loop counter reached 1
LotusScript は、doCount% を暗黙のうちに宣言し、ゼロに初期化します。このため、ループの本体は 1 回実行されます。しかし、この初期化に頼るのは危険なプログラミング手法です。実行時において以前に doCount% が現れていないこと、または doCount% の現在値がゼロであることを確認することなく、この動作に頼ることはできません。
次の例では Do ステートメントは、極限値に収束する数列の連続する項を計算します。
' This sub computes the quotient of each successive pair of ' terms of the Fibonacci sequence 1, 1, 2, 3, 5, 8, 13, ... ' The sequence of quotients 2, 3/2, 5/3, ... is known to ' converge to the golden mean (1 + Sqr(5))/2. ' The sub argument deltaLim! is the tolerance. ' This example illustrates the Do...Loop Until form of the ' Do statement, with a condition that is recomputed on each ' iteration. Sub FibiLim (deltaLim As Single) Dim r1 As Single, r2 As Single, r3 As Single Dim limTrue As Single Dim i As Integer ' Initialize the Fibonacci numbers and a counter. r1!= 1 r2!= 1 r3!= 1 i% = 2 Do NexTerm: i% = i% + 1 r1!= r2! r2!= r3! ' r3! is the next Fibonacci number. r3!= r2!+ r1! Print i%, "f(" & Str(i%) & "):"r3!, "quotient:" _ r3!/ r2! ' On the first iteration, disable the standard exit ' condition. If i% = 3 GoTo NexTerm ' Iterate until successive quotients are close. ' The sequence is known to converge, so the iteration ' will end. Loop Until Abs(r3!/ r2!- r2!/ r1!)< deltaLim! limTrue!= (1 + Sqr (5)) / 2 ' When done, show the closeness obtained and the actual ' limit. Print "Tolerance:"deltaLim! Print "Difference:"CSng(Abs(r3!/ r2!- limTrue!)), _ "(Actual limit:"limTrue!")" End Sub ' Call FibiLim with a tolerance argument. Call FibiLim(.005) ' Output: ' 3 f(3):2 quotient:2 ' 4 f(4):3 quotient:1.5 ' 5 f(5):5 quotient:1.66666666666667 ' 6 f(6):8 quotient:1.6 ' 7 f(7):13 quotient:1.625 ' 8 f(8):21 quotient:1.61538461538462 ' 9 f(9):34 quotient:1.61904761904762 ' Tolerance:.005 Difference:1.013614E-03 ' (Actual limit: 1.618034)
関連項目