Лесенка if-else-if
Ещё один специальный способ использования конструкции if-else – это так называемая лесенка if-else-if. Целевой случай использования условного оператора в таком виде – это выбор одной из нескольких взаимно исключающих альтернатив. Рассмотрим применение лесенки if-else-if для решения следующей задачи: пользователь вводит мощность двигателя в лошадиных силах, а программа сообщает величину транспортного налога, соответствующую введенной мощности. Пусть схема расчета налога такая:
- 0-99: 500 рублей;
- 100-199: 1000 рублей;
- 200-299: 1500 рублей;
- 300 и более: 2000 рублей.
Данная программа будет иметь следующий вид:
cout << "Введите мощность:\n";
int power; cin >> power;
if (power>=300) {
cout << "2000 рублей.\n";
} else if (power>=200) {
cout << "1500 рублей\n";
} else if (power>=100) {
cout << "1000 рублей\n";
} else if (power>0) {
cout << "500 рублей\n";
} else {
cout << "Ошибка\n";
}
Обратите внимание на то, что в данном примере каждый if обходится одним сравнением и, например, писать power>=100 && power<200 не нужно, поскольку альтернативы взаимно исключают друг друга, а случай power<200 проверен выше. Несмотря на вложенность операторов друг в друга, при использовании лесенки отступы делать не принято.
Пусть нам требуется написать программу, которая принимает с клавиатуры оценку и сообщает словесный эквивалент этой оценки; например, оценке 5 соответствует название «отлично», оценке 4 – «хорошо», и т.д. Используя лесенку if-else-if написать эту программу можно следующим образом:
int mark;
cout << "Введите оценку: ";
cin >> mark;
if (mark == 5) {
cout << "Отлично\n";
} else if (mark == 4) {
cout << "Хорошо\n";
} else if (mark == 3) {
cout << "Удовлетворительно\n";
} else if (mark == 2) {
cout << "Неудовлетворительно\n";
} else if (mark == 1) {
cout << "Кол\n";
} else {
cout << "Такой оценки нет!\n";
}
Как видно из приведённого фрагмента кода, неудобство выбранного решения заключается в том, что много раз приходится писать else-if; кроме того, при первом взгляде логика программы может быть не очень понятна. Конструкция, которая предназначена именно для решения таких задач, – это конструкция switch-case.
Конструкция switch-case
Для выбора одной из нескольких альтернатив наилучшим решением является использование конструкции switch-case, синтаксис которой следующий:
switch (<проверяемое выражение>) {
case <значение_1>:
<группа_операторов_1>; break;
case <значение_2>:
<группа_операторов_2>; break;
...
case <значение_N>:
<группа_операторов_N>; break;
default:
<группа_операторов_по_умолчанию>; break;
}
Операторы из разных групп выполняются в зависимости от значения проверяемого выражения. Если ни одно из значений не совпадает, то выполняется группа операторов после метки default. Используя эту конструкцию, можно модифицировать программу, сообщающую словесный эквивалент оценки и сделать её более простой и понятной:
int mark;
cout << "Введите оценку: ";
cin >> mark;
switch(mark) {
case 5:
cout << "Отлично\n"; break;
case 4:
cout << "Хорошо\n"; break;
case 3:
cout << "Удовлетворительно\n"; break;
case 2:
cout << "Неудовлетворительно\n"; break;
case 1:
cout << "Кол\n"; break;
default:
cout << "Нет такой оценки\n"; break;
}
С помощью этого оператора проверять диапазоны значений, как это делается в программе с транспортным налогом, нельзя.
Исключение операторов break из switch
Вы, наверное, обратили внимание на то, что после каждой группы операторов поставлен оператор break. Какова его роль? Давайте уберём некоторые из них и посмотрим, что будет.
switch(mark) {
case 5:
cout << "Отлично\n";
case 4:
cout << "Хорошо\n";
case 3:
cout << "Удовлетворительно\n";
case 2:
cout << "Неудовлетворительно\n"; break;
case 1:
cout << "Кол\n"; break;
default:
cout << "Нет такой оценки\n"; break;
}
Выполнятся все операторы до первого break. Здесь программа стала работать неправильно, но в некоторых случаях можно специально убирать некоторые breakи, чтобы упростить написание программы. Рассмотрим программу, которая проверяет, является ли буква гласной; мы уже решили эту задачу с помощью оператора if. Теперь рассмотрим, как можно написать эту программу с помощью оператора switch:
char letter;
cout << "Введите букву: ";
cin >> letter;
switch (letter) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
case 'y':
cout << "Гласная\n"; break;
default:
cout << "Согласная\n";
}