Оператор выбора (PascalABC.NET)

Материал из Информационная безопасностя
Версия от 20:16, 9 мая 2023; Безуглов Сергей (обсуждение | вклад) (Новая страница: «{{TOCRight}} == Теория с примерами == Условный оператор и условная операция позволяют выбрать о...»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Теория с примерами

Условный оператор и условная операция позволяют выбрать один вариант из двух. Когда вариантов больше, приходится вкладывать анализ одного условия в другое. При большом количестве вариантов получаются достаточно громоздкие и запутанные конструкции. Решение проблемы предлагает оператор выбора.

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