Когда использовать лесенку if-else неудобно

Лесенка 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";

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: