§ 4. Оператор ветвления

4.3. Оператор множественного выбора

 

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

В С++ еще имеется оператор множественного выбора switch, который позволяет выбрать один вариант из нескольких в зависимости от значения выражения и обеспечивает множественное разветвление в программе. Часто использование оператора switch более эффективно, чем использование нескольких операторов if. Формат команды:

switch ( <переменная> ) 

{

  case константа1: {

    команда(ы)1

break;

  }

  case константа2: {

    команда(ы)2

break;

  }

...

  default: {

команда(ы)n

break;

  }

}

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

В блоке default прописываются команды, которые будут выполняться в том случае, когда ни одного совпадения переменной с перечисленными значениями не было обнаружено. Этот блок может быть опущен.

Фигурные скобки могут быть опущены, если в блоке выполняется только одна команда.

Пример 4.6. Дано значение n (1 ≤ n ≤ 7), являющееся номером дня недели. Написать программу, которая определит по значению n, выходной этот день или рабочий.

Этапы выполнения задания

I.  Исходные данные: n (номер дня недели).

II. Результат: сообщения — «рабочий», «выходной» или «ошибочный номер».

III. Алгоритм решения задачи.

1. Ввод исходного числа.
2. 
Выбор значения n из 7 возможных:

2.1. Если значения n — 1, 2, 3, 4, 5 — выводится сообщение «рабочий».
2.2. Если значения n — 6, 7 выводится сообщение «выходной».
2.3. Для любого другого числа — выводит сообщение «ошибочный номер».

3. Вывод результата.

VI. Описание переменных: n – int.

Нужно помнить о некоторых особенностях оператора switch:

  • switch отличается от if тем, что он может выполнять только операции проверки строгого равенства, в то время как if может вычислять логические выражения и отношения;
  • в одном операторе switch не может быть двух констант, имеющих одинаковые значения;
  • оператор switch, включающий в себя другой оператор switch, может содержать одинаковые константы;
  • одно и то же действие может быть выполнено для разных значений констант. Команды записываются после последнего выбора. Для всех предыдущих список команд пуст:
  • С технической точки зрения операторы break являются необязательными в операторе switch. Они используются для окончания работы последовательности команд, относящихся к одному блоку, в котором произошло совпадение значения переменной со значением константы. Если оператор break отсутствует, то после того, как было обнаружено совпадение, будут выполнены все остальные команды для каждого выбора, описанного после совпадения. Сравнения не происходят, а команды выполняются последовательно.

case константа1:

case константа2:{

  команда(ы)1

  break;

}

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

Пример 4.6.

V. Программа:

#include <iostream>

 

using namespace std;

 

int main()

{

  setlocale(0,"");

  int n;

  cout << "Номер дня n=";

  cin >> n;

  switch (n)

  {

    case 1:

    case 2:

    case 3:

    case 4:

    case 5:

  {

      cout << "рабочий" << endl;

      break;

  }

    case 6:

    case 7:

  {

      cout << "выходной" << endl;

      break;

  }

    default:

    cout << "ошибочный номер" << endl;

  }

  return 0;

}

VI. Тестирование:

Пример работы программы, в которой убрали оператор break: