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

 

В отличие от оператора цикла с постусловием оператор цикла с предусловием вычисляет и проверяет условие до выполнения операторов, составляющих тело цикла. В остальном эти операторы похожи. Синтаксис этого оператора следующий:

while <условие> do <оператор>;

Здесь while, do – ключевое слово (перев. с англ. пока и делать);

<оператор> – любой оператор Турбо-Паскаля, в том числе и составной (этот оператор называют телом цикла);

<условие> – логическое выражение типа сравнения, используемое для выхода из цикла.

Оператор работает следующим образом: сначала вычисляется условие, и если получается истинное значение, то выполняется оператор, являющийся телом цикла, а затем снова проверяется условие. Если значение условного выражения ложно, то осуществляется выход из цикла. Таким образом, если условие было ложно при первом входе в цикл, то операторы тела цикла не выполнятся ни разу. Очевидно, один из операторов тела цикла должен влиять на значение условного выражения, поскольку иначе цикл будет повторяться бесконечно. Например, следующий фрагмент программы будет печатать радостное сообщение бесконечное число раз, так как отсутствуют в цикле конструкции, изменяющие величину i:

i:=1;

while i<5 do

writeln('Доброе утро!');

Чтобы получить работающий фрагмент программы, добавим в тело цикла оператор, увеличивающий значение i:

i:=1;

while i<5 do

begin

writeln('Доброе утро!');

i:=i+1;

end;

end;

Проиллюстрируем использование оператора цикла с предусловием на примере pr11 нахождения среднего арифметического последовательности чисел (схема алгоритма приведена на рис.11). Последовательность чисел вводится с клавиатуры и завершается стоп-кодом. Использование стоп-кода в данном случае состоит в том, что какое-то числовое значение заведомо исключается из входной последовательности и используется как стоп-код. Если мы заранее знаем, что -1 у нас никогда не появится в последовательности, то можно -1 использовать для указания ее конца.

Рис. 11

 

program pr11;

const stopcod=-1;

var c: integer;{количество вводимых чисел}

sum,{сумма вводимых чисел}

number:real;{вводимое число}

begin

sum:=0;

c:=0;

writeln('Введите пеpвое число последовательности:');

read(number);

while number<>stopcod do

begin

sum:=sum+number;

c:=c+1;

writeln('Введите cледующее число

последовательности:' );

read(number);

end;

if c=0 then writeln ('Сpеднее значение pавно нулю')

else writeln ('Сpеднее значение pавно ',sum/c);

end.

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

Кроме того, в этой программе впервые появился раздел констант. Константа stopcod, в отличии от переменной, не может получить новое значение в программе, и тип константы определяется её видом.

Следующий пример иллюстрирует работу оператора цикла с предусловием на задаче, вычисляющей c точностью е сумму ряда:

s=1+1/2+1/3+1/4+ ... .

Вычислить сумму ряда с точностью е– это значит завершить суммирование членов ряда тогда, когда очередной член ряда окажется меньше е по абсолютной величине. Схема алгоритма приведена на рис.12, а программа – в примере pr12.

program pr12;

var

i:integer;

sum,{сумма pяда}

e,{точность}

k:real;{очеpедной член pяда}

begin

sum:=0;

i:=1;

writeln('Введите точность:');

read(e);

k:=1/i;

while k>e do {пока очеpедной член pяда больше точности}

begin

sum:=sum+k;

i:=i+1;

k:=1/i;

end;

writeln ('Сумма pяда pавна ', sum);

end.

 

Рис. 12