Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УЧЕБНИК-Pascal.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
499.71 Кб
Скачать

2.6. Улучшенный каЛьКулятор (продолжение)

2.6.1. Оператор цикла с постусловием (проверка на ноль)

Вернемся к программе калькулятор. Загрузите ее в интегрированную среду ВР и запустите на выполнение. В качестве исходных данных введите следующие данные:

Число1 – 5;

Знак действия - *;

Число2 – 0.

В результате работы программы будет 0. Действительно, если любое число умножить на ноль в результате получим ноль. Опять запустим программу, но теперь вместо действия умножения предложим программе произвести деление.

Программа выдаст сообщение об ошибке. Действительно делить на ноль нельзя. Что же делать?

Конечно, можно вывести предупреждение в процедуру Init , например

procedure Init;

begin

Writeln('Insert chislo 1');

Readln(Chislo1);

Writeln('Insert Znak');

Readln(Znak);

Writeln('Insert chislo 2');

Readln(Chislo2);

{проверка возможности деления на ноль}

If (Znak=’/’) and (Chislo2=0) then

begin

Writeln(' chislo 2=0,Insert chislo 2<>0');

Readln(Chislo2);

end;

end;

Если выполнятся два условия, то есть знак действия будет равен «/» и значение второго числа будет равно 0, программа выдаст предупредительное сообщение и попросит заново ввести второе число.

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

begin

. . . . . . .

end;

Это позволяет интерпретировать группу операторов как один оператор. Такие операторы называются составными. Операторными скобками мы определяем иерархию (порядок) выполнения действий.

Хорошо если попадется добросовестный пользователь и введет число неравное 0, а если нет? Увы, программа опять покажет ошибку. Как быть? Что нужно сделать, что бы защитить нашу программу?

Понятно, что программа должна в случае с делением повторять ввод данных пока второе число не будет равно 0. Сколько раз программа должна попросить повторить ввод данных, мы заранее незнаем. Но, по крайней мере, хотя бы один раз она должна запросить ввести второе число. Таким образом, мы должны использовать:

а) цикл с нефиксированным количеством действий;

б) цикл с пост условием.

Оператор цикла с постусловием в Паскале имеет следующий формат:

Repeat

{тело цикла}

Действие 1;

Действие 2;

. . . . . . .

Действие N;

Until <условие>;

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

В нашем случае одно условие это znak=’/’ и второе условие Chislo2=0.

Составим таблицу истинности

znak=’/’

Chislo2=0

Ожидаемый результат

А and B

Not(A and B)

Истина

Истина

Ложь

Истина

Ложь

Ложь

Истина

Истина

Ложь

Истина

Истина

Ложь

Истина

Ложь

Истина

Ложь

Ложь

Истина

Ложь

Истина

Введем изменения в процедуру Init.

procedure Init;

begin

Writeln('Insert chislo 1');

Readln(Chislo1);

Writeln('Insert Znak');

Readln(Znak);

repeat

Writeln('Insert chislo 2');

Readln(Chislo2);

Until not((znak=’/’) and (Chislo2=0));

End;

Если будет веден знак "/" и число 0, то программа будет запрашивать ввод второго числа, пока оно не будет равно нулю.

Цикл с постусловием будет повторятся до тех пор, пока не выполнится условие записанное после ключевого слова Until.

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