Урок 5.5. Оператор выбора switch

5.5. Оператор выбора switch

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

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

case <конст. выражение 1> : <оператор(ы)1>

case <конст. выражение 2> : <оператор(ы)2>

...

case <конст. выражение N> : <оператор(ы)N>

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

}

После ключевого слова switch в скобках записывается выражение, результат выполнения которого обязательно должен иметь тип int. Далее в фигурных скобках записываются операторы варианта, помеченные префиксами вида: case <конст.выражение N>:, в которых константное выражение также должно быть целым, а все префиксы должны быть различными. Один из вариантов может быть отмечен префиксом default. Наличие варианта default необязательно, но чаще всего он присутствует в конструкции switch.

Оператор выбора работает следующим образом. Вначале вычисляется выражение в круглых скобках <выражение>. Значение <выражение> сравнивается с константными выражениями case-префиксов операторов варианта и выполняется i-тый вариант, для которого эти значения совпадают. После завершения выполнения операторов выбранного варианта выполняются операторы следующего за ним варианта и т.д., до исчерпания всех операторов варианта.

Fig5.3

Рис.5.3. Алгоритмическая схема выполнения оператора switch.

Если значение выражения в switch не совпадает ни с одним вариантом, то либо выполняется оператор варианта по умолчанию default (если он присутствует), либо не выполняется никакой вариант (если нет варианта по умолчанию default). На рис.5.3. представлена алгоритмическая схема выполнения оператора switch.

Рассмотрим пример использования оператора switch. Допустим, необходимо написать фрагмент программы, которая печатает некоторое четверостишие, начиная с k-той строки:

   switch(k)
   {
    case 1 : printf("У Лукоморья дуб зеленый\n");
    case 2 : printf("Златая цепь на дубе том\n");
    case 3 : printf("И днем и ночью кот ученый\n");
    case 4 : printf("Все ходит по цепи кругом\n");
    default: printf("А.С.Пушкин\n"); 
    }

Например, при k, равном 3, программа отработала бы следующим образом:
И днем и ночью кот ученый
Все ходит по цепи кругом
А.С.Пушкин.

При k, равном 5, программа отработала бы так:

А.С.Пушкин.


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

switch (<выражение>)
{
case <конст. выражение 1> : <оператор(ы)1>
                                                    [break]
case <конст. выражение 2> : <оператор(ы)2>
                                                    [break]
                                                    ...
case <конст. выражение N> : <оператор(ы)N>
                                                    [break]
                                   default : <оператор(ы)>
                                                  [break]
}

Операторы break записываются в вариантах по необходимости, и там, где они есть, выполнение break приводит к передаче управления за пределы переключателя, т.е. начинает выполняться оператор программы, записанный после закрывающей фигурной скобки оператора switch.

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

Fig5.4

Рис.5.4. Алгоритмическая схема выполнения оператора switch c break'ом.

Приведем пример использования оператора break в переключателе. Для этого изменим постановку предыдущей задачи следующим образом: написать фрагмент программы, печатающей к-ую строку четверостишия (в отличие от предыдущего случая, когда необходимо было напечатать четверостишие, начиная с к-ой строки).

   switch(k)
   {
    case 1 : printf("У Лукоморья дуб зеленый\n");
             break;
    case 2 : printf("Златая цепь на дубе том\n");
             break;
    case 3 : printf("И днем и ночью кот ученый\n");
             break;
    case 4 : printf("Все ходит по цепи кругом\n");
             break;
    default: printf("В стихотворении нет строки с таким номером\n");
  }

В заключение раздела отметим, что операторы в case-вариантах и default-варианте могут отсутствовать. Это используется тогда, когда мы желаем получить одинаковый результат при переходе к разным префиксам. Например, фрагмент программы:

case 'K':
case 'k': printf("компьютер\n");
break;

показывает, что будет напечатано слово компьютер в том случае, если на вход переключателя поступит буква k независимо от того, строчная или прописная. Если поступит буква К, то это вызовет выполнение соответствующего варианта, но поскольку там операторы отсутствуют, то будут выполняться операторы, расположенные ниже, пока не встретится оператор break.
Этот же прием можно реализовать по-другому, указав два или более case-префикса перед одним вариантом, например, так:
case 'K': case 'k':printf("компьютер\n"); break;

Эти примеры говорят о том, что <выражение> в switch и <конст.выр> в case могут быть и типа char. Это правомерно, ибо переменные и константы типа char интерпретируются как целые числа типа int.

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов