Оператор выбора 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 — переворот.
  • Каждое отдельное сравнение в составном условии обязательно берут в скобки.
  • Приоритет связок: notandor; для ясности расставляйте скобки.
Проверьте себя
1. Для какого случая оператор case подходит лучше, чем цепочка if?
AКогда нужно сравнить дробные числа
BКогда выбор идёт по конкретным значениям одной переменной
CКогда есть только два варианта
DКогда условие проверяет диапазон 'больше 50'
2. Когда истинно выражение (a > 0) and (b > 0)?
AКогда истинно хотя бы одно из условий
BКогда оба условия истинны одновременно
CКогда оба условия ложны
DВсегда
3. Почему в условии (x > 0) and (x < 10) каждое сравнение берут в скобки?
AСкобки ускоряют выполнение
BБез скобок из-за приоритета операций Паскаль поймёт условие неправильно и выдаст ошибку
CЭто требование оператора case
DСкобки нужны только в Python
Поддержать проект