Циклы типа do-loop
Как уже было отмечено, данный тип цикла выполняется до тех пор, пока истинно некоторое условие. Под условием понимается любое выражение, значение которого может быть True или False (например, NumVal < 15), либо функция, возвращающая логическое значение (например, Eof), либо свойство, имеющее логическое значение (например, свойство Value некоторого переключателя). Существует два основных типа условных циклов: Do While – Loop и Do Until – Loop. Циклы типа Do While – Loop выполняются пока истинно некоторое условие, а циклы типа Do Until – Loop выполняются, если некоторое условие ложно.
Циклы типа Do While – Loop
Ключевое слово While в цикле типа Do указывает программе, что данный цикл нужно выполнять до тех пор, пока некоторое условие истинно. В случае если условие, указанное в заголовке цикла типа Do While становится ложным, программа переходит к выполнению следующего за ключевым словом Loop оператора.
Существует две формы цикла типа Do While. Они отличаются местом расположения условия – в заголовке цикла (в операторе Do While – Loop), либо в конце цикла (в операторе Do – Loop While).
В первой форме цикла типа Do While, условие помещается в его заголовке, как показано на приведенном ниже примере, в котором вычисляется сумма цифр положительного целого десятичного числа.
Dim N as Long ‘заданное число
Dim D as Long ‘делитель
Dim S as Byte ‘текущее значение суммы цифр
Dim C as Byte ‘значение текущей цифры
N = txtN ‘считывание числа из текстового поля txtN
S = 0 ‘обнуление значение суммы цифр
D = 1000000000 ‘начальное значение делителя
Do While N > 0 ‘до тех пор, пока в числе N есть цифры, отличные от нуля
C = N \ D ‘вычисление текущей цифры
N = N – C * D ‘вычитание цифры из числа
S = S + C ‘увеличение суммы на значение текущей цифры
D = D / 10 ‘уменьшение делителя на один разряд
Loop ‘конец оператора цикла
Поместив условие после ключевых слов Do While, вы тем самым указываете программе, что его нужно проверить перед началом выполнения первой итерации. Такие операторы ещё называются оператором цикла с предусловием. Если условие истинно, цикл будет выполнен один раз. После этого программа снова проверит данное условие и т.д. Как только условие становится ложным, программа прекращает выполнение цикла и переходит к следующему за ключевым словом Loop оператору. Группа операторов, находящихся между ключевыми словами Do и Loop называется телом цикла.
Обратите внимание, что в описываемой форме оператора Do While, тело цикла может ни разу не быть выполнено. Так происходит в случае, если при первой проверке условия, оно окажется ложным. Тогда программа пропустит все операторы цикла и перейдет к следующему за ключевым словом Loop оператору.
Циклы типа Do – Loop While
Чтобы выполнить тело цикла хотя бы один раз, нужно использовать вторую форму оператора типа Do While. В данном случае условие помещается в самом конце цикла, после ключевых слов Loop While. Такое размещение условия указывает программе, что она должна вначале выполнить операторы цикла, а затем проверить условие на истинность. Ниже приведён фрагмент кода, определяющим является ли число простым (простое число делится без остатка только на единицу и само на себя).
Dim N as Long ‘заданное число
Dim D as Long ‘делитель
Dim Sim as Boolean ‘флаг простого числа
N = txtN ‘считывание числа из текстового поля txtN
S = True ‘число является простым
D = 2 ‘начальное значение делителя
Do ‘начало цикла
If N mod D = 0 Then S = False ‘если число N делится без остатка на D,
‘то число N непростое
D = D + 1 ‘увеличение делителя на единицу
Loop While D < N Or S ‘выполнение цикла до тех пор, пока
‘делитель меньше заданного числа или число простое
В начале приведённого фрагмента кода делается утверждение, что заданное число N – простое (S = True). Начальное значение делителя D устанавливается равным двойке (D = 2). Далее в операторе цикла осуществляется поиск значения делителя D в диапазоне от 2 до N-1, на которое число N делится без остатка. Цикл выполняется до тех пор, пока делитель D находится в заданном диапазоне и флаг простого числа S равен True.
Цикл завершается тогда, когда делитель D становится равным N или значение флага S равным False. Нетрудно видеть, что цикл завершится при первом делении без остатка, не доходя до конца диапазона, что уменьшает количество операций. Если в заданном диапазоне не найдено ни одного делителя, то оператор S = False не будет выполнен ни разу и значение флага так и останется равным True.
Используя данную форму оператора типа Do While, будьте особенно внимательны, поскольку тело цикла выполняется первый раз без проверки указанного условия. Если тело цикла содержит операторы , которые могут выполняться с ошибками, то лучше использовать оператор цикла с предусловием.
Внимание! Не помещайте условие одновременно в начало и конец цикла, после ключевых, слов Do While и Loop While, поскольку это вызовет ошибку в момент запуска программы.
