Предположим, что вы создаете экранное меню, которое предлагает пользователю на выбор один из пяти возможных вариантов, например, “дешевый”, “умеренный”, “дорогой”, “экстравагантный” и “непомерный”. Вы можете расширить последовательность if else if else для обработки этих пяти альтернатив, но оператор C++ switch упрощает обработку выбора из большого списка. Ниже представлена общая форма оператора switch:
switch (целочисленное-выражение)
{
case метка1 : оператор (ы)
case метка2 : оператор (ы)
default : оператор(ы)
}
Оператор switch действует подобно маршрутизатору, который сообщает компьютеру, какую строку кода выполнять следующей.
По достижении оператора switch программа переходит к строке, которая помечена значением, соответствующим текущему значению целочисленное-выражение.
Например, если целочисленное - выражение имеет значение 4, то программа переходит к строке с меткой case 4. Как следует из названия, выражение целочисленное-выражение должно быть целочисленным. Также каждая метка должна быть целым константным выражением. Чаще всего метки бывают константами типа char или int, такими как 1 или ‘q’, либо же перечислителями. Если целочисленное-выражение не соответствует ни одной метке, программа переходит к метке default. Метка default не обязательна. Если она опущена, а соответствия не найдено, программа переходит к оператору, следующему за switch (рис. 6.3).
Оператор switch в C++ отличается от аналогичных операторов в других языках, например, Pascal, в одном очень важном отношении. Каждая метка case в C++ работает только как метка строки, а не граница между выборами.
То есть после того, как программа перейдет на определенную строку в switch, она последовательно выполнит все операторы, следующие за этой строкой внутри switch, если только вы явно не направите ее в другое место. Выполнение не останавливаетсяавтоматически на следующем case. Чтобы прекратить выполнение в конце определенной группы операторов, вы должны использовать оператор break. Это передаст управление за пределы блока switch.
В листинге 6.10 показано, как с помощью switch и break реализовать простое меню. Для отображения возможных вариантов выбора в программе применяется функция showmenu (). Затем оператор switch выбирает действие на основе выбора пользователя.
#include <iostream>
using namespace std;
void showmenu(); // function prototypes
void report();
void comfort();
int main()
{
showmenu();
int choice;
cin >> choice;
while (choice != 5)
{
switch(choice)
{
case 1 : cout << "\a\n";
break;
case 2 : report();
break;
case 3 : cout << "The boss was in all day.\n";
break;
case 4 : comfort();
break;
default : cout << "That's not a choice.\n";
}
showmenu();
cin >> choice;
}
cout << "Bye!\n";
getchar();
getchar();
return 0;
}
void showmenu()
{
cout << "Please enter 1, 2, 3, 4, or 5:\n"
"1) alarm 2) report\n"
"3) alibi 4) comfort\n"
"5) quit\n";
}
void report()
{
cout << "It's been an excellent week for business.\n"
"Sales are up 120%. Expenses are down 35%.\n";
}
void comfort()
{
cout << "Your employees think you are the finest CEO\n"
"in the industry. The board of directors think\n"
"you are the finest CEO in the industry.\n";
}
Цикл while завершается, когда пользователь вводит 5.Ввод от 1до 4активизирует соответствующий выбор из списка switch, а ввод значения б вызывает действие по умолчанию.
Обратите внимание, что для корректной работы программы вводиться должно целочисленное значение. Если, например, ввести букву, оператор ввода даст сбой, а цикл будет выполняться бесконечно вплоть до уничтожения программы. В таком случае лучше использовать символьный ввод.
Как отмечалось ранее, этой программе необходимы операторы break, чтобы ограничить выполнение определенной частью оператора switch. Вы можете удостовериться, что это именно так, удалив операторы break из листинга 6.10 и посмотрев, как программа будет работать без них. Например, вы обнаружите, что ввод 2 заставит программу выполнить операторы, ассоциированные с метками 2, 3, 4 и default. C++ ведет себя подобным образом, потому что такое поведение иногда может быть полезным. Так, за счет этого можно легко использовать множественные метки. Например, предположим, что вы перепишете листинг 6.10, используя в качестве выборов меню и меток case символы вместо целых значений. В таком случае можно использовать символы как верхнего, так и нижнего регистра:
char choice;
cin >> choice;
while (choice != 'Q' && choice != 'q')
{
switch(choice)
{
case 'a'
case 'A' : cout << "\a\n"; break;
case ' r'
case 'R' : report(); break;
case '1'
case 'L' : cout << "The boss was break; in all day.\n"