Пример за използване на случай на превключване c. Условни изрази

Условни твърдения

Условните изрази ви позволяват да контролирате потокизпълнение на програмата, така че всеки ред код да не се изпълнява както трябва в програмата. Нека да разгледаме всички условни изрази в C#:

оператор if

За да организира условно разклоняване, езикът C# наследи конструкцията if...else от C и C++. Неговият синтаксис трябва да е интуитивен за всеки, който е програмирал на процедурни езици:

ако (условие)
оператор(и)
друго
оператор(и)

Ако трябва да се изпълни повече от един оператор за всяко условие, тези оператори трябва да се комбинират в блок с помощта на фигурни скоби (...). (Това се отнася и за други конструкции на C#, в които операторите могат да бъдат комбинирани в блок, като цикли for и while.)

Струва си да се отбележи, че за разлика от езиците C и C++, в C# условният оператор if може да работи само с булеви изрази, но не и с произволни стойности като -1 и 0.

Операторът if може да използва сложни изрази и може да съдържа else изявления, което позволява извършването на по-сложни проверки. Синтаксисът е подобен на този, използван в подобни ситуации в езиците C (C++) и Java. При конструирането на сложни изрази в C# се използва напълно очакван набор от логически оператори. Нека разгледаме следния пример:

Използване на системата; използване на System.Collections.Generic; използване на System.Linq; използване на 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 ifs, добавени към едно if, не е ограничен. Едно нещо, което трябва да се отбележи за if е, че фигурните скоби не са необходими, ако има само един оператор в условния клон, както е показано в оригиналния пример.

изявление за превключване

Вторият оператор за избор в C# е изявление за превключване, който осигурява многопосочно разклоняване на програмата. Следователно този оператор ви позволява да избирате между няколко алтернативни вариантипо-нататъшно изпълнение на програмата. Въпреки че многопосочното тестване може да се извърши с помощта на серия от вложени оператори if, в много случаи е по-ефективно да се използва оператор switch. Този оператор работи по следния начин. Стойността на израза се сравнява последователно с константите за избор от даден списък. След като бъде намерено съответствие с едно от условията за избор, се изпълнява последователността от изрази, свързани с това условие. По-долу е обща формаизявление за превключване:

switch(expression) ( case constant1: последователност от оператори за прекъсване; case constant2: последователност от оператори за прекъсване; case constant3: последователност от оператори за прекъсване; ... по подразбиране: последователност от оператори за прекъсване; )

Въпреки че операторът switch...case трябва да е познат на C и C++ програмистите, той е малко по-безопасен в C#, отколкото неговия C++ еквивалент. По-специално, той забранява условията на „поглед през“ в почти всички случаи. Това означава, че ако case частта се извика в началото на блока, тогава кодовите фрагменти след следващите case части не могат да бъдат изпълнени, освен ако изрично не се използва оператор goto за прескачане към тях. Компилаторът налага това ограничение, като изисква всяка клауза case да бъде последвана от изявление за прекъсване, В в противен случайизвежда грешка.

Важно е да се отбележи, че даден изразоператорът за превключване трябва да бъде от целочислен тип (char, byte, short или int), изброен или низ. И изрази от други типове, като например с плаваща запетая, не са разрешени в команда за превключване. Често изразът, който управлява команда за превключване, просто се свежда до една променлива. Освен това константите за избор трябва да са от тип, съвместим с типа на израза. В един оператор за превключване не е разрешено наличието на две константи за избор с една и съща стойност.

Тагове: c превключвател, c превключвател, прекъсване на превключване, по подразбиране, ред на разклоненията на командата switch.

Оператор за превключване

Нека разгледаме пример от темата за "разклоняването". Програмата показва името на деня от седмицата по сериен номер

#включи #включи int main() ( unsigned day; printf("Въведете ден "); scanf("%d", &day); if (day > 7) ( day = day % 7; ) if (day == 0) ( printf( "неделя"); else if (ден == 1) (printf("понеделник"); ) else if (ден == 2) ( printf("вторник"); ) else if (ден == 3) ( printf ("сряда"); ) else if (ден == 4) ( printf("четвъртък"); ) else if (ден == 5) ( printf("петък"); ) else if (ден == 6) ( printf("събота");

Този код се състои от седем последователни израза ако. Неговият код може да бъде опростен с помощта на оператора превключвател

#включи #включи int main() ( unsigned day; printf("Въведете ден "); scanf("%d", &day); if (day > 7) ( day = day % 7; ) switch (day) ( case 0: printf( "неделя"); случай 1: printf("четвъртък"); прекъсване; случай 5: printf("петък"); по подразбиране: printf("събота"); ) getch();

Оператор превключвателприема число като аргумент и в зависимост от стойността му изпълнява определени команди.

превключвател (<переменная>) (случай<значение 1>: <ветвь 1> }

Ако стойността на променливата не съвпада с никоя случай, тогава е изпълнено по подразбиранеклон. Може да отсъства, тогава изобщо нищо не се прави.
В примера по-горе всеки клон завършва с израза прекъсвам. Важно е. Когато компютърът се види от оператора прекъсвам, той излиза от израза превключвател. Ако липсваше, програмата щеше да се „провали“ допълнително и да започне да изпълнява следните разклонения.

#включи #включи int main() ( unsigned day; printf("Въведете ден "); scanf("%d", &day); if (day > 7) ( day = day % 7; ) switch (day) ( case 0: printf( случай 1: printf("вторник"); case 4: printf("събота");

Въведете стойност като 3 и ще видите изхода на програмата
сряда четвъртък петък събота
всички клонове след намереното.
Изявленията за всеки клон могат да бъдат рамкирани фигурни скоби(и това е още по-добре). Тогава всеки от клоновете ще бъде отделен блок, в който можете да дефинирате свои собствени променливи. Пример за програма, която пита потребителя за номер, оператор и втори номер и извършва действие.

#включи #включи #включи int main() ( float a, b, c; char op; scanf("%f %c %f", &a, &op, &b); switch (op) ( case "+": ( c = a + b; break; ) case "-": ( c = a - b; break; ) case "/": ( if (b != 0.0) ( c = a / b; ) else ( printf("Грешка: деление на нула" ); );

Ако влезете
1 + 2
тогава ще се покаже резултатът от операцията 1 + 2 = 3
Бих искал да обърна внимание на факта, че букви като „+“ и т.н. се третират като числа, така че могат да се използват в команда за превключване. Тази програма използва функцията за изход от библиотеката stdlib. Функцията спира програмата и връща резултата от нейната работа. Ако се върне true (ненулева стойност), това означава, че програмата е изпълнена с грешка.

Клонът по подразбиране може да се намира навсякъде, не непременно в края. Този код също ще работи добре

Превключване (ден) ( случай 0: printf("неделя"); пауза; случай 1: printf("понеделник"); пауза; случай 2: printf("вторник"); пауза; случай 3: printf("сряда") случай 4: printf("четвъртък");

default тук също се нуждае от команда за прекъсване, както при другите клонове, в противен случай ще падне. Въпреки че може да се напише по този начин, това е лош стил на програмиране. Клонът по подразбиране е логично поставен в края, когато няма други опции.

Възможните стойности на аргументи за израз за превключване могат да бъдат в произволен ред, но трябва да бъдат постоянни стойности. Това означава, че следният код няма да работи

#включи #включи #включи int main() ( //Това, разбира се, е константа, но не може да се използва като //стойност за команда за превключване const int понеделник = 0; неподписан ден; printf("Въведете ден "); scanf("% d", &ден); ако (ден > 7) ( ден = ден % 7; ) превключвател (ден) ( случай понеделник: printf("неделя"); прекъсване; случай 1: printf("понеделник"); прекъсване; случай 2: printf("вторник"); printf("четвъртък");

switch (израз) ( [декларация]: [case константен-израз1]: [списък-инструкции1] [case константен-израз2]: [списък-инструкции2]:: [по подразбиране: [списък-инструкции]])

Израз след ключова дума превключвател V скоби, може да бъде всеки израз, разрешен в езика SI, чиято стойност трябва да е цяло число. Имайте предвид, че можете да използвате изричен актьорски съставза целия тип обаче е необходимо да се запомнят ограниченията и препоръките, споменати по-горе.

Значението на този израз е ключово за избора от няколко опции. Тялото на оператора smitch се състои от няколко оператора, маркирани с ключовата дума case, последвана от постоянен израз. Трябва да се отбележи, че използването на цял константен израз е съществен недостатък, присъщ на разглеждания оператор.

Тъй като константен израз се оценява по време на превод, той не може да съдържа променливи или извиквания на функции. Обикновено като константен израз се използват целочислени или символни константи.

Всички константни изрази в оператора превключвателтрябва да е уникално. В допълнение към твърденията, маркирани с ключовата дума case, може да има, но винаги един, фрагмент, маркиран с ключовата дума по подразбиране.

Списъкът с оператори може да е празен или да съдържа един или повече оператори. И в оператора превключвателНяма нужда да ограждате поредица от изрази във фигурни скоби.

Имайте предвид също, че в оператора превключвателМожете да използвате свои собствени локални променливи, чиито декларации се появяват преди първата ключова дума case, но декларациите не трябва да използват инициализация.

Схема за изпълнение на изявление превключвателследващия:

  • изразът в скоби се оценява;
  • изчислените стойности се сравняват последователно с постоянни изрази, следващи ключовите думи за case;
  • ако един от постоянните изрази съвпада със стойността на израза, тогава контролът се прехвърля към израза, маркиран със съответната ключова дума case;

— ако никой от постоянните изрази не е равен на израза, тогава контролът се прехвърля към оператора, маркиран с ключовата дума по подразбиране, а при липсата му контролът се предава на следващия след него превключвателоператор.

Забележка интересна функцияизползване на оператора switch: конструкция с дума по подразбиранеможе да не е последният в тялото на оператора превключвател. Ключови думи случайИ по подразбиранев тялото на оператора превключвателса значими само когато първоначална проверка, когато се определя началната точка на изпълнение на органа на оператора превключвател. Всички оператори, между начален оператори края на тялото, се изпълняват независимо от ключовите думи, освен ако някой от операторите не прехвърли контрола от тялото на оператора превключвател. Следователно програмистът трябва да се погрижи за излизането случай, ако е необходимо. Най-често използваният оператор за това е прекъсвам.

За да изпълните същите стъпки за различни значенияизрази, можете да маркирате едно и също твърдение с множество ключови думи случай.

Пример:

1 2 3 4 5 6 7 8 9 int i= 2; превключвател (i) (случай 1: i += 2; случай 2: i *= 3; случай 0: i /= 2; случай 4: i -= 5; по подразбиране: ;)

int i=2; превключвател (i) (случай 1: i += 2; случай 2: i *= 3; случай 0: i /= 2; случай 4: i -= 5; по подразбиране: ; )

Изпълнение на изявление превключвателзапочва с отбелязаното твърдение случай 2. Така че променливата азполучава стойност, равна на 6, тогава операторът, маркиран с ключовата дума, се изпълнява случай 0и след това случай 4, променливата i ще приеме стойността 3 и след това стойността -2. Изявление, маркирано с ключовата дума по подразбиране, не променя стойността на променливата.

Помислете за по-ранния пример, който илюстрира използването на вложени изрази if, сега пренаписани с помощта на оператора превключвател.

1 2 3 4 5 6 7 8 9 10 овъглено ZNAC; int x, y, z; превключвател (ZNAC) ( случай "+" : x = y + z; прекъсване ; случай "-" : x = y - z; прекъсване ; случай "*" : x = y * z; прекъсване ; случай "/" : x = u / z; по подразбиране:;

овъглено ZNAC; int x,y,z; превключвател (ZNAC) ( case "+": x = y + z; break; case "-": x = y - z; break; case "*": x = y * z; break; case "/": x = u / z; по подразбиране: ;

С помощта на оператора прекъсвамдопуска в необходим моментпрекъсване на последователността от изпълнение на оператори в тялото на оператор switch чрез прехвърляне на управлението на оператора, който следва превключвател.

Обърнете внимание, че вложените изрази могат да се използват в тялото на оператор switch превключвател, докато същите постоянни изрази могат да се използват в ключовите думи за регистър. случай 2: f-= 9; прекъсване ; ) случай 3 : b-= c; прекъсване ; :)

: превключвател (a) ( случай 1: b=c; прекъсване; случай 2: превключвател (d) ( случай 0: f=s; прекъсване; случай 1: f=9; прекъсване; случай 2: f-=9; прекъсване ; ) случай 3: b-=c;

1.4.6. изявление за прекъсване
Операторът break гарантира, че изпълнението на най-вътрешния израз, който се присъединява към него, е прекратено. превключвам, правя, за, докато. След изпълнението на оператора break, управлението се прехвърля към оператора, следващ прекъснатия.

Операторът switch е много удобен заместител за многократна употреба. Командата switch сравнява стойността на една променлива с няколко константи. Основният формат за използване на оператора с множество избори за превключване на случай е показан по-долу. Стойността на променливата, посочена в условието за превключване, се сравнява със стойностите, които следват ключовата дума case. Когато стойността в променливата съответства на стойността в реда с оператора case, компютърът ще продължи да изпълнява програмата от тази точка.

Switch (/*променлива*/) ( case const1: /*Тук е кодът, който трябва да бъде изпълнен, ако променливата е равна на const1*/ break; case const2: /*този код ще бъде изпълнен, ако променливата е равна на const2* / break; /*...*/ по подразбиране: /*Код, който ще бъде изпълнен, ако никоя от константните стойности не съвпада със стойността в променливата*/ break )

Когато стойността, която се сравнява в променлива, съвпадне с първата стойност на оператора case, програмата ще започне да изпълнява кода, който е между текущ операторслучай и . Операторът break се използва за прекъсване на програмния поток в оператор switch и прехвърляне на контрола към следващия оператор след switch. Ако не използвате оператора break, веднага след изпълнението на един блок код, програмата ще премине към изпълнение на следващия случай, дори ако константната стойност не е равна на стойността в променливата променлива. Следователно, в команда за превключване, блоковете от код след case трябва винаги да бъдат предшествани от команда за прекъсване.

Също така си струва да се обърне внимание ключова думапо подразбиране, не е задължително, но в същото време е необходимо за справяне с неочаквани ситуации. Например, когато стойността на променлива не съвпада с никоя от стойностите на case, тогава ще бъде изпълнен кодът, който е в клона по подразбиране. Това може да бъде полезно в случай, че не очакваме някоя от стойностите на case да съответства на стойността на променливата в клаузата switch. В този случай ще видим, че кодът в клона по подразбиране работи.

За да разберете и запомните всичко казано по-рано, нека преминем към разглеждане на проста програма, използваща командата за избор на switch. Въпреки че този пример може да не е най-успешният, той ясно показва цялата функционалност на оператора switch.

#включи int main() ( printf("Какво да гледам днес?\n"); printf("1. Стрелка\n"); printf("2. Свръхестествено\n"); printf("3 . Живи мъртви\n "); printf("4. Изход\n"); printf("Вашият избор: "); int input; scanf("%d", &input); switch (input) ( случай 1: /* обърнете внимание на двоеточието, няма точка и запетая */ printf("Смъртта му беше само началото"\n"); break f("Scary Got Sexy"\n") ; Бийте се с мъртвите"\n"; case 4: printf("Няма да гледаме нищо днес:(\n"); default: printf("Invalid input.\n"); ) getchar(); върне 0;

И така, как работи този код? Като начало направихме малко меню ( редове 5 - 10), за да информира по някакъв начин потребителя какво трябва да бъде въведено в програмата. Както вече разбрахте, трябва да въведете число - 1, 2, 3 или 4. В зависимост от въведеното число, програмата ще работи по различен начин. IN в този примерМного ясно е, че входната стойност се съхранява във входната променлива и след това стойността в тази променлива се предава на командата switch, ред 13.IN редове 13 - 29деклариран е превключвател на оператор с множествен избор. Как работи? Много просто, по ред, програмата сравнява входната променлива със стойностите 1, 2, 3 и 4. Например, ако въведем числото 3, тогава програмата ще изпълни кода, който се намира в редове 21-22, когато въведем едно, програмата ще отпечата съобщението от ред 15. Мисля, че схващате идеята. Е, ако сме въвели друго число, различно от дадените, кодовият блок влиза ред 27. Нека да разгледаме резултата от програмата. Въведох стойност - 3, днес ще гледам - ​​Ходене!

Какво да гледам днес? 1. Стрелка 2. Свръхестествено 3. Живи мъртви 4. Изход Вашият избор: 3 „Борба с мъртвите. Страх от живите"

Можете да поставите това менюи въведете потребителската стойност в цикъла, след което можете да правите селекции в цикъла толкова пъти, колкото искате. Надявам се, че описах целия процес достатъчно ясно, темата не е сложна, но за да консолидираме материала, експериментирайте с този код. Късмет!

Въпреки че конструкцията if-else-if може да изпълнява множество тестове, тя не е много елегантна. Кодът е много труден за разбиране и дори авторът може да се обърка в него след известно време. За тази цел C има оператор за решение за превключване, който изпълнява действия въз основа на сравняване на стойност със списък от символни или цели константи. Когато се намери съвпадение, операторът или операторите, свързани с тази стойност, се изпълняват. Изявлението за превключване изглежда така:

превключвател (израз) (
случай константа1:

прекъсване;
случай константа2:
последователност от твърдения
прекъсване;
случайна константа3:
последователност от оператори за прекъсване;
...
по подразбиране:
последователност от твърдения
}

Инструкцията по подразбиране се изпълнява, ако не бъдат намерени съвпадения, по подразбиране не е задължително и ако не присъства, тогава нищо не се случва, ако няма съвпадения. Когато се намери съвпадение, операторите, свързани със съвпадащия регистър, се изпълняват, докато не се срещне оператор за прекъсване. В случая по подразбиране (или последния случай, ако няма такъв по подразбиране), командата switch се прекратява, когато се срещне краят.

Трябва да знаете три неща важни точкиизявление за превключване:

  1. switch се различава от if по това, че може да извършва само стриктни операции за тестване на равенство, докато if може да оценява логически изразии взаимоотношения.
  2. Не може да има две константи в един оператор switch, които имат същите стойности. Разбира се, оператор switch, който включва друг оператор switch, може да съдържа подобни константи.
  3. Ако символни константи се използват в команда за превключване, те автоматично се преобразуват в цели числа.

Операторът switch често се използва за обработка на команди от клавиатурата, като манипулиране на менюто. Както е показано по-долу, функцията menu() показва менюто за проверка на правописа и извиква съответните процедури:

Празно меню (празно)
{
char ch;

Printf("1. Проверка на правописа\n");
printf("2. Правилни правописни грешки\n");
printf("3. Показване на правописни грешки\n");
printf("Натисни всеки друг клавиш за пропускане\n");
printf("Въведете своя избор: ");

Ch = getche(); /* четене на клавиатурата */

Превключвател (ch) (
случай "1":
проверка на правописа();
прекъсване;
случай "2":
правилни_грешки();
прекъсване;
случай "3";
показване на грешки ();
прекъсване;
по подразбиране:
printf("Няма избрана опция");
}
}

От техническа гледна точка операторите за прекъсване не са задължителни в оператора за превключване. Те се използват за прекратяване на поредица от изрази, свързани с дадена константа. Ако няма оператор за прекъсване, операторите в следващия раздел продължават да се изпълняват, докато се достигне операторът за прекъсване или краят на оператора за превключване. Можете да мислите за константите за избор като етикети. Изпълнението започва от етикета, съответстващ на търсената стойност, и продължава до достигане на прекъсване или края на командата switch. Например функцията, показана по-долу, използва тази функция case оператор за опростяване на кода на манипулатора за въвеждане на драйвер на устройство:

Void inp_handler(void)
{
int ch, флаг;
ch = read_device(); /* четене на някакво устройство */
флаг = -1;
превключвател (ch) (
case 1: /* тези случаи имат обща последователност */
случай 2: /* изрази */
случай 3:
флаг = 0;
прекъсване;
случай 4:
флаг = 1;
случай 5:
грешка (флаг);
прекъсване;
по подразбиране:
процес (ch);
}
}

Тази подпрограма илюстрира двата аспекта на командата switch. Първо, можете да имате празни условия. IN в такъв случайпървите три условия водят до изпълнението на същите оператори:

Второ, изпълнението преминава към следващия случай, ако няма прекъсване. Ако ch съвпада с 4, тогава флагът е зададен на 1 и тъй като няма оператор за прекъсване, изпълнението продължава и операторът за грешка (флаг) се изпълнява. В този случай flag има стойност 1. Ако ch е 5, тогава се извиква error(flag) и стойността на flag ще бъде - 1. Способността да се изпълняват множество изрази, които отговарят на множество условия при липса на оператор break ви позволява да пишете ефективен код, защото елиминира необходимостта от дублиране на код.

Важно е да се разбере, че изразите, свързани с всеки етикет, не са блокове от код, а по-скоро последователност от изрази. (Самият оператор switch дефинира блок.) Разбирането на това е необходимо в някои специфични ситуации. Например, следният кодов фрагмент съдържа грешка и няма да се компилира, защото не е възможно да се декларира променлива в поредица от изрази:

/* неправилно */

Превключвател(c) (
случай 1:
int;
...

Променливата обаче може да се добави:

/* надясно */
превключвател(c) (
int;
случай 1:
...

Възможно е да се създаде блок от код като един от изразите в последователност и да се декларира променлива в него, както е показано по-долу:

/* Това също е правилно */
превключвател (с) (
случай 1:
( /* създаване на блок */
int;
...
}