Программа 20.11. Использование оператора For. . .Next



Программа 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 I Until} условие]

[ блокОператоров 1] [Exit Do]

[блокОператоров2] Loop

/ Постусловие /

Do

[блокОператоров 1] [Exit Do]

[блокОператоров2] Loop [{While | Unti1} условие]

Как упоминалось, различие этих двух конструкций состоит в том, что в первом случае условие будет проверяться до выполнения блока операторов (предусловие), а во втором — после (постусловие).

Теперь о проверке условий. Если в конструкции стоит ключевое слово while, то блок операторов будет выполняться, пока условие остается истинным, если же стоит until, блок операторов будет выполняться до тех пор, пока условие остается ложным. Вообще, исходя из синтаксиса, наличие условия не обязательно. Если его нет, то по умолчанию оно трактуется как False.

Необязательный оператор Exit DO аналогичен оператору Exit For в цикле For. . .Next. Он также прекращает выполнение цикла и передает управление на оператор, следующий непосредственно за Loop.

Давайте на приведенном выше примере рассмотрим работу цикла с условием. Наше условие выглядит так: "сумма > 5000", причем это условие выхода из нашего цикла, т. к. мы найдем искомое число элементов массива. Следовательно, сначала мы должны вычислить сумму (блокОператоров), а потом проверить, не больше ли она 5000 (until sumOfBooks > sooo). Помимо этого надо следить, чтобы мы не вышли за пределы границ массива, для чего используется оператор it.

Во втором примере мы решили ту же самую задачу, но несколько другим способом. Мы запустили, вообще говоря, бесконечный цикл, поскольку условие while 1 всегда истинно. Выходом же из цикла является выполнение
условия sumOfBooks > 5000.



Содержание раздела