Главная » Статьи » Програмування » C [ Добавить статью ]

RUS Уроки по программированию на языке С (Структура множественного выбора switch.)


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

В сегодняшнем уроке мы с вами познакомились с операторами, позволяющими производить анализ каких-либо данных. Теперь вы можете переходить к выполнению домашнего задания, а так же закрепить теоретические знания пройдя тест. Желаем удачи!!!!


Категория: C | Добавил: DEN-SHP (05.11.2012)
Просмотров: 1084 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]