Рассмотрим оператор цикла с предусловием, записываемый как
WHILE Условие DO Оператор;
Конструкция WHILE...DO переводится как «пока...делать». Оператор (простой или составной), стоящий после служебного слова DO и называемый телом цикла, будет выполняться циклически, пока выполняется логическое условие, т.е. пока значение «Условия» равно True. Само условие цикла может быть логической константой, переменной или выражением с логическим результатом.
Условие выполнения тела цикла WHILE проверяется до начала выполнения каждой итерации. Поэтому, если условие сразу не выполняется, то тело цикла игнорируется и будет выполняться оператор, стоящий сразу за телом цикла.
При написании циклов с предусловием следует помнить о двух вещах. Во-первых, чтобы цикл имел шанс когда-нибудь завершиться, содержимое его тела должно обязательно влиять на условие цикла. Во-вторых, условие должно состоять из корректных
- 99 -
выражений и значений, определенных еще до первого выполнения тела цикла. Поясним сказанное примером, вычисляющим значение факториала 10! (рис. 6.1).
| VAR
| > Factorial, N : Integer;
| BEGIN
| > Factorial := 1; { стартовое значение факториала = 0! }
| > N:=1; {стартовое значение для условия цикла}
| >WHILE N<=10 DO
| >begin { начало тела цикла WHILE }
| > Factorial:=Factorial*N; { вычисление факториала N! }
| > N := N + 1 { N должно меняться в цикле }
| >end; { конец тела цикла WHILE }
| > WriteLn( Factorial ); { вывод результата расчета }
| END.
Рис. 6.1
Обратите внимание на присваивание N:=1 перед циклом. Без него значение N может быть любым, и условие может быть некорректным, не говоря уже о самом значении факториала. Значение N меняется внутри цикла. При этом гораздо безопаснее так писать тело цикла, чтобы оператор, влияющий на условие, был последним в теле. Это гарантирует от нежелательных переборов. Если, скажем, на рис. 6.1 поставить строку N:=N+1; перед вычислением значения Factorial, то результатом программы будет значение 11!. Исправить оплошность можно, заменив стартовое значение N на 0, а условие — на N<10. Но от этого программа вряд ли станет нагляднее. Поскольку циклу WHILE «все равно», что происходит в его теле, тело может содержать другие, вложенные, циклы.
6.5. Оператор цикла с постусловием (REPEAT...UNTIL)
Рассмотренный выше оператор цикла с предусловием решает, выполнять свое тело или нет, до первой итерации. Если это не соответствует логике алгоритма, то можно использовать цикл с постусловием, т.е. решающий, делать или нет очередную итерацию, лишь после завершения предыдущей. Это имеет принципиальное значение лишь на первом шаге, а далее циклы ведут себя идентично. Цикл с постусловием всегда будет выполнен хотя бы один раз.