Пример полной программы в си с switch. Условные операторы

Последнее обновление: 30.07.2016

Условные конструкции - один из базовых компонентов многих языков программирования, которые направляют работу программы по одному из путей в зависимости от определенных условий.

В языке C# используются следующие условные конструкции: if..else и switch..case

Конструкция if/else

Конструкция if/else проверяет истинность некоторого условия и в зависимости от результатов проверки выполняет определенный код:

Int num1 = 8; int num2 = 6; if(num1 > num2) { Console.WriteLine($"Число {num1} больше числа {num2}"); }

После ключевого слова if ставится условие. И если это условие выполняется, то срабатывает код, который помещен далее в блоке if после фигурных скобок. В качестве условий выступают ранее рассмотренные операции сравнения.

В данном случае у нас первое число больше второго, поэтому выражение num1 > num2 истинно и возвращает true , следовательно, управление переходит к строке Console.WriteLine("Число {num1} больше числа {num2}");

Но что, если мы захотим, чтобы при несоблюдении условия также выполнялись какие-либо действия? В этом случае мы можем добавить блок else:

Int num1 = 8; int num2 = 6; if(num1 > num2) { Console.WriteLine($"Число {num1} больше числа {num2}"); } else { Console.WriteLine($"Число {num1} меньше числа {num2}"); }

Int num1 = 8; int num2 = 6; if(num1 > num2) { Console.WriteLine($"Число {num1} больше числа {num2}"); } else if (num1 < num2) { Console.WriteLine($"Число {num1} меньше числа {num2}"); } else { Console.WriteLine("Число num1 равно числу num2"); }

Также мы можем соединить сразу несколько условий, используя логические операторы:

Int num1 = 8; int num2 = 6; if(num1 > num2 && num1==8) { Console.WriteLine($"Число {num1} больше числа {num2}"); }

В данном случае блок if будет выполняться, если num1 > num2 равно true и num1==8 равно true .

Конструкция switch

Конструкция switch/case аналогична конструкции if/else , так как позволяет обработать сразу несколько условий:

Console.WriteLine("Нажмите Y или N"); string selection = Console.ReadLine(); switch (selection) { case "Y": Console.WriteLine("Вы нажали букву Y"); break; case "N": Console.WriteLine("Вы нажали букву N"); break; default: Console.WriteLine("Вы нажали неизвестную букву"); break; }

После ключевого слова switch в скобках идет сравниваемое выражение. Значение этого выражения последовательно сравнивается со значениями, помещенными после оператора сase . И если совпадение будет найдено, то будет выполняться определенный блок сase .

В конце каждого блока сase должен ставиться один из операторов перехода: break , goto case , return или throw . Как правило, используется оператор break . При его применении другие блоки case выполняться не будут.

Однако если мы хотим, чтобы, наоборот, после выполнения текущего блока case выполнялся другой блок case, то мы можем использовать вместо break оператор goto case:

Int number = 1; switch (number) { case 1: Console.WriteLine("case 1"); goto case 5; // переход к case 5 case 3: Console.WriteLine("case 3"); break; case 5: Console.WriteLine("case 5"); break; default: Console.WriteLine("default"); break; }

Если мы хотим также обработать ситуацию, когда совпадения не будет найдено, то можно добавить блок default , как в примере выше.

Применение оператора return позволит выйти не только из блока case, но и из вызывающего метода. То есть, если в методе Main после конструкции switch..case, в которой используется оператор return , идут какие-либо операторы и выражения, то они выполняться не будут, а метод Main завершит работу.

Оператор throw применяется для выброса ошибок и будет рассмотрен в одной из следующим тем.

Тернарная операция

Тернарную операция имеет следующий синтаксис: [первый операнд - условие] ? [второй операнд] : [третий операнд] . Здесь сразу три операнда. В зависимости от условия тернарная операция возвращает второй или третий операнд: если условие равно true , то возвращается второй операнд; если условие равно false , то третий. Например:

Int x=3; int y=2; Console.WriteLine("Нажмите + или -"); string selection = Console.ReadLine(); int z = selection=="+"? (x+y) : (x-y); Console.WriteLine(z);

Здесь результатом тернарной операции является переменная z. Если мы выше вводим "+", то z будет равно второму операнду - (x+y). Иначе z будет равно третьему операнду.

Оператор выбора 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 int main() { printf("Что бы сегодня посмотреть?\n"); printf("1. Стрела(Arrow)\n"); printf("2. Сверхъестественное(Supernatural)\n"); printf("3. Ходячие мертвецы(Walking Dead)\n"); printf("4. Выход\n"); printf("Ваш выбор: "); int input; scanf("%d", &input); switch (input) { case 1: /* обратите внимание на двоеточие, точки сзапятой тут нет */ printf("«His Death Was Just The Beginning»\n"); break; case 2: printf("«Scary Just Got Sexy»\n"); break; case 3: printf("«Fight the dead. Fear the living»\n"); break; case 4: printf("Сегодня смотреть ничего не будем:(\n"); break; default: printf("Неправильный ввод.\n"); } getchar(); return 0; }

Итак, как же работает этот код? Для начала, мы сделали небольшое меню (строки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»

Вы можете поместить данное меню и ввод значени пользователя в цикл, тогда сможете в цикле делать выбор столько раз, сколько сами захотите. Надеюсь, что описал весь процесс достаточно понятно, тема не сложная, но для закрепления материала, поэксперементируйте с этим кодом. Удачи!

Условные операторы

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

Хотя конструкция 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:

  1. switch отличается от if тем, что он может выполнять только операции проверки строгого равенства, в то время как if может вычислять логические выражения и отношения.
  2. Не может быть двух констант в одном операторе switch, имеющих одинаковые значения. Конечно, оператор switch, включающий в себя другой оператор switch, может содержать аналогичные константы.
  3. Если в операторе 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;
...
}