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

Операция ?:

Язык С++ включает операцию, которая часто может использоваться вместо оператора if else. Она называется условной операцией, записывается как ?: и является единственной операцией C++, которая требует трех операндов. Ее общая форма вы­глядит следующим образом:

выражение1 ? выражение2 : выражениеЗ

Если выражение 1 истинно, то значением всего условного выражения будет значе­ние выражение2. В противном случае значением всего выражения будет выражениеЗ. Ниже приведены два примера, демонстрирующие ее работу:

5>3?10:12

// 5 > 3 истинно, поэтому значением выражения будет 10

3== 9? 25 : 18

// 3 == 9 ложно, поэтому значением всего выражения будет 18

Первый пример можно перефразировать так: если 5 больше, чем 3, то выражение оценивается как 10; иначе оно оценивается как 12. В реальных ситуациях программирования выражения, конечно же, могут включать в себя переменные.

Код в листинге использует условную операцию для нахождения большего из двух значений.

#include <iostream>

int main()

{

using namespace std;

int a, b;

cout << "Enter two integers: ";

cin >> a >> b;

cout << "The larger of (" << a << " and " << b << ");

int c = a > b ? a : b;

// c = a if a > b, else c = b

cout << " is " << c << endl;

getchar();

getchar();

return 0;

}

Ключевой частью программы является следующий оператор:

int c = a>b?a : b;

Он выдает тот же результат, что и приведенные ниже операторы:

int с;

if (а > b)

с = а; else

с = b;

По сравнению с последовательностью if else условная операция более короткая, но на первый взгляд не так очевидна. Одно отличие между этими двумя подходами заключается в том, что условная операция порождает выражение, а потому — един­ственное значение, которое может быть присвоено или встроено в более крупное выражение, как это сделано в программе из листинга выше, где значение условного вы­ражения присваивается переменной с.

Краткая форма и необычный синтаксис ус­ловной операции высоко ценится некоторыми программистами. Их любимый трюк, достойный порицания, состоит в использовании вложенных друг в друга условных выражений.

Оператор switch

Предположим, что вы создаете экранное меню, которое предлагает пользовате­лю на выбор один из пяти возможных вариантов, например, “дешевый”, “умерен­ный”, “дорогой”, “экстравагантный” и “непомерный”. Вы можете расширить последо­вательность if else if else для обработки этих пяти альтернатив, но оператор C++ switch упрощает обработку выбора из большого списка. Ниже представлена общая форма оператора switch:

switch (целочисленное-выражение)

{

case метка1 : оператор (ы)

case метка2 : оператор (ы)

default : оператор(ы)

}

Оператор switch действует подобно маршрутизатору, который сообщает компь­ютеру, какую строку кода выполнять следующей.

По достижении оператора switch программа переходит к строке, которая помечена значением, соответствующим текущему значению целочисленное-выражение.

Например, если целочисленное - выражение имеет значение 4, то программа переходит к строке с меткой case 4. Как следует из названия, выражение целочисленное-выражение должно быть цело­численным. Также каждая метка должна быть целым константным выражением. Чаще всего метки бывают константами типа char или int, такими как 1 или ‘q’, либо же перечислителями. Если целочисленное-выражение не соответствует ни одной мет­ке, программа переходит к метке default. Метка default не обязательна. Если она опущена, а соответствия не найдено, программа переходит к оператору, следующему за switch (рис. 6.3).

Оператор switch в C++ отличается от аналогичных операторов в других языках, например, Pascal, в одном очень важном отношении. Каждая метка case в C++ рабо­тает только как метка строки, а не граница между выборами.

То есть после того, как программа перейдет на определенную строку в switch, она последовательно выполнит все операторы, следующие за этой строкой внутри switch, если только вы явно не направите ее в другое место. Выполнение не останав­ливается автоматически на следующем case. Чтобы прекратить выполнение в конце определенной группы операторов, вы должны использовать оператор break. Это пе­редаст управление за пределы блока switch.

В листинге 6.10 показано, как с помощью switch и break реализовать простое меню. Для отображения возможных вариантов выбора в программе применяется функция showmenu (). Затем оператор switch выбирает действие на основе выбора пользователя.

#include <iostream>

using namespace std;

void showmenu(); // function prototypes

void report();

void comfort();

int main()

{

showmenu();

int choice;

cin >> choice;

while (choice != 5)

{

switch(choice)

{

case 1 : cout << "\a\n";

break;

case 2 : report();

break;

case 3 : cout << "The boss was in all day.\n";

break;

case 4 : comfort();

break;

default : cout << "That's not a choice.\n";

}

showmenu();

cin >> choice;

}

cout << "Bye!\n";

getchar();

getchar();

return 0;

}

void showmenu()

{

cout << "Please enter 1, 2, 3, 4, or 5:\n"

"1) alarm 2) report\n"

"3) alibi 4) comfort\n"

"5) quit\n";

}

void report()

{

cout << "It's been an excellent week for business.\n"

"Sales are up 120%. Expenses are down 35%.\n";

}

void comfort()

{

cout << "Your employees think you are the finest CEO\n"

"in the industry. The board of directors think\n"

"you are the finest CEO in the industry.\n";

}

Цикл while завершается, когда пользователь вводит 5. Ввод от 1 до 4 активизиру­ет соответствующий выбор из списка switch, а ввод значения б вызывает действие по умолчанию.

Обратите внимание, что для корректной работы программы вводиться должно целочисленное значение. Если, например, ввести букву, оператор ввода даст сбой, а цикл будет выполняться бесконечно вплоть до уничтожения программы. В таком случае лучше использовать символьный ввод.

Как отмечалось ранее, этой программе необходимы операторы break, чтобы ог­раничить выполнение определенной частью оператора switch. Вы можете удосто­вериться, что это именно так, удалив операторы break из листинга 6.10 и посмот­рев, как программа будет работать без них. Например, вы обнаружите, что ввод 2 заставит программу выполнить операторы, ассоциированные с метками 2, 3, 4 и default. C++ ведет себя подобным образом, потому что такое поведение иногда может быть полезным. Так, за счет этого можно легко использовать множественные метки. Например, предположим, что вы перепишете листинг 6.10, используя в каче­стве выборов меню и меток case символы вместо целых значений. В таком случае можно использовать символы как верхнего, так и нижнего регистра:

char choice;

cin >> choice;

while (choice != 'Q' && choice != 'q')

{

switch(choice)

{

case 'a'

case 'A' : cout << "\a\n"; break;

case ' r'

case 'R' : report(); break;

case '1'

case 'L' : cout << "The boss was break; in all day.\n"

case ' с'

case 'C' : comfort() ; break;

default : cout << "That's not a choice.\n";

}

showmenu(); cin >> choice;

}