
- •Введение
- •Глава 1. Структурное программирование
- •1.1 Основные определения
- •1.2 Три основных действия
- •1.2.1 Последовательность
- •1.2.2 Выбор
- •1.2.3 Цикл
- •1.3. Структурный подход к решению задач
- •Задание
- •1.4. Организация хранения и обработки данных
- •1.4.1 Записи и списки
- •Задание
- •1.4.2 Очередь
- •Задание
- •1.4.3 Стек
- •Задание
- •1.5 Структурное программирование.
- •2. Программирование на языке паскаль
- •2.1. Краткая история эвм и языки программирования
- •Задание
- •2.2. Интегрированная среда borland pascal
- •2.2.1. Краткая характеристика. Запуск программы
- •2.1.2. Основы работы в редакторе Открытие нового окна
- •Завершение работы со средой
- •Задание
- •«Горячие» клавиши интегрированной среды
- •2.3. Структура программы
- •2.3.1.Основные положения
- •2.3.2. Понятие идентификатора
- •2.3.3. Первая программа
- •2.3.4. Описание подпрограммы (процедуры).
- •2.3.4. Строковый тип данных
- •2.3.5. Процедуры ввода и вывода данных
- •Задание
- •2.4. Программа калькулятор.
- •2.4.1. Тип целые и вещественный.
- •2.4.2. Переменные вещественного типа
- •Задание
- •2.5. Улучшенный калькулятор
- •2.5.1. Операторы выбора
- •Булевские (логические) операции
- •Операции отношения
- •Оператор if … then
- •Оператор case
- •2.5.2. Основные отличия применения операторов выбора. Перечисляемый тип. Интервальный тип.
- •Задание
- •2.6. Улучшенный каЛьКулятор (продолжение)
- •2.6.1. Оператор цикла с постусловием (проверка на ноль)
- •2.6.2. Оператор цикла с предусловием
- •2.6.3. Оператор цикла со счетчиком (параметром)
- •Задание
- •2.7. Переменные типа массив
- •2.7.1. Виды массивов
- •2.7.2.Описание массива
- •2.7.3.Нахождение максимального элемента в массиве
- •Задание
- •2.7.4. Строковая переменная (продолжение)
- •Задание
- •2.7.5. Строковая переменная как массив
- •Мама мыла раму
- •Задание
- •2.7.6. Описание функции
- •Задание
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 не годится для записи циклов, в которых может возникнуть ситуация, когда тело цикла не должно выполнятся ни разу. Если возникает такая ситуация, то необходимо использовать цикл с пред условием.