На этом шаге мы рассмотрим синтаксис и применение оператора
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.
#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, то по окончании выполнения списка операторов выбранного варианта произойдет переход на следующий вариант из списка.
#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 требуется выполнить одну и ту же последовательность операторов, то в списке вариантов следует подряд перечислить эти варианты с пустым списком операторов для всех вариантов, кроме последнего.
#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 Расширьте свой кругозор! Бабирусса, дикая малайская свинья Выхухоль, водоплавающий крот Гиббон, длиннорукая обезьяна Даман древесный На первый раз достаточно!
На следующем шаге мы начнем изучение циклических конструкций.