Шаг 25.
Условные конструкции. Оператор switch

    На этом шаге мы рассмотрим синтаксис и применение оператора switch.

    При решении задач достаточно часто приходится осуществлять выбор одного из нескольких вариантов. Это можно сделать с помощью конструкций if...else, но во многих случаях оказывается более удобным применять оператор switch, общий вид которого следующий:

     switch (<переключающее выражение>)
        { 
          case  <константное_выражение_1>: 
                                           <операторы_1>;
          case  <константное_выражение_2>: 
                                           <операторы_2>;
                .   .   .   .   .   .
          case  <константное_выражение_n>: 
                                           <операторы_n>;
          default: <операторы>;
        }

    Управляющая конструкция switch передает управление к тому из помеченных с помощью case операторов, для которого значение константного выражения совпадает со значением переключающего выражения. Переключающее выражение должно быть целочисленным или его значение приводится к целому. Значения константных выражений, помещаемых за служебными словами case, приводятся к типу переключающего выражения. В одном переключателе все константные выражения должны иметь различные значения, но быть одного типа. Любой из операторов, помещенных в фигурных скобках после конструкции switch (...), может быть помечен одной или несколькими метками case. Если значение переключающего выражения не совпадает ни с одним из константных выражений, то выполняется переход к оператору, отмеченному меткой default. В каждом переключателе должно быть не больше одной метки default, однако эта метка может и отсутствовать. В этом случае при несовпадении переключающего выражения ни с одним из константных выражений, помещаемых вслед за case, в переключателе не выполняется ни один из операторов.

    Метки не изменяют последовательности выполнения операторов. Если не предусмотрены переходы или выход из переключателя, то в нем последовательно выполняются все операторы, начиная с той метки, на которую передано управление.

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

    #include<iostream.h>
    void main()
    {   int ic;
        cout << "\nВведите любую десятичную цифру: ";
        cin >> ic;
        cout << '\n';
        switch (ic)
        {  case 0: case 1: cout << "один, ";
           case 2: case 3: cout << "три, ";
           case 4: case 5: cout << "пять, ";
           case 6: case 7: cout << "семь, ";
           case 8: case 9: cout << "девять ";
                                   break; //Выход из переключателя.
                  default: cout << "Ошибка! Это не цифра! ";
         }
    }
Текст этой программы можно взять здесь.

    Пусть, например, была введена цифра 6. Компьютер "найдет" метку case 6 и выполнит все операторы, идущие за этой меткой:

     case 7: cout << "семь, ";
     case 8: 
     case 9: cout << "девять ";

    Таким образом, на экран будет выведено: семь, девять.

    Приведенная программа также иллюстрирует действие оператора break, о котором более подробно мы поговорим на 33 шаге. С его помощью осуществляется выход из переключателя. Если поместить оператор break после вывода каждой цифры, то программа будет печатать название только одной нечетной цифры.

    Приведем несколько примеров использования оператора switch.


    Пример 1.
   #include<iostream.h>
   main ()
   {
      int c;
      cout << "Введите цифру от 1 до 7: "; 
      cin >> c;
      cout << "\nСоответствующий день недели:";
      switch (c)
      {
         case 1  :    cout << "\nПонедельник - день тяжелый!";
                      break;
         case 2  : cout << "\nВторник!"; break; 
         case 3  : cout << "\nСреда!";   break; 
         case 4  : cout << "\nЧетверг!"; break; 
         case 5  : cout << "\nПятница!"; break; 
         case 6  : cout << "\nСуббота!"; break;
         case 7  : cout << "\nВоскресенье! Ура!"; break;
         default : cout << "\nЭто не цифра от 1 до 7"; 
       }
     }
Текст этой программы можно взять здесь.

    Обратите внимание, что если после метки с двоеточием идет несколько операторов, то их необязательно помещать в блок с помощью скобок { и }.

    Напомним, что если не использовать оператор завершения break, то по окончании выполнения списка операторов выбранного варианта произойдет переход на следующий вариант из списка.


    Пример 2.
   #include<iostream.h>
   main ()
   {
      char c;
      cout << "Введите русскую заглавную букву (от 'А' до 'Д'): ";
      cin >> c;
      cout << "\nРасширьте свой кругозор!";
      switch (c)
      {
         case 'А': cout << "\nАргали,дикий горный азиатский баран";
         case 'Б': cout << "\nБабирусса,дикая малайская свинья";
         case 'В': cout << "\nВыхухоль,водоплавающий крот";
         case 'Г': cout << "\nГиббон,длиннорукая обезьяна";
         case 'Д': cout << "\nДаман древесный";
         default : cout << "\nНа первый раз достаточно!";
      }
   }
Текст этой программы можно взять здесь.

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


    Пример 3. Для удобства пользователя можно видоизменить приведенную выше программу следующим образом:
   #include<iostream.h>
   main ()
   {
      char c;
      cout << "Нажмите любую из клавиш 'А,Б,В,Г,Д': ";
      cin >> c;
      cout << "\nРасширьте свой кругозор!";
      switch (c)
      {
         case 'a':
         case 'A':
         case 'а':
         case 'А': cout << "\nАргали,дикий горный азиатский баран";
         case 'b':
         case 'B':
         case 'б':
         case 'Б': cout << "\nБабирусса,дикая малайская свинья";
         case 'w':
         case 'W':
         case 'в':
         case 'В': cout << "\nВыхухоль,водоплавающий крот";
         case 'g':
         case 'G':
         case 'г':
         case 'Г': cout << "\nГиббон,длиннорукая обезьяна";
         case 'd':
         case 'D':
         case 'д':
         case 'Д': cout << "\nДаман древесный";
         default : cout << "\nНа первый раз 
достаточно!";
      }
   }
Текст этой программы можно взять здесь.

    Результат работы программы:

   Нажмите любую из клавиш 'А,Б,В,Г,Д':  b
   Расширьте свой кругозор!
   Бабирусса, дикая малайская свинья
   Выхухоль, водоплавающий крот
   Гиббон, длиннорукая обезьяна
   Даман древесный
   На первый раз достаточно!


    На следующем шаге мы начнем изучение циклических конструкций.


Предыдущий шаг Содержание Следующий шаг