- •Оглавление
- •Часть 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. Разветвляющийся вычислительный процесс и условный оператор
Главное, чего недостает нашим первым программам -- гибкости и умения принимать решения. Ведь уже несложный алгоритм решения квадратного уравнения предусматривает два варианта расчета, реальные же алгоритмы могут выдавать результаты, зависящие от десятков и сотен условий.
Разветвляющийся вычислительный процесс (РВП) реализуется по одному из нескольких направлений вычисления (ветвей алгоритма). Выбор одной из ветвей зависит от истинности или ложности некоторого условия (логического выражения), включенного в состав условного оператора. Программа должна учитывать все возможные ветви вычислений. При запуске программы, в зависимости от данных, выполняется только одна из возможных ветвей.
7.1. Логические выражения
Логические выражения (ЛВ) строятся из АВ, операций отношения, логических операций и круглых скобок.
Результатом вычисления ЛВ является одно из двух значений: true или false.
7.2. Операции отношения
Операции отношения (сравнения) имеют следующий общий вид:
АВ1 ОО АВ2
где АВ -- арифметические выражения, ОО -- один из следующих знаков операций:
< <= > >= = <>
Последний знак обозначает отношение "не равно". Обратите также внимание на запись отношений "меньше или равно", "больше или равно".
В любое логическое выражение должна входить хотя бы одна операция отношения.
Приведем примеры ЛВ, включающих одну ОО:
d<0 -- выбор ветви вычислений зависит от значения d;
sqr(x)+sqr(y)<=sqr(r) -- результат будет равен true для точек с координатами (x, y), лежащих внутри круга радиуса R с центром в начале координат;
cos(x)>1 -- результат этого ЛВ всегда равен false.
К вещественным значениям в общем случае неприменима операция = ("равно") из-за неточного представления этих значений в памяти компьютера. Поэтому для вещественных переменных отношение вида a=b часто заменяется на abs(a–b)<eps, где eps -- малая величина, определяющая допустимую погрешность.
7.3. Логические операции
Логические операции применимы только в логических выражениях и служат для составления сложных условий, требующих более одной операции отношения. В Паскале определены логические операции, описанные в табл. 7.1.
Табл. 7.1. Логические операции языка Паскаль
Математическая запись |
Запись на Паскале |
Название |
not |
Отрицание |
|
and |
Операция "И" (логическое умножение) |
|
or |
Операция "ИЛИ" (логическое сложение) |
|
xor |
Операция "исключающее ИЛИ" |
Операция NOT применима к одному логическому выражению (является унарной). Ее результат равен true, если выражение ложно и наоборот.
Например, выражение NOT (sin(x)>1) всегда даст значение true.
Операция AND связывает не менее двух логических выражения (является бинарной). Ее результат равен true, если все выражения истинны или false, если хотя бы одно из выражений ложно.
В качестве примера распишем выражение . Т. к. операции принадлежности в Паскале нет, используем операцию AND и операции отношения: (x>=a) and (x<=b).
Математическое выражение a,b,c>0 (одновременно) будет иметь вид (a>0) and (b>0) and (c>0).
Операция OR также связывает не менее двух логических выражений. Ее результат равен true, если хотя бы одно выражение истинно и false, если все выражения ложны.
Распишем выражение . На Паскале оно будет иметь вид(x<a) or (x>b). Другой способ связан с применением операции NOT: not ((x>=a) and (x<=b)).
Условие "хотя бы одно из значений a,b,c положительно" может быть записано в виде (a>0) or (b>0) or (c>0) .
Условие "только одно из значений a,b,c положительно" потребует объединения возможностей операций AND и OR:
(a>0) and (b<=0) and (c<=0) or
(a<=0) and (b>0) and (c<=0) or
(a<=0) and (b<=0) and (c>0).
Операция XOR, в отличие от OR, возвращает значение "ложь" (false) и в том случае, когда все связанные ей логические выражения истинны. Чтобы лучше уяснить это отличие, составим так называемую таблицу истинности двух логических операций (табл. 7.2). Для краткости значение false обозначим нулем, а true -- единицей. Для двух логических аргументов возможно всего 4 комбинации значений 0 и 1.
Табл. 7.2. Таблица истинности операций OR и XOR
Аргумент A |
Аргумент B |
A or B |
A xor B |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
В качестве примера использования операции XOR запишем условие "только одно из значений a,b положительно":
(a>0) xor (b>0).
К сожалению, записать условие "только одно из значений a,b,c положительно" в напрашивающемся виде (a>0) xor (b>0) xor (c>0) нельзя -- результат этого выражения будет равен true и в случае, когда все три значения положительны. Связано это с тем, что при последовательном расчете логических выражений слева направо (1 xor 1) xor 1 будет равно 0 xor 1 = 1.
С помощью xor удобно организовывать различного рода переключатели, которые последовательно должны принимать одно из двух состояний:
x := x xor true; writeln ('x=', x);
x := x xor true; writeln ('x=', x);
Независимо от начального значения логической переменной x, второе выведенное на экран значение будет логическим отрицанием первого. В реальной практике конструкции подобные x := x xor true; не дублируются в коде многократно, а применяются внутри цикла (см. гл. 9).
Приоритет логических операций следующий: самая старшая операция -- not, затем and, следующие по приоритету -- or и xor (равноправны между собой), самый низкий приоритет имеют операции отношения. Последнее служит причиной того, что в составных условиях отдельные отношения необходимо заключать в круглые скобки, как и сделано во всех примерах раздела.