6.3. Оператор варианта (CASE)

Оператор варианта необходим в тех случаях, когда в зависимости от значений какой-либо переменной надо выполнить те или иные

- 97 -

операторы (простые или составные). Если вариантов всего два, то можно обойтись и оператором IF. Но если их, например, десять? В этом случае оптимален оператор варианта CASE. Структура оператора CASE имеет вид

CASE УправляющаяПеременнаяИлиВыражение OF

НаборЗначений1 : Оператор1;

НаборЗначений2 : Оператор2;

НаборЗначенийЗ : ОператорЗ;

...

НаборЗначенийN : ОператорN

ELSE

АльтернативныйВсемНаборамОператор

END;

Между служебными словами CASE и OF должна стоять переменная или выражение (оно вычислится при исполнении оператора CASE). Тип переменной (или значения выражения) может быть только перечислимым (включая типы Char и Boolean), диапазоном или целочисленным одного из типов Byte, ShortInt, Integer или Word. Все прочие типы не будут пропущены компилятором Турбо Паскаля. Набор значений — это конкретные значения управляющей переменной или выражения, при которых необходимо выполнить соответствующий оператор, игнорируя остальные варианты. Если в наборе несколько значений, то они разделяются между собой запятыми. Можно указывать диапазоны значений. Между набором значений и соответствующим ему оператором обязательно должно ставиться двоеточие «:».

Оператор в конкретном варианте может быть как простым, так и составным. Конец варианта обязательно обозначается точкой с запятой. Турбо Паскаль допускает необязательную часть ELSE. Если значение переменной (выражения) не совпало ни с одним из значений в вариантах, то будет выполнен оператор, стоящий в части ELSE.

Завершает оператор CASE слово END. По-прежнему перед ELSE и END необязательна точка с запятой. Рассмотрим пример оператора варианта (в нем Err — переменная типа Word):

| CASE Err OF

| 0 : WriteLn( 'Нормальное завершение программы' );

| 2, 4, 6 : begin

| WriteLn('Ошибка при работе с файлом');

| WriteLn('Повторите действия снова.')

| end;

- 98 -

| 7..99 : WriteLn( 'Ошибка с кодом ', Err )

| ELSE {case}

| WriteLn( 'Код ошибки=,Err,' См. описание')

| END; {case}

Здесь в зависимости от значения переменной Err выводится на экран операторами WriteLn текст соответствующего сообщения. Наличие варианта ELSE (Err не равна 0, 2, 4, 6 и не входит в диапазон 7..99) гарантирует выдачу сообщения в любом случае.

Значения в каждом наборе должны быть уникальными, т.е. они могут появиться только в одном варианте. Пересечение наборов значений для разных вариантов является ошибкой, и она будет замечена компилятором.

Оператор варианта CASE очень удобен и, как правило, более эффективен, чем несколько операторов IF того же назначения. Эффективность его в смысле скорости будет максимальной, если размещать наиболее вероятные значения (или их наборы) первыми в порядке следования.