Неприятности происходят также, когда код содержит больше операторов if
, чем ветвей else
. Для иллюстрации проблемы перепишем внутренний оператор if else
, добавляющий плюс или минус, на основании различных наборов условий:
//
//
if (grade % 10 >= 3)
if (grade % 10 > 7)
lettergrade += '+'; //
//
else
lettergrade += '-'; //
//
Отступ в данном коде подразумевает, что оператор else
предназначен для внешнего оператора if
, т.е. он выполняется, когда значение grade
заканчивается цифрой меньше 3
. Однако, несмотря на наши намерения и вопреки отступу, ветвь else
является частью внутреннего оператора if
. Этот код добавляет '-'
к оценкам, заканчивающимся на 3-7
включительно! Правильно выровненный, в соответствии с правилами выполнения, этот код выглядел бы так:
//
//
if (grade % 10 >= 3)
if (grade % 10 > 7)
lettergrade += '+'; //
//
else
lettergrade += '-'; //
//
Заключив внутренний оператор if
в блок, можно сделать ветвь else
частью внешнего оператора if
:
//
//
if (grade % 10 >= 3) {
if (grade % 10 > 7)
lettergrade += '+'; //
//
} else //
lettergrade += '-'; //
//
Операторы не распространяются за границы блока, поэтому внутренний цикл if
заканчивается на закрывающей фигурной скобке перед оператором else
. Оператор else
не может быть частью внутреннего оператора if
. Теперь ближайшим свободным оператором if
оказывается внешний, как и предполагалось изначально.
Упражнение 5.5. Напишите собственную версию программы преобразования числовой оценки в символ с использованием оператора if else
.
Упражнение 5.6. Перепишите программу оценки так, чтобы использовать условный оператор (см. раздел 4.7) вместо оператора if else
.
Упражнение 5.7. Исправьте ошибки в каждом из следующих фрагментов кода:
(a) if (ival1 != ival2)
ival1 = ival2
else ival1 = ival2 = 0;
(b) if (ival < minval)
minval = ival;
occurs = 1;
(c) if (int ival = get_value())
cout << "ival = " << ival << endl;
if (!ival)
cout << "ival = 0\n";
(d) if (ival = 0)
ival = get_value();
Упражнение 5.8. Что такое "потерянный оператор else
"? Как в языке С++ определяется принадлежность ветви else
?
5.3.2. Оператор switch
switch
предоставляет более удобный способ выбора одной из множества альтернатив. Предположим, например, что необходимо рассчитать, как часто встречается каждая из пяти гласных в некотором фрагменте текста. Программа будет иметь следующую логику.
• Читать каждый введенный символ.
• Сравнить каждый символ с набором искомых гласных.
• Если символ соответствует одной из гласных букв, добавить 1
к соответствующему счетчику.
• Отобразить результаты.
Программа должна отобразить результаты в следующем виде:
Number of vowel а: 3195
Number of vowel e: 6230
Number of vowel i: 3102
Number of vowel o: 3289
Number of vowel u: 1033
Для непосредственного решения этой задачи можно использовать оператор switch
.
//
unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0;
char ch;