Как мы уже выяснили, оператор if позволяет сделать выбор одного из двух возможных продолжений. Если вариантов выбора более двух, то можно использовать вложенные операторы if. Но это не всегда удобно. Когда счёт вариантов выбора идёт на десятки (а может быть, и на сотни!), то применение if становится совершенно неудобным. Для таких случаев рекомендуют использовать специальный оператор switch.
Оператор switch — это оператор для выбора одного из многих продолжений. Схематично этот оператор можно изобразить так:
Формальная запись этого оператора на С/С++ выглядит так:
switch(Выражение)
{
case Константа1: Операторы1; break;
case Константа2: Операторы2; break;
...................................
case КонстантаN: ОператорыN; break;
default:
Операторы по умолчанию;
}
Здесь Выражение — это любое выражение целого типа (чаще — просто переменная), например типа char или int.
Далее в блоке за заголовком мы видим набор конструкций вида
case Константа: Операторы; break;
В них Константа — это константа того же целого типа, что и Выражение. Операторы — любые исполняемые операторы. Количество их произвольное, оформлять блоком не требуется.
Алгоритм работы оператора switch:
Вычисляется значение Выражения.
Затем среди рассмотренных выше конструкций ищется такая, которая начинается с Константы, равной значению Выражения. Если Константа найдена, то выполняются следующие за ней Операторы. Оператор break осуществляет выход из оператора switch. Если ни одна из Констант не равна значению Выражения, то выполняется ветвь default (по умолчанию), и оператор заканчивает работу.
Ветвь default в операторе switch может отсутствовать. В этом случае, если ни одна из ветвей не соответствует значению Выражения, то делается выход из оператора switch.
Количество вариантов в операторе switch ни чем не ограничено. В принципе, они все могут отсутствовать (как и ветвь default), то есть вполне можно написать:
switch(Выражение) { }
но фигурные скобки за заголовком должны быть всегда.
Пример 1. По номеру дня недели вывести на экране монитора название этого дня недели.
Возможный вариант решения:
#include <iostream>
using namespace std;
// Для нормальной русификации в консольных приложениях
#include <windows.h>
char * rus(char *s);
int main()
{
int n; // Номер дня недели
cout << "n=";
cin >> n;
switch(n)
{
case 1:
cout << rus("Понедельник") << endl;
break;
case 2:
cout << rus("Вторник") << endl;
break;
case 3:
cout << rus("Среда") << endl;
break;
case 4:
cout << rus("Четверг") << endl;
break;
case 5:
cout << rus("Пятница") << endl;
break;
case 6:
cout << rus("Суббота") << endl;
break;
case 7:
cout << rus("Воскресенье") << endl;
break;
default:
cout << rus("Неверный номер для дня недели: ") << n << endl;
}
return 0;
}
char bufer[64];
char * rus(char *s)
{
CharToOem(s, bufer);
return bufer;
}
Для нормального отображения русских букв здесь применена перекодировка с помощью стандартной функции CharToOem(), вызываемой из нашей функции rus().
Замечание. Все ветви в операторе switch мы завершали оператором break. А что произойдёт, если оператор break отсутствует? Оказывается, будет выполняться и следующая ветвь, и возможно не одна (!!), и так до тех пор, пока не встретится первый оператор break. Из этого следует, что оператор switch, вообще то, соответствует не схеме, изображенной выше (схема 1), а немного другой схеме, а именно:
На практике, безусловно, чаще требуется схема 1, которую создают искусственно с помощью операторов break. Хотя есть ситуации, где необходимо совместить какие-либо ветви.
Пример 2. Написать программу, которая находит простые однозначные числа.
Возможный вариант решения:
#include <iostream>
using namespace std;
#include <windows.h>
char * rus(char *s);
int main()
{
int n;
cout << rus("Задайте натуральное число n=");
cin >> n;
switch(n)
{
case 2:
case 3:
case 5:
case 7:
cout << rus("Простое однозначное число") << endl;
break;
default:
cout << rus("Это что-то другое") << endl;
}
return 0;
}
char bufer[64];
char * rus(char *s)
{
CharToOem(s, bufer);
return bufer;
}