Множественное ветвление в 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. Напишите программу, в которой есть две переменные — целочисленная и строковая. Пользователь должен ввести слово из определенного набора. В зависимости от того, какое слово он ввел, численной переменной присваивается соответствующее число. Если введенное слово не из допустимых, то численной переменной надо присвоить -1.
  2. Вспомните программу из прошлого урока, в которой из числа извлекался квадратный корень. Перепишите ее таким образом, чтобы пользователю предлагалось ввести число повторно, если первое было отрицательным.