Кроме условного оператора в качестве управляющей структуры довольно часто используется оператор выбора CASE. Эта структура позволяет переходить на одну из ветвей в зависимости от значения заданного выражения (селектора выбора). Ее особенность состоит в том, что выбор решения здесь осуществляется не в зависимости от истинности или ложности условия, а является вычислимым. Оператор выбора позволяет заменить несколько операторов развилки (в силу этого его ещё называют оператором множественного ветвления).
В конструкции CASE вычисляется выражение K и выбирается ветвь, значение метки которой совпадает со значением K. После выполнения выбранной ветви происходит выход из конструкции CASE. Если в последовательности нет метки со значением, равным K, то управление передается внешнему оператору, следующему за конструкцией CASE (в случае отсутствия альтернативы ELSE; если она есть, то выполняется следующий за ней оператор, а уже затем управление передается внешнему оператору).
Запись оператора выбора
CASE K OF
A1 : серия 1;
A2 : серия 2;
...
AN : серия N
ELSE серия N + 1
END;
Любая из указанных серий операторов может состоять как из единственного оператора, так и нескольких (в этом случае, как обычно, операторы, относящиеся к одной метке, должны быть заключены в операторные скобки begin..end).
Выражение K здесь может быть любого порядкового типа (напомним, что к таким типам относятся все целые типы, Boolean, Char, перечисляемый тип, диапазонный тип, базирующийся на любом из указанных выше типов).
Задача 1. В старояпонском календаре был принят двенадцатилетний цикл. Годы внутри цикла носили названия животных: крысы, коровы, тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, петуха, собаки и свиньи. Написать программу, которая позволяет ввести номер года и печатает его название по старояпонскому календарю. Справка: 1996 г. — год крысы — начало очередного цикла.
Поскольку цикл является двенадцатилетним, поставим название года в соответствие остатку от деления номера этого года на 12.
Program Goroskop;
Var Year : Integer;
Begin
Write(' Введите год '); ReadLn(Year);
CASE Year MOD 12 OF
0 : WriteLn('Год Обезьяны');
1 : WriteLn('Год Петуха');
2 : WriteLn('Год Собаки');
3 : WriteLn('Год Свиньи');
4 : WriteLn('Год Крысы');
5 : WriteLn('Год Коровы');
6 : WriteLn('Год Тигра');
7 : WriteLn('Год Зайца');
8 : WriteLn('Год Дракона');
9 : WriteLn('Год Змеи');
10 : WriteLn('Год Лошади');
11 : WriteLn('Год Овцы')
END;
END.
Задача 2. Найти наибольшее из двух действительных чисел, используя оператор выбора.
Program Maximum;
Var Max, X, Y : Real;
Begin
Write('Введите два неравных числа:');
ReadLn(X, Y);
Case X > Y Of
TRUE : Max := X;
FALSE : Max := Y
End;
WriteLn('Максимальное из двух есть ', Max : 12 : 6)
End.
Задача 3. Преобразовать символ, если он является строчной русской буквой, в заглавную букву.
Так как в альтернативной системе кодировки ASCII строчные русские буквы идут не подряд, а с некоторым разрывом, то в данном случае, в зависимости от того, в какую часть таблицы попадает введенная буква, используется та или иная формула. Если введённый символ не является строчной русской буквой, он выводится без изменения.
Program UpCase;
Var C : Char;
Begin
Write('Введите символ:');
ReadLn(C);
Case C Of
' а '..' п ' : C := Chr(Ord(C) - 32);
' р '..' я ' : C := Chr(Ord(C) - 80)
End;
WriteLn(C);
End.
Как видно из примера, в качестве метки может выступать не только отдельное значение, но и диапазон значений. Кроме того, в качестве метки может выступать перечень значений выражения (значения перечисляются через запятую).