Краткая справка по языку программирования Turbo Pascal

       

Оператор цикла с предусловием WHILE



Оператор цикла с предусловием WHILE

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

Синтаксис оператора WHILE:

WHILE Условие DO

Оператор;

Конструкция WHILE…DO переводится как “пока…делать”. Оператор (простой или составной), стоящий после служебного слова DO и называемый телом цикла, будет выполнятся циклически, пока значение “Условия” равно TRUE (истина). Само условие цикла может быть логической константой, переменной или логическим выражением.

Условие выполнения тела цикла WHILE проверяется до начала каждой итерации. Поэтому если условие сразу не выполняется, то тело цикла игнорируется и будет выполнятся оператор, стоящий сразу за телом цикла.

Оператором в теле цикла может быть другой циклический оператор, т.е. циклы могут быть вложенными.

При написании циклов с предусловием следует помнить о двух вещах. Во-первых, чтобы цикл имел шанс когда-нибудь завершится, содержимое его тела должно обязательно влиять на условие цикла. Во-вторых, условие должно состоять из корректных выражений и значений, определенных еще до первого выполнения тела цикла.

Пример цикла WHILE: Вычисление факториала 10! = 1·2·3·4·5·6·7·8·9·10

VAR



Factorial, N : Integer;

BEGIN

  Factorial := 1; {стартовое значение факториала =0! }

  N := 1;         {стартовое значение для условия цикла }

  WHILE N<=10 DO

               {заголовок цикла, условие }

   begin

                       {начало тела цикла }

     Factorial := Factorial*N; {вычисление факториала N! }

     N := N + 1                 {N должно меняться в цикле}

   end;                         {конец тела цикла }


  WriteLn(’10!= ’,Factorial);  {вывод результата расчета }

END.

Обратите внимание на присваивание N:=1

пред циклом. Без него значение N может быть любым, и условие может оказаться некорректным, не говоря уже о самом значении факториала. Значение N меняется внутри цикла. При этом гораздо безопаснее так писать тело цикла, чтобы оператор, влияющий на условие, был бы последним. Это гарантирует от нежелательных переборов. Если, скажем, в рассмотренном выше примере, поставить строку N:=N+1; перед вычислением факториала, то результатом программы будет значение 11!. Исправить оплошность можно, заменив стартовое значение N на 0, а условие – на N<10. Но от этого программа вряд ли станет нагляднее.



Оператор цикла с постусловием REPEAT…UNTIL



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



Синтаксис оператора REPEAT…UNTIL:



REPEAT

  Оператор1;

  Оператор2;

  ···

  ОператорN;

UNTIL Условие;

Операторы (Оператор1, Оператор2, … ОператорN), образующие тело цикла, будут выполнятся циклически, до тех пор пока значение “Условия” не станет равно TRUE (истина). Иными словами, в цикле REPEAT…UNTIL условием продолжения итераций является невыполнение “Условия” (его значение FASLE – ложь).

Условие цикла может быть логической константой, переменной или логическим выражением.

Оператор REPEAT…UNTIL имеет две части: начальную (слово REPEAT) и завершающую (слово UNTIL), которые охватывают группу операторов, составляющих тело цикла. Поэтому необходимости в использовании составного оператора для построения тела цикла из нескольких простых операторов не возникает.

Принципиальное отличие оператора REPEAT…UNTIL от оператора WHILE в том, что проверка условия производится не перед началом выполнения тела цикла, а после его выполнения, когда решается вопрос, повторить ли еще раз действия. Поэтому тело цикла всегда выполняется по крайней мере один раз.





Пример 1. Проверка ввода



VAR

  N : Integer;

BEGIN

  . . .

  REPEAT

    Write(‘Введите целое число от 0 до 10: ’);

    ReadLn(N);

  UNTIL (N>=0) and (N<=10);

  . . .

END.

В этом примере программа будет запрашивать ввод числа до тех пор, пока пользователь не введет “правильное” число.



Пример 2. “Вечный цикл”



REPEAT UNTIL False;

Этот цикл пустой и никогда не прекращающийся. Он хорош только в том случае, когда нужно заблокировать программу, и, возможно весь компьютер. (Но если отбросить шутки, то можно и его пристроить в дело. Обычно так организуют программы с повторяющимися действиями: вначале программы ставят REPEAT, а в конце – UNTIL False. А прервать цикл можно специальными операторами EXIT и HALT). Это имеет смысл, если условий завершения программы много или они очень сложны.)



Оператор цикла с параметром FOR



Оператор цикла с параметром вводится для организации “строгих” циклов, которые должны быть проделаны заданное число раз. Кроме того, циклы с параметром позволяют организовать автоматическое изменение значения некоторой переменной в определенном диапазоне.



Синтаксис оператора FOR:



FOR

ПараметрЦикла := МладшееЗначение TO

СтаршееЗначение DO Оператор;

или

FOR

ПараметрЦикла := СтаршееЗначение DOWNTO

МладшееЗначение DO Оператор;

Оператор, представляющий собой тело цикла, может быть как простым, так и составным. Параметр цикла, а также диапазон его значений

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

Изменение параметра цикла может быть как возрастающим, так и убывающим. В первом случае МладшееЗначение должно быть больше чем Старшее, а во втором – наоборот.



Примеры оформления циклов с параметром.





VAR i : integer;

BEGIN

  FOR i := 1 TO 10 DO Write(i:5);

  FOR i := 5 DOWNTO 0 DO

Write(i:5)

END.

На месте младших и старших значений могут стоять константы, а могут и переменные или выражения, совместимые по присваиванию с параметром цикла. Например,

CONST n = 10;

      m = 3;

VAR i,

    k : integer;

BEGIN

  k := 1;

  FOR i := k TO n DO Write(i:5);

  FOR i := (m+2) DOWNTO 0 DO

Write(i:5)

END.

Выполнение цикла начинается с присваивания параметру стартового значения. Затем следует проверка, не превосходит ли параметр конечное значение (случай с TO) или не является ли он меньше конечного значения (случай с DOWNTO). Если результат проверки утвердительный, то цикл считается завершенным. В противном случае выполняется тело цикла (оператор, следующий за словом DO), и после этого параметр цикла меняет свое значение на следующее. Далее снова производится проверка значения параметра цикла, т.е. алгоритм повторяется.



Запрещается

изменять параметр цикла и его старшее и младшее значения внутри тела цикла. Кроме того, параметр цикла не может участвовать в построении диапазонов этого же цикла. Компилятор таких “незаконных” действий не замечает, но программа, содержащая цикл с заголовком типа

FOR i := i-5 TO

i+5 DO ... ;

не заслуживает никакого доверия, даже если запускается!

Операторы FOR могут быть вложенными друг в друга, например

VAR

  i,j : integer;

BEGIN

  WriteLn(‘Таблица умножения’);

  FOR i := 1 TO 10 DO begin

     FOR j := 1 TO 10 DO

Write((i*j):5);

    WriteLn;

  end;

END.






Содержание раздела