Программирование разветвляющихся алгоритмов

Информатика 8 класс · тест: 5 вопросов

Навигатор ведёт по одному маршруту, пока дорога свободна, и перестраивает его, когда впереди пробка. Программа тоже умеет выбирать: проверяет условие и в зависимости от ответа выполняет одни команды или другие.

Условный оператор

Разветвляющийся алгоритм — алгоритм, в котором в зависимости от условия выполняется одна из нескольких последовательностей команд. В языках программирования для этого есть условный оператор: «если условие истинно — сделай одно, иначе — другое».

Программа проверяет, чётное ли число:

#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
И — истинно, когда верны оба условия&&andand
ИЛИ — истинно, когда верно хотя бы одно||oror
НЕ — меняет истину на ложь и наоборот!notnot

Проверим, что возраст от 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 случайных вопросов по этому уроку — при следующем открытии будут другие. Ответы проверяются сразу, без регистрации.