Skip to content

Switch и if - условные операторы и оператор выбора

Эту картину я знаю с начальной школы. На этом примере мы и рассмотрим оператор выбора Switch и опции выбора Case

опять двойка

void main() {
	int quarterGrade = 1;
	print(getReward(quarterGrade));
}
 
String getReward(int grade) {
	String reward;
 
	switch (grade) {
		case 5:
			reward = "Bicycle";
			break;
		case 4:
			reward = "GoPro";
			break;
		case 3:
			reward = "No prize";
			break;
		case 2:
			reward = "Lost time and bad mood";
			break;
		case 1:
			reward = "Better not to ask";
			break;
		default:
			reward = "This grade does not exist";
	}
 
	return reward;
}

Каждое значение в switch-case завершается оператором break, который предотвращает дальнейшее выполнение следующего блока case. Если break не использовать, выполнение просто перейдёт к следующему case, что бывает удобно, если несколько вариантов должны приводить к одному и тому же результату. Завершается конструкция блоком default, который обрабатывает все не предусмотренные в case значения, то есть служит универсальным вариантом на случай неожиданных данных.

Когда возможны множественные варианты выбора, switch и case оказываются удобным инструментом. Это тот самый случай, когда можно сказать: «Направо пойдёшь – коня потеряешь, прямо…». Такой алгоритм отлично подходит для ситуаций, где определённый вход должен привести к строго заданному результату.

Направо пойдёшь – коня потеряешь, прямо

Один из самых распространённых примеров использования switch в учебниках — календарь. Ведь у нас есть 12 месяцев, каждому из которых соответствует уникальное название и ID.

void main() {
  int month = 8;
  print(getMonthName(month));
}
 
String getMonthName(int month) {
  switch (month) {
    case 1:
      return "January";
    case 2:
      return "February";
    case 3:
      return "March";
    case 4:
      return "April";
    case 5:
      return "May";
    case 6:
      return "June";
    case 7:
      return "July";
    case 8:
      return "August";
    case 9:
      return "September";
    case 10:
      return "October";
    case 11:
      return "November";
    case 12:
      return "December";
    default:
      return "Invalid month";
  }
}

Dart не требует break в switch, поскольку return автоматически завершает выполнение функции. Мы можем либо использовать одну переменную и возвращать её в конце, либо завершать каждый вариант с помощью return. Оба стиля корректны.

Первый стиль — с переменной и единым return — делает код более читабельным для новичков, особенно тех, кто переходит с Java или других строго типизированных языков.

Второй стиль, где return используется внутри каждого case, делает код короче и в некоторых случаях удобнее.

Первый вариант, больше характерен для учебников по Java, тогда как второй ближе к JavaScript. Это вопрос предпочтений, но я бы рекомендовал начинающим придерживаться первого подхода — хотя бы до тех пор, пока не станет понятно, как каждый из них влияет на код. А возможно, в будущем вы и вовсе обойдётесь без switch — в программировании существует множество способов выразить свои мысли. И один из альтернативных вариантов — это использование условных операторов if else.

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

if-else-condition-image

Оператор if имеет схожие функции и примерно те же цели, но с небольшими отличиями, которые касаются условий. Если вы не уверены, всегда можно проверить это в Google, например, запросив “switch vs if comparison”. На Хабре, например, есть несколько статей, обсуждающих эстетику, скорость, эффективность и методы использования этих операторов.

Нас пока эстетика не сильно интересует. Мы учимся синтаксису.

Пример: поездка в летний лагерь

Допустим, если родители дали разрешение (условие — true), я поеду в летний лагерь, а если нет — останусь дома.

// Метод для проверки разрешения от родителей
void checkSummerCampPermission(bool isPermissionGranted) {
	if (isPermissionGranted) {
		print("Я поеду в летний лагерь");
	} else {
		print("Я останусь на всё лето дома");
	}
}
 
void main() {
	// Пример: родитель дал разрешение
	bool permission = true;
	checkSummerCampPermission(permission);
 
	// Пример: родитель не дал разрешение
	permission = false;
	checkSummerCampPermission(permission);
}

Для этого примера не имеет смысла использовать switch, потому что у нас всего два варианта, и в этом заключается одно из отличий между if-else и switch.

Преимущества if-else

Главное преимущество if-else — возможность выполнить несколько команд в одном блоке. Рассмотрим пример с ракетой и ускорением свободного падения:

void checkRocketLaunch(int a) {
  const int superConstantG = 10;
 
  if (a < superConstantG) {
    print("Начальное ускорение недостаточно");
    print("Ракета не может стартовать");
    print("Подготовить аварийные службы");
  } else {
    print("Ракета улетает в космос");
    print("Выпустить пресс-релиз об успешном запуске");
    print("Подготовить программистов к государственным наградам");
  }
}
 
void main() {
  checkRocketLaunch(5);
}

Здесь мы видим, что если начальное ускорение меньше константы, выполняются несколько команд для подготовки к аварийному сценарию.

Пример с возрастом покупателя

В switch нельзя проверить, например, “младше 18 лет”, а с помощью if-else это легко сделать:

void checkAlcoholSale(int age) {
  if (age < 16) {
    print("Алкоголь и сигареты продавать нельзя!!!");
  } else if (age >= 18) {
    print("Можно продавать алкоголь и сигареты");
  } else {
    print("Водку продавать нельзя, а пиво и сигареты можно");
  }
}
 
void main() {
  checkAlcoholSale(40);
}

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

Домашнее задание

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

    • Если скорость до 50 км/ч — нарушений нет.
    • Если скорость от 50 до 65 км/ч — устное порицание и лекция на 5 минут.
    • Если превышение скорости от 16 до 40 км/ч — штраф 40 евро.
    • Если скорость от 100 до 130 км/ч — штраф 500 евро.
    • Если скорость выше 130 км/ч — штраф 1000 евро, конфискация прав на 3 года и конфискация транспортного средства.
  2. Светофор Напишите программу для машины, стоящей на светофоре. Программа должна выводить действия водителя в зависимости от сигнала светофора:

    • Если горит красный — остановиться.
    • Если горит жёлтый — приготовиться к остановке.
    • Если горит зелёный — продолжить движение.
  3. Зарплата с надбавкой за стаж Напишите программу для расчета зарплаты сотрудника магазина с учетом стажа работы. Базовая зарплата составляет 500$. Для сотрудников:

    • За 3 года работы — надбавка 10%.
    • За 5 лет работы — надбавка 50%.
    • За 10 лет работы — надбавка 100%.
    • За 15 лет работы — надбавка 150%.
  4. Вывод даты Напишите программу, которая выводит дату в формате dd-mm-yyyy. Программа должна принимать на вход день, месяц и год, а также разделитель (например, "-"). Она должна проверять, чтобы день и месяц были в пределах нормальных значений (от 1 до 31 для дня и от 1 до 12 для месяца), а если нужно, дописывать нули.

  5. Алкогольный контроль Напишите программу, которая проверяет возраст покупателя и решает, можно ли продать алкоголь. Программа должна проверять:

    • Если покупателю 10 лет — отказать в продаже.
    • Если покупателю 17 лет — отказать в продаже.
    • Если покупателю 18 лет — разрешить продажу.
    • Если покупателю 20 лет — разрешить продажу.
    • Если покупателю 30 лет — разрешить продажу.
  6. Определение сезона года Напишите программу, которая определяет сезон года по месяцу. Программа должна принять месяц как целое число (от 1 до 12) и вывести:

    • Зиму (декабрь, январь, февраль),
    • Весну (март, апрель, май),
    • Лето (июнь, июль, август),
    • Осень (сентябрь, октябрь, ноябрь).
  7. Выбор таблетки в Матрице Напишите программу, которая моделирует выбор таблетки в Матрице. Программа должна запросить у пользователя, какую таблетку он выбирает:

    • Красную — вывести сообщение "Ты выбрал красную таблетку, ты будешь знать правду."
    • Синюю — вывести сообщение "Ты выбрал синюю таблетку, ты останешься в иллюзии."
    • Если введено что-то другое — вывести сообщение "Ты выбрал несуществующую таблетку."
  8. Лифт Как бы вы написали программу управления лифтом? elevator

Дополнительные материалы

  1. Is "else if" faster than "switch() case"?
  2. Why switch is better than if-else