Оператор выбора switch является очень удобной заменой множественного использования . Оператор switch сравнивает значение одной переменной с несколькими константами. Основной формат для использования оператора множественного выбора switch case показан — ниже. Значение переменной указанной в условии switch сравнивается со значениями, которые следуют за ключевым словом case . Когда значение в переменной, соответствует значению в строке с оператором case , компьютер продолжит выполнение программы с этого места.
Switch (/*variable*/) { case const1: /*Тут находится код, который необходимо выполнить, если переменная variable будет равна const1*/ break; case const2: /*этот код выполнится, если variable будет равна const2*/ break; /*...*/ default: /*Код, который выполнится, если ниодно из константых значению не соответствует значение в переменной variable*/ break; }
Когда сравниваемое значение в переменной variable совпадет с первым значением оператора case , программа начнет выполнять код, который находится между текущим оператором case и . Оператор break используется для того, чтобы прерывать ход программы в операторе switch и передавать управление следующему оператору, после switch . Если не использовать оператор break , то, сразу после того, как выполнится один блок кода, программа переключится на выполнения следующего case , даже, если константное значение не будет равно значению в переменной variable . Поэтому, в операторе выбора switch , блоки кода после case всегда должны предваряться оператором break .
Также стоит обратить в нимание на ключевое слово default , оно не является обязательным, но в то же время оно необходимо для обработки неожидынных ситуаций. Например, когда значение переменной не совпадает ни с одним из значений case , в таком случае выполнится код, который находится в ветке default . Это может быть полезно, в случае, если мы не ожидаем, что ниодно из значений case не совпало со значением переменной в условии switch . В таком случае, мы увидем, что сработал код в ветке default .
Чтобы, все ранее сказанное понять и запомнить, давайте перейдем к рассмотрению простой программы с использованием оператора выбора switch . Хотя, возможно этот пример не самый удачный, но в нем наглядно показывается весь функционал оператора switch .
#include
Итак, как же работает этот код? Для начала, мы сделали небольшое меню (строки5 — 10 ), чтобы как-то информировать пользователя, что необходимо водить в программу. Как вы уже поняли, необходимо ввести число — 1, 2, 3 или 4. В зависимости от введенного числа, программа будет срабатывать поразному. В данном примере очень хорошо видно, что вводимое значение сохраняется в переменную input , и после этого, значение в этой переменной передается в оператор switch , строка 13 .В строках 13 — 29 объявлен оператор множественного выбора switch . Какже он работает? Очень просто, по порядку программа сравнивает переменную input со значениями 1, 2, 3 и 4 . Например, если мы ввели число 3, топрограмма выполнит код, который находится в строках 21-22 , при вводе единицы, программа напечатает сообщение из строки 15.Думаю суть вы уловили. Ну, а, если мы ввели другое число, отличное от заданных, выполнится блок кода в строке 27 . Смотрим результат работы программы. Я ввел значение — 3, сегодня буду смотреть — Ходячих!
Что бы сегодня посмотреть? 1. Стрела(Arrow) 2. Сверхъестественное(Supernatural) 3. Ходячие мертвецы(Walking Dead) 4. Выход Ваш выбор: 3 «Fight the dead. Fear the living»
Вы можете поместить данное меню и ввод значени пользователя в цикл, тогда сможете в цикле делать выбор столько раз, сколько сами захотите. Надеюсь, что описал весь процесс достаточно понятно, тема не сложная, но для закрепления материала, поэксперементируйте с этим кодом. Удачи!
Но в С++ еще имеется оператор множественного выбора switch , который мы сейчас детально рассмотрим.
// форма записи оператора множественного выбора switch switch (/*переменная или выражение*/) { case /*константное выражение1/*: { /*группа операторов*/; break; } case /*константное выражение2*/: { /*группа операторов*/; break; } //. . . default: { /*группа операторов*/; } }
На начальном этапе анализируется выражение или переменная. После чего осуществляется переход к той ветви программы, для которой значение переменной или выражения совпадает с указанным константным выражением. Далее выполняется оператор или группа операторов пока не встретится или закрывающая фигурная скобочка. Если значение переменной или выражения не совпадает ни с одним константным выражением, то передается управление ветви программы содержащей зарезервированное слово default . После чего выполняется оператор или группа операторов данной ветви. Сейчас рассмотрим задачу с использованием оператора выбора switch .
Условие задачи: написать программу, которая складывает, вычитает, умножает, делит два числа введенных с клавиатуры. Разработать пользовательский интерфейс.
// switch.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include
В 9-й строке
мы объявили переменную count целочисленного типа. Именно значение данной переменной программа будет сравнивать со значением константного выражения. В строке 10
объявлены две переменные вещественного , для хранения введённых чисел. Почему вещественного, объясню позже. С 17 по 41 строки
записан условный оператор множественного выбора switch . На начальном этапе анализируется переменная count . Анализируется таким образом:
если переменная count равна единице, значит, выполняется блок операторов с 20-й по 23-ю строки
;
если переменная count равна двойке, значит, выполняется блок операторов с 25-й по 28-ю строки
;
если переменная count равна тройке, значит, выполняется блок операторов с 30-й по 33-ю строки
;
если переменная count равна четырем, значит, выполняется блок операторов с 35-й по 38-ю строки
;
Если же значение переменной count не совпадает ни с одним константным выражением, то передается управление ветви программы содержащей зарезервированное слово default . То есть будет выполнена следующая строка
Cout << "Nepravilni vvod" << endl;
Оператор switch может содержать, а может и не содержать зарезервированное слово default . Если значение переменной не совпадет ни с одним константным выражением и не будет default , то программное управление в этом случае просто перешло бы к первому оператору после switch . В строках 19, 24, 29, 34
записаны константные выражения, с которыми программа сравнивает значение переменной count .
В строках 22, 27, 32, 37
, записан . Возникает вопрос: «Зачем он нужен?» Допустим, пользователь ввел 2, то есть переменная count инициализировалась двойкой. Начинает работать условный оператор множественного выбора switch . То есть выполняется поиск двойки в константных выражениях. Сначала проверяется строка 19
, мы видим, что в строке 19
константное выражение равно единице, а нам нужна двойка. Проверяем дальше. А дальше по порядку строка 24
. Мы видим, что в строке 24
константное выражение равно двойке, то, что нужно!!! Переменная count равна константному выражению, выполняется блок операторов с 25 по 28 строки
. И вот в 27-й строке
записан оператор break , который заставляет программу перейти к первому оператору после оператора switch . В данном случае управление передается строке 42
. А нужен этот переход только для того, чтобы не выполнялись заведомо ненужные действия. Если убрать оператор break , то программа будет дальше сравнивать значение переменной с константными выражениями, пока они все не закончатся и потом все равно передаст управление строке 42
. Результат работы программы показан ниже (см. Рисунок 1).
Рисунок 1 — Оператор множественного выбора в С++
Вернемся к строке 10 , там объявляются две переменные типа double . Наверное, возникает вопрос, «Почему вещественного типа, а не целочисленного?». Отвечаю: «Потому, что одно из действий, которые может выполнять программа является деление, а при делении результат имеет вещественный тип данных. Компилятор С++ при делении чисел обращает внимание на их типы данных. Если мы просто делим числа на калькуляторе, например 4/5=0.8 Компилятор С++ нам выдаст результат при таком делении 0. Так как оба числа являются целочисленными, значит, результат тоже будет целочисленный, то есть целая часть от обычного деления, а в нашем случае целая часть при таком делении – это 0, соответственно часть информации теряется, или как еще говорят, отсекается (восемь десятых, в нашем случае, отсекается). А если делимое и делитель поменять местами, на калькуляторе получим: 5/4=1.25; компилятор С++ покажет несколько иной результат, а именно 5/4=1 (0.25 отсекается). Такое явление в С++ называется неявным приведением типа.» Вещественный тип данных используется для более точного представления чисел, чем целочисленный (то есть отображает дробную часть).
В С++ существуют два вещественных :
1) double – вещественный тип данных двойной точности, а значит занимает вдвое больше памяти, чем тип float
2) float – вещественный тип данных одинарной точности
Условные операторы
Условные операторы позволяют управлять потоком выполнения программы, чтобы не выполнялась каждая строка кода, как она следует в программе. Давайте рассмотрим все условные операторы языка C#:
Оператор if
Для организации условного ветвления язык C# унаследовал от С и С++ конструкцию if...else. Ее синтаксис должен быть интуитивно понятен для любого, кто программировал на процедурных языках:
if (условие)
оператор (операторы)
else
оператор (операторы)
Если по каждому из условий нужно выполнить более одного оператора, эти операторы должны быть объединены в блок с помощью фигурных скобок {...}. (Это также касается других конструкций C#, в которых операторы могут быть объединены в блок - таких как циклы for и while .)
Стоит обратить внимание, что в отличие от языков С и С++, в C# условный оператор if может работать только с булевскими выражениями, но не с произвольными значениями вроде -1 и 0.
В операторе if могут применяться сложные выражения, и он может содержать операторы else, обеспечивая выполнение более сложных проверок. Синтаксис похож на применяемый в аналогичных ситуациях в языках С (С++) и Java. При построении сложных выражений в C# используется вполне ожидаемый набор логических операторов . Давайте рассмотрим следующий пример:
Using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string args) { string myStr; Console.WriteLine("Введите строку: "); myStr = Console.ReadLine(); if (myStr.Length = 5) && (myStr.Length
Как видите количество else if, добавляемых к единственному if, не ограничено. Один момент, который следует отметить касательно if: фигурные скобки применять не обязательно, если в условной ветви присутствует только один оператор, как показано в исходном примере.
Оператор switch
Вторым оператором выбора в C# является оператор switch , который обеспечивает многонаправленное ветвление программы. Следовательно, этот оператор позволяет сделать выбор среди нескольких альтернативных вариантов дальнейшего выполнения программы. Несмотря на то что многонаправленная проверка может быть организована с помощью последовательного ряда вложенных операторов if, во многих случаях более эффективным оказывается применение оператора switch. Этот оператор действует следующим образом. Значение выражения последовательно сравнивается с константами выбора из заданного списка. Как только будет обнаружено совпадение с одним из условий выбора, выполняется последовательность операторов, связанных с этим условием. Ниже приведена общая форма оператора switch:
switch(выражение) { case константа1: последовательность операторов break; case константа2: последовательность операторов break; case константаЗ: последовательность операторов break; ... default: последовательность операторов break; }
Хотя оператор switch...case должен быть знаком программистам на С и С++, в C# он немного безопаснее, чем его эквивалент С++. В частности, он запрещает "сквозные" условия почти во всех случаях. Это значит, что если часть case вызывается в начале блока, то фрагменты кода за последующими частями case не могут быть выполнены, если только не используется явно оператор goto для перехода к ним. Компилятор обеспечивает это ограничение за счет того, что требует, чтобы за каждой частью case следовал оператор break , в противном случае он выдает ошибку.
Важно отметить, что заданное выражение в операторе switch должно быть целочисленного типа (char, byte, short или int), перечислимого или же строкового . А выражения других типов, например с плавающей точкой, в операторе switch не допускаются. Зачастую выражение, управляющее оператором switch, просто сводится к одной переменной. Кроме того, константы выбора должны иметь тип, совместимый с типом выражения. В одном операторе switch не допускается наличие двух одинаковых по значению констант выбора.
- 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: