- •Оглавление
- •Часть 1. Основы языка Паскаль 5
- •Часть 2. Элементы профессионального программирования на Паскале 92
- •Введение
- •Часть 1. Основы языка Паскаль
- •1. Алгоритм и программа
- •1.1. Алгоритм
- •1.2. Свойства алгоритма
- •1.3. Формы записи алгоритма
- •1.4. Программа и программное обеспечение
- •1.5. Этапы разработки программы
- •2. Данные в языке Паскаль
- •2.1. Константы
- •2.2. Переменные и типы переменных
- •3. Арифметические выражения
- •4. Линейный вычислительный процесс
- •4.1. Оператор присваивания
- •4.2. Оператор ввода
- •4.3. Оператор вывода
- •4.4. Управление выводом данных
- •4.5. Вывод на печать
- •5. Структура простой программы на Паскале
- •6. Компилятор и оболочка Turbo Pascal
- •7. Разветвляющийся вычислительный процесс и условный оператор
- •7.1. Логические выражения
- •7.2. Операции отношения
- •7.3. Логические операции
- •7.4. Короткий условный оператор
- •7.5. Полный условный оператор
- •7.6. Составной условный оператор
- •7.7. Вложенные условные операторы
- •7.8. Оператор выбора
- •7.9. Примеры программ с условным оператором
- •8. Директивы компилятора и обработка ошибок ввода
- •9. Оператор цикла. Циклы с предусловием и постусловием
- •10. Цикл со счетчиком и досрочное завершение циклов
- •11. Типовые алгоритмы табулирования функций, вычисления количества, суммы и произведения
- •11.1. Алгоритм табулирования
- •11.2. Алгоритм организации счетчика
- •11.3. Алгоритмы накопления суммы и произведения
- •12. Типовые алгоритмы поиска максимума и минимума
- •13. Решение учебных задач на циклы
- •14. Одномерные массивы. Описание, ввод, вывод и обработка массивов на Паскале
- •15. Решение типовых задач на массивы
- •Часть 2. Элементы профессионального программирования на Паскале
- •16. Кратные циклы
- •16.1. Двойной цикл и типовые задачи на двойной цикл
- •16.2. Оператор безусловного перехода
- •17. Матрицы и типовые алгоритмы обработки матриц
- •18. Подпрограммы
- •18.1. Процедуры
- •18.2. Функции
- •18.3. Массивы в качестве параметров подпрограммы
- •18.4. Открытые массивы
- •19. Множества и перечислимые типы
- •20. Обработка символьных и строковых данных
- •20.1. Работа с символами
- •20.2. Работа со строками
- •21. Текстовые файлы
- •21.1. Общие операции
- •21.2. Примеры работы с файлами
- •21.3. Работа с параметрами командной строки
- •22. Записи. Бинарные файлы
- •23. Модули. Создание модулей
- •23.1. Назначение и структура модулей
- •23.2. Стандартные модули Паскаля
- •24. Модульcrtи создание консольных интерфейсов
- •25. Модульgraph и создание графики на Паскале
- •Заключение
- •Приложение 1. Таблицы ascii-кодов символов для операционных систем dos и Windows
- •Приложение 2. Основные директивы компилятора Паскаля
- •Приложение 3. Основные сообщения об ошибках Паскаля
- •Приложение 4. Дополнительные листинги программ
- •Приложение 5. Расширенные коды клавиатуры
- •Приложение 6. Правила хорошего кода
- •Рекомендуемая литература
7.4. Короткий условный оператор
Это первый вид условного оператора, позволяющий программе выполнить или пропустить некоторый блок вычислений. Общий вид короткого условного оператора следующий:
if логическое_выражение then оператор1;
Сначала вычисляется логическое выражение, если оно имеет значение true, то выполняется оператор1, иначе оператор1 игнорируется. Блок-схема соответствующего вычислительного процесса представлена на рис. 7.1.
Рис. 7.1. Блок-схема короткого условного оператора
Если по условию требуется выполнить несколько операторов, их необходимо заключить в операторные скобки begin...end;, образуя единый составной оператор:
if d>0 then begin
x1:=(-b+sqrt(d))/(2*a);
x2:=(-b-sqrt(d))/(2*a);
writeln (x1:8:3,x2:8:3);
end;
Здесь по условию d>0 выполняется 3 оператора, первые два из которых вычисляют корни x1 и x2 квадратного уравнения, а последний выводит на экран найденные значения корней.
Следующий пример иллюстрирует поиск значения y=max(a,b,c). Поскольку стандартной функции для нахождения максимума в Паскале нет, применим 2 коротких условных оператора:
y:=a;
if b>y then y:=b;
if c>y then y:=c;
Вообще, для условной обработки N значений требуется N-1 короткий условный оператор.
7.5. Полный условный оператор
Эта форма условного оператора позволяет запрограммировать 2 ветви вычислений. Общий вид полного условного оператора следующий:
if логическое_выражение then оператор1
else оператор2;
Оператор работает следующим образом: если логическое выражение имеет значение true, то выполняется оператор1, иначе выполняется оператор2. Всегда выполняется только один из двух операторов. Перед ключевым словом else ("иначе") точка с запятой не ставится, т.к. if-then-else -- единый оператор.
Вычислим значение m=min(x,y) с помощью полного условного оператора:
if x<y then m:=x else m:=y;
В следующем примере выполним обработку двух переменных: если значения a и b одного знака, найти их произведение, иначе заменить нулями.
if a*b>0 then c:=a*b
else begin
a:=0; b:=0;
end;
Из примера видно, что к ветви алгоритма после ключевого слова else, состоящей более чем из одного оператора, также применяются операторные скобки.
7.6. Составной условный оператор
Эта форма условного оператора применяется, когда есть более 2 вариантов расчета. Общий вид составного оператора может включать произвольное число условий и ветвей расчета:
if логическое_выражение1 then оператор1
else if логическое_выражение2 then оператор2
...
else if логическое_выражениеN then операторN
else оператор0;
При использовании оператора последовательно проверяются логические выражения 1, 2, ... ,N, если некоторое выражение истинно, то выполняется соответствующий оператор и управление передается на оператор, следующий за условным. Если все условия ложны, выполняется оператор0 (если он задан). Число ветвей N неограниченно, ветви else оператор0; может и не быть.
Существенно то, что если выполняется более одного условия из N, обработано все равно будет только первое истинное условие. В показанной ниже программе составной условный оператор неверен, если ее разработчик хотел отдельно учесть значения x, меньшие единицы по модулю:
var x:real;
begin
write ('Введите x:'); readln (x);
if x<0 then writeln ('Отрицательный')
else if x=0 then writeln ('Ноль')
else if abs(x)<1 then
writeln ('По модулю меньше 1')
else writeln ('Больше 1');
end.
Условие x<0 сработает, например, для значения x=-0.5, что не позволит программе проверить условие abs(x)<1.
Еще одну распространенную ошибку работы с составным условным оператором показывает произведенный ниже расчет знака n переменной a:
if a<0 then n:=-1;
if a=0 then n:=0
else n:=1;
Применение одного короткого и одного полного условных операторов является здесь грубой ошибкой -- ведь после завершения короткого условного оператора для всех ненулевых значений a будет выполнено присваивание n:=1. Правильных вариантов этого расчета, по меньше мере, два:
if a<0 then n:=-1;
if a=0 then n:=0;
if a>0 then n:=1;
— с помощью 3 коротких условных операторов, вариант не очень хорош тем, что проверяет лишние условия даже тогда, когда знак уже найден.
if a<0 then n:=-1;
else if a<0 then n:=1;
else n:=0;
— с помощью составного условного оператора, этот вариант лучше. На практике следует помнить, что для вещественных значений сравнение с нулем может быть проблематично.
Можно сделать вывод, что при программировании многовариантных расчетов следует соблюдать осторожность, чтобы не допустить "потерянных" или неверно срабатывающих ветвей алгоритма.
В качестве еще одного примера рассчитаем значение функции, заданной графически (рис. 7.2).
Рис. 7.2. Функция, заданная графически
Перепишем функцию в аналитическом виде:
Одним из вариантов запрограммировать вычисление y(x) мог бы быть следующий:
if abs(x)>1 then y:=0
else if x<0 then y:=x+1
else y:=1-x;
Возможна и последовательная проверка условий слева направо, которая породит немного избыточный, но легче воспринимающийся код:
if x<-1 then y:=0
else if x<0 then y:=x+1
else if x<1 then y:=1-x
else y:=0;