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
имеет схожие функции и примерно те же цели, но с небольшими отличиями, которые касаются условий. Если вы не уверены, всегда можно проверить это в 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 операторов. И, возможно, это не так уж далеко от истины. Основные конструкции, такие как эти, действительно часто встречаются в коде и являются основой многих алгоритмов и программ.
Домашнее задание
-
Действия сотрудника дорожной полиции Напишите программу для дорожного полицейского, который останавливает автомобиль и проверяет его скорость. Программа должна анализировать скорость автомобиля и предпринимать соответствующие действия:
- Если скорость до 50 км/ч — нарушений нет.
- Если скорость от 50 до 65 км/ч — устное порицание и лекция на 5 минут.
- Если превышение скорости от 16 до 40 км/ч — штраф 40 евро.
- Если скорость от 100 до 130 км/ч — штраф 500 евро.
- Если скорость выше 130 км/ч — штраф 1000 евро, конфискация прав на 3 года и конфискация транспортного средства.
-
Светофор Напишите программу для машины, стоящей на светофоре. Программа должна выводить действия водителя в зависимости от сигнала светофора:
- Если горит красный — остановиться.
- Если горит жёлтый — приготовиться к остановке.
- Если горит зелёный — продолжить движение.
-
Зарплата с надбавкой за стаж Напишите программу для расчета зарплаты сотрудника магазина с учетом стажа работы. Базовая зарплата составляет 500$. Для сотрудников:
- За 3 года работы — надбавка 10%.
- За 5 лет работы — надбавка 50%.
- За 10 лет работы — надбавка 100%.
- За 15 лет работы — надбавка 150%.
-
Вывод даты Напишите программу, которая выводит дату в формате
dd-mm-yyyy
. Программа должна принимать на вход день, месяц и год, а также разделитель (например, "-"). Она должна проверять, чтобы день и месяц были в пределах нормальных значений (от 1 до 31 для дня и от 1 до 12 для месяца), а если нужно, дописывать нули. -
Алкогольный контроль Напишите программу, которая проверяет возраст покупателя и решает, можно ли продать алкоголь. Программа должна проверять:
- Если покупателю 10 лет — отказать в продаже.
- Если покупателю 17 лет — отказать в продаже.
- Если покупателю 18 лет — разрешить продажу.
- Если покупателю 20 лет — разрешить продажу.
- Если покупателю 30 лет — разрешить продажу.
-
Определение сезона года Напишите программу, которая определяет сезон года по месяцу. Программа должна принять месяц как целое число (от 1 до 12) и вывести:
- Зиму (декабрь, январь, февраль),
- Весну (март, апрель, май),
- Лето (июнь, июль, август),
- Осень (сентябрь, октябрь, ноябрь).
-
Выбор таблетки в Матрице Напишите программу, которая моделирует выбор таблетки в Матрице. Программа должна запросить у пользователя, какую таблетку он выбирает:
- Красную — вывести сообщение "Ты выбрал красную таблетку, ты будешь знать правду."
- Синюю — вывести сообщение "Ты выбрал синюю таблетку, ты останешься в иллюзии."
- Если введено что-то другое — вывести сообщение "Ты выбрал несуществующую таблетку."
-
Лифт Как бы вы написали программу управления лифтом?