Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по паскалю.doc
Скачиваний:
0
Добавлен:
03.01.2020
Размер:
582.14 Кб
Скачать

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

ОПЕРАТОР ЦИКЛА С ПОСТУСЛОВИЕМ имеет структуру:

REPEAT оп-р1;

оп-р2;

оп-рk

UNTIL условие;

В отличие от оператора While оператор цикла REPEAT

  • во-первых, выполняется по крайней мере один раз, то есть сначала выполняются все операторы оп-р1, оп-р2,…, оп-рk, а затем проверяется условие,

  • во-вторых, повторное выполнение операторов оп-р1,

оп-р2,…, оп-рk, происходит до тех пор, пока условие = false.

Поэтому можно сказать, что оператор While выполнается пока условие истинно, а оператор Repeat выполнается до тех пор, пока условие не станет истинно.

Замечание. Для корректной работы операторов цикла проверяемые условия должны зависеть от действий внутри цикла.

В противном случае возможно неограниченное повторение цикла («зацикливание» программы) в операторе While при условие=True и в операторе Repeat при условие =False.

Рекомендации по применению. В отличие от оператора For операторы While и Repeat следует применять в тех случаях, когда количество выполнений цикла неизвестно и не может быть вычислено до начала выполнения оператора цикла. В частности, оператор цикла Repeat удобно применять для организации повторного выполнения программы при изменяемых значениях исходных данных, задаваемых пользователем. В этом случае в программе следует предусмотреть формирование запроса на повторное выполнение программы, например, следующим образом:

Repeat

……….

Операторы программы

……….

Write(‘Повторить работу программы? – Y/N’);read(povtor);

Until povtor = (’N’ or ‘n’);

Рассмотрим пример применения оператора Repeat для второго варианта организации работы предыдущей программы (пример 3), в котором повторное решение задачи при другом значении Е происходит без выхода из программы.

Пример 3.1.

Program sum_r2;{Вариант 2: Repeat – для повторного ввода данных}

Label 1;{метка}

Var k:integer;

Sum,a,E:real;{a – очередной элемент ряда}

Povtor:char;

Begin

REPEAT

1: write(‘Задайте значение Е>0: ’);readln(E);

{Очевидно, что при Е>=1 задача теряет смысл, поэтому

проверяется условие корректности задания значения Е:}

if E>=1 then

begin writeln(‘Значение Е задано не корректно. Надо Е<1’);

goto 1

end;

a:=1;{первый элемент ряда равен 1}

Sum:=0;k;=0;

While a > E do

Begin k:=k+1;a:=1/sqr(k);sum:=sum+a;

writeln(‘На шаге’, k:3, ‘ сумма ряда S=’,sum);

End;

Write(‘Повторить работу программы? – Y/N’);

read(povtor);

UNTIL povtor = (’N’ or ‘n’);

Writeln(‘Решение закончено. Нажмите Enter’);readln

End.

Как уже отмечалось выше, одним из требований структурного программирования является последовательное прочтение текста программы, без возврата на предыдущие операторы. В частности, это требование проявляется в отказе от применения оператора безусловного перехода GOTO. Хотя отказ этот высказывается не в категаричном запрете, а в форме рекомендаций и, следовательно, его использование не является ошибкой (см. предыдущий пример). Покажем на том же примере предыдущей задачи, как можно избежать применения оператора GOTO. Здесь приводится только фрагмент программы, необходимый для иллюстрации сказанного:

Program sum_r3;{Вариант 3: Repeat для корректного ввода Е}

Var k:integer;

Sum,a,E:real;{a – очередной элемент ряда}

Povtor:char;

Begin

REPEAT

Repeat write(‘Задайте значение Е>0: ’);readln(E);

{Очевидно, что при Е>=1 задача теряет смысл, поэтому

проверяется условие корректности задания значения Е:}

if E>=1 then

writeln(‘Значение Е задано не корректно. Надо Е<1’);

Until E<1;{При корректном задании Е условие Е<1 принимает значение True и программа выходит из внутреннего цикла Repeat, продолжая выполнение следующих операторов: }

a:=1;{первый элемент ряда равен 1}

sum:=0;………………………