Цикл ПОКА. Операторы While и Until
Кроме цикла ДО, который повторяется заданное количество раз, применяется также цикл ПОКА, который повторяется до тех пор, пока верно некоторое заданное условие (или, наоборот, пока некоторое условие не станет верным). В VBA имеется четыре основных способа реализации цикла ПОКА:
-оператор While с проверкой в начале цикла;
Do While условие
операторы, выполняемые в цикле
Loop
Цикл повторяется, пока условие верно (и прекращается, когда оно становится неверным). Условие проверяется перед началом цикла. Если оно сразу неверно, то цикл не выполняется ни разу;
-оператор While с проверкой в конце цикла:
Do
операторы, выполняемые в цикле
Loop While условие
Цикл повторяется, пока условие верно. Условие проверяется в конце цикла. Поэтому цикл выполняется, как минимум, один раз;
-оператор Until с проверкой в начале цикла:
Do Until условие
операторы, выполняемые в цикле
Loop
Цикл повторяется, пока условие неверно (и прекращается, когда оно становится верным). Условие проверяется перед началом цикла;
-оператор Until с проверкой в конце цикла:
Do
операторы, выполняемые в цикле
Loop Until условие
Цикл повторяется, пока условие неверно (и прекращается, когда оно становится верным). Условие проверяется в конце цикла, поэтому цикл выполняется, как минимум, один раз.
Пример 1.10. В программе вводится одномерный массив из восьми чисел, и выполняется суммирование его элементов (начиная с первого), пока сумма не превысит 20.
Sub primer1_10a()
Dim a(1 To 8) As Integer
MsgBox(“Вводите массив”)
For i = 1 To 8
a(i) = InputBox("a(" & i & ")")
Next i
sum = 0 : i = 0
Do While sum <= 20
i = i + 1
sum = sum + a(i)
Loop
MsgBox ("Сумма достигнута на " & i & "-м элементе и равна" & sum)
End Sub
Здесь переменная sum сначала равна нулю, поэтому условие sum<=20 верно. Выполняются операторы цикла:
i = i + 1
sum = sum + a(i)
Таким образом, переменная sum становится равной первому элементу массива a. Если он превышает 20, то цикл завершается, так как условие sum<=20 оказывается неверным. Выполняется оператор, следующий за циклом, т.е. выводится сообщение о найденной сумме. Если же элемент a(1) не превышает 20, то условие sum<=20 остается верным, и цикл повторяется снова: переменная i принимает значение 2, и к переменной sum прибавляется величина a(2). Цикл повторяется, пока переменная sum не превысит 20.
Эту же задачу можно решить с помощью оператора Until. Для этого следует заменить строку Do While sum <= 20 на следующую: Do Until sum > 20.
Следует обратить внимание, что программа, приведенная в примере 1.8, не вполне правильная: в ней не предусмотрено, что сумма элементов массива может оказаться меньше 20. В этом случае программа завершится с выдачей сообщения об ошибке, когда переменная i превысит объявленное количество элементов массива (в данном примере оно равно 8). Чтобы исправить эту ошибку, можно изменить программу, как показано ниже.
Sub primer1_10b()
Dim a(1 To 8) As Integer
MsgBox ("Вводите массив")
For i = 1 To 8
a(i) = InputBox("a(" & i & ")")
Next i
sum = 0: i = 0
Do While (sum <= 20) And (i < 8)
i = i + 1
sum = sum + a(i)
Loop
If sum > 20 Then
MsgBox ("Сумма достигнута на " & i & "- м элементе и равна " & Sum)
Else
MsgBox ("Сумма не достигнута")
End If
End Sub
Здесь цикл While выполняется до тех пор, пока верны два условия: переменная sum не превышает 20, и переменная i меньше 8. Если хотя бы одно из этих условий нарушается, то цикл прекращается. Поэтому, если в ходе выполнения цикла переменная sum достигает значения, превышающего 20, то цикл прекращается, так как нарушается условие sum <= 20. Если же оказывается, что сумма всех элементов массива меньше 20, то цикл прекращается из-за нарушения условия i < 8 (так как переменная i увеличивается на единицу в каждом цикле и достигает значения 8, когда вычислена сумма всех элементов массива). После прекращения цикла в операторе If проверяется достигнутое значение переменной sum, и выводится соответствующее сообщение.
Пример 1.11. Вычислить сумму ряда с точностью до 0,0001.
Sub primer1_11a()
n=0 : element = 1 : sum = 0
Do While Abs (element) >= 0.0001
sum = sum + element
n=n+1
factorial = 1
For i=1 To n
factorial = factorial * i
Next i
element = ((-1)^n)/(factorial*(2*n+1))
Loop
MsgBox(“Сумма ” & sum & “достигнута при n = ” & n-1)
End Sub
Здесь Abs – встроенная (стандартная) функция языка VBA, вычисляющая модуль. Для вычисления факториала использован цикл For, рассмотренный ранее. Вычитание при выводе результата (n-1) требуется из-за того, что в цикле переменная n увеличивается, и только после этого проверяется условие окончания цикла (поэтому на момент окончания цикла переменная n будет иметь значение, на единицу превышающее количество элементов вычисленной суммы).
Эту же программу можно реализовать и другими способами, например, используя цикл ПОКА в форме Until:
Sub primer1_11b()
n=0 : element = 1 : sum = 0
Do
sum = sum + element
n=n+1
factorial = 1
For i=1 To n
factorial = factorial * i
Next i
element = ((-1)^n)/(factorial*(2*n+1))
Loop Until Abs (element) < 0.0001
MsgBox(“Сумма ” & sum & “достигнута при n = ” & n-1)
End Sub
Здесь цикл повторяется, пока условие Abs (element) < 0.0001 неверно (и завершается, когда это условие становится верным).