Организация циклов

Самой общей формой оператора цикла является структура do-loop, которая позволяет построить цикл любого типа. Схема организации цикла с использованием операторов do-loop в "чистом виде" показана на рис. 4.11,а. Если не принять специальных мер в операторах тела цикла, то он превратится в бесконечный цикл, преднамеренное создание которого встречается очень редко. Поэтому в теле цикла должны в явном или неявном виде находиться операторы, проверяющие условие завершения цикла, обеспечивающие выполнение условия и прерывающие цикл. В примере на рис. 4.11,а такие операторы стоят между многоточиями. Первый из них создает возможность выполнения условия завершения цикла (С=10), а второй командой exit loopпрерывает цикл при С=10. Смещение этих операторов вверх к слову do превращает цикл в цикл с претестом, а смещение вниз к слову loop – в цикл с посттестом.

Do …'операторы тела цикла Loop Например, Do . . . C=InputBox("с=",,10,20) If C=10 then exit loop . . . Loop Do while <логическое выражение> …'операторы тела цикла Loop Например, Do while c=10 . . . C=InputBox("с=",,10,20) . . . Loop Do …'операторы тела цикла Loop while <логическое выражение> Например, Do . . . C=InputBox("с=",,10,20) . . . Loop while c=10
а) б) в)
Рис. 4.11. Цикл do-loop в классическом виде (а), с претестом (б) и с посттестом (в)

Использование ключевых слов while и until позволяет создать циклы с претестом и посттестом более в явно выраженном виде. На рис. 4.11,б,в приведены соответственно циклы с претестом и посттестом в общем виде и их примеры. Слово while обеспечивает выполнение цикла при значении логического выражения равном "true", а слово until – при значении равном "false". Тело цикла с посттестом всегда выполняется хотя бы один раз, тело цикла с претестом может не выполниться ни разу.

Если число повторений тела цикла известно или может быть вычислено, то можно применить специальную форму оператора цикла for – next. Для этого описывается специальный счетчик числа повторений цикла, а далее используется оператор for-next, имеющий формат, показанный на рис. 4.12. Слова "начало" и "конец" обозначают начальное и конечное значение содержимого счетчика цикла, а "шаг" – число, прибавляемое к содержимому счетчика при каждом повторении цикла. Значение счетчика цикла кроме проверки выполнения условия окончания цикла может использоваться для модификации операторов тела цикла как параметр команды, значение параметра процедуры, аргумента функции или индекса элемента массива.

В примере (рис. 4.12,б) счетчик цикла имеет имя I, его содержимое меняется от 1 до 20 с шагом 2 и принимает нечетные значения 1,3,5,…, 19. В цикле записываются нули в нечетные элементы численного массива А, значения функции Fi, в которую передано в качестве аргумента k значение счетчика и вызывается процедура, в которую в качестве значения параметра j передано значение i+1. Аналогичные эффекты можно получить и в циклах do-loop, если в них организовать счетчик числа повторений цикла.

Forсчетчик = начало To конец [Step шаг] <операторы тела цикла> Next счетчик Dim i As Integer Dim A(1 to 20) As Single Sub Pro(j As integer) . . . End Sub Function Fi(k As Integer) As Single For i=1 To 10 Step 2 A(i)=0 A(i+1)=Fi(i) Pro(i+1) Next i End Function
а) б)
Рис. 4.12. Оператор цикла for-next в общем виде (а) и пример его применения (б)

Возможно вложение циклов друг в друга. В этом случае необходимо проследить, чтобы тело вложенного цикла не имело продолжения в теле внешнего цикла. Схемы правильного вложения циклов приведены на рис. 4.13. Возможно также вложение циклов for-next в циклы do-loop и наоборот.

Do . . . ' операторы тела внешнего цикла Do <тело вложенного цикла> Loop . . . ' операторы тела внешнего цикла Loop For i = начало_1 To конец_1 . . . ' операторы тела внешнего цикла For j=начало_2 To конец_2 <тело вложенного цикла> Next j . . . ' операторы тела внешнего цикла Next i
   
Рис. 4.13. Схемы правильных вложенных циклов