Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник Моя первая программа на С++.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

Конструкция switch/case/default

Если в программе следует учесть больше трех возможных вариантов, конструкция с вложенными инструк- циями if...else может оказаться очень запутанной. В таких случаях в качестве альтернативы используется переключатель switch. Переключатель switch представляет собой структуру, построенную по принципу меню, и содержит все возможные варианты условий и инструкции, которые следует выполнить в каждом конкретном случае. Пример подобной конструкции приведен в Листинге8.7.

Листинг 8.7. Программа, в которой используется инструкция switch.

/*switch.c*/ main()

{

int answer; puts("Си это: \n"); puts("1. Язык, на котором

говорят на юге Франции\n");

puts("2. Язык, который используется только для написания \

больших компьютерных программ\n");

puts("3. Компилирующий язык, легко совместимый с любыми системами\n"); puts("4. Ничего из перечисленного\n"); puts("Введите номер ответа\n");

answer = getchar(); putchar('\n'); switch (answer)

{

case '1':

puts("К сожалению, Вы ошиблись, \

на юге Франции говорят на языке Паскаль\n");

break;

case '2':

puts("Вы ошибаетесь,

язык Си используют для написания программ\n");

puts("любых типов и размеров\n"); break;

case '3':

дали правильный ответ\n");

puts("Очень хорошо, Вы

puts("Си является

компилирующим языком и может использоваться\n");

puts("с

любыми компьютерными системами\n");

break;

case '4':

puts("К сожалению,

Вы ошибаетесь, правильный ответ - номер 3\n");

break;

default:

не соответствующий \

puts("Вы ввели символ,

ни одному из номеров ответа\n");

}

В круглых скобках после переключателя switch находится переменная типа int или char, следом располо- жен блок инструкций, заключенных в фигурные скобки, которые содержат ряд ветвей case. Каждая ветвь case выполняет инструкции, основываясь на возможном значении переменной. Это значение должно быть представлено в виде целого числа или символа, заключенного в одинарные кавычки, либо в виде имени целочисленной или символьной константы.

Ветвь case '1':, например, предписывает программе выполнить следующие ниже инструкции, если значе- ние переменной переключателя switch соответствует символу '1'. Если значение переменной отличается от единицы, компилятор переходит к проверке условия второй ветви case.

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

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

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

case 'Y':

case 'y': puts ("Вы ответили \"Да\"");

break;

case 'N':

case 'n': puts ("Вы ответили \"Нет\""); break;

Проверка чисел с плавающей точкой и строк

Мы уже говорили, что в ветви case значение условия должно быть целым числом или символом. Поэтому нельзя написать инструкцию типа case 12.87: или case "Adam". Строки будут подробно рассматриваться в главе 10. Что касается значений типа float, то если вы хотите проверить такое значение, оно должно быть каким-то образом преобразовано в формат целого числа или символа.

В большинстве случаев для преобразования формата можно использовать конструкцию if...else. В Листин- ге8.8 приведен текст программы, в которой конструкция if...else присваивает целочисленное значение пе- ременной level, основываясь на значении типа float, присвоенном переменной income.

Листинг 8.8. Использование вложенных инструкций if для преобразования чисел с плавающей точкой.

/*switch.c*/ main()

{

float income; char level;

printf("Введите сумму Вашего годового дохода: "); scanf("%f", &income);

if(income<= 20000.00)

level = '1';

else

if(income<= 60000.00)

level = '2';

else if(income<= 120000.00)

else

switch(level)

{

case '1':

level = '3';

level = '4';

case '2':

case '3':

case '4':

default:

puts("Ставка налога = 15%"); break;

puts("Ставка налога = 28%"); break;

puts("Ставка налога = 32%"); break;

puts("Ставка налога = 36%"); break;

puts("Вы

неправильно ввели сумму дохода");

}

}

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