Структура множественного выбора switch.
Мы уже знакомы с конструкцией, анализирующей условия - конструкцией if, а
также с тернарным оператором. Еще один оператор выбора - оператор switch.
Представьте, что необходимо написать программу, в которой используется меню,
состоящее из пяти пунктов. Например, маленькое приложение для малышей, умеющее
складывать, вычитать и т. п. Можно реализовать обработку выбора с помощью
лесенки if else if, вот так:
# include <iostream>
using namespace std;
void main(){
// объявление переменных и ввод значения с клавиатуры
float A,B,RES;
cout<<"Enter first digit:\n";
cin>>A;
cout<<"Enter second digit:\n";
cin>>B;
// реализация программного меню
char key;
cout<<"\nSelect operator:\n";
cout<<"\n + - if you want to see SUM.\n";
cout<<"\n - - if you want to see DIFFERENCE.\n";
cout<<"\n * - if you want to see PRODUCT.\n";
cout<<"\n / - if you want to see QUOTIENT.\n";
//ожидание выбора пользователя
cin>>key;
if(key=='+') { // если пользователь выбрал сложение
RES=A+B;
cout<<"\nAnswer: "<<RES<<"\n";
}
else if(key=='-'){ // если пользователь выбрал вычитание
RES=A-B;
cout<<"\nAnswer: "<<RES<<"\n";
}
else if(key=='*'){ // если пользователь выбрал умножение
RES=A*B;
cout<<"\nAnswer: "<<RES<<"\n";
}
else if(key=='/'){ // если пользователь выбрал деление
if(B){ // если делитель не равен нулю
RES=A-B;
cout<<"\nAnswer: "<<RES<<"\n";
}
else{ // если делитель равен нулю
cout<<"\nError!!! Divide by null!!!!\n";
}
}
else{ // если введенный символ некорректен
cout<<"\nError!!! This operator isn't correct\n";
}
}
|
Вышеописанный пример вполне корректен, но несколько громоздко выглядит.
Данный код можно значительно упростить. именно для этого используется switch. Он
позволяет сравнить значение переменной с целом рядом значений и, встретив
совпадение, выполнить определенное действие.
Общий синтаксис и принцип действия.
Для начала рассмотрим общий синтаксис оператора:
switch(выражение){
case значение1:
действие1;
break;
case значение2:
действие2;
break;
case значение3:
действие3;
break;
......
default:
действие_по_умолчанию;
break;
}
|
Давайте проанализируем данную форму записи:
1. Выражение - те данные, которые необходимо проверить на соответствие. Здесь
может указываться переменная (но только типа char или целочисленная), либо
выражение, результатом которого являются целочисленные данные.
2. case Значение1, case значение2, case значение3 - Целочисленные или
символьные постоянные значения с которыми сверяется выражение.
3. Действие1, действие2, действие3 - Действия, которые должны выполниться,
если значение выражения совпало со значением case.
4. Если произошло совпадение и благополучно выполнилось действие связанное с
совпавшим case, switсh заканчивает свою работу и программа переходит на
следующую строку за закрывающейся фигурной скобкой оператора switch. За данную
функцию отвечает оператор break именно он останавливает выполнение switch.
5. Если в ходе анализа совпадений не произошло срабатывает секция default и
выполняется действие_по_умолчанию. Оператор default является аналогом оператора
else.
Исходя из вышеописанных утверждений схема работы оператора switch выглядит
так:
Теперь давайте посмотрим, каким
образом можно упростить приведенный в начале темы пример.
Оптимизация примера.
# include <iostream>
using namespace std;
void main(){
// объявление переменных и ввод значения с клавиатуры
float A,B,RES;
cout<<"Enter first digit:\n";
cin>>A;
cout<<"Enter second digit:\n";
cin>>B;
// реализация программного меню
char key;
cout<<"\nSelect operator:\n";
cout<<"\n + - if you want to see SUM.\n";
cout<<"\n - - if you want to see DIFFERENCE.\n";
cout<<"\n * - if you want to see PRODUCT.\n";
cout<<"\n / - if you want to see QUOTIENT.\n";
//ожидание выбора пользователя
cin>>key;
//проверяется значение переменной key
switch(key){
case '+': // если пользователь выбрал сложение
RES=A+B;
cout<<"\nAnswer: "<<RES<<"\n";
break; // остановка switch
case '-': // если пользователь выбрал вычитание
RES=A-B;
cout<<"\nAnswer: "<<RES<<"\n";
break; // остановка switch
case '*': // если пользователь выбрал умножение
RES=A*B;
cout<<"\nAnswer: "<<RES<<"\n";
break; // остановка switch
case '/': // если пользователь выбрал деление
if(B){ // если делитель не равен нулю
RES=A-B;
cout<<"\nAnswer: "<<RES<<"\n";
}
else{ // если делитель равен нулю
cout<<"\nError!!! Divide by null!!!!\n";
}
break; // остановка switch
default: // если введенный символ некорректен
cout<<"\nError!!! This operator isn't correct\n";
break; // остановка switch
}
}
|
Как видите, код теперь выглядит гораздо проще и его удобнее читать.
Оператор switch достаточно прост в обращении, однако необходимо знать
некоторые особенности его работы:
1. Если в case используются символьные значения, они должны указываться в
одинарных кавычках, если целочисленные, то без кавычек.
2. Оператор default может располагаться в любом месте системы switch,
выполняться он все равно будет в том случае, если нет ни одного совпадения.
Однако правилом "хорошего тона" является указывать default в конце всей
конструкции.
switch(выражение){
case значение1:
действие1;
break;
case значение2:
действие2;
break;
default:
действие_по_умолчанию;
break;
case значение3:
действие3;
break;
}
|
3. После самого последнего оператора в списке (будь то case или default)
оператор break можно не указывать.
switch(выражение){
case значение1:
действие1;
break;
case значение2:
действие2;
break;
default:
действие_по_умолчанию;
break;
case значение3:
действие3;
}
| |
switch(выражение){
case значение1:
действие1;
break;
case значение2:
действие2;
break;
case значение3:
действие3;
break;
default:
действие_по_умолчанию;
}
| |
4. Оператор default можно вообще не указывать, в случае, если не найдется
совпадений, просто ничего не произойдет.
switch(выражение){
case значение1:
действие1;
break;
case значение2:
действие2;
break;
case значение3:
действие3;
break;
}
|
5. В случае, если необходимо выполнять один и тот же набор действий для
разных значений проверяемого выражения, можно записывать несколько меток подряд.
Рассмотрим пример программы, которая переводит систему буквенных оценок в
цифровые.
# include <iostream>
using namespace std;
void main(){
// объявление переменной, для хранения буквенной оценки
char cRate;
// просьба ввести буквенную оценку
cout<<"Input your char-rate\n";
cin>>cRate;
//анализ введенного значения
switch (cRate) {
case 'A':
case 'a':
// оценка A или a равноценна 5
cout<<"Your rate is 5\n";
break;
case 'B':
case 'b':
// оценка B или b равноценна 4
cout<<"Your rate is 4\n";
break;
case 'C':
case 'c':
// оценка C или c равноценна 3
cout<<"Your rate is 3\n";
break;
case 'D':
case 'd':
// оценка D или d равноценна 2
cout<<"Your rate is 2\n";
break;
default:
// остальные символы некорректны
cout<<"This rate isn't correct\n";
}
}
|
Пример примечателен тем, что с помощью идущих подряд case достигается
регистронезависимость. То есть, неважно, какую именно букву введет пользователь
- заглавную или строчную.
Распространенная ошибка.
Всё самое главное об операторе switch сказано, осталось лишь получить
информацию о том, с какой проблемой может столкнуться программист, используя
данный оператор.
Если случайно пропустить break в любом блоке case, кроме последнего, и
этот блок в последствии отработает, то выполнение switch не остановиться. Тот
блок оператора case, который будет идти вслед за уже выполнившимся, так же
выполниться без проверки.
Пример ошибки.
# include <iostream>
using namespace std;
void main(){
// реализация программного меню
int action;
cout<<"\nSelect action:\n";
cout<<"\n 1 - if you want to see course of dollar.\n";
cout<<"\n 2 - if you want to see course of euro.\n";
cout<<"\n 3 - if you want to see course of rub.\n";
//ожидание выбора пользователя
cin>>action;
//проверяется значение переменной action
switch(action){
case 1: // если пользователь выбрал доллар
cout<<"\nCource: 5.2 gr.\n";
break; // остановка switch
case 2: // если пользователь выбрал евро
cout<<"\nCource: 6.2 gr.\n";
//break; закомментированна остановка switch
case 3: // если пользователь выбрал рубли
cout<<"\nCource: 0.18 gr.\n";
break; // остановка switch
default: // если выбор некорректен
cout<<"\nError!!! This operator isn't correct\n";
break; // остановка switch
}
}
|
Ошибка произойдет в том случае, если будет выбран 2 пункт меню. В case со
значением 2 закомментирован оператор остановки break. На экране результат такой
ошибки выглядит следующим образом:
Select action:
1 - if you want to see course of dollar.
2 - if you want to see course of euro.
3 - if you want to see course of rub.
2
Cource: 6.2 gr.
Cource: 0.18 gr.
Press any key to continue |
Кроме необходимой информации на экране показалось то, что находилось в блоке
case, располагающемся после ошибочной конструкции. Следует избегать таких
опечаток, так как они приводят к ошибкам на этапе выполнения.
В сегодняшнем уроке мы с вами познакомились с операторами, позволяющими
производить анализ каких-либо данных. Теперь вы можете переходить к выполнению
домашнего задания, а так же закрепить теоретические знания пройдя тест. Желаем
удачи!!!!