6.4. Оператор цикла с предусловием (WHILE)
В практике программирования циклы — повторяющиеся выполнения одних и тех же простых или составных операторов — играют очень важную роль. Существует три стандартных способа организации циклических вычислений.
Рассмотрим оператор цикла с предусловием, записываемый как
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 «все равно», что происходит в его теле, тело может содержать другие, вложенные, циклы.