Оператор выбора case и логические выражения
Урок знакомит с оператором выбора case для множества вариантов и логическими связками and, or, not для сложных условий.
case выбирает одну из многих ветвей по значению переменной; and, or, not объединяют несколько условий в одно.
Когда if становится громоздким
Цепочка if-else if-else if... хорошо работает для двух-трёх вариантов. Но представьте программу, которая по номеру дня недели (1–7) печатает его название. Семь вариантов через else if — это длинно и неуклюже. Для таких случаев, когда выбор идёт по конкретным значениям одной переменной, в Паскале есть более изящный инструмент — оператор выбора case.
Оператор case
Оператор case сравнивает значение переменной с набором вариантов и выполняет подходящую ветку:
var
day: integer;
begin
day := 3;
case day of
1: writeln('Понедельник');
2: writeln('Вторник');
3: writeln('Среда');
4: writeln('Четверг');
5: writeln('Пятница');
6, 7: writeln('Выходной');
else
writeln('Нет такого дня');
end;
end.
Читается так: «рассмотреть значение day: если 1 — печатать Понедельник, если 2 — Вторник...». Заметьте удобство: в одной ветке можно перечислить несколько значений через запятую (6, 7 — оба дают «Выходной»), а ветка else срабатывает, если ни один вариант не подошёл. Завершается конструкция словом end. Запустите аналог на Python через словарь:
day = 3
names = {1: 'Понедельник', 2: 'Вторник', 3: 'Среда',
4: 'Четверг', 5: 'Пятница', 6: 'Выходной', 7: 'Выходной'}
print(names.get(day, 'Нет такого дня'))
Вывод:
Среда
Важное ограничение: case работает только с целыми числами, символами и подобными «перечислимыми» типами. Сравнивать через case дробные real или диапазоны вроде «больше 50» нельзя — для этого нужен if. Но в PascalABC.NET можно делать case и по строкам, и по диапазонам (1..5: ...) — приятное расширение.
Логические выражения: зачем они нужны
Часто решение зависит не от одного условия, а от нескольких сразу. «Пускать в кино, если возраст больше 16 и есть билет». «Скидка, если ты студент или пенсионер». Чтобы объединять условия, в Паскале есть три логические связки: and (и), or (или), not (не).
| Связка | Смысл | Истинно, когда... |
and | И | оба условия истинны |
or | ИЛИ | хотя бы одно условие истинно |
not | НЕ | условие ложно (переворачивает) |
and: оба условия
Связка and истинна, только когда оба условия выполнены одновременно. Классический пример — проверка попадания числа в диапазон:
var
age: integer;
begin
age := 25;
if (age >= 18) and (age <= 65) then
writeln('Трудоспособный возраст')
else
writeln('Вне диапазона');
end.
Очень важная деталь: каждое сравнение берут в скобки. Запись age >= 18 and age <= 65 без скобок Паскаль поймёт неправильно из-за приоритета операций. Всегда оборачивайте отдельные условия в скобки: (...) and (...).
or: хотя бы одно
Связка or истинна, если выполнено хотя бы одно из условий (или оба):
var
day: integer;
begin
day := 7;
if (day = 6) or (day = 7) then
writeln('Выходной!')
else
writeln('Рабочий день');
end.
day = 7
if day == 6 or day == 7:
print('Выходной!')
else:
print('Рабочий день')
Вывод:
Выходной!
not: переворот условия
Связка not переворачивает значение: истину делает ложью и наоборот. not (x = 5) означает «x не равно 5» (то же, что x <> 5). Часто not применяют к логическим переменным:
var
isRaining: boolean;
begin
isRaining := false;
if not isRaining then
writeln('Можно гулять без зонта');
end.
Логические связки можно комбинировать, но при этом важен приоритет: сначала not, потом and, потом or. И снова главный совет: ставьте скобки, чтобы не гадать о порядке. (a > 0) and ((b > 0) or (c > 0)) — явно и понятно.
Попробуй сам
Напишите программу, которая по введённому году определяет, високосный он или нет. Год високосный, если делится на 4, но не на 100, либо делится на 400. Условие: (year mod 4 = 0) and (year mod 100 <> 0) or (year mod 400 = 0). Проверьте на Python для 2024:
year = 2024
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
print('Високосный')
else:
print('Обычный')
Вывод:
Високосный
Частые ошибки
- Нет скобок вокруг сравнений.
x > 0 and x < 10вызовет ошибку. Нужно(x > 0) and (x < 10). - Путают and и or. «В диапазоне от A до B» — это
and(оба условия), а «равно A или B» — этоor. - Двоеточие вместо точки с запятой в case. После значения ставится двоеточие, а ветки разделяются точкой с запятой; завершается
caseсловомend. - case по дробным числам.
caseне работает с типом real — для дробных используйтеif.
Итоги
case переменная ofудобно выбирает ветку по конкретным значениям; в одной ветке можно перечислить значения через запятую, аelseловит остальные.caseработает с целыми и символами, но не с дробными числами и не с диапазонами «больше/меньше» (в классике).- Логические связки:
and— оба условия,or— хотя бы одно,not— переворот. - Каждое отдельное сравнение в составном условии обязательно берут в скобки.
- Приоритет связок:
not→and→or; для ясности расставляйте скобки.