Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вложенные циклы и двумерные массивы.docx
Скачиваний:
1
Добавлен:
24.11.2019
Размер:
3.51 Mб
Скачать

Использование перечислителей в качестве меток

В листинге 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.