Операторы
Итак, рассмотрим работу конструкции цикла со счетчиком в целом. Оператор For инициализирует переменную счетчик значением начало, после чего выполняется блокОператоров1 до тех пор, пока не встретится оператор Exit For (выход) или оператор Next (следующий). Далее оператор Next проверяет, не достигнуто ли значение конец, и если нет, то прибавляется значение шага к счетчику и процедура повторяется, если да – работа оператора цикла завершается.
В программе 20.11 мы рассмотрим три примера работы с циклом For…Next. В первом примере мы запрограммировали решение задачи о вычислении факториала числа 20 (20!=1*2*3**20), причем значение счетчика явно используется в вычислениях. После чего вывели итоговый результат (~2.432Е+18).
Во втором примере мы показываем, что помимо простых конструкций с циклами существуют более сложные – вложенные циклы. Характерным примером для вложенных циклов является инициализация матрицы (n x m). Мы проинициализировали все элементы матрицы (6 х 5) единицей.
В последнем примере мы продемонстрируем работу оператора Exit For и счетчика с отрицательным шагом. Допустим, у нас есть проинициализированный массив типа string. Необходимо найти элемент данного массива, равный строке "выход", причем проверка будет происходить с конца массива.
Программа 20.11. Использование оператора For…Next
Sub
Factorial()
Dim
factorial
As
Variant
factorial = 1
For
i = 1
To
20
factorial = factorial * i
Next
MsgBox(factorial)
End
Sub
Sub
InitMatrix()
Dim
matrix(5.4)
As
Integer
For
i = 0
To
5
For
j = 0
To
4
matrix(i, j) = 1
Next
j
Next
i
End
Sub
Sub
VectorSearch
Dim
Vector(7)
As
String
Инициализация
For
i = 7
To
0
Step
- 1
If
(Vector(i) =
"Выход"
)
Then
Exit
For
:
End
If
Next
i
End
Sub
Теперь допустим, что вы не знаете заранее, сколько раз должно выполниться тело цикла, как в случае с оператором For…Next, но знаете условие, при котором цикл должен продолжать или прекращать свою работу. В таком случае и следует употреблять циклы с условием – DO… Loop. Например, издательству поступают заявки от 25 магазинов на покупку определенного количества книги "Microsoft Office 2001 в целом", но количество книг ограничено (скажем, их всего 5000 экземпляров). Издательство, соответственно, удовлетворяет первые заявки, насколько может (то есть не более того, что есть сейчас на складе). Перед издательством встает задача – определить, заявки скольких первых магазинов оно удовлетворит? Перейдем к математической трактовке поставленной задачи. Заявки от магазинов образуют одномерный массив, элементы которого суть количества заказываемой книги. Таким образом, мы хотим узнать: сколько первых элементов этого массива можно взять так, чтобы их сумма значений была не больше 5000? В данном случае есть цикл и есть условие, но неизвестно, сколько именно раз потребуется выполнять суммирование для выявления необходимого количества элементов. Для решения подобных задач и применяется оператор цикла DO… Loop. Существует два вида циклов с условием: с предусловием и с постусловием. Соответственно, и цикл DO… Loop имеет две синтаксические конструкции, суть различия которых – во времени проверки условия.
/ Предусловие /
Do
[{
While
|
Until
} условие]
[блокОператоров1] [
Exit
Do
]
[блокОператоров2]
Loop
/ Постусловие /
Do
[блокОператоров1] [
Exit
Do
]
[блокОператоров2]
Loop
[{
While
|
Until
} условие]
Как упоминалось, различие этих двух конструкций состоит в том, что в первом случае условие будет проверяться до выполнения блока операторов (предусловие), а во втором – после (постусловие).
Теперь о проверке условий. Если в конструкции стоит ключевое слово while, то блок операторов будет выполняться, пока условие остается истинным, если же стоит until, блок операторов будет выполняться до тех пор, пока условие остается ложным. Вообще, исходя из синтаксиса, наличие условия не обязательно. Если его нет, то по умолчанию оно трактуется как False.
Необязательный оператор Exit DO аналогичен оператору Exit For в цикле For…Next. Он также прекращает выполнение цикла и передает управление на оператор, следующий непосредственно за Loop.