Выражение, стоящее между CASE и OF, называется селектором. Константы (значения выражения), предшествующие двоеточию, называются метками случаев. Порядок работы оператора: сначала вычисляется значение селектора, затем выполняется оператор, одна из меток которого совпадает со значением селектора. Все остальные операторы не выполняются, и управление передается следующему после END оператору. В случае короткой формы оператора CASE при несовпадении значения селектора (ключа) ни с одной из констант из списка никакой оператор не подлежит исполнению. Если же в операторе есть строка ELSE, то при несовпадении значения селектора ни с одной константой выполняется оператор, следующий за ELSE.
Выражение «селектор» может относиться к любому скалярному типу, кроме REAL. Метки случаев должны принадлежать тому же типу, что и селектор. Нежелательно, чтобы одна и та же метка появлялась более одного раза в операторе CASE. Если же это произойдет (компилятор не проверяет повторяемость меток), то выполнится тот оператор, который соответствует первому вхождению метки в список констант.
Оператор CASE особенно удобно использовать, во-первых, когда характер действий определяется значениями, которые не попадают в последовательно расположенные интервалы, во-вторых, когда нескольким дискретным значениям селектора соответствует одно и то же действие.
П р и м е р 1. Печать названия десятичных цифр.
program DICITS;
var DIGIT: integer;
begin
writeln ('Введите цифру');
readln (DIGIT);
case DIGIT of
0: writeln ('нуль');
1: writeln ('один');
..................
9: writeln ('девять');
else writeln ('это не цифра');
end;
end.
П р и м е р 2. Печать номера квартала года.
program NUMKVART;
var MESIATZ: 1..12;
begin
write ('Введите номер месяца года – ');
read (MESIATZ);
case MESIATZ of
1, 2, 3: writeln ('Первый квартал');
4, 5, 6: writeln ('Второй квартал');
7, 8, 9: writeln ('Третий квартал');
10, 11, 12: writeln ('Четвертый квартал');
end;
end.
Примечание. В операторе CASE нет явно условий как таковых, однако проверка условий осуществляется в неявном виде на предмет совпадения константы со значением селектора.
Контрольные вопросы
1. Какие операторы используются для программирования развилок?
2. Как выполняются операторы условного перехода?
3. Какую из функций: Sin(x), Abs(x), Trunc(x) можно заменить условным оператором if x<0 then x := -x?
4. Если выбор вариантов осуществляется из конечного числа элементов выбора, то лучше взять для этого оператор if или case?
5. Как заменить оператор case операторами if?
6. В чем преимущество оператора case от последовательности «коротких» операторов if?
7. Какой тип переменной можно использовать в качестве ключа оператора case?