"Программы без ошибок можно написать
двумя способами, но работает — третий"
Алан Джей Перлис

Оператор выбора Case

Приветствую вас на нашем очередном занятии. Сегодня урок будет посвящен оператору варианта Case.
Оператор Case - это оператор множественного ветвления. То есть в зависимости от некоторого условия может быть выполнено одно из многочисленных продолжений программы. Рассмотрим структуру оператора Case, а затем я поясню на бытовом примере, как это работает.

Case <селектор> of
    <константа 1> : <оператор 1>;
    <константа 2> : <оператор 2>;
    .............................
    <константа N> : <оператор N>;
    else <оператор>
end;

где Case - зарезервированное слово (от англ. "выбор", "вариант");
<селектор> - выражение, исходя из значения которого будет выбран оператор из списка для дальнейшего выполнения;
of - зарезервированное слово (от англ. "из");
<константа> - константа выбора;
<оператор> - любые операторы языка Pascal, в том числе может быть составной или пустой операторы;
else - зарезервированное слово (от англ. "иначе"). Если ни одна из констант не подошла к селектору, то будут выполнены операторы, следующие за else. Блок else не обязателен, поэтому если его нет, оператор case завершит свою работу, так и не выполнив ни одного оператора из списка;
end - зарезервированное слово (от англ. "конец"), завершение оператора варианта.

Разберем работу оператора Case на примере. Каждый из вас, прежде чем выйти на улицу одевает одежду. Выбор этой одежды во многом зависит от температуры на улице. Если на термометре -15, то вы наденете куртку, брюки и сапоги. А если на улице +20, ваш выбор будет состоять из майки, шорт и сандалий. Представьте, что термометр с его показаниями температуры - это своего рода <селектор> в программе. В роли <констант> выступают градусы цельсия, а в роли <операторов> ваш гардероб. Тогда программу, которая выбирает гардероб в зависимости от температуры, можно записать следующим образом:

program garderob;
var
   temperatura:integer;
begin
     write('Температура = ');
     read(temperatura);
     case temperatura of
      -24..-15 : writeln('Шапка-ушанка, фуфайка, ватные штаны, валенки');
      -14..0 : writeln('Шапка, теплая куртка, штаны, ботинки');
      1..10 :  writeln('Куртка, штаны, ботинки');
      11..17 : writeln('Ветровка, джинсы, кроссовки');
      18..25 : writeln('Кепка, майка, сандалии');
      26..35 : writeln('Плавки, маска, ласты');
      else writeln('Лучше остаться дома')
     end;
end.

Пользователь вводит значение температуры, если это значение расположено в интервале от -24 до +35 градусов цельсия, то программа находит среди констант ту, которая равна введенному значению, и выводит на экран список гардероба, соответствующий этой температуре. Если введенное значение температуры лежит за пределом от -24 до +35, то на экран выводится сообщение из блока else - 'Лучше остаться дома'.

Несколько важных замечаний

Примеры ошибочного написания оператора Case:

Пример №1 - селектор не может иметь тип real

program one;
var
   x:real;
begin
     read(x);
     case x of
     1 : writeln('one');
     2 : writeln('two');
     3 : writeln('three');
     4 : writeln('four');
     end;
end.

Пример №2 - тип констант не совпадает с типом селектора:

program two;
var
   x:integer;
begin
     read(x);
     case x of
     'A' : writeln('one');
     'B' : writeln('two');
     'C' : writeln('three');
     'D' : writeln('four');
     end;
end.

Пример №3 - повторение константы (константа 2 встречается два раза в списке):

program three;
var
   x:integer;
begin
     read(x);
     case x of
     1,2 : writeln('one');
     2,3 : writeln('two');
     4 : writeln('three');
     5..7 : writeln('four');
     end;
end.

Кстати, в этом примере наглядно показано, что <константа> может быть не только простым числом, но и представлять собой некий диапазон. Запись диапазона происходит следующим образом: <начало>..<конец> Также <константа> может быть задана перечисляемым списком. Такой список записывается через запятую, например (при x:integer):

case x of
  0, 1, 2 : <операторы 1>;
  3, 4, 5 : <операторы 2>;
  6, 9, 15 : <операторы 3>;
end;
через запятую и в одинарных кавычках (при x:char):
case x of
  'A', 'B', 'C' : <операторы 1>;
  'D', 'E', 'F' : <операторы 2>;
  'Monday', 'Tuesday', 'Wednesday' : <операторы 3>;
end;

Это все, о чем я хотел вам сегодня рассказать. Надеюсь, материал был понятен. Для закрепления навыков обязательно посетите раздел Практика, в нем собраны задачи по разным темам и даны готовые решения. Если возникли какие-то вопросы, не стесняйтесь задавать их, контакты для связи со мной находятся здесь. Если вопросов нет - жду вас на следующем уроке. Всего доброго!