Условный оператор if...then...else... в Pascal
Создано: 31.03.2026
Все программы, которые мы писали до этого, имели последовательный ход своего выполнения, это были линейные алгоритмы. Строки кода исполнялись друг за другом, одна за другой, никакая из них не пропускалась. Однако бывают ситуации, когда в зависимости от значения переменной или каких-то других условий ход выполнения программы должен идти по-разному, то есть происходить ветвление. Например, если делитель не равен нулю, то надо выполнить деление, а если равен — вывести сообщение о невозможности операции.
Для таких случаев в языках программирования предусмотрен условный оператор. В языке Pascal его синтаксис можно описать как if...then...else..., где вместо троеточий находятся исполняемые выражения. Если мы вспомним английский, то if переводится как "если", then можно перевести как "тогда", else — как "иначе". Получается "если ... тогда ... иначе ...". Понимать это надо следующим образом: если что-то происходит, то (тогда) надо сделать одно, а иначе — сделать что-то другое.
Выражение, которое вставляется между if и then, особенное. Главным в нем должна быть логическая операция, а не арифметическая, присвоения или ввода-вывода. Логические операции имеют такую особенность, что их результатом может быть только правда или ложь. Подробнее о логических операциях и логическом типе данных мы узнаем позже. Пока, чтобы изучить условный оператор, нам достаточно знать только это.
Наиболее простыми и востребованными логическими операциями являются операции сравнения, или отношения, реализуемые в Паскале операторами <, <=, >, >=, =, <>, то есть "меньше", "меньше или равно", "больше", "больше или равно", "равно", "не равно". При использовании любого по обе стороны от него находятся сравниваемые значения или операции, результаты которых сравниваются. Например, a > -1 будет правдой, если значение переменной a больше минус единицы; операция a <> b проверяет, что значения переменных не равны друг другу, то есть различны. Выражение a mod 10 = 0 будет истиной, если число a делится нацело на 10.
Рассмотрим пример, как будет выглядеть код с условным оператором, проверяющим, что делитель не равен нулю:
var a, b: integer; begin readln(a, b); if b <> 0 then writeln(a/b:5:2) else writeln('Нельзя'); end.
Пример выполнения, когда делитель не равен нулю:
5 8 0.63
И когда он ему равен:
4 0 Нельзя
Выражение с условным оператором получается слишком длинным. Поэтому его принято разбивать на несколько строк, например так:
if b <> 0 then writeln(a/b:5:2) else writeln('Нельзя');
Важно понимать, что это по-прежнему только одно выражение, и точка с запятой ставится только в его конце. Компилятору с Паскаля наши переходы безразличны, как и отступы, которые мы делаем для удобства чтения кода.
При таком виде у условного оператора как бы появляются две ветки. Одна if, другая — else. Первую строку можно назвать заголовком условного оператора, а логическое выражение при if — просто условием.
Перепишите пример с делением на 0 таким образом, чтобы тела веток условного оператора поменялись бы местами. Как для этого надо изменить логическое выражение в заголовке?
Тела веток могут быть сложными, то есть содержать несколько выражений, а не по одному как в примере выше. Но как быть, если выражения между собой должны разделяться точкой с запятой, тогда как сам условный оператор как выражение заканчивается таким знаком препинания. Ведь как только компилятор "увидит" точку с запятой, он решит, что условный оператор завершился. Это приведет к ошибке.
Чтобы разрешить эту проблему прибегают к скобкам. В них заключают последовательность выражений, которая должна быть вложена в тело той или иной ветки. При этом в Паскале роль операторных скобок выполняют ключевые слова begin и end. Вот как это может выглядеть на практике:
var i, error: integer; s: string; begin readln(s); val(s, i, error); if error <> 0 then begin writeln('Ожидалось целое число.'); writeln('Позиция первого неверного символа: ', error); end else begin writeln('Численная переменная i = ', i) end; end.
Здесь тело ветки else можно было бы не помещать в операторные скобки, так как оно содержит одно выражение. Слово begin не обязательно писать на той же строке, где находится if или else. Оно может быть записано на отдельной строке под заголовками веток.
В примере выше мы используем еще незнакомую нам процедуру val. Она относится к стандартным (встроенным) функциям и процедурам языка Pascal и выполняет преобразование строки в число. Выражение val(s, i, error) преобразует строку s в значение числовой переменной i, при этом строка s должна содержать символьное представление числа. В случае успешного преобразования переменная error равна нулю. Если же обнаружена ошибка, то error будет содержать номер позиции первого ошибочного символа, а значение i не изменится. Параметр error является необязательным.
Таким образом, считывая с ввода строку, а не число, мы избегаем аварийного завершения программы с ошибкой, которая возникает, когда вместо цифр вводятся буквы при присваивании численной переменной. Примеры выполнения программы:
78 Численная переменная i = 78
732hd Ожидалось целое число. Позиция неверного символа: 4
У условного оператора имеется сокращенная форма, когда ветка else просто отсутствует. Логика его работы такова, что если условие соблюдается, то выражения в теле if выполняются. Если же условие ложно, то не делается ничего. Рассмотрим программу:
var f: real; begin readln(f); if f < 0 then begin writeln('Нельзя извлекать квадратный корень'); writeln('из отрицательного числа.'); writeln('Корень будет извлечен из модуля числа.'); f := abs(f); end; writeln(sqrt(f):10:3); end.
В ней с клавиатуры получают число и потом с помощью встроенной функции sqrt() извлекают из него квадратный корень. Однако перед этим надо проверить, что число не является отрицательным, иначе возникнет ошибка времени выполнения. Обратите внимание, что последнее выражение в коде уже никак не относится к условному оператору. Извлечение корня и вывод на экран будут исполняться всегда, так как относятся к "главной ветке" программы. Примеры выполнения:
9.49 3.081
-5.6 Нельзя извлекать квадратный корень из отрицательного числа. Корень будет извлечен из модуля числа. 2.366
В примере выше было принято решение, что если вводится отрицательное число, извлекать корень из его абсолютного значения. Его получают с помощью функции abs(). Перепишите программу таким образом, чтобы корень извлекался только при вводе положительного числа или нуля, а в случае отрицательного сообщалось бы о некорректном вводе.
Задания для дополнительной или самостоятельной работы:
- Напишите программу, которая в зависимости от введенного значения выполняет вычисления по-разному.
- Напишите программу, которая определяет, является ли введенное целое число четным или нечетным?
- Процедура
val()может преобразовывать строку не только в целое число, также в вещественное. Измените приведенный в уроке пример с ее использованием таким образом, чтобы сначала происходила попытка преобразования строки в целое число. Если она завершается неудачей, то в вещественное. На экран должно выводится сообщение, какой тип числа был получен, или о том, что из строки получить число не удалось.