Книга: Язык Си - руководство для начинающих

МНОЖЕСТВЕННЫЙ ВЫБОР: ОПЕРАТОРЫ switch И break

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

/*животные*/

main( )

 {

 char ch;

printf("Введите букву алфавита, а я укажу");

printf("название животного, n начинающееся с нее.n");

printf("Введите, пожалуйста,  букву;  для завершения работы введите #. n");

while((ch = getchar())!= '#')

{

  if(ch != 'n')  /* пропуск символа "новая строка" */

{    if(ch >= 'a' && ch <= 'я')  /*разрешены только строчные буквы */

    switch (ch)

    { case 'a' : printf(" аргали, дикий горный азиатский баранn");

                 break;

      case 'б' : printf(" бабирусса,  дикая малайская свинья n");

                 break;

     case 'в' : printf(" выхухоль, водоплавающий крот n");

                 break;

      case 'г' : printf(" гиббон, длиннорукая обезьяна n");

                 break;

      case 'д' : printf(" дамандревесныйn");

                 break;

        default: printf(" Это трудная задача!n");

                 break;

    } else

        printf(" Я распознаю только строчные буквы. n");

  printf(" Введите, пожалуйста, следующую букву или #.n");

} /* конец if, пропускающего символ "новая строка" */

} /* конец цикла while */

}

РИС. 7.7. Программа, печатающая названия животных.

     Нам стало скучно продолжать, и мы остановились на букве д. Давайте теперь рассмотрим один пример выполнения программы перед тем, как обсудить использованные в ней новые средства языка.

Введите букву алфавита, а я укажу название животного, начинающееся с нее.

 Введите, пожалуйста, букву; для завершения работы введите #.

 а [возврат]

аргали, дикий горный азиатский баран Введите, пожалуйста, следующую букву или #. г

 [возврат]

гиббон, длиннорукая обезьяна Введите, пожалуйста, следующую букву или #. р

 [возврат]

Это трудная задача!

Введите, пожалуйста, следующую букву или #. Т

 [возврат]

Я распознаю только строчные буквы. Введите, пожалуйста, следующую букву или #. #

[возврат]

     Этот пример служит иллюстрацией работы оператора swith. Вначале вычисляется выражение в скобках, расположенное за ключевым словом switch. В данном случае значением этого выражения будет символ, присвоенный переменной ch, который мы ввели перед этим. Затем программа просматривает список "меток" (в этом примере case 'a':, case'б': и т. д.) до тех пор, пока не находит "метку", которая соответствует данному значению. Далее программа переходит к выполнению оператора, расположенного в этой строке. Что произойдет в случае, когда такой подходящей строки не найдется? Если существует строка с "меткой" case default:, то будет выполняться оператор, помеченный этой меткой. В противном случае произойдет переход к оператору, расположенному за оператором switch.

     Что можно сказать по поводу оператора break? Его выполнение приводит к тому, что в программе происходит выход из оператора switch и осуществляется переход к следующему за ним оператору (см. рис. 7.8). При отсутствии оператора break будут выполнены все операторы, начиная с помеченного данной меткой и завершая оператором switch. Если удалить все операторы break из нашей программы, то, указав, например, букву г, получим следующий диалог:

Введите букву алфавита, а я укажу название животного,  начинающееся с нее.

Введите, пожалуйста, букву; для завершения работы введите #.

г [возврат]

гиббон, длиннорукая обезьяна

даман древесный

это трудная задача

Введите, пожалуйста, следующую букву или #.

# [возврат]

     Мы видим, что выполнились все операторы, начиная от метки case 'г' и кончая оператором switch. Если вы знакомы с языком Паскаль, то можете заметить, что оператор switch в Си похож на оператор case в Паскале. Важнейшее отличие состоит в том, что если вы хотите, чтобы в каждом конкретном случае выполнялся только помеченный оператор, то в операторе switch необходимо использовать операторы break.

     Метки, имеющиеся в операторе switch, должны быть константами или константными выражениями (выражения, операнды которого константы) целого типа (включая тип char). Запрещается использовать в качестве метки переменную. Значением выражения в скобках должна быть величина целого типа (опять же, включая тип char). Ниже приводится общая структура оператора switch:

switch(целоe выражение)

{ case константа1 : операторы; (необязательные)

  case константа2 : операторы; (необязательные)

  case default (необязательные) : операторы; (необязательные)

}

  switch (number)

{

  case 1: оператор1;

          break;

  case 2: оператор 2;

          break;

  сазе 3: оператор 3;

          break;

  default:оператор4;

}

оператор5;

  switch (number) {

case 1:  оператор 1;

case 2:  оператор 2;

case 3:  оператор 3;

defauit:  оператор 4;

}

оператор 5;

В обоих случаях значение number равно 2.

РИС. 7.8. Ход выполнения программы, использующей оператор switch при наличии или в отсутствии операторов break

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

case 'E':

case 'e':

         printf(" ехидна, муравьед колючий n" );

         break;

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

     Наша программа имеет две небольшие особенности, о которых мы хотели бы упомянуть.

     Первая поскольку мы собираемся использовать программу в диалоговом режиме, мы решили воспользоваться символом # вместо EOF в качестве признака прекращения ее работы. В работе компьютера могли бы возникнуть сложности, если бы он предложил нам ввести признак EOF или даже какой-нибудь управляющий символ, между тем как символ # вполне подходит для этой цели. Поскольку теперь отсутствует необходимость чтения символа EOF, мы не должны описывать в программе переменную ch типа int.

     Вторая мы использовали оператор if, который позволяет игнорировать символы "новая строка" при вводе символов в программу. Это тоже некоторая плата за возможность диалоговой работы. Без этого оператора if каждый раз при нажатии клавиши [возврат] программе пришлось бы рассматривать данный признак как прочитанный символ.

     Когда требуется использовать оператор switch, а когда конструкцию else-if? Часто у нас нет возможности выбора. Вы не можете применить оператор switch, когда выбор вариантов основывается на вычислении значения переменной или выражения типа int. Удобного способа воспользоваться оператором switch в случае когда возможные значения переменной попадают в некоторый диапазон, также не существует. Проще написать, например, так:

if(integer < 1000 && integer > 2)

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

Оглавление книги


Генерация: 6.614. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз