Программирование циклических алгоритмов

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

Написать «Привет» один раз легко. А сто раз? Копировать одну команду сто раз никто не станет — для повторений в языках программирования есть циклы.

Что такое цикл

Циклический алгоритм — алгоритм, в котором одни и те же команды повторяются несколько раз. Повторяющиеся команды называют телом цикла, одно выполнение тела — шагом (итерацией).

Циклы бывают трёх видов:

  • с предусловием — сначала проверить условие, потом выполнить тело; повторять, пока условие истинно;
  • с постусловием — сначала выполнить тело, потом проверить условие; тело выполнится хотя бы один раз;
  • с параметром — повторить заданное число раз, а переменная-счётчик сама меняется на каждом шаге.

Цикл с предусловием: while

Используют, когда число повторений заранее неизвестно. Программа считает сумму цифр числа: берёт последнюю цифру, добавляет к сумме и отбрасывает её — пока от числа что-то осталось.

#include <stdio.h>

int main(void) {
    int n, sum = 0;
    scanf("%d", &n);
    while (n > 0) {
        sum = sum + n % 10;   // последняя цифра
        n = n / 10;           // отбросить её
    }
    printf("%d\n", sum);
    return 0;
}
program DigitSum;
var
  n, sum: integer;
begin
  readln(n);
  sum := 0;
  while n > 0 do
  begin
    sum := sum + n mod 10;   { последняя цифра }
    n := n div 10;           { отбросить её }
  end;
  writeln(sum);
end.
n = int(input())
total = 0
while n > 0:
    total = total + n % 10   # последняя цифра
    n = n // 10              # отбросить её
print(total)

Для числа 1234 цикл сделает четыре шага: сумма станет 4, 7, 9, 10, а число — 123, 12, 1, 0. На пятой проверке n > 0 ложно, цикл закончится, программа выведет 10.

Если условие ложно с самого начала, тело не выполнится ни разу. А если оно никогда не станет ложным, получится бесконечный цикл — программа «зависнет». Поэтому внутри тела что-то должно менять переменную из условия: здесь это n.

Цикл с постусловием

Тело выполняется хотя бы раз, а проверка стоит в конце. Удобно, когда нужно повторять ввод, пока пользователь не введёт подходящее значение:

int x;
do {
    printf("Введите положительное число: ");
    scanf("%d", &x);
} while (x <= 0);   // повторять, ПОКА число неподходящее
repeat
  write('Введите положительное число: ');
  readln(x);
until x > 0;   { повторять, ПОКА НЕ станет подходящим }
while True:
    x = int(input("Введите положительное число: "))
    if x > 0:
        break   # подходящее число — выходим из цикла

Обрати внимание на условия. В Си do … while повторяет, пока условие истинно. В Паскале repeat … until повторяет, пока условие ложно, то есть до тех пор, пока оно не станет истинным. Поэтому условия противоположные: x <= 0 и x > 0.

В Python цикла с постусловием нет. Его заменяют бесконечным циклом while True с выходом по команде break.

Цикл с параметром: for

Используют, когда число повторений известно заранее. Выведем квадраты чисел от 1 до 5:

int i;
for (i = 1; i <= 5; i++) {
    printf("%d ", i * i);
}
for i := 1 to 5 do
  write(i * i, ' ');
for i in range(1, 6):
    print(i * i, end=" ")

Результат: 1 4 9 16 25. Счётчик i по очереди принимает значения 1, 2, 3, 4, 5.

  • Си — в скобках три части через точку с запятой: начальное значение i = 1, условие продолжения i <= 5 и изменение после каждого шага i++ (увеличить на 1).
  • Паскаль — for i := 1 to 5 do, счётчик растёт на 1 сам. Для счёта в обратную сторону есть downto: for i := 5 downto 1 do.
  • Python — range(1, 6) даёт числа от 1 до 5: правая граница в диапазон не входит. range(5) — это 0, 1, 2, 3, 4.

Пример. Сумма чисел от 1 до n

#include <stdio.h>

int main(void) {
    int n, i, sum = 0;
    scanf("%d", &n);
    for (i = 1; i <= n; i++) {
        sum = sum + i;
    }
    printf("%d\n", sum);
    return 0;
}
program Total;
var
  n, i, sum: integer;
begin
  readln(n);
  sum := 0;
  for i := 1 to n do
    sum := sum + i;
  writeln(sum);
end.
n = int(input())
total = 0
for i in range(1, n + 1):
    total = total + i
print(total)

Для n = 10 программа выведет 55. Переменную-сумму обязательно обнуляют до цикла: если сделать это внутри, сумма будет сбрасываться на каждом шаге.

Синтаксис коротко

СиПаскальPython
с предусловиемwhile (усл) { … }while усл do …while усл:
с постусловиемdo { … } while (усл);
пока истинно
repeat … until усл;
пока ложно
нет; while True + break
с параметром от 1 до nfor (i = 1; i <= n; i++)for i := 1 to n dofor i in range(1, n + 1):
досрочный выходbreakbreakbreak

🎯 Самое главное

  • Цикл повторяет тело. Три вида: с предусловием, с постусловием, с параметром.
  • while — когда число повторений заранее неизвестно; for — когда известно.
  • Тело цикла с постусловием выполняется хотя бы раз; с предусловием — может не выполниться ни разу.
  • В Паскале repeat … until идёт до тех пор, пока условие не станет истинным.
  • В Python range(a, b) не включает b.

🤔 Проверь себя

1. Сколько раз выполнится тело цикла for i in range(3, 8) в Python? А for i := 3 to 8 do в Паскале?

В Python — 5 раз (3, 4, 5, 6, 7), в Паскале — 6 раз (от 3 до 8 включительно).

2. Что будет, если в программе суммы цифр забыть строку, которая отбрасывает последнюю цифру?

Число не будет уменьшаться, условие n > 0 останется истинным — получится бесконечный цикл.

3. Какой цикл подходит для задачи «спрашивать пароль, пока не введут правильный»?

Цикл с постусловием: спросить нужно хотя бы один раз, а проверить — после ввода.

4. Перепиши цикл for i := 10 downto 1 do на Си или Python.

Си: for (i = 10; i >= 1; i--); Python: for i in range(10, 0, -1): — третье число в range — шаг.

Ты знаешь все три основные алгоритмические конструкции: следование, ветвление и повторение. Из них собирается программа любой сложности.

Проверь себя

5 случайных вопросов по этому уроку — при следующем открытии будут другие. Ответы проверяются сразу, без регистрации.