- •Глава II. Управляющие структуры
- •6. Операторы ветвления
- •6.1. Условный оператор if
- •6.2. Оператор switch
- •7. Операторы цикла
- •7.1. Цикл с параметром (цикл for)
- •7.2. Цикл с предусловием (цикл while)
- •7.3. Цикл с постусловием (цикл do … while)
- •7.4. Вложенные циклы
- •8. Операторы передачи управления
- •8.1. Оператор прерывания блока break
- •8.2. Оператор завершения итерации цикла continue
- •8.3. Оператор прерывания программы exit
- •8.4. Оператор безусловного перехода
- •Содержание
- •Глава II. Управляющие структуры 1
- •6. Операторы ветвления 2
- •6.1. Условный оператор if 2
6.2. Оператор switch
Оператор switch (переключатель) предназначен для разветвления процесса вычислений на несколько направлений. Формат оператора:
switch (переключающее выражение)
{
case константное_выражение_1: операторы_1;
case константное_выражение_2: операторы_2;
. . . . . . . .
case константное_выражение_n: операторы_n;
[default: операторы;]
}
Выполнение оператора начинается с вычисления переключающего выражения, которое должно быть целочисленным или его значение приводится к целому. Затем управление передается операторам, помеченным константным выражением, значение которого совпало с вычисленным, после чего последовательно выполняются все остальные ветви, если выход из переключателя явно не указан.
Все константные выражения должны иметь разные значения, но быть одного и того же целочисленного типа. Несколько меток могут следовать подряд. Если совпадения не произошло, выполняются операторы, расположенные после слова default (а при его отсутствии управление передается следующему за switch оператору).
Выход из переключателя обычно выполняется с помощью операторов break или return.
Пример. Программа, которая в зависимости от номера дня недели выводит его название.
#include <stdio.h>
void main()
{
int c;
printf ("Введите цифру от 1 до 7:\n");
scanf("%d",&c);
printf ("Соответствующий день недели:\n");
switch (c)
{
case 1: printf ("Понедельник - день тяжелый!\n"); break;
case 2: printf ("Вторник!\n"); break;
case 3: printf ("Среда!\n"); break;
case 4: printf ("Четверг!\n"); break;
case 5: printf ("Пятница!\n"); break;
case 6: printf ("Суббота!\n"); break;
case 7: printf ("Воскресенье! Ура!\n"); break;
default: printf ("Это не цифра от 1 до 7\n");
}
}
Пример. Программа, которая в зависимости от порядкового номера месяца (1, 2, …) выводит на экран соответствующее этому месяцу название времени года.
#include <stdio.h>
void main()
{
int n;
printf ("Введите номер месяца:\n");
scanf("%d",&n);
printf ("Время года: ");
switch (n)
{
case 1: case 2: case 12: printf ("зима\n"); break;
case 3: case 4: case 5: printf ("весна\n"); break;
case 6: case 7: case 8: printf ("лето\n"); break;
case 9: case 10: case 11: printf ("осень\n"); break;
default: printf ("Номер месяца введен неверно\n");
}
}
Обратите внимание, что если после метки с двоеточием идет несколько операторов, то их необязательно помещать в блок с помощью скобок { }.
Метки не изменяют последовательности выполнения операторов. Если не предусмотрены переходы или выход из переключателя, то в нем последовательно выполняются все операторы, начиная с той метки, на которую передано управление. Проиллюстрируем указанную особенность на примере.
Пример. Программа, выводящая названия нечетных целых цифр, не меньших заданной.
#include <stdio.h>
void main()
{
int cif;
printf ("Введите любую десятичную цифру:\n");
scanf("%d",&cif);
switch (cif)
{
case 0: case 1: printf ("один, ");
case 2: case 3: printf ("три, ");
case 4: case 5: printf ("пять, ");
case 6: case 7: printf ("семь, ");
case 8: case 9: printf ("девять\n"); break;
default: printf ("Ошибка! Это не цифра!\n");
}
}
Пусть, например, была введена цифра 6. Компьютер "найдет" метку case 6 и выполнит все операторы, идущие за этой меткой:
case 7: printf ("семь, ");
case 8:
case 9: printf ("девять\n"); break;
Таким образом, на экран будет выведено: семь, девять.
Если поместить оператор break после вывода каждой цифры, то программа будет выводить название только одной нечетной цифры.
