Урок 4. Условия — if и case
До сих пор программы выполняли все строки подряд. Но часто действие зависит от данных: число чётное или нечётное, пароль верный или нет, оценка высокая или низкая. Для этого есть условный оператор if и оператор выбора case.
if … then … else
program EvenOdd;
var
n: integer;
begin
readln(n);
if n mod 2 = 0 then
writeln(n, ' — чётное')
else
writeln(n, ' — нечётное');
end.1414 — чётноеЧитается как по-английски: «если n mod 2 = 0, то вывести „чётное“, иначе — „нечётное“». После then — то, что делается при выполненном условии, после else — при невыполненном. Ветку else можно не писать, тогда при ложном условии программа просто идёт дальше:
if n < 0 then
writeln('Число отрицательное');Перед else точка с запятой не ставится. if … then writeln('да'); else … — ошибка компиляции: точка с запятой закончила бы оператор if, и else оказался бы «ничьим».
Сравнения
| Знак | Значение |
|---|---|
= | равно |
<> | не равно |
<, > | меньше, больше |
<=, >= | меньше или равно, больше или равно |
Сравнивать можно числа, символы и строки. Строки сравниваются по алфавиту, точнее по кодам символов: 'apple' < 'banana' — истина, а все большие латинские буквы «меньше» маленьких.
Несколько действий: begin … end
После then и else стоит один оператор. Если действий несколько, их объединяют в составной оператор begin … end:
program Compare;
var
a, b: integer;
begin
readln(a, b);
if a > b then
begin
writeln('Первое больше');
writeln('Разница: ', a - b);
end
else
begin
writeln('Первое не больше второго');
writeln('Разница: ', b - a);
end;
end.3 10Первое не больше второго
Разница: 7Обратите внимание: после первого end нет точки с запятой — за ним идёт else. Без begin … end к условию относилась бы только первая строка, а вторая выполнялась бы всегда.
and, or, not
Условия соединяют логическими операциями:
and— «и»: истина, когда верны оба условия;or— «или»: истина, когда верно хотя бы одно;not— «не»: меняет истину на ложь и наоборот.
Каждое сравнение рядом с and и or берут в скобки: (a > 0) and (b > 0). В Pascal and и or выполняются раньше сравнений, и без скобок запись a > 0 and b > 0 компилятор поймёт как a > (0 and b) > 0 и выдаст ошибку.
Пример — високосный год. Год високосный, если он делится на 4 и не делится на 100, или если делится на 400:
program LeapYear;
var
y: integer;
begin
readln(y);
if ((y mod 4 = 0) and (y mod 100 <> 0)) or (y mod 400 = 0) then
writeln(y, ' — високосный год')
else
writeln(y, ' — обычный год');
end.20242024 — високосный годДля 1900 программа выведет «обычный год»: он делится на 100, но не на 400.
Вложенные условия
Внутри then или else может стоять ещё один if. Так проверяют несколько вариантов по очереди:
program NumberSign;
var
x: integer;
begin
readln(x);
if x > 0 then
writeln('Положительное')
else if x < 0 then
writeln('Отрицательное')
else
writeln('Ноль');
end.-8Отрицательноеelse всегда относится к ближайшему if перед ним, у которого ещё нет своего else. Если нужно иначе, внутренний if заключают в begin … end.
case — выбор из многих вариантов
Когда одна переменная сравнивается с несколькими значениями, цепочка if становится длинной. Удобнее case:
program DayName;
var
d: integer;
begin
readln(d);
case d of
1: writeln('Понедельник');
2: writeln('Вторник');
3: writeln('Среда');
4: writeln('Четверг');
5: writeln('Пятница');
6, 7: writeln('Выходной');
else
writeln('Такого дня нет');
end;
end.6ВыходнойКак устроен case:
- после
case— выражение целого типа или символ (char), послеof— варианты; - в варианте — одно значение, несколько через запятую (
6, 7) или диапазон (1..5); - ветка
elseвыполняется, если ни один вариант не подошёл; её можно не писать; - в конце —
end;, хотяbeginуcaseнет.
В отличие от if, в case точка с запятой перед else допустима.
Пример с диапазонами — уровень по десятибалльной отметке:
program Mark;
var
m: integer;
begin
readln(m);
case m of
1..2: writeln('Низкий уровень');
3..4: writeln('Удовлетворительный уровень');
5..6: writeln('Средний уровень');
7..8: writeln('Достаточный уровень');
9..10: writeln('Высокий уровень');
else
writeln('Отметка от 1 до 10');
end;
end.8Достаточный уровеньЕсли в одном варианте нужно несколько действий, их, как и в if, заключают в begin … end.
Частые ошибки
- Точка с запятой перед
else— ошибка компиляции. Подробно — в справке Ошибка: ожидалась точка с запятой. - Точка с запятой после
then.if x > 0 then;— компилятор не возразит, но условие будет управлять пустым оператором, а следующая строка выполнится всегда. =вместо:=и наоборот. В условии —=, в присваивании —:=.- Нет скобок вокруг сравнений рядом с
andиor. - Забыли
begin … endвокруг нескольких действий — к условию относится только первое.
Коротко
if условие then действие else другое;— передelseточки с запятой нет.- Несколько действий в ветке заключают в
begin … end. - Сравнения:
=,<>,<,>,<=,>=; логика:and,or,not, сравнения — в скобках. caseвыбирает вариант по значению целого числа или символа; варианты — значения, списки и диапазоны.