40. Инструкция множественного выбора (switch)
Эта инструкция служит для ветвления программы во многих направлениях.
Ее синтаксис:
switch (<Выражение>)
{
case <Константа 1>:
<Последовательность инструкций 1>
break;
case <Константа 2>:
<Последовательность инструкций 2>
break;
……….
case <Константа N>:
<Последовательность инструкций N>
break;
default:
<Последовательность инструкций>
}
При совпадении значения выражения со значением одной из констант 1 – N будет выполнена соответствующая этой ветви последовательность инструкций. Инструкция break осуществляет прерывание выполнения инструкции switch и управление передается следующему за switch-инструкцией оператору. Если значение выражения не совпадет ни с одной из констант, то будут выполнены инструкции ветви default.
Ветвь default не обязательна. В случае отсутствия ветви default при несовпадении значения выражения ни с одной из констант не будет выполнена ни одна из инструкций оператора switch.
Значение выражения в инструкции switch обязательно должно быть либо целого, либо символьного типа (в принципе тип выражения может быть и логическим, но в этом случае выгоднее пользоваться if-инструкцией) – вещественные значения не допускаются.
Пример записи инструкции:
unsigned i;
cin >> i;
switch ( i )
{
case 0:
cout << "ноль\n";
break;
case 1:
cout << "один\n ";
break;
case 2:
cout << "два\n ";
break;
default:
cout << "много\n ";
}
Если в выбранной ветви будет отсутствовать инструкция break, то после выполнения инструкций этой ветви начнут выполняться инструкции следующей ветви до тех пор, пока не встретится инструкция break или не будет достигнут конец оператора switch. Например:
unsigned i;
cin >> i;
switch ( i )
{
case 0: cout << 0;
case 1: cout << 1;
case 2: cout << 2;
case 3: cout << 3;
case 4: cout << 4;
case 5: cout << 5;
}
В этом примере на экран будет выведена последовательность цифр, начинающаяся с цифры, введенной с клавиатуры.
Инструкция switch более эффективна, чем структура “лесенка”, реализованная с помощью вложенных инструкций if.
41. Цикл с предусл Формат записи этой инструкции:
Или, если тело цикла представляет собой одиночную инструкцию:
Выражение в этой инструкции может быть любого типа, значения которого можно трактовать как значения логического типа данных (bool). Это выражение определяет условие продолжения выполнения тела цикла, то есть, если значение этого выражения истинно (true или не равно 0), то тело цикла выполняется вновь, если же ложно (false или 0) , то цикл заканчивается и управление передается следующей за циклом инструкции.
Очевидно, что тело цикла в этой инструкции может не выполниться ни разу, если при входе в цикл значение выражения будет соответствовать значению false или 0.
Для того чтобы цикл начал выполняться, необходимо перед началом цикла выполнить инициализацию его параметров так, чтобы значение выражения соответствовало значению true или было не равно 0.
Неправильное использование этой инструкции может привести к образованию бесконечного цикла (к зацикливанию программы). Такая ситуация возникает в том случае, когда значение выражения не меняется в процессе выполнения цикла. Для того чтобы избежать подобной ситуации, необходимо в теле цикла предусмотреть такие изменения параметров цикла, при которых, в конце концов, условие продолжения цикла перестанет выполняться, либо использовать принудительное завершение цикла с помощью инструкции break.
Рассмотрим некоторые примеры.
Пример 1. Необходимо в виде строки вывести на экран цифры от 0 до 9.
int k = 0; // На экран выведено k цифр
while (k <= 9) // Здесь используется логическое выражение
{
cout << k;
++k;
}
// На экран выведено k = 10 цифр: 0123456789
Формулировка условия продолжения цикла в этом примере может быть и другой:
k < 10 или k != 10
Поскольку на каждом шаге цикла параметр цикла k увеличивает свое значение на 1 (начиная с 0), то после выполнения 10 шагов условие выполнения цикла (при любой формулировке из перечисленных) обязательно перестанет выполняться и цикл закончится.
Но вот, если в теле цикла не предусмотреть наращивание параметра k, то получим бесконечный цикл, в котором на экран будут выводиться одни нули:
int k = 0;
while (k <= 9)
{
cout << k;
}
Для остановки его нам придется принудительно прервать выполнение программы.
Причиной зацикливания может быть и неправильная формулировка условия продолжения цикла.
Пример 2. Необходимо в виде строки вывести на экран только нечетные числа из первого десятка.
int k = 1;
while (k != 10)
{
cout << k << “\t”;
k += 2;
}
В этом примере выражение k != 10 никогда не станет ложным, так как параметр цикла k при его увеличении на каждом шаге цикла на 2 будет иметь только нечетные значения. Правильной формулировкой условия является, например, такая: k < 10.
Пример 3. Для принудительного (досрочного) прекращения цикла можно использовать инструкцию break. Например:
while (<Выражение>)
{
<Инструкция 1>;
if (<Ошибка>)
break;
<Инструкция 2>;
}
<Инструкция 3>;
Если при выполнении <Инструкции 1> возникает ошибка (о чем свидетельствует значение true выражения <Ошибка>), после которой выполнение цикла должно быть прекращено, выполняется инструкция break. При выполнении инструкции break цикл прекращается (<Инструкция 2> выполнена не будет), и управление передается <Инструкции 3>, следующей за оператором цикла.
Пример 4. Если в предыдущем примере при возникновении ошибки требуется только пропустить выполнение <Инструкции 2), а затем продолжить выполнение цикла, следует использовать инструкцию continue:
while (<Выражение>)
{
<Инструкция 1>;
if (<Ошибка>)
continue;
<Инструкция 2>;
}
При выполнении инструкции continue <Инструкция 2> выполнена не будет, но цикл перейдет к выполнению следующей итерации (шага).
Инструкция continue на практике используется достаточно редко, так как обойтись без нее очень просто:
while (<Выражение>)
{
<Инструкция 1>;
if (!<Ошибка>)
{
<Инструкция 2>;
}
}Надо только не забыть инвертировать выражение <Ошибка>.
- 2. Структура и основные элементы программы
- 3.Общее понятие типов данных
- 4. Переменные и константы
- 5.Основные типы данных
- 6. Спецификаторы типов данных
- 7. Определение переменных и констант в программе
- 8. Инициализация переменных различных типов
- 9.Целочисленные типы данных
- 10. Вещественные типы данных
- 11. Особенности представления вещественных типов данных
- 12.Логический тип данных
- 13. Символьный тип данных
- 14. Управляющие последовательности
- 15. Операции и выражения
- 16. Операция присваивания, составные операции присваивания
- 17. Понятие l-значения
- 18. Преобразование типов данных
- 19. Арифметические операции
- 20. Операции инкремента и декремента, их разновидности
- 21. Операции отношения
- 22. Логические операции
- 23. Побитовые операции сдвига
- 24. Побитовые логические операции
- 25. Примеры применения побитовых операций
- 26. Условная операция и ее использование
- 27. Определение объема памяти, необходимого для размещения объектов
- 28. Понятие приоритета операций и его влияние на результаты вычислений
- 31.Флаги форматирования потоков ввода-вывода
- 32. Форматирование ввода-вывода с помощью манипуляторов
- 33.Форматирование ввода-вывода с помощью функций потоков ввода-вывода
- 34. Управление шириной поля вывода и выравниванием данных при выводе
- 35. Управление форматом вывода вещественных значений
- 36. Основные понятия структурного программирования
- 37. Базовый набор управляющих структур
- 39.Условная инструкция (if)
- 40. Инструкция множественного выбора (switch)
- 42. Цикл с постусловием (do while)
- 43. Итерационный цикл (for)
- 46. Инструкция перехода goto
- 47. Понятие рекуррентных вычислений, примеры
- 48. Понятие инварианта цикла
- 49. Понятие и определение массива
- 52. Ввод элементов массивов с клавиатуры
- 53. Декларативная и программная инициализация массивов
- 54. Копирование массивов
- 55. Нахождение минимальных и максимальных значений в массивах
- 56. Сдвиг элементов массивов
- 57. Перестановка элементов в массивах
- 58. Поиск данных в массивах
- 59. Сортировка данных в массивах
- 60. Вычисление сумм и произведений элементов массивов
- 61. Представление текстовых строк в виде массива символов
- 62. Ввод-вывод символьных строк
- 63. Определение фактической длины строки
- 64. Копирование символьных строк
- 65. Основные функции обработки строк библиотеки cstring
- 66. Массивы текстовых строк (двумерные массивы символов)
- 67. Указатели Понятие указателя
- Работа с указателями
- 68. Арифметика указателей
- 69. Индексирование указателей
- 70. Ссылки
- 71. Определение функции
- 72. Инструкция return
- 73. Завершение работы функции
- 74. Механизмы передачи данных через параметры функций
- 75. Передача данных по значению
- 76. Передача данных через указатели
- 77. Передача данных по ссылке
- 78. Параметры по умолчанию
- 79. Функции с переменным числом параметров
- 80. Inline функции
- 81. Перегрузка функций
- 82. Рекурсия
- 83. Прототипы функций