Множественное ветвление в Pascal
Создано: 02.04.2026
Сам по себе условный оператор позволяет программе разделиться на две ветви выполнения. Но что делать, если их требуется больше, то есть как в программе реализовать множественное ветвление? Простой пример: если значение переменной положительное, то надо сделать одно, если отрицательное — другое, а если равное нулю — третье. Мы вполне можем использовать три отдельных условных оператора:
var a: integer; begin readln(a); if a > 0 then writeln('Тепло'); if a < 0 then writeln('Холодно'); if a = 0 then writeln('Ноль градусов') end.
В таком варианте нельзя использовать ветку else хотя бы при одном if, потому что она будет "срабатывать", когда одно из условий ложно. Но при этом может быть истиной третье.
Представленный код вполне рабочий, но не совсем правильный, потому что если срабатывает первый if, в проверках условий при втором и третьем нет смысла. Однако они произойдут, вычислительные мощности компьютера будут тратиться впустую.
Грамотным решением проблемы множественного ветвления является вложение одного условного оператора в одну из веток другого, внешнего для него. Если не имеет значения, в какую именно — if или else, то лучше помещать в else. Так логика выполнения будет более ясной. Перепишем нашу программу таким образом:
var a: integer; begin readln(a); if a > 0 then writeln('Тепло') else if a < 0 then writeln('Холодно') else writeln('Ноль градусов'); end.
И проследим ход ее выполнения. Сначала проверяется условие a > 0. Если оно верное, то на экране выводится Тепло, а ветка else и все, что в нее вложено, игнорируются. Если a > 0 — это ложь, то компьютер–исполнитель не выполняет тело if, а заходит в else.
Здесь он видит вложенный условный оператор и начинает исполнять уже его. Если условие a < 0 правда, выполнится тело if, иначе — else. Ветка else вложенного условного оператора как раз обрабатывает случаи, когда переменная равна нулю. Действительно, если ее значение не больше нуля и не меньше, то остается только ноль.
Эта программа лучше, чем первая, потому что как только в условии встречается логическое выражение, возвращающее истину, все нижеследующие проверки пропускаются.
Придумайте программу, состоящую из трех ветвей, каждая из которых содержала бы в своем теле несколько выражений (их надо заключать в операторные скобки begin и end).
Теперь придумаем программу с пятью ветвями:
var a: integer; begin write('Оценка: '); readln(a); if a = 2 then writeln('Плохо') else if a = 3 then writeln('Удовлетворительно') else if a = 4 then writeln('Хорошо') else if a = 5 then writeln('Отлично') else writeln('Неверная оценка'); end.
Первое, что может не понравиться, это получившаяся "лестница". Она, конечно, помогает видеть, куда что вложено, но если мы это уже понимаем, ничего не мешает переписать программу так:
var a: integer; begin write('Оценка: '); readln(a); if a = 2 then writeln('Плохо') else if a = 3 then writeln('Удовлетворительно') else if a = 4 then writeln('Хорошо') else if a = 5 then writeln('Отлично') else writeln('Неверная оценка'); end.
Такой код для компилятора Паскаля ничем не отличается от предыдущего, мы просто подняли каждый вложенный if к его внешнему else. Однако для нас программа становится более читабельной и кажется, что в языке программирования есть настоящий условный оператор множественного ветвления.
Второе, на что следует обратить внимание, это использование одного и того же логического оператора и одной и той же переменной во всех условиях. Для таких случаев во многих языках программирования есть оператор выбора, который используют вместо условного оператора.
В Паскале оператор выбора, или переключатель, определяется ключевым словом case, переводится как "случай". Вот как с ним будет выглядеть наша программа:
var a: integer; begin write('Оценка: '); readln(a); case a of 2: writeln('Плохо'); 3: writeln('Удовлетворительно'); 4: writeln('Хорошо'); 5: writeln('Отлично'); else writeln('Неверная оценка'); end; end.
При использовании оператора выбора мы избавляемся от множественного упоминания переменной и знака равенства. Заголовок case a of можно перевести как "случай значения переменной a из нижеследующих".
Однако, в отличие от условного оператора, переключатель имеет ряд принципиальных ограничений. Переменная–селектор (та, которая упоминается при case) может иметь только перечисляемый тип (например, она не может быть вещественного типа). По ходу выполнения оператора case значение переменной сравнивается с различными описанными в нем альтернативами (метками–значениями). Как только совпадение будет найдено, то выполняется блок кода при данной метке, и происходит выход в основную ветку программы.
Если совпадений не будет, то выполняется блок else. Если блок else отсутствует (он является не обязательным), то никакой блок кода в операторе case не выполняется.
Каждая альтернатива может включать не одно значение, а несколько или даже диапазон (этот тип данных будет изучаться нами позже).
var n: integer; begin write('Введите класс школы: '); readln(n); case n of 1..4: writeln('Младшие классы.'); 5..8: writeln('Средняя школа.'); 9,11: writeln('Старшие классы. Выпускной.'); 10: writeln('Старшие классы.'); else writeln('Error') end; end.
Здесь выражение 1..4 означает, что данная ветка обрабатывает случаи, когда значение переменной равно любому из 1, 2, 3 или 4. Выражение 9,11 подразумевает случаи, когда значением n является 9 или 11.
Подумайте, почему в операторе выбора каждая ветка отделяется точкой с запятой? Какие ключевые слова здесь играют роль операторных скобок? Придумайте программу, в которой хотя бы в одной альтернативе должно выполняться несколько выражений. Надо ли их обрамлять словами begin и end? Могут ли в языке программирования одни операторные скобки вкладываться в другие?
Задания для дополнительной или самостоятельной работы:
- Напишите программу, в которой есть две переменные — целочисленная и строковая. Пользователь должен ввести слово из определенного набора. В зависимости от того, какое слово он ввел, численной переменной присваивается соответствующее число. Если введенное слово не из допустимых, то численной переменной надо присвоить -1.
- Вспомните программу из прошлого урока, в которой из числа извлекался квадратный корень. Перепишите ее таким образом, чтобы пользователю предлагалось ввести число повторно, если первое было отрицательным.