Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория ответы.doc
Скачиваний:
39
Добавлен:
24.12.2018
Размер:
1.61 Mб
Скачать
  1. Алгоритмы с ветвлением. Инструкция switch. Вложенные инструкции switch. Примеры в реальных задачах.

Инструкция switch

Инструкция switch — это инструкция многонаправленного ветвления, которая позволяет выбрать одну из множества альтернатив.

Прежде чем переходить к изучению других циклических С++-конструкций, познакомимся с еще одной инструкцией выбора — switch. Инструкция switch обеспечивает многонаправленное ветвление. Она позволяет делать выбор одной из множества альтернатив. Хотя многонаправленное тестирование можно реализовать с помощью последовательности вложенных if-инструкций, во многих ситуациях инструкция switch оказывается более эффективным решением. Она работает следующим образом. Значение выражения последовательно сравнивается с константами из заданного списка. При обнаружении совпадения для одного из условий сравнения выполняется последовательность инструкций, связанная с этим условием. Общий формат записи инструкции switch таков.

switch (выражение) {

case константа1: последовательность инструкций break;

case константа2: последовательность инструкций break;

case константаЗ: последовательность инструкций break;

default: последовательность инструкций

}

Элемент выражение инструкции switch должен при вычислении давать целочисленное или символьное значение. (Выражения, имеющие, например, тип с плавающей точкой, не разрешены.) Очень часто в качестве управляющего switch-выражения используется одна переменная.

Инструкция break завершает выполнение кода, определенного инструкцией switch.

Последовательность инструкций default-ветви выполняется в том случае, если ни одна из заданных case-констант не совпадет с результатом вычисления switch-выражения. Ветвь default необязательна. Если она отсутствует, то при несовпадении результата выражения ни с одной из case-констант никакое действие выполнено не будет. Если такое совпадение все-таки обнаружится, будут выполняться инструкции, соответствующие данной case-ветви, до тех пор, пока не встретится инструкция break или не будет достигнут конец switch-инструкции (либо в default-, либо в последней case-ветви).

Инструкции default-ветви выполняются в том случае, если ни одна из case-констант не совпадет с результатом вычисления switch-выражения.

Итак, для применения switch-инструкции необходимо знать следующее.

  • Инструкция switch отличается от инструкции if тем, что switch-выражение можно тестировать только с использованием условия равенства (т.е. на совпадение switch-выражения с заданными case-константами), в то время как условное i f-выражение может быть любого типа.

  • Никакие две case-константы в одной switch-инструкции не могут иметь идентичных значений.

  • Инструкция switch обычно более эффективна, чем вложенные if-инструкции.

  • Последовательность инструкций, связанная с каждой case-ветвью, не является блоком. Однако полная switch-инструкция определяет блок. Значимость этого факта станет очевидной после того, как вы больше узнаете о C++.

Согласно стандарту C++ switch-конструкция может иметь не более 16 384 case-инструкций. Но на практике (исходя из соображений эффективности) обычно ограничиваются гораздо меньшим их количеством.

Использование switch-инструкции демонстрируется в следующей программе. Она создает простую "справочную" систему, которая описывает назначение for-, if- и switch-инструкций. После отображения списка предлагаемых тем, по которым возможно предоставление справки, программа переходит в режим ожидания до тех пор, пока пользователь не сделает свой выбор. Введенное пользователем значение используется в инструкции switch для отображения информации по указанной теме. (Вы могли бы в качестве упражнения дополнить информацию по имеющимся темам, а также ввести в эту "справочную" систему новые темы.)

// Демонстрация switch-инструкции на примере простой «справочной» системы.

#include <iostream.h>

int main(){

int choice;

cout<<"Справка по темам:\n\n";

cout<< "1. for\n";

cout<< "2. if\n";

cout<< "3. switch\n\n";

cout << "Введите номер темы (1-3): ";

cin >> choice; cout << "\n";

switch(choice) {

case 1: cout << "for - это самый универсальный цикл в С++.\n"; break;

case 2: cout << "if - это инструкция условного ветвления.\n"; break;

case 3: cout << "switch - это инструкция многонаправленного ветвления.\n"; break;

default: cout << "Вы должны ввести число от 1 до З.\n";

return 0; }

Вот один из вариантов выполнения этой программы.

Справка по темам:

  1. for

  2. if

3. switch

Введите номер темы (1-3): 2

if - это инструкция условного ветвления.

Формально инструкция break необязательна, хотя в большинстве случаев использования switch-конструкций она присутствует. Инструкция break, стоящая в последовательности инструкций любой case-ветви, приводит к выходу из всей switch-конструкции и передает управление инструкции, расположенной сразу после нее. Но если инструкция break в case-ветви отсутствует, будут выполнены все инструкции, связанные с данной case-ветвью, а также все последующие инструкции, расположенные под ней, до тех пор, пока все-таки не встретится инструкция break, относящаяся к одной из последующих case-ветвей, или не будет достигнут конец switch-конструкции.

Рассмотрим внимательно следующую программу. Попробуйте предугадать, что будет отображено на экране при ее выполнении.

#include <iostream.h>

int main() {

int i;

for(i=0; i<5; i++)

{ switch(i) {

case 0: cout << "меньше l\n";

case 1: cout << "меньше 2\n";

case 2: cout << "меньше 3\n";

case 3: cout << "меньше 4\n";

case 4: cout << "меньше 5\n"; }

cout << '\n'; }

return 0; }

Вот как выглядят результаты выполнения этой программы.

меньше 1 меньше 2 меньше 3 меньше 4 меньше 5

меньше 2 меньше 3 меньше 4 меньше 5

меньше 3 меньше 4 меньше 5

меньше 4 меньше 5

меньше 5

Как видно по результатам, если инструкция break в одной case-ветви отсутствует, выполняются инструкции, относящиеся к следующей case-ветви.

Как показано в следующем примере, в switch-конструкцию можно включать "пустые" case-ветви.

switch (i) {

case 1:

case 2:

case 3: do_something (); break;

case 4: do_something_else(); break;

}

Если переменная i в этом фрагменте кода получает значение 1, 2 или 3, вызывается функция do_something (). Если же значение переменной i равно 4, делается обращение к функции do_something_else (). Использование "пачки" нескольких пустых case-ветвей характерно для случаев, когда они используют один и тот же код.

Вложенные инструкции switch

Инструкция switch может быть использована как часть case-последовательности внешней инструкции switch. В этом случае она называется вложенной инструкцией switch. Необходимо отметить, что case-константы внутренних и внешних инструкций switch могут иметь одинаковые значения, при этом никаких конфликтов не возникнет. Например, следующий фрагмент кода вполне допустим.

switch(chl) {

case 'A': cout <<"Эта константа А - часть внешней инструкции switch";

switch(ch2) { case 'A': cout « "Эта константа А - часть внутренней инструкции switch";

break;

case 'В': // ...

break;

}

case 'B': // ...

}