
- •Вложенные циклы и двумерные массивы
- •Инициализация двумерного массива
- •Использование двумерного массива
- •Операторы Ветвления
- •Оператор if
- •If (проверочное-условие)
- •Оператор if else
- •Форматирование операторов if else
- •Конструкция if else if else
- •Условные операции и предотвращение ошибок
- •Логические выражения
- •Операция ?:
- •Оператор switch
- •Использование перечислителей в качестве меток
- •Операторы break и continue
Операция ?:
Язык С++ включает операцию, которая часто может использоваться вместо оператора 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;
}