Как уже было рассмотрено в разделе про условный оператор, множественный выбор может быть реализован при помощи вложенных один в другой операторов if. Такой подход не всегда удобен, особенно в том случае, если количество вариантов хода программы велико.
Специально для целей эффективного осуществления множественного выбора в языке Object Pascal предусмотрен оператор выбора case.
В общем виде оператор case записывается следующим образом:
case<ключ выбора> of
<список выбора 1>: оператор 1;
<список выбора 2>: оператор 2;
...
<список выбора N>: оператор N;
Else
оператор для else;
end;
где <ключ выбора> – выражение, значение которого определяет дальнейший ход выполнения программы;
<список выбора X> – список значений <ключа выбора>, если <ключ выбора> будет равен одному из значений <списка выбора X>, то будет выполнен оператор X.
Если значения в списке выбора представляют собой диапазон чисел, то вместо списка можно указать первую и последнюю константу диапазона, разделив их двумя точками. Например, список 1, 2, 3, 4, 5, 6 может быть заменен диапазоном 1..6.
Выполняется оператор caseследующим образом:
1. Сначала вычисляется значение выражения <ключа выбора>.
2. Значение выражения <ключа выбора> последовательно сравнивается со значениями из списков выбора.
3. Если значение выражения <ключа выбора> совпадает хотя бы с одним значением из списка выбора, то выполняется соответствующий этому списку оператор (может быть составной). На этом выполнение оператора саsезавершается.
4. Если значение выражения <ключа выбора> не совпадает ни с одной константой из всех списков, то выполняется оператор для else.
На рис. 3.4 приведен алгоритм, реализуемый оператором case.
Оператор выбора case также как и условный оператор if может быть неполным. Т.е. синтаксис оператора caseпозволяет не использовать else и соответствующий оператор для else. В этом случае, если значение выражения <ключа выбора> не совпадает ни с одним значением из всех списков, то выполняется следующий за case ... end;оператор программы.
Рис. 3.4.Алгоритм оператора выбора
Рассмотрим пример использования оператора выбора case для вывода на экран категории дня недели.
Вариант 1:
casenDayOfWeek of
1,2,3,4,5: sDay := ’Рабочий день. ’ ;
6: sDay := ’Cyббoтa! ’;
7: sDay := ’Воскресенье! ’;
end;
Вариант 2:
casenDayOfWeek of
1..5: sDay := ’Рабочий день.’ ;
6: sDay := ’Cyббoтa! ’;
7: sDay := ’Воскресенье! ’;
end;
Вариант 3:
casenDayOfWeek of
6: sDay := ’Cyббoтa!’;
7: sDay := ’Воскресенье!’;
elsesDay := ’Рабочий день.’ ;
end;
На первый взгляд все три варианта равноценны. Однако, вариант 3 использовать не рекомендуется, так как в нем не учитывается ошибочная, но вполне вероятная ситуация, когда значение номера дня недели может быть меньше одного либо больше семи. В этом случае в варианте 3 такой день будет считаться рабочим, что неверно.