Как работают циклы с предусловием и постусловием
easy

Как работают циклы с предусловием и постусловием

Проверяют условие либо до, либо после

Мы уже рассказывали, зачем в программировании нужны циклы, а также разобрали один из видов — цикл с известным числом повторений. Сегодня поговорим о циклах с предусловием и постусловием. Это базовая база, которая пригодится и в простых скриптах в самом начале освоения программирования, и в сложных навороченных программах позже.

О циклах в общем

Цикл — это повторение определённых действий несколько раз, когда мы снова и снова делаем одно и то же. Например, если мы моем тарелки, то повторяем по кругу такие действия: взять тарелку → намылить → ополоснуть → поставить сушиться.

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

В любом цикле обязательно есть два компонента:

  1. Условие, по которому цикл начинается, продолжается и заканчивается.
  2. Тело цикла — неизменный набор инструкций что-то делать.

Теперь мы знаем достаточно, чтобы идти дальше.

Зачем столько видов циклов и чем они отличаются

Циклы — инструменты программиста, которые помогают настроить автоматический повтор действий и упростить код.

В прошлый раз мы познакомились с циклом с известным числом повторений, по-другому его ещё называют циклом со счётчиком. Такой цикл выполняется заданное количество раз, а после каждого повтора действий программа проверяет, остались ли ещё повторы. Если остались, цикл продолжает работать, если закончились — завершается.

Если бы такого подхода было достаточно, все задачи можно было бы решать только при помощи циклов с известным числом повторений. Но, как и в обычной жизни, мы не всегда знаем, сколько именно раз нужно что-то повторить, а вот когда нужно остановиться с повторами — знаем. Здесь нам и пригодятся циклы, которые будут делать что-то до тех пор, пока работает условие. Если оно проверяется до выполнения действий, получится цикл с предусловием, если после — цикл с постусловием.

Что такое цикл с предусловием

Представим, что после большого праздника у нас скопилась гора грязных тарелок, которые нужно вымыть. Сколько их всего, мы не знаем, и это не имеет значения, потому что нам всё равно нужно вымыть их все. Когда мы начнём мыть тарелки, у нас будет такой цикл:

Пока есть грязные тарелки, делаем так:

взять тарелку, намылить, ополоснуть, поставить сушиться, перейти к следующей.

Мы будем продолжать мыть тарелки до тех пор, пока грязных не останется, сколько бы их у нас ни было. Работает простая логика: остались грязные тарелки — продолжаем мыть, закончились — прекращаем мыть, выключаем воду и идём заниматься другими делами.

В программировании можно сделать точно так же: мы задаём какое-то условие, компьютер сразу проверяет, выполняется оно или нет, и всё время, пока оно выполняется, повторяет нужные нам действия.

Как работают циклы с предусловием и постусловием

Если условие выполняется (истинно), цикл работает, а если не выполняется (ложное) — нет. Будь у нас хоть 10, хоть 35, хоть 119 грязных тарелок, цикл будет работать для всех них одинаково, независимо от количества тарелок.

Чтобы запрограммировать цикл с предусловием, во многих языках программирования используют ключевое слово while. Оно переводится как «пока»: пока есть грязные тарелки, продолжаем мыть посуду. После while указывается условие, а затем следует тело цикла — код, который выполняется, пока условие истинно:

Как работают циклы с предусловием и постусловием

Представим, что у нас есть какой-то набор данных с названиями фруктов, и в нём несколько раз встречается слово «яблоко», а нам нужно его удалить. Получается, что программа должна работать так:

  1. Проверить, что среди данных есть элемент «яблоко».
  2. Если есть, определить индекс такого элемента.
  3. Удалить элемент по найденному индексу.
  4. Вернуться к 1. Если найден ещё один элемент «яблоко», выполнить 2–4. Если нет, выйти из цикла.

На JavaScript получится такой код:

// Объявляем наш набор данных
let items = ["яблоко", "банан", "яблоко", "апельсин", "яблоко"];

// Условие: пока среди данных есть элемент «яблоко»
while (items.includes("яблоко")) {
    // Определяем индекс элемента «яблоко»
    let index = items.indexOf("яблоко");
    // Удаляем найденный элемент
    items.splice(index, 1);
}
// Отображаем набор данных после удаления «яблоко»
console.log("Данные после удаления «яблоко»:", items);
Как работают циклы с предусловием и постусловием

Теперь проверим, не сломается ли программа, если яблок в изначальном списке вообще не будет:

// Наш набор данных
let items = ["ананас", "банан", "груша", "апельсин"];

// Условие: пока среди данных есть элемент «яблоко»
while (items.includes("яблоко")) {
    // Определяем индекс элемента «яблоко»
    let index = items.indexOf("яблоко");
    // Удаляем найденный элемент
    items.splice(index, 1);
}
// Отображаем набор данных после удаления «яблоко»
console.log("Данные после удаления «яблоко»:", items);
Как работают циклы с предусловием и постусловием

Как это работает: программа просмотрела наш набор данных, не обнаружила там ни одного яблока и вернула список фруктов в том же виде, в котором мы его ей предоставили. Ошибки при этом тоже не случилось — цикл просто не сработал, потому что заданное условие не было выполнено.

Для сравнения посмотрим, как можно удалить яблоки при помощи кода на Python:

# Объявляем наш набор данных
items = ["яблоко", "банан", "яблоко", "апельсин", "яблоко"]

# Условие: пока среди данных есть элемент «яблоко»
while "яблоко" in items:
    # Удаляем найденный элемент
    items.remove("яблоко")

# Отображаем набор данных после удаления «яблоко»
print("Список после удаления «яблоко»:", items)
Как работают циклы с предусловием и постусловием

Что такое цикл с постусловием

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

Делать так:

взять тарелку, намылить, ополоснуть, поставить сушиться, перейти к следующей…

…пока есть моющее средство.

Выполняя этот цикл, мы гарантированно вымоем первую тарелку. Затем мы будем проверять, осталось ли моющее средство, после каждой уже вымытой тарелки и перед тем как взять следующую. Когда окажется, что моющее средство закончилось, мы прекратим мыть посуду, даже если не все тарелки вымыты.

Теперь перенесём это на программирование. Мы сообщаем компьютеру, что нужно сделать, а после задаём условие, которое нужно проверить. Если условие выполняется, компьютер повторяет указанное действие. Если не выполняется — не повторяет. Получается такая логика:

Как работают циклы с предусловием и постусловием

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

👉 Смотрите: в циклах с предусловием мы сначала проверяем условие, а потом выполняем действия. А в циклах с постусловием наоборот: сначала выполняем действие, а потом проверяем условие.

В большинстве языков программирования циклы с постусловием пишутся с помощью слов do…while. Мы сначала сообщаем программе, что сделать, а после нужных действий выполняем проверку условия. Если оно истинно, цикл повторяется, если ложное — завершается:

Как работают циклы с предусловием и постусловием

Простой пример полезного цикла с постусловием

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

  1. Дать пользователю ввести пароль хотя бы один раз.
  2. После этого проверить пароль. Если он правильный, пропустить пользователя дальше, если нет — вернуться к 1.

На JavaScript получится такой код. Мы написали его для примера, но в жизни так работать с паролями нельзя (хранить их прямо в коде):

// Объявляем переменную password
let password;

// Цикл: повторять действие
do {
    // Запрашивать ввод пароля
    password = prompt("Введите пароль:");
    // Выводить пароль на экран
    console.log("Вы ввели:", password);
// Условие: правильный пароль
} while (password !== "secret123");
// Если пароль правильный, вывести сообщение
console.log("Пароль правильный. Добро пожаловать!");
Как работают циклы с предусловием и постусловием

В Python нет такого цикла, который обязательно выполнялся бы хотя бы раз перед проверкой условия. Но это не значит, что там не получится реализовать такую логику, просто она будет чуть сложнее. Чтобы это сделать, используют бесконечный цикл while true (цикл с предусловием) и указывают дополнительное условие выхода, при срабатывании которого цикл немедленно завершается (чтобы код не работал действительно бесконечно):

// Условие: повторять бесконечно
while True:
    // Запрашивать ввод пароля
    password = input("Введите пароль: ")
    // Выводить пароль на экран
    print("Вы ввели:", password)
    // Условие: правильный пароль
    if password == "secret123":
        // Если пароль правильный, вывести сообщение
        print("Пароль правильный. Добро пожаловать!")
        // Прервать бесконечный цикл
        break
Как работают циклы с предусловием и постусловием

Как превратить цикл с известным числом повторений в цикл с предусловием и постусловием

Цикл с предусловием и цикл с постусловием более гибкие, чем цикл с известным числом повторений, так что при желании можно задать нужное количество повторов без счётчика. Это не всегда нужно, но если можно, то почему бы и нет.

Создадим цикл с известным числом повторений, который выведет на экран числа от 1 до 5. Логика его работы будет такая:

  1. Начать отсчёт с 1.
  2. Повторять, пока счётчик не станет равен 5.
  3. После каждого повтора увеличивать счёт на единицу.

Вот как это выглядит на JavaScript:

/*
 * let i = 1 — начать отсчёт с 1,
 * i <= 5 — условие повторения до 5 (включительно), 
 * i++ — увеличение i на 1 после каждого повтора
 */
for (let i = 1; i <= 5; i++) {
    // тело цикла: вывести значения на экран
    console.log(i);
}

Сделаем то же самое с помощью цикла с предусловием. Нам нужно объявить переменную цикла (счётчик), определить условие для работы цикла и указать, как менять переменную цикла после каждого повтора. В цикле с известным числом повторений вся эта информация содержится в конструкции for (let i = 1; i <= 5; i++). В цикле с предусловием мы вынесем эти вводные отдельными строками. Получится такой код:

// начинаем отсчёт с 1
let i = 1;

// условие: продолжать до 5 включительно
while (i <= 5) {
    // выводим значение на экран
    console.log(i);
    // после повтора увеличиваем счётчик на 1
    i++;
}

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

// начинаем отсчёт с 1
let i = 1;

// выполняем действие внутри цикла
do {
    // выводим значение на экран
    console.log(i);
    // после действия увеличиваем счётчик на 1
    i++;
// условие: продолжать до 5 включительно
} while (i <= 5);

Во всех трёх случаях мы получим один и тот же результат:

Как работают циклы с предусловием и постусловием

Таким образом можно превратить любой цикл с известным числом повторений в цикл с предусловием или постусловием. Попробуйте сделать то же самое с циклом с известным числом повторений на Python.

Тут есть нюанс: если цикл с известным числом повторений написан так, что он ни разу не сработает, он по-прежнему не выполнится, став циклом с предусловием, но выполнится один раз, если станет циклом с постусловием. Например, если мы изменим начальное значение счётчика с 1 на 10, а условием работы цикла останется выражение i <= 5. С другой стороны, не очень понятно, зачем писать циклы с известным числом повторений, которые не должны срабатывать.

Ну и зачем тогда цикл с известным числом повторений?

В программировании всё стремится к максимальной простоте и универсальности. Но цикл с известным числом повторений — не просто способ выполнить нужные действия определённое количество раз, но удобный и читаемый инструмент для таких ситуаций, и вот почему:

  • Счётчик изменяется автоматически и за корректностью его работы не нужно следить.
  • Он сразу позволяет понять, сколько раз что-то выполняется. Например, for i in range(10) говорит: этот код будет выполнен 10 раз.
  • С его помощью можно пройти по диапазону чисел или коллекции, например если нужно перебрать все элементы какого-то списка, не зная их общее количество.

Что в итоге

Мы разобрали три основных цикла в программировании:

  • Цикл с известным числом повторений полезен, когда действия нужно выполнить точное количество раз. Условие выхода из такого цикла известно заранее — это число повторов. При этом условие не может меняться по ходу работы цикла.
  • Цикл с предусловием выбирают, если количество повторов неизвестно, а действия нужно повторять только в случае, если выполняется какое-то условие. Пока цикл работает, условие может меняться.
  • Цикл с постусловием тоже подходит для ситуаций, когда количество повторов неизвестно, но ещё он гарантирует хотя бы одно повторение цикла, поскольку условие для повтора проверяется после действий. Это условие может меняться во время работы цикла.

Если понимать, как работают эти циклы, можно решать самые разные задачи. При этом неважно, какой язык программирования вы выберете, логика останется той же.

Обложка:

Алексей Сухов

Корректор:

Елена Грицун

Вёрстка:

Кирилл Климентьев

Соцсети:

Юлия Зубарева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Вам может быть интересно
easy