Программирование разветвляющихся алгоритмов
Навигатор ведёт по одному маршруту, пока дорога свободна, и перестраивает его, когда впереди пробка. Программа тоже умеет выбирать: проверяет условие и в зависимости от ответа выполняет одни команды или другие.
Условный оператор
Разветвляющийся алгоритм — алгоритм, в котором в зависимости от условия выполняется одна из нескольких последовательностей команд. В языках программирования для этого есть условный оператор: «если условие истинно — сделай одно, иначе — другое».
Программа проверяет, чётное ли число:
#include <stdio.h>
int main(void) {
int n;
scanf("%d", &n);
if (n % 2 == 0) {
printf("чётное\n");
} else {
printf("нечётное\n");
}
return 0;
}
program Parity;
var
n: integer;
begin
readln(n);
if n mod 2 = 0 then
writeln('чётное')
else
writeln('нечётное');
end.
n = int(input())
if n % 2 == 0:
print("чётное")
else:
print("нечётное")
Как это записывается в каждом языке:
- Си — условие в круглых скобках, ветки в фигурных скобках. Для одной команды скобки можно опустить, но с ними надёжнее.
- Паскаль —
if … then … else …. Передelseточка с запятой не ставится: она закончила бы оператор, иelseоказался бы «ничьим». Если в ветке несколько команд, их окружаютbegin … end. - Python — после условия и после
elseставится двоеточие, а команды ветки пишутся с отступом в 4 пробела. Отступ здесь не украшение: по нему Python понимает, где ветка кончается.
Ветку «иначе» можно не писать: тогда при ложном условии программа просто пойдёт дальше. Такое ветвление называют неполным.
Операции сравнения
| Си | Паскаль | Python | |
|---|---|---|---|
| равно | == | = | == |
| не равно | != | <> | != |
| больше, меньше | >, < | >, < | >, < |
| больше или равно, меньше или равно | >=, <= | >=, <= | >=, <= |
Ловушка Си: if (x = 5) — это не сравнение, а присваивание. Переменная получит значение 5, и условие всегда окажется истинным. Сравнение пишется двумя знаками: x == 5.
Сложные условия
Иногда нужно проверить несколько условий сразу. Их соединяют логическими операциями И, ИЛИ, НЕ:
| Си | Паскаль | Python | |
|---|---|---|---|
| И — истинно, когда верны оба условия | && | and | and |
| ИЛИ — истинно, когда верно хотя бы одно | || | or | or |
| НЕ — меняет истину на ложь и наоборот | ! | not | not |
Проверим, что возраст от 12 до 17 лет включительно:
if (age >= 12 && age <= 17) {
printf("подросток\n");
}
if (age >= 12) and (age <= 17) then
writeln('подросток');
if age >= 12 and age <= 17:
print("подросток")
# в Python можно и как в математике: 12 <= age <= 17
В Паскале сравнения внутри сложного условия обязательно берут в скобки: and выполняется раньше сравнений. Без скобок Паскаль попробует сначала вычислить 12 and age, и получится ошибка.
Несколько вариантов
Когда вариантов больше двух, проверки выстраивают цепочкой. Программа переводит баллы за тест в оценку:
#include <stdio.h>
int main(void) {
int points;
scanf("%d", &points);
if (points >= 90) {
printf("5\n");
} else if (points >= 70) {
printf("4\n");
} else if (points >= 50) {
printf("3\n");
} else {
printf("2\n");
}
return 0;
}
program Grade;
var
points: integer;
begin
readln(points);
if points >= 90 then
writeln(5)
else if points >= 70 then
writeln(4)
else if points >= 50 then
writeln(3)
else
writeln(2);
end.
points = int(input())
if points >= 90:
print(5)
elif points >= 70:
print(4)
elif points >= 50:
print(3)
else:
print(2)
Условия проверяются сверху вниз, и выполняется первая подходящая ветка. При 75 баллах условие points >= 90 ложно, points >= 70 — истинно: программа выведет 4 и дальше не проверяет. В Python для «иначе если» есть короткое слово elif.
Пример. Большее из двух чисел
if (a > b) {
max = a;
} else {
max = b;
}
printf("%d\n", max);
if a > b then
max := a
else
max := b;
writeln(max);
if a > b:
biggest = a
else:
biggest = b
print(biggest)
# в Python есть и готовая функция: max(a, b)
В Python переменную не стоит называть max — так называется встроенная функция, и после присваивания она станет недоступна.
🎯 Самое главное
- Ветвление:
if— проверка условия,else— что делать, если условие ложно. - Блок ветки: фигурные скобки в Си,
begin … endв Паскале, отступ в Python. - Равенство:
==в Си и Python,=в Паскале. Неравенство:!=и<>. - И, ИЛИ, НЕ:
&& || !в Си,and or notв Паскале и Python. - В Паскале перед
elseнет точки с запятой, а сравнения в сложном условии — в скобках.
🤔 Проверь себя
1. Что выведет программа с оценками, если набрано ровно 50 баллов?
3. Условия >= 90 и >= 70 ложны, >= 50 — истинно.
2. Запиши условие «число x отрицательное или больше 100» на своём языке.
Си: x < 0 || x > 100; Паскаль: (x < 0) or (x > 100); Python: x < 0 or x > 100.
3. Почему в Си if (x = 0) — ошибка, хотя программа компилируется?
Это присваивание, а не сравнение: x станет равен 0, и условие всегда будет ложным. Нужно x == 0.
4. Что не так в паскалевской строке if a > b then writeln(a); else writeln(b);?
Лишняя точка с запятой перед else: она завершает оператор if, и else остаётся без пары.
Дальше — циклы: как заставить программу повторять действия, пока это нужно.
Проверь себя
5 случайных вопросов по этому уроку — при следующем открытии будут другие. Ответы проверяются сразу, без регистрации.