Оператор выбора (PascalABC.NET)
Теория с примерами
Условный оператор и условная операция позволяют выбрать один вариант из двух. Когда вариантов больше, приходится вкладывать анализ одного условия в другое. При большом количестве вариантов получаются достаточно громоздкие и запутанные конструкции. Решение проблемы предлагает оператор выбора.
1 case Переключатель of
2 СписокВыбора1: Оператор1;
3 СписокВыбора2: Оператор2;
4 …
5 СписокВыбораN: ОператорN;
6 else
7 ГруппаОператоров
8 end;
Переключатель – это выражение так называемого порядкового типа. Нам важно сейчас, что оно может быть, в том числе, типа integer. Работа оператора выбора происходит следующим образом. Значение переключателя отыскивается в списках выбора, начиная от первого по порядку. Если поиск удачен, выполняется соответствующий оператор и на этом работа оператора выбора заканчивается. Если поиск неуспешен, выполняется группа операторов, указанная после else. Ветка else может отсутствовать и тогда при неуспешном поиске оператор вывода не делает ничего.
Рассмотрим пример. Достаточно часто встречается задача на сравнение двух целочисленных значений.
Исходов у такого сравнения три: первое значение больше, значения равны, второе значение больше. Начинающие программировать обычно используют связку из пары условных операторов, но есть и другое решение – с помощью оператора выбора. Оно не совсем очевидно: ведь этот оператор использует константы порядкового типа, а сравнение – логическая операция. Но ведь ничто не мешает результат сравнения «вычислить», например, найти разность первого и второго значения. А переводить знак этой разности в число умеет функция Sign(x).
1 ##
2 var (a, b) := ReadInteger2('Введите два числа:');
3 case Sign(a - b) of
4 1: Print('Первое число больше');
5 0: Println('Числа равны');
6 -1: ('Второе число больше');
7 end;
Задачи
День недели
Составить программу, которая в зависимости от порядкового номера дня недели (1, 2, …, 7) выводит на экран его название (понедельник, вторник, ..., воскресенье).
Пример простейшей задачи, программируемой «в лоб», т.е. не раздумывая.
1 ##
2 var n := ReadInteger('Укажите номер дня недели (1 - 7):');
3 case n of
4 1: Print('Понедельник');
5 2: Print('Вторник');
6 3: Print('Среда');
7 4: Print('Четверг');
8 5: Print('Пятница');
9 6: Print('Суббота');
10 7: Print('Воскресенье');
11 else
12 Print('Введен недопустимый номер дня')
13 end;
Укажите номер дня недели (1 - 7): 3 Среда
Время года
Составить программу, которая в зависимости от порядкового номера месяца (1, 2, ..., 12) выводит на экран время года, к которому относится этот месяц.
Примеры записи списков выбора. Элементы списка перебираются по очереди и непринципиально, как строить список месяцев для зимы: 1, 2, 12 или 12, 1, 2. Элементы списка можно перечислять через запятую или задавать в виде диапазона (например, 3..5 означает «от трех до пяти», причем обе заданные границы также входят в диапазон).
1 ##
2 var n := ReadInteger('Укажите номер месяца (1 - 12):');
3 case n of
4 1, 2, 12: Print('Зима');
5 3..5: Print('Весна');
6 6..8: Print('Лето');
7 9..11: Print('Осень');
8 else
9 Print('Введен недопустимый номер месяца');
10 end