Как использовать оператор switch в javascript

Проблема с операторами в switch

Прежде, чем мы перейдем к обзору нововведений в switch, давайте быстро оценим одну ситуацию. Допустим, мы столкнулись с «ужасным» тернарным булеаном и хотим преобразовать его в обычный булеан. Вот один из способов сделать это:

Согласитесь, что это очень неудобно. Как и многие другие варианты switch, встречающиеся в «природе», представленный выше пример просто вычисляет значение переменной и присваивает его, но реализация обходная (объявляем идентификатор и используем его позже), повторяющаяся (мои ‘и всегда результат copy-pasta) и подвержена ошибкам (забыл еще одну ветку? Ой!). Тут явно есть, что улучшить.

Давайте попробуем решить эти проблемы, поместив switch в отдельный метод:

Так намного лучше: отсутствует фиктивная переменная, нет ‘ов, загромождающих код и сообщений компилятора об отсутствии (даже если в этом нет необходимости, как в данном случае).

Но, если подумать, то мы не обязаны создавать методы только для того, чтобы обойти неуклюжую особенность языка. И это даже без учёта, что такой рефакторинг не всегда возможен. Нет, нам нужно решение получше!

If(выражение1) if(выражение2) if(выражение3) …

Ветви
else
и if,
позволяющие организовать выбор из
многих возможностей, могут отсутствовать.
Может быть опущена и заключительная
else-ветвь.
В этом случае краткая форма оператора
if
задает альтернативный выбор — делать
или не делать — выполнять или не выполнять
then-оператор.

Семантика
оператора
if
проста и понятна. Выражения if
проверяются в порядке их написания. Как
только получено значение true,
проверка прекращается и выполняется
оператор (это может быть блок),
который следует за выражением, получившим
значение true.
С завершением этого оператора завершается
и оператор
if.
Ветвь else,
если она есть, относится к ближайшему
открытому if.

Nested Switch in C

In C, we can have an inner switch embedded in an outer switch. Also, the case constants of the inner and outer switch may have common values and without any conflicts.

We considere the following program which the user to type his own ID, if the ID is valid it will ask him to enter his password, if the password is correct the program will print the name of the user, otherwise ,the program will print Incorrect Password and if the ID does not exist , the program will print Incorrect ID

#include <stdio.h>
int main() {
        int ID = 500;
        int password = 000;
        printf("Plese Enter Your ID:\n ");
        scanf("%d", & ID);
        switch (ID) {
            case 500:
                printf("Enter your password:\n ");
                scanf("%d", & password);
                switch (password) {
                    case 000:
                        printf("Welcome Dear Programmer\n");
                        break;
                    default:
                        printf("incorrect password");
                        break;
                }
                break;
            default:
                printf("incorrect ID");
                break;
        }
}

OUTPUT:

Plese Enter Your ID:
 500
Enter your password:
 000
Welcome Dear Programmer

  1. In the given program we have explained initialized two variables: ID and password
  2. An outer switch construct is used to compare the value entered in variable ID. It execute the block of statements associated with the matched case(when ID==500).
  3. If the block statement is executed with the matched case, an inner switch is used to compare the values entered in the variable password and execute the statements linked with the matched case(when password==000).
  4. Otherwise, the switch case will trigger the default case and print the appropriate text regarding the program outline.

JS Учебник

JS СтартJS ВведениеJS УстановкаJS ВыводJS ОбъявленияJS СинтаксисJS КомментарииJS ПеременныеJS ОператорыJS АрифметическиеJS ПрисваиваниеJS Типы данныхJS ФункцииJS ОбъектыJS СобытияJS СтрокиJS Методы строкиJS ЧислаJS Методы числаJS МассивыJS Методы массиваJS Сортировка массиваJS Итерация массиваJS ДатыJS Форматы датJS Методы получения датJS Методы установки датJS МатематическиеJS РандомныеJS БулевыJS СравненияJS УсловияJS SwitchJS Цикл ForJS Цикл WhileJS ПрерываниеJS Преобразование типовJS ПобитовыеJS Регулярные выраженияJS ОшибкиJS Область действияJS ПодъёмJS Строгий режимJS Ключевое слово thisJS Ключевое слово LetJS Ключевое слово ConstJS Функции стрелокJS КлассыJS ОтладкаJS Гид по стилюJS Лучшие практикиJS ОшибкиJS ПроизводительностьJS Зарезервированные словаJS ВерсииJS Версия ES5JS Версия ES6JS JSON

Операторы break

Если забыть поставить операторы break в предыдущем примере, то результат будет странным – Invalid day?.

Давайте проверим. Изменим предыдущий пример, добавив вывод в консоль и сделав String day = “MON”:

public String forgetBreak() {
	String day = "MON";

	String result;

	switch (day) {
	case "MON":
	case "TUE":
	case "WED":
	case "THU":
		System.out.println("Time to work");
		result = "Time to work";
	case "FRI":
		System.out.println("Nearing weekend");
		result = "Nearing weekend";

	case "SAT":
	case "SUN":
		System.out.println("Weekend!");
		result = "Weekend!";
	default:
		System.out.println("Invalid day?");
		result = "Invalid day?";
	}
	return result;
}

Если бы во всех блоках стояли операторы break, то результат был бы равен Time to work, и это было бы правильно.

 Но без оператора break мы заходим во все нижележащие case и default (пока не встретится break), в итоге мы выполняем все блоки, и результат будет равен “Invalid day?” Посмотрите на вывод в консоль, по выводу видно, что мы проходим все блоки:

Time to work
Nearing weekend
Weekend!
Invalid day?

Оператор switch

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

Давайте быстро посмотрим, как выглядит типичный оператор switch:

switch (expression) {
    case x: {
        /* Your code here */
        break;
    }
    case y: {
        /* Your code here */
        break;
    }
    default: {
        /* Your code here */
    }
}

Отлично, теперь есть пара вещей, на которые вы, возможно, не обратили внимание:

Ключевое слово break необязательно.

Ключевое слово break позволяет нам остановить выполнение блоков, когда условие уже выполнено. Если не добавлять ключевое слово break в оператор switch, не будет ни какой ошибки. Но если ключевое слово break пропущено случайно, это может означать, что выполнится код, о котором вы даже не подозреваете, что также добавит несоответствия нашим реализациям, мутациям, утечкам памяти и уровням сложности при отладке проблемы. Давайте посмотрим на представление этой проблемы:

switch ('first') {
    case 'first': {
        console.log('first case');
    }
    case 'second': {
        console.log('second case');
    }
    case 'third': {
        console.log('third case');
        break;
    }
    default: {
        console.log('infinite');
    }
}

Если выполнить этот фрагмент кода в своей консоли, вы увидите, что типа такого:

firt case
second case
third case

Оператор switch выполнит блок во втором и третьем условие, даже если первое условие уже было правильным, затем он находит ключевое слово break в третьем условие и остановит выполнение, без предупреждений или ошибок в консоли.

Фигурные скобки в каждом условие НЕ являются обязательными.

Фигурные скобки представляют блоки кода в javascript, так как начиная с ECMAscript 2015 мы можем объявлять переменные с блочной областью с использованием операторов, таких как const или let, что отлично (но не так хорошо для switch), так как фигурные скобки не обязательны, мы можем получить ошибки, из-за дублирования переменных, давайте посмотрим, что произойдет, когда мы выполним код ниже:

switch ('second') {
    case 'first':
        let position = 'first';
        console.log(position);
        break;
    case 'second':
        let position = 'second';
        console.log(position);
        break;
    default:
        console.log('infinite');
}

мы получим:

Uncaught SyntaxError: Identifier 'position' has already been declared

Возникает ошибка, потому что переменная position уже была объявлена в первом условие, и поскольку там нет фигурных скобок, она поднимается, а затем, когда во втором условие пытаемся объявить ее же, то получается что она уже существует и BOOM.

А теперь представьте, что может произойти при использовании операторов switch без ключевого слова break и фигурными скобками:

switch ('first') {
    case 'first':
        let position = 'first';
        console.log(position);
    case 'second':
        console.log(`second has access to ${position}`);
        position = 'second';
        console.log(position);
    default:
        console.log('infinite');
}

В консоли будет следующее:

first
second has access to first
second
infinite

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

Требования к значениям в case

Значения в case тоже не могут быть равны null, иначе код не скомпилируется.

Кроме того, в case должны быть именно значения (либо переменные final). Например, такой код скомпилируется только в том случае, если перед переменной m стоит final:

public String caseNotFinal() {
	String day = new String("MON");

	final String m= "MON";
	String result;

	switch (day) {
	case m:
	case "TUE":
	case "WED":
	case "THU":
		result = "Time to work";
		break;
	case "FRI":
		result = "Nearing weekend";
		break;
	case "SAT":
	case "SUN":
		result = "Weekend!";
		break;
	default:
		result = "Invalid day?";
		break;
	}
	return result;
}

Еще все значения должны быть одного типа, то есть нельзя в аргумент switch передавать, например, переменную типа int, а в case – значение типа double.

Оператор if

Для организации условного ветвления язык C# унаследовал от С и С++ конструкцию
if…else. Ее синтаксис должен быть интуитивно понятен для любого, кто программировал на процедурных языках:

if (условие)
  оператор (операторы)
else
  оператор (операторы)

Если по каждому из условий нужно выполнить более одного оператора, эти операторы
должны быть объединены в блок с помощью фигурных скобок {…}. (Это также касается других конструкций C#, в которых операторы могут быть объединены в блок — таких
как циклы for и while.)

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

Синтаксис похож
на применяемый в аналогичных ситуациях в языках С (С++) и Java. При построении
сложных выражений в C# используется вполне ожидаемый набор логических операторов. Давайте рассмотрим следующий пример:

В операторе if могут применяться сложные выражения, и он может содержать операторы else, обеспечивая выполнение более сложных проверок. Синтаксис похож
на применяемый в аналогичных ситуациях в языках С (С++) и Java. При построении
сложных выражений в C# используется вполне ожидаемый набор логических операторов. Давайте рассмотрим следующий пример:

Как видите количество else if, добавляемых к единственному if, не ограничено. Один момент, который следует отметить касательно if: фигурные скобки применять
не обязательно, если в условной ветви присутствует только один оператор, как показано в исходном примере.

Пример использования switch

Давайте сделаем программу с использованием switch. Смысл программы будет заключаеться в нахождении суммы, разности, умножения, деления двух чисел, которые, как и операции будет выбирать пользователь.

  • 5 — сумма
  • 8 — разность
  • 9 — умножение
  • 7 — деление

int str;

int first, second;

cout << «Введите первое число: «; cin >> first;
cout << «Введите второе число: «; cin >> second;

cout << «Укажите какую операцию использовать: «cin >> str;

switch (str) {
case 5:
cout << «Сумма: » << first + second;
break;
case 8:
cout << «Вычитание: » << first — second;
break;
case 9:
cout << «Умножение: » << first * second;
break;
case 7:
cout << «Деление: » << first / second;
break;
default:
cout << «Что-то пошло не так. Повторите попытку»;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

intstr;

intfirst,second;

cout<<«Введите первое число: «;cin>>first;

cout<<«Введите второе число: «;cin>>second;

cout<<«Укажите какую операцию использовать: «cin>>str;

switch(str){

case5

cout<<«Сумма: «<<first+second;

break;

case8

cout<<«Вычитание: «<<first-second;

break;

case9

cout<<«Умножение: «<<first*second;

break;

case7

cout<<«Деление: «<<firstsecond;

break;

default

cout<<«Что-то пошло не так. Повторите попытку»;

}

  • В строках 10, 13, 16, 19: применяется проверка значений .
  • В строке 22: если пользователь ошибся с числом, то программа его оповестит с помощью оператора .

Вот пример успешного выполнения программы:

switch.cpp

Введите первое число: 5
Введите первое число: 7
Укажите какую операцию использовать: 9
Умножение: 35
Process returned 0 (0x0) execution time : 0.010 s
Press any key to continue.

Вот и все! Надеемся этот урок был для вас полезен. Удачи!

18 сентября 2017

C++, Синтаксис

Необязательный оператор при работе со switch в Go

Необязательный оператор инициализатор может предшествовать выражению . Инициализатор и выражение разделяются точкой с запятой.

number.go

Go

package main

import (
«fmt»
)

func main() {

switch num := 6; num % 2 == 0 {

case true:
fmt.Println(«even value»)

case false:
fmt.Println(«odd value»)
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

packagemain

import(

«fmt»

)
 

funcmain(){

switchnum=6;num%2=={

casetrue

fmt.Println(«even value»)

casefalse

fmt.Println(«odd value»)

}

}

В данном примере есть инициализатор и выражение. Оператор определяет, если значение четное или нечетное.

Go

switch num := 6; num % 2 == 0 {

1 switchnum=6;num%2=={

является switch инициализатором, а switch выражением.

Что из себя представляет оператор switch?

Оператор switch проверяет значение и сравнивает его с несколькими возможными шаблонами.

Рассмотрим следующее перечисление:

enum Compass {
    case north
    case east
    case south
    case west
}

Если вы хотите найти нужное направление, вы можете использовать следующий код:

let heading = Compass.south
 
if heading == .north {
    print("Вы направляетесь на север!")
} else if heading == .east {
    print("Вы направляетесь на восток!")
} else if heading == .south {
    print("Вы направляетесь на юг!")
} else if heading == .west {
    print("Вы направляетесь на запад!")
}

Приведенный выше код использует оператор if для оценки значения heading и вывода соответствующей строки текста.

Мы можем сделать то же самое, используя оператор switch:

switch heading {
case .north
    print("Вы направляетесь на север!")
case .east
    print("Вы направляетесь на восток!")
case .south
    print("Вы направляетесь на юг!")
case .west
    print("Вы направляетесь на запад!")
}

Сначала мы используем ключевое слово switch, а затем проверяемое выражение, в данном случае это константа heading. Это значение, которое рассматривается блоками switch. Затем мы перебираем возможные варианты значений с помощью case. В приведенном выше примере мы рассматриваем все возможные значения перечисления Compass.

Особенностью switch является то, что каждый switch блок должен быть исчерпывающим. Посмотрите, что происходит, когда мы забываем включить вариант с .east:

switch heading {
case .north
    print("Вы направляетесь на север!")
case .south
    print("Вы направляетесь на юг!")
case .west
    print("Вы направляетесь на запад!")
}
 
// error: switch must be exhaustive

Оператор Switch

Рассмотрим пример из темы «ветвления». Программа выводит название дня недели по порядковому номера

#include<conio.h>
#include<stdio.h>

int main() {
	unsigned day;

	printf("Enter day ");
	scanf("%d", &day);

	if (day > 7) {
		day = day % 7;
	}

	if (day == 0) {
		printf("Sunday");
	} else if (day == 1) {
		printf("Monday");
	} else if (day == 2) {
		printf("Tuesday");
	} else if (day == 3) {
		printf("Wednesday");
	} else if (day == 4) {
		printf("Thursday");
	} else if (day == 5) {
		printf("Friday");
	} else if (day == 6) {
		printf("Saturday");
	} 

	getch();
}

Этот код состоит из семи идущих друг за другом операторов if. Его код можно упростить с помощью оператора switch

#include<conio.h>
#include<stdio.h>

int main() {
	unsigned day;

	printf("Enter day ");
	scanf("%d", &day);

	if (day > 7) {
		day = day % 7;
	}

	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;
	case 5:
		printf("Friday");
		break;
	default:
		printf("Saturday");
	}

	getch();
}

Оператор switch принимает в качестве аргумента число, и в зависимости от его значения выполняет те или иные команды.

switch (<переменная>) {
	case <значение 1>:
		<ветвь 1>
	
	
}

Если значение переменной не соответствует ни одному case, то выполняется default ветвь. Она может отсутствовать, тогда вообще ничего не выполняется.

В примере выше каждая ветвь оканчивается оператором break

Это важно. Когда компьютер видит оператор break, он выходит из оператора switch

Если бы он отсутствовал, то программа «провалилась» бы дальше, и стала выполнять следующие ветви.

#include<conio.h>
#include<stdio.h>

int main() {
	unsigned day;

	printf("Enter day ");
	scanf("%d", &day);

	if (day > 7) {
		day = day % 7;
	}

	switch (day) {
	case 0:
		printf("Sunday");
	case 1:
		printf("Monday");
	case 2:
		printf("Tuesday");
	case 3:
		printf("Wednesday");
	case 4:
		printf("Thursday");
	case 5:
		printf("Friday");
	default:
		printf("Saturday");
	}

	getch();
}

Введите значение, например 3, и вы увидите, что программа выведет

WednesdayThursdayFridaySaturday

то есть все ветви, после найденной.

Операторы каждой из ветвей могут быть обрамлены фигурными скобками (и так даже лучше).
Тогда каждая из ветвей будет отдельным блоком, в котором можно определять свои переменные.
Пример программы, которая запрашивает у пользователя число, оператор и второе число и выполняет действие.

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

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("Error: divide by zero");
				getch();
				exit(1);
			}
			break;
		}
		case '*': {
			c = a * b;
			break;
		}
		default:
			printf("No operation defined");
			getch();
			exit(1);
	}

	printf("%.6f", c);
	getch();
}

Если ввести

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<conio.h>
#include<stdio.h>
#include<stdlib.h>
 
int main() {
//Это, конечно, константа, но не может быть использована как
//значение для оператора switch
	const int monday = 0;
    unsigned day;
 
    printf("Enter day ");
    scanf("%d", &day);
 
    if (day > 7) {
        day = day % 7;
    }
 
    switch (day) {
    case monday:
        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;
    }
 
    getch();
}

Q&A

Всё ещё не понятно? – пиши вопросы на ящик

Метки caseCase labels

Каждая метка case указывает на шаблон для сравнения с выражением сопоставления (переменная в предыдущем примере).Each case label specifies a pattern to compare to the match expression (the variable in the previous examples). Если они совпадают, управление передается разделу switch, который содержит первую соответствующую метку case.If they match, control is transferred to the switch section that contains the first matching case label. Если с выражением соответствия не совпадает ни один шаблон метки case, управление передается разделу с меткой case при условии, что такой раздел существует.If no case label pattern matches the match expression, control is transferred to the section with the case label, if there’s one. Если метки case нет, никакие операторы ни в одном из разделов switch не выполняются, а оператор теряет управление.If there’s no case, no statements in any switch section are executed, and control is transferred outside the statement.

Дополнительные сведения об операторе и сопоставлении шаблонов см. в разделе .For information on the statement and pattern matching, see the section.

Так как C# 6 поддерживает только шаблон констант и не допускает повтор постоянных значений, метки case определяют взаимоисключающие значения. При этом выражению сопоставления может соответствовать только один шаблон.Because C# 6 supports only the constant pattern and doesn’t allow the repetition of constant values, case labels define mutually exclusive values, and only one pattern can match the match expression. В связи с этим порядок отображения операторов не имеет значения.As a result, the order in which statements appear is unimportant.

Тем не менее, поскольку в C# 7.0 поддерживаются другие шаблоны, метки case не нужно определять как взаимоисключающие значения, и выражению соответствия могут соответствовать сразу несколько шаблонов.In C# 7.0, however, because other patterns are supported, case labels need not define mutually exclusive values, and multiple patterns can match the match expression. Поскольку в первом разделе switch выполняются только те операторы, которые содержат совпадающий шаблон, порядок операторов становится важным.Because only the statements in the first switch section that contains the matching pattern are executed, the order in which statements appear is now important. Обнаружив раздел switch, оператор или операторы которого эквивалентны предыдущим операторам или являются их подмножествами, C# выдает ошибку компилятора CS8120, «Метка case оператора switch уже обработана предыдущей меткой case».If C# detects a switch section whose case statement or statements are equivalent to or are subsets of previous statements, it generates a compiler error, CS8120, «The switch case has already been handled by a previous case.»

В следующем примере демонстрируется оператор с использованием различных не взаимоисключающих шаблонов.The following example illustrates a statement that uses a variety of non-mutually exclusive patterns. Если раздел switch перемещается и перестает быть первым разделом в операторе , C# выдает ошибку компилятора, так как целое число с нулевым значением — это подмножество всех целых чисел. Такой шаблон определен оператором .If you move the switch section so that it’s no longer the first section in the statement, C# generates a compiler error because an integer whose value is zero is a subset of all integers, which is the pattern defined by the statement.

Устранить эту проблему и предупреждение компилятора можно одним из двух способов:You can correct this issue and eliminate the compiler warning in one of two ways:

  • изменив порядок разделов switch;By changing the order of the switch sections.

  • используя в метке .By using a in the label.

The default Keyword

The keyword specifies the code to run if there is no
case match:

Example

The method returns the weekday as a number between
0 and 6.

If today is neither Saturday (6) nor Sunday (0), write a default message:

switch (new Date().getDay()) {
 
case 6:
    text = «Today is Saturday»;
    break;
  case 0:
    text = «Today is Sunday»;
    break;
 
default:
    text = «Looking forward to the Weekend»;}

The result of text will be:

The case does not have to be the last case in a switch
block:

Example

switch (new Date().getDay()) {
  default:
    text = «Looking forward to the Weekend»;   
break;  case 6:
    text = «Today is Saturday»;
    break;
  case 0:
    text = «Today is Sunday»;
}

If is not the last case in the switch block, remember to end the default case with a break.

Оператор switch в Go

Оператор в Go предоставляет возможность многостороннего выполнения. Спецификатор выражения или типа сравнивается с кейсам (случаями) внутри оператора , чтобы определить, какую ветвь выполнить. В отличие от других языков вроде C, Java или PHP в Golang каждый кейс завершается неявным разрывом, следовательно, нам не нужно писать его явно.

Премиум курс по Golang

Рекомендуем вам супер курс по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании!

Уроки, статьи и Видео

Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.

Кейсы выполняются сверху вниз, останавливаясь при успехе. Операторы работают со значениями любого типа, не только integer.

Есть два типа операторов : выражения и типы. Можно использовать запятые для разделения нескольких выражений в одном случае оператора. Оператор без выражения является альтернативным способом выражения логики .

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

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

Начнем с самого простого — условного оператора . В общем случае, этот оператор выглядит следующим образом:

if (Условие)
  Действие 1;
else
  Действие 2;

Дословно этот оператор можно описать так: если выполняется Условие, то необходимо выполнить Действие 1, иначе (если Условие не выполняется), то выполнить Действие 2

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

Немного раздражало после Delphi, но, в принципе, довольно быстро привыкаешь где надо «на автомате» расставлять скобки. Во-вторых, после Действия 1 обязательно ставится точка с запятой. Если необходимо выполнить несколько действие, то, соответственно, эти действия заключаются в фигурный скобки. Так же, как и в Delphi, ключевое слово может отсутствовать, если не требуется выполнять никаких действий в случае, если Условие вернет .

Рассмотрим несколько примеров использования условного оператора , используя те знания, которые у нас уже есть на данный момент. Например, пусть пользователь задаст любое число от 0 до 10 и наша программа, в зависимости от того чётное это число или не четное, либо увеличит число на 1, либо, наоборот — уменьшит. Ещё со школьной скамьи мы знаем, что чётное число — это число, которое делится без остатка на 2. Про ноль, конечно, есть вопросы, но будем считать, что ноль — тоже чётное число.  Программу можно представить следующим образом:

Console.WriteLine("Введите число от 0 до 10:"); 
int i = int.Parse(Console.ReadLine());
if (i % 2 == 0)
  Console.WriteLine($"{i} - четное число");
else
  Console.WriteLine($"{i} - нечетное число");
Console.ReadLine();

Раздерем эту программу построчно. Вначале, мы предлагаем пользователю ввести какое-либо число:

Console.WriteLine("Введите число от 0 до 10:");

Далее идёт строка в которой мы объявляем переменную i и тут же её инициализируем для чего конвертируем строку, которую ввел пользователь, в целое число, то есть выполняем сразу три действия:

  1. объявляем переменную
  2. читаем из консоли строку, которую ввел пользователь:
  3. конвертируем строку в целочисленный тип int:

Далее идет наш условный оператор в котором мы проверяем остаток от деления, воспользовавшись соответствующим . Если условие истинно, то выводим строку, что число является чётным, иначе — что число является не четным. 

Последняя строка — просто «заглушка» для того, чтобы окно консоли не закрывалось до тех пор, пока пользователь не нажмет ввод. Используя знания по переменным в C# эту строку можно было бы написать так:

_ = Console.ReadLine();

Теперь можно запустить программу, нажав F5 и посмотреть на результат, например:

Введите число от 0 до 10:

6

6 — четное число

Конечно, приведенный выше код программы — это только демонстрация работы оператора и при разработке реального проекта у опытного программиста к этому коду возникло бы сразу масса вопросов, например, почему программа не проверяет, что число действительно находится в пределах от 0 до 10, а не больше или меньше предельных значений? Или почему не проводится проверка на то, что пользователь ввел именно число, а не символ или вообще строку? Про обработку ошибок мы ещё поговорим, а пока попробуем доработать наш код и снять приведенные выше вопросы используя только условный оператор . 

Console.WriteLine("Введите целое число от 0 до 10:");

if (int.TryParse(Console.ReadLine(), out int i))
{
   if (i >= 0 && i <= 10)
     {
       if (i % 2 == 0)
          Console.WriteLine($"{i} - четное число");
       else
          Console.WriteLine($"{i} - нечетное число");
      }
    else
     Console.WriteLine("Введенное число не входит в диапазон от 0 до 10");
    }
else
  Console.WriteLine("Введено не число или число с плавающей запятой");
 _ = Console.ReadLine();

Здесь мы уже воспользовались методом , который возвращает , если удалось преобразовать строку в целое число и в противном случае. Если пользователь ввел именно число, то далее идёт проверка на вхождение числа в диапазон от 0 до 10 и, если это условие оказалось истиной (), то проводится проверка числа на чётность. Конечно, и эту программу можно улучшать, но мы этого сегодня делать не будем, а лучше рассмотрим ещё один условный оператор C# — . 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector