- •Вложенные циклы и двумерные массивы
- •Инициализация двумерного массива
- •Использование двумерного массива
- •Операторы Ветвления
- •Оператор if
- •If (проверочное-условие)
- •Оператор if else
- •Форматирование операторов if else
- •Конструкция if else if else
- •Условные операции и предотвращение ошибок
- •Логические выражения
- •Операция ?:
- •Оператор switch
- •Использование перечислителей в качестве меток
- •Операторы break и continue
Использование перечислителей в качестве меток
В листинге 6.11 иллюстрируется применение enum для определения набора взаимосвязанных констант в операторе switch.
В общем случае входной поток cin не распознает перечислимые типы (он не может знать, как вы определите их), поэтому программа читает выбор как int.
Когда оператор switch сравнивает значение int с перечислимой меткой case, он приводит перечисление к типу int. Точно также перечисления приводятся к int в проверочном условии цикла while.
#include <iostream>
// create named constants for 0 - 6
enum {red, orange, yellow, green, blue, violet, indigo};
int main()
{
using namespace std;
cout << "Enter color code (0-6): ";
int code;
cin >> code;
while (code >= red && code <= indigo)
{
switch (code)
{
case red: cout << "Her lips were red.\n"; break;
case orange: cout << "Her hair was orange.\n"; break;
case yellow: cout << "Her shoes were yellow.\n"; break;
case green: cout << "Her nails were green.\n"; break;
case blue: cout << "Her sweatsuit was blue.\n"; break;
case violet: cout << "Her eyes were violet.\n"; break;
case indigo: cout << "Her mood was indigo.\n"; break;
}
cout << "Enter color code (0-6): ";
cin >> code;
}
cout << "Bye\n";
getchar();
getchar();
return 0;
}
Оба оператора — switch и if else — позволяют выбирать из списка альтернатив. Однако if else из них является более гибким оператором. Например, он позволяет обрабатывать диапазоны, как показано в следующем примере:
В отличие от этого, оператор switch не позволяет обрабатывать диапазоны. Каждая метка case оператора switch должна быть представлена одиночным значением. К тому же значение должно быть целым (что включает char), поэтому оператор switch не может проверять значения с плавающей точкой. К тому же значение метки case должно быть константой. Если вам необходимо проверять диапазоны, выполнять проверку значений с плавающей точкой или сравнивать две переменные, то вам следует использовать if else.
Если же, однако, все альтернативы могут быть идентифицированы целочисленными константами, то вы можете применять как switch, так и if else. А поскольку это та ситуация, для обработки которой специально был спроектирован оператор switch, его применение в этом случае более эффективно в смысле размера кода и скорости выполнения, если только речь не идет всего о паре возможных альтернатив выбора.
Если в конкретном случае можно использовать либо оператор switch, либо последовательность if else if, то обычная практика состоит в применении switch, когда имеется три или более альтернатив.
Операторы break и continue
Операторы break и continue позволяют программе пропускать часть кода. Оператор break можно использовать в операторе switch и в любых циклах. Он вызывает немедленную передачу управления за пределы текущего оператора switch или цикла. Оператор continue применяется только в циклах и вынуждает программу пропустить остаток тела цикла и сразу начать следующую итерацию (рис. 6.4).
В листинге 6.12 демонстрируется работа этих двух операторов. Программа позволяет ввести строку текста. Цикл отображает каждый ее символ и использует break, чтобы завершить цикл, если очередной символ строки окажется точкой.
Это показывает, как с помощью break прервать цикл изнутри, если некоторое условие окажется истинным. Далее программа подсчитывает пробелы, пропуская остальные символы. Здесь в цикле используется continue, чтобы пропустить оставшуюся часть цикла, если окажется, что символ не является пробелом.
#include <iostream>
const int ArSize = 80;
int main()
{
using namespace std;
char line[ArSize];
int spaces = 0;
cout << "Enter a line of text:\n";
cin.get(line, ArSize);
cout << "Complete line:\n" << line << endl;
cout << "Line through first period:\n";
for (int i = 0; line[i] != '\0'; i++)
{
cout << line[i]; // display character
if (line[i] == '.') // quit if it's a period
break;
if (line[i] != ' ') // skip rest of loop
continue;
spaces++;
}
cout << "\n" << spaces << " spaces\n";
cout << "Done.\n";
getchar();
getchar();
return 0;
}
Обратите внимание, что в то время как оператор continue вынуждает программу из листинга пропустить оставшуюся часть тела цикла, он не пропускает выражение обновления цикла. В цикле for оператор continue заставляет программу перейти непосредственно к выражению обновления, а затем — к проверочному выражению. В цикле while, однако, continue заставляет программу сразу выполнить проверочное условие. Поэтому любое обновляющее выражение в теле цикла while, которое следует за continue, будет пропущено. В некоторых случаях это может приводить к проблемам.
В этой программе можно было бы обойтись без continue. Вместо этого можно было бы использовать следующий код:
if (line[i] == ' ') spaces++;
Однако оператор continue может сделать программу более читабельной, когда за continue следует несколько операторов. В таком случае нет необходимости делать эти операторы частью if.
В C++, как и в С, присутствует оператор goto. Следующий оператор означает, что нужно перейти в место, помеченное меткой paris ::
goto paris;
То есть в программе может присутствовать следующий код:
char ch;
cin >> ch;
if (ch == 'P') goto paris;
cout « ...
paris: cout << "You've just arrived at Paris.\n";
В большинстве случаев (некоторые скажут — во всех случаях) применение goto — неудачное решение, и для управления потоком выполнения программы вы должны стараться применять структурные управляющие конструкции вроде if else, switch, continue и т.п.
9. Вывести на экран все простые числа до 100.