Примеры с конструкцией switch для c. Условные конструкции
Теги: си switch, c switch, switch break, default, порядок ветвей оператора switch.
Оператор Switch
Р ассмотрим пример из темы "ветвления". Программа выводит название дня недели по порядковому номера
#include
Этот код состоит из семи идущих друг за другом операторов if . Его код можно упростить с помощью оператора switch
#include
Оператор switch принимает в качестве аргумента число, и в зависимости от его значения выполняет те или иные команды.
Switch (<переменная>) { case <значение 1>: <ветвь 1> }
Если значение переменной не соответствует ни одному case
, то выполняется default
ветвь. Она может отсутствовать, тогда вообще ничего не выполняется.
В примере выше каждая ветвь оканчивается оператором break
. Это важно. Когда компьютер видит оператор break
, он выходит из оператора switch
. Если бы он отсутствовал, то программа "провалилась" бы дальше, и стала выполнять следующие ветви.
#include
Введите значение, например 3, и вы увидите, что программа выведет
WednesdayThursdayFridaySaturday
то есть все ветви, после найденной.
Операторы каждой из ветвей могут быть обрамлены фигурными скобками (и так даже лучше).
Тогда каждая из ветвей будет отдельным блоком, в котором можно определять свои переменные.
Пример программы, которая запрашивает у пользователя число, оператор и второе число и выполняет действие.
#include
Если ввести
1 + 2
то будет выведен результат операции 1 + 2 = 3
Хочу обратить внимание, что литеры типа "+" и т.п. воспринимаются в качестве чисел, поэтому их можно использовать в операторе switch.
В этой программе использовалась функция exit из библиотеки stdlib. Функция останавливает работу программы и возвращает результат её работы. Если возвращается истина (ненулевое значение), то это значит, что программа была выполнена с ошибкой.
Ветвь default может располагаться в любом месте, не обязательно в конце. Этот код также будет нормально работать
Switch (day) { case 0: printf("Sunday"); break; case 1: printf("Monday"); break; case 2: printf("Tuesday"); break; case 3: printf("Wednesday"); break; case 4: printf("Thursday"); break; default: printf("Saturday"); break; case 5: printf("Friday"); break; }
default здесь также нуждается в операторе break, как и другие ветви, иначе произойдёт сваливание вниз. Несмотря на то, что так можно писать, это плохой стиль программирования. Ветвь default логически располагается в конце, когда других вариантов больше нет.
Возможные значения аргумента оператора switch могут располагаться в любом порядке, но должны быть константными значеними. Это значит, что следующий код не заработает
#include
Хотя конструкция if-else-if может выполнять многочисленные проверки, она не очень элегантна. Код очень труден для восприятия и в нем может запутаться даже автор через некоторое время. С этой целью С имеет оператор принятия решений switch, выполняющий действия, основываясь на сравнении значения со списком констант символов или целых чисел. При обнаружении совпадения выполняется оператор или операторы, ассоциированные с данным значением. Оператор switch имеет следующий вид:
switch (выражение) {
case константа1:
break;
case константа2:
последовательность операторов
break;
case константа3:
последовательность операторов break;
...
default:
последовательность операторов
}
Оператор default выполняется, если не найдено соответствий, default необязателен и, если его нет, то в случае отсутствия совпадений ничего не происходит. Когда обнаруживается совпадение, операторы, ассоциированные с соответствующим case, выполняются до тех пор, пока не встретится оператор break. В случае default (или последнего case, если отсутствует default), оператор switch заканчивает работу при обнаружении конца.
Следует знать о трех важных моментах оператора switch:
- switch отличается от if тем, что он может выполнять только операции проверки строгого равенства, в то время как if может вычислять логические выражения и отношения.
- Не может быть двух констант в одном операторе switch, имеющих одинаковые значения. Конечно, оператор switch, включающий в себя другой оператор switch, может содержать аналогичные константы.
- Если в операторе switch используются символьные константы, они автоматически преобразуются к целочисленным значениям.
Оператор switch часто используется для обработки команд клавиатуры типа работа с меню. Как показано ниже, функция menu() отображает меню для программы проверки орфографии и вызывает соответствующие процедуры:
Void menu(void)
{
char ch;
Printf("1. Check Spelling\n");
printf("2. Correct Spelling Errors\n");
printf("3. Display Spelling Errors\n");
printf("Strike Any Other Key to Skip\n");
printf (" Enter your choice: ");
Ch = getche(); /* чтение клавиатуры */
Switch(ch) {
case "1":
check_spelling();
break;
case "2":
correct_errors();
break;
case "3";
display_errors();
break;
default:
printf("No option selected");
}
}
С технической точки зрения операторы break являются необязательными в операторе switch. Они используются для окончания работы последовательности операторов, ассоциированных с данной константой. Если оператор break отсутствует, продолжают выполняться операторы следующего раздела, пока не будет достигнут оператор break или конец оператора switch. О константах выбора можно думать как о метках. Выполнение начинается с метки, соответствующей искомому значению, и продолжается, пока не будет достигнут break или конец оператора switch. Например, функция, показанная ниже, использует данную особенность оператора case для упрощения кода обработчика ввода драйвера устройства:
Void inp_handler(void)
{
int ch, flag;
ch = read_device(); /* чтение какого-то устройства */
flag = -1;
switch(ch) {
case 1: /* данные случаи имеют общую последовательность */
case 2: /* операторов */
case 3:
flag = 0;
break;
case 4:
flag = 1;
case 5:
error(flag);
break;
default:
process(ch);
}
}
Данная подпрограмма иллюстрирует две грани оператора switch. Во-первых, можно иметь пустые условия. В данном случае первые три условия приводят к выполнению одних и тех же операторов:
Во-вторых, выполнение переходит к следующему case, если отсутствует break. Если ch соответствует 4, то flag устанавливается в 1, и, поскольку отсутствует оператор break, выполнение продолжается и выполняется оператор error(flag). В данном случае flag имеет значение 1. Если ch равно 5, то вызывается error(flag), а значение flag будет равно - 1. Способность запускать несколько операторов, соответствующих нескольким условиям при отсутствии оператора break, позволяет создавать эффективный код, поскольку это избавляет от необходимости дублировать код.
Важно понять, что операторы, ассоциированные с каждой меткой, являются не блоками кода, а скорее последовательностью операторов. (Сам оператор switch определяет блок.) Понимание этого необходимо в некоторых специфических ситуациях. Например, следующий фрагмент кода содержит ошибку и не будет компилироваться, поскольку невозможно объявить переменную в последовательности операторов:
/* неверно */
Switch(с) {
case 1:
int t;
...
Тем не менее переменная может быть добавлена:
/* верно */
switch(с) {
int t;
case 1:
...
Имеется возможность создания блока кода как одного из операторов в последовательности и объявление в нем переменной, как показано ниже:
/* Это также корректно */
switch (с) {
case 1:
{ /* create a block */
int t;
...
}
- 2. Общая форма описания оператора выбора switch . Ключевые слова switch , case , break , default
1. Назначение оператора выбора switch
Оператор выбора switch позволяет выбрать один вариант хода решения задачи из нескольких в зависимости от значения выражения. Таким образом, обеспечивается многонаправленное разветвление в программе.
Оператор switch может быть заменен . Однако, в некоторых случаях использование оператора switch может быть более эффективным, чем использование .
2. Общая форма описания оператора выбора switch . Ключевые слова switch , case , break , default
Общая форма записи оператора switch следующая
switch (выражение ) { case константа1 : последовательность_операторов1 ; break ; case константа2 : последовательность _операторов2 ; break ; ... case константа N : N ; break ; default последовательность_операторов ; }- выражение – некоторое выражение целочисленного (int ) или символьного типа (char );
- константа1 , константа2 , …, константа N – константные значения, с которыми сравнивается значение выражения. Константные значения должны быть целочисленного или символьного типа;
- последовательность _операторов1 , последовательность _операторов2 , …, последовательность _операторов N – соответствующая последовательность операторов (инструкций), которые связаны с соответствующим условием;
- последовательность_операторов – последовательность операторов, которая выполняется в случае, если не найдено ни одно совпадение значения выражения со значением констант.
Оператор switch работает следующим образом. Сначала вычисляется значение выражение. Потом это значение последовательно сравнивается с константами из заданного списка. Как только найдено совпадение для одного из условий сравнения (ветвь case ), выполняется последовательность инструкций, которые связаны с этим сравнением. Если не найдено ни одного совпадения, то выполняются операторы, которые следуют после ключевого слова default .
Ключевое слово case используется для того, чтобы указать значение константы, при совпадении с которой значения выражения, будет выполняться соответствующая последовательность операторов.
Операция break прерывает (заканчивает) выполнение кода, который определен инструкцией switch .
Операции, которые размещены после ключевого слова default , выполняются в том случае, если ни одна из case-констант не совпадает с результатом вычисления switch -выражения.
Ключевое слово default и соответствующая последовательность операторов могут быть опущены. В этом случае, если не выполняется ни одна из ветвей после слова case , выполнение передается следующему оператору, который следует за оператором switch .
3. Примеры использования оператора выбора switch
Пример 1. Даны значения n = 1..7, что есть номером дня недели. По значению n определить, выходной этот день или рабочий. Результат записать в переменную fDayOff типа bool .
Фрагмент кода, который решает данную задачу.
int day; bool fDayOff; day = 3; switch (day) { case 1: fDayOff = false ; break ; case 2: fDayOff = false ; break ; case 3: fDayOff = false ; break ; case 4: fDayOff = false ; break ; case 5: fDayOff = false ; break ; case 6: fDayOff = true ; break ; case 7: fDayOff = true ; break ; }Другой, более компактный вариант решения данной задачи.
int day; bool fDayOff; day = 7; switch (day) { case 1: case 2: case 3: case 4: case 5: fDayOff = false ; break ; case 6: case 7: fDayOff = true ; break ; }Еще один вариант решения данной задачи
int day; bool fDayOff; day = 7; switch (day) { case 6: case 7: fDayOff = true ; break ; default : fDayOff = false ; }Пример 2. Дано целое число n = 1..3, которое есть номером функции. По значению переменной n вычислить значение соответствующей функции:
1) -2x 2 -4; 2) 5x+2; 3) 15-3x.
Фрагмент кода, который решает данную задачу с помощью сокращенной формы оператора switch .
int n; float f, x; n = 3; x = 3; switch (n) { case 1: f = -2*x*x-4; break ; case 2: f = 5*x+2; break ; case 3: f = 15-3*x; break ; }4. Особенности использования операции break в операторе switch
В операторе switch операция break не является обязательной.
Если операция break присутствует, то происходит выход из оператору switch и выполнение следующего за ним оператора. Если операция break в case -ветви отсутствует, тогда выполняются все операторы, которые связаны с данной case -ветвью, а также все операторы, которые следуют сразу после нее до тех пор, пока не встретится другая инструкция break или не будет достигнут конец switch -оператора.
Сегодня мы научимся пользоваться этой полезной конструкцией языка c++.
Очень часто в процессе написания программы требуется писать длинные if-else конструкции, например, когда мы получаем какой-либо ключ от пользователя; если вы пишете игру, то придется проверять на какую кнопку нажал игрок (вправо, влево, пробел и т.д.).
В этой статье мы узнаем как удобно оформлять подобные конструкции с помощью switch case , а так же узнаем немного о enum типах, которые хорошо подходят для работы со switch case.
Конструкция switch-case — это удобная замена длинной if-else конструкции, которая сравнивает переменную с несколькими константными значениями, например int или char.
Синтаксис
switch (<переменная>) { case значение1: Выполнить если <переменная> == значение1 break; case значение2: Выполнить если <переменная> == значение2 break; ... default: выполнить, если ни один вариант не подошел break; }Переменная в скобках сравнивается со значениями, описанными после ключевого слова case. После двоеточия находится код, который будет выполнен в случае если переменная оказалась равной текущему значению. break необходим для того, чтобы прервать выполнение switch. Рассмотрим пример, где нет break: