Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Воробьева.Приемы_программирования_в среде_VBfor...doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.58 Mб
Скачать

Циклы в программе

Часто в программах надо повторить часть операторов несколько раз. Для многократного выполнения блока операторов используется один из трех операторов цикла – For … Next:, While … Wend или Dо … Lоор.

Ч

Рис.10. Алгоритм цикла For … Next

асто заранее известно сколько раз надо повторить цикл, например, надо ввести данные в массив из 5 элементов, но бывают случаи, когда число повторений не известно, например, надо найти первую пустую ячейку на листе. Иногда возникают ситуации, когда блок внутри цикла может быть просто обойден (например, первая ячейка пустая).

Цикл For … Nехt используется в том случае, когда количество выполнений заданного блока операторов известно заранее. Алгоритм цикла представлен на рис.10. Данная конструкция имеет следующий синтаксис:

For счетчик = начало To конец [Step шаг]

onepaтopы

Next [счетчик]

При положительном значении величины шаг цикл For … Next работает следующим образом.

Переменной счетчик сначала присваивается значение начало. Далее проверяется условие счетчик > конец. Если результатом проверки этого условия является значение Тruе, то происходит окончание работы цикла. При этом операторы цикла операторы ни разу не выполняются.

Если результатом проверки условия счетчик > конец является False, то в этом случае операторы цикла выполняются первый раз. После этого происходит переход на начало цикла. Далее значение переменной счетчик увеличивается на величину шага шаг, после чего снова проверяется условие счетчик > конец. Если результатом является Falsе, то операторы цикла выполняются второй раз, и т.д.

Выполнение цикла оканчивается, когда результатом проверки условия счетчик > конец становится Тruе. По окончании цикла выполняется оператор, следующий за циклом, т.е. за ключевым словом Next.

Пример. Программа расчета факториал числа 6 имеет следующий вид:

Public Sub Фaкториал1()

Dim I As Byte

Dim F As Long

F = 1

For I = 1 To 6 Step 1

F = F * I

Next I

End Sub

Напомним, что факториал целого положительного числа n обозначается n! и (согласно определению) n! равняется произведению целых чисел от 1 до n: n! = 1 2  ... n.

Для результата отводится ячейка, в которую до начала простого цикла записывается 1, в данном случае F=1.

Пример. Второй вариант программы расчета 6!

Public Sub Фaкториал2()

Dim I As Byte

Dim F As Long

F = 1

For I = 6 To 1 Step -1

F = F * I

Next I

End Sub

В случае отсутствия ключевого слова Step шаг изменения переменной счетчик полагается равным единице.

В качестве параметров цикла начало, конец и шаг можно использовать не только числа, но и арифметические выражения. Важно, чтобы к моменту выполнения цикла For … Next все переменные в этих арифметических выражениях имели числовые значения (были определены).

Зачастую требуется досрочно выйти из цикла. В этом случае цикл For … Next записывается в виде

For счетчик = начало To конец [Step шаг]

onepaтopы1

If условие Then Exit For

onepaтopы2

Next [счетчик]

Досрочное окончание цикла обеспечивается оператором, обозначаемым служебным словосочетанием Exit For. Работает цикл следующим образом.

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

Пример. Четвертый вариант программы расчета 6!

Public Sub Фaктopиал4()

Dim I As Byte

Dim F As Long

F = 1

For I = 1 To 13 Step 1

F = F * I

If I = 6 Then Exit For

Next I

End Sub

Часто в примерах встречается задача накопления суммы, которая решается с помощью оператора цикла. Для результата, как и в случае вычисления произведения, отводится ячейка, в которую перед началом простого цикла записывается ноль, например S=0.

Сумма накапливается в ячейке S путем многократного выполнения оператора присваивания S=S + слагаемое, который располагается внутри простого цикла.

Результат получается в ячейке S по окончании работы простого цикла, т.е. печать S и другие действия с S выполняются после оператора Next.

Пример

Найдите сумму слагаемых вида 2, для х, изменяющегося от 5 до 15 с шагом 0,3.

Public Sub Sum()

S=0

For x = 5 To 15 Step 0.3

S=S+5*x^2

Next x

End Sub

Существуют два варианта циклов – первый, который мы подробно рассмотрели ранее, выполняется по счетчику, определяемому в операторе.

Второй вариант оператора – перебор всех объектов в коллекции (это все листы книги, ячейки листа или выделенного диапазона и др.). Этот оператор часто используется для работы со всеми листами книги, которые описаны коллекцией «Sheets» или других объектов.

Записывается оператор следующим образом:

For each Sh in ActiveWorkbook.Sheets

Next

Здесь нет в конце имени счетчика, переменная Sh является объектом коллекции.

Цикл применяется в том случае, когда число выполнений операторов цикла заранее неизвестно. Синтаксис этого цикла:

While условие

oпepaторы

Wend

Работа цикла While … Wend начинается с расчета значения логического выражения условие. Если условие = False, то работа цикла заканчивается, т.е. осуществляется переход на оператор, расположенный после ключевого слова Wend. Если условие = Тruе, то выполняются операторы цикла операторы. После этого опять рассчитывается значение логического выражения условие, и т.д.

Пример. Пятый вариант программы расчета 6!

Sub Факториал5()

Dim I As Byte

Dim F As Long

F = 1: I = 1

While I <= 6

F = F * I

I = I + 1

Wend

End Sub

Цикл Do … Lоор, как и цикл While … Wend, применяется, когда число выполнений операторов цикла заранее неизвестно. Он имеет два варианта оформления – с предусловием и постусловием (рис.11).

Рис.11. Алгоритмы цикла Do … Loop с предусловием и постусловием, соответственно.

Для проверки условий используются две формы, которые оформляются служебными словами – While (Пока), когда цикл выполняется пока условие «Истина» и Until (До тех пор), в нем цикл выполняется пока условие «Ложь». Это позволяет легко находить варианты условий. Существует четыре разновидности данной конструкции.

Первой разновидностью является цикл Do While … Lоор, имеющий следующий синтаксис:

Do While условие

операторы

Loop

Работа цикла Do While … Lоор начинается с расчета значения логического выражения условие. Если условие = False, то работа цикла оканчивается, т.е. осуществляется переход на оператор, расположенный после ключевого слова Lоор. Если условие = Тruе, то выполняются операторы цикла операторы. После этого опять рассчитывается значение логического выражения условие, и т.д.

Цикл Do While … Lоор эквивалентен рассмотренному ранее циклу While … Wend.

Пример. Шестой вариант программы расчета 6!

Sub Факториал6()

Dim I As Byte

Dim F As Long

F = 1: I = 1

Do While I <= 6

F = F * I

I = I + 1

Loop

End Sub

Пример. Программа «шагания» по оси координат:

Sub Stepsl()

Dim x As Single

Dim h As Single

h = 0.5 'величина шага равна 0.5

x = 44 'начальное значение х равно 44

Do While x < 55 'конечное значение х равно 55

x = x + h 'значение х увеличивается на h

Loop ‘do while… - делай пока выполняется …

End Sub

Упрощенная форма цикла с предусловием и проверкой по While записывается в форме While X<10: X=X+1: Wend

Вторая разновидность конструкции Do … Lоор ‑ цикл Do Until … Lоор. Синтаксис этого цикла:

Do Until условие

операторы

Lоор

Работа цикла Do Until … Lоор начинается с расчета значения логического выражения условие. Если условие = Тruе, то работа цикла оканчивается, т.е. осуществляется переход на оператор, расположенный после ключевого слова Lоор. Если условие = False, то выполняются операторы цикла операторы. После этого опять рассчитывается значение логического выражения условие, и т.д.

Пример. Второй вариант программы «шагания» по оси координат:

Sub Steps2()

Dim x As Single

Dim h As Single

h = 0.5 'величина шага равна 0.5

x = 44 'начальное значение х равно 44

Do Until x >= 55 'конечное значение х равно 55

x = x + h 'значение х увеличивается на h

Loop 'do until… - делай до выполнения

End Sub

Видно, что в циклах Do While … Lоор и Do Until … Lоор существует ситуация, когда операторы цикла не выполняются ни разу, т.к. условие окончания цикла проверяется перед выполнением этих операторов.

Третья разновидность конструкции Do … Loop ‑ цикл Do … Lоор While ‑ имеет синтаксис

Do

операторы

Loop While условие

Работа цикла Do … Lоор While начинается с выполнения операторов цикла операторы. После этого рассчитывается значение логического выражения условие. Если условие = False, то работа цикла оканчивается. В противном случае опять выполняются операторы цикла, и т.д.

Пример. Третий вариант программы «шагания» по оси координат:

Sub Steps3()

Dim x As Single

Dim h As Single

h = 0.5 'величина шага равна 0.5

x = 44 'начальное значение х равно 44

Do

x = x + h 'значение х увеличивается на h

Loop While x < 55 'конечное значение х равно 55

End Sub

Четвертая разновидность конструкции Do … Loop ‑ цикл Do … Lоор Until ‑ имеет синтаксис

Do

операторы

Loop Until условие

Работа цикла Do … Lоор Until начинается с выполнения операторов цикла операторы. После этого рассчитывается значение логического выражения условие. Если условие = Тruе, то работа цикла оканчивается. В противном случае опять выполняются операторы цикла, и т.д.

Пример. Четвертый вариант программы «шагания» по оси координат:

Sub Steps4()

Dim x As Single

Dim h As Single

h = 0.5 'величина шага равна 0.5

x = 44 'начальное значение х равно 44

Do

x = x + h 'значение х увеличивается на h

Loop Until x >= 55 'конечное значение х равно 55

End Sub

Видно, что в последних двух разновидностях цикла Do … Loop операторы цикла операторы хотя бы один раз обязательно выполняются, т.к. условие окончания цикла проверяется после выполнения этих операторов.

Внутри цикла Do … Loop может находиться оператор Ехit Dо, предназначенный для досрочного выхода из цикла. Употребляется этот оператор так же, как Ехit For в цикле For … Next, ‑ он входит в состав условного оператора.

Отметим, что для цикла While … Wend не существует оператора досрочного выхода из цикла.