M. УЭИТ - Язык Си - руководство для начинающих
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, ваша программа будет выполняться более эффективно.
Резюме: множественный выбор вариантов с помощью оператора switch
Управление в программе передается оператору, у которого в качестве метки используется значение некоторого выражения. Затем в процессе прохождения программы будут выполняться оставшиеся операторы, пока не произойдет новый переход.
Как выражения, так и метки должны иметь значения целого типа (включая тип char), метки должны быть константами или константными выражениями. Если не которому значению выражения не соответствует никакая метка, управление передается оператору с меткой default (если такой имеется). В противном случае, управление передается оператору, следующему за оператором switch.
III. Форма:
switch (выражение)
{ case метка1: оператор1
case метка2: оператор2
default: оператор3
}
В операторе может присутствовать более чем 2 помеченных оператора, а наличие метки default является необязательным.
IV. Пример
switch (letter)
{
case 'a':
case 'e': printf(" %c - этогласнаяn ", letter);
case 'c':
case 'n': printf(" Символ%свнаборебукв саnе n ", letter);
default: printf(" Добрыйдень. n" );
}
Если переменная letter имеет значение 'a' или 'e', будут выведены на печать все три сообщения, если же 'c' или 'n', то последние два. В случае остальных значений будет напечатано только последнее сообщение.
Изложенный здесь материал позволит вам писать гораздо более мощные и обладающие большими возможностями программы, чем раньше. В справедливости этого утверждения вы сможете убедиться, если сравните некоторые из примеров, приведенных в данной главе, с программами, рассмотренными в предыдущих главах. Но вы изучили еще далеко не все. Вот почему вам придется одолеть еще немало страниц этой книги.
ЧТО ВЫ ДОЛЖНЫ БЫЛИ УЗНАТЬ В ЭТОЙ ГЛАВЕ
Как осуществить выбор из двух возможностей выполнить оператор или пропустить его: с помощью оператора if.
Как осуществить выбор одного из двух вариантов: с помощью оператора if-else.
Как осуществить выбор одного из нескольких вариантов: с помощью операторов else-if, switch
Операции отношения: > >= = = <= < !=
Логические операции: && || !
ВОПРОСЫ И ОТВЕТЫ
Вопросы
1. Определите, какие выражения истинны, а какие ложны.
а. 100 > 3
б. 'а' > 'с'
в. 100 > 3 && 'а' > 'с'
г. 100 > 3 || 'a' > 'с'
д. !(100 > 3)
2. Запишите выражения, соответствующие следующим условиям
а. Значение number равно или больше 1, но меньше 9
б. Значение ch не равно q или k
в. Значение number лежит между 1 и 9, но не равно 5
г. Значение number не лежит между 1 и 9
3. В программе, приведенной ниже, наряду с неоправданно сложными условными выражениями имеются и прямые ошибки. Уточните эту программу и исправьте в ней ошибки.
main( ) /* 1 */
{ /* 2 */
int weight, height; /* вес в фунтах, рост в дюймах */
/* 4 */
scanf('' %d, weight, height); /* 5 */
if(weight < 100) /* 6 */
if (height >= 72) /* 7 */
printf(" Для такого веса у вас слишком большой рост n");
else if (height < 72 && > 64) /* 9 */
printf(" У вас большой рост для вашего веса. n" );
else if (weight > 300 && !(weight < = 300)) /* 11*/
if( !(height >= 48) /* 12 */
printf(" Для такого веса у вас слишком маленький рост.n" );
else /* 14 */
printf(" У вас идеальный вес. n"); /* 15*/
/* 16 */
}
Ответы
1. Выражения истинны в вопросах а и г
2. a. number > = 1 && number < 9
б. ch != 'q' && ch != k
Замечание: выражение ch != q || ch!= k всегда будет иметь значение "истина", потому что если переменная сh равна q, то она не может равняться k, и второе условие оказывается выполненным врезультате все выражения "ИЛИ" будет истинным.
в. number > 1 && number < 9 && number != 5
г. !(number > 1 && number < 9) или number < = 1 || number > = 9
Замечание: сказать, что число НЕ лежит между 1 и 9 это то же самое, что сказать: число равно или меньше 1 ИЛИ равно или больше 9. Вторая форма несколько неуклюже звучит на словах, но проще записывается в виде выражения.
3. Строка 5: должна выглядеть так scanf(" %d %d", &weight, &height). He забывайте указывать символы в качестве префиксов имен переменных в функции scanf( ). Кроме того, данной строке должна предшествовать строка, предлагающая ввести данные.
Строка 9: подразумеваемое выражение должно выглядеть так: (height < 72 && height > 64). Однако первая часть этого выражения необязательна, поскольку величина height, если поток управления достигнет записи else-if, будет обязательно меньше 72. Поэтому более простое условие (height > 64) в данном случае служит той же цели.