Рубріки: Теорія

Цикл з післяумовою: принцип роботи та приклади коду

Андрій Денисенко

Для повторення послідовності дій у програмуванні використовуються цикли. Існує кілька видів циклів. Цю статтю присвячено циклу, який виконується принаймні один раз і повторюється, поки умова, яку вказано після його тіла, залишається істинною. Це цикл з післяумовою.

Що таке цикл з післяумовою

Цикл із післяумовою — це послідовність дій, яка виконується принаймні один раз і повторюється, поки зазначена в кінці умова залишається істинною.

Завдання й принцип роботи циклу з післяумовою

Цикл з післяумовою використовують, коли потрібно виконати дії один раз і повторювати їх виконання, поки виконується умова циклу.

Цикл з післяумовою працює за такою схемою:

  • здійснюється вхід у цикл і виконуються інструкції, які становлять його тіло;
  • дії, що виконуються, змінюють істинність післяумови;
  • після завершення ітерації (повторення) перевіряється істинність умови;
  • якщо умова є істинною, тіло циклу виконується знову;
  • інакше здійснюється вихід із циклу.

Приклади роботи циклу з післяумовою

Цикл з післяумовою різними мовами програмування виглядає так:

C, C++, C#, Java, JavaScript та інші C-подібні мови

do
{
    <тіло циклу>
} while (<умова>);

Pascal

У Pascal замість конструкції do ... while використовується конструкція repeat ... until. Тіло циклу виконується один раз і повторюється не поки значення умови залишається істинним, а доки воно стане істинним. Коли під час перевірки встановлюється, що умова є істинною, здійснюється вихід із циклу.

repeat
    <тіло циклу>
until <умова виходу>;

Python

Цикл із післяумовою не реалізовано у Python. Поведінку циклу з післяумовою можна зімітувати, наприклад, у такі два способи (в обох реалізовано цикл repeat ... until, оскільки зазначено умову виходу, а не продовження).

Нескінченний цикл із примусовим виходом за допомогою оператора break:

while True:
    <тіло циклу>
    if <умова виходу>:
        break

Явна вставка тіла циклу перед конструкцією циклу:

<тіло циклу>
while not <умова виходу>:
    <тіло циклу>

Простий цикл

Розглянемо виконання простого циклу з післяумовою докладніше. Припустимо, потрібно виводити в консолі значення змінної i, поки воно менше або дорівнює 7. На C цей цикл можна записати так:

#include<stdio.h>  
int main(){    
    int i=3;      
    do{    
        printf("%d \n",i);    
        i++;    
    }while(i<=7);   
    return 0;  
}

Результат буде таким:

3
4
5
6
7

Давайте подивимося, що відбувається під час виконання цього коду.

Ітерація i i <= 7
1 3 True
2 4 True
3 5 True
4 6 True
5 7 True
6 8 False
  • Ітерація 1. Спочатку змінна i містить значення 3, тому умова i <= 7 дорівнює True. Здійснюється вхід у тіло циклу. Виводиться значення i (3), потім воно збільшується на 1. Цикл запускається знову.
  • Ітерація 2. Тепер змінна i містить значення 4, тому умова i <= 7 дорівнює True. Здійснюється вхід у тіло циклу. Виводиться значення i (4), потім воно збільшується на 1. Цикл запускається знову.
  • Ітерація 3. Тепер змінна i містить значення 5, тому умова i <= 7 дорівнює True. Здійснюється вхід у тіло циклу. Виводиться значення i (5), потім воно збільшується на 1. Цикл запускається знову.
  • Ітерація 4. Тепер змінна i містить значення 6, тому умова i <= 7 дорівнює True. Здійснюється вхід у тіло циклу. Виводиться значення i (6), потім воно збільшується на 1. Цикл запускається знову.
  • Ітерація 5. Тепер змінна i містить значення 7, тому умова i <= 7 дорівнює True. Здійснюється вхід у тіло циклу. Виводиться значення i (7), потім воно збільшується на 1. Цикл запускається знову.
  • Ітерація 6. Тепер змінна i містить значення 8, тому умова i <= 7 дорівнює False. Оскільки значення умови стало хибним, відбувається вихід із циклу.

Послідовність Фібоначчі

Розглянемо роботу циклу з післяумовою на прикладі виведення N зазначених користувачем перших чисел Фібоначчі.

Послідовність Фібоначчі — це послідовність, у якій кожне наступне число є сумою попередніх двох. Зазвичай ця послідовність починається з нуля, але в деяких джерелах її починають з 1 і 1 або з 1 і 2 (як і сам Фібоначчі).

Ось перші десять чисел цієї послідовності:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34

Приклад коду складання послідовності Фібоначчі на Java

import java.util.*;

class Fibonacci
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // Get user input and convert it to an integer
        System.out.print("How many Fibonacci values would you print? ");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        // Initialize variables
        int index = 1; // Loop counter
        int prev1 = 1; // The previous number
        int prev2 = 0; // The number before the previous number

        do{
            System.out.println(prev2);

            // Calculate the next value
            int next = prev1 + prev2;
            // Move the previous back and set the previous to the current value
            prev2 = prev1;
            prev1 = next;

            // Increment index
            index++;

        }while(index <= n); // Check the condition
    }
}

Приклад коду складання послідовності Фібоначчі на Python

# Get user input and convert it to an integer
n = int(input("How many Fibonacci values would you like to print? "))

# Initialize variables
index = 1 # Loop counter
prev1 = 1 # The previous number
prev2 = 0 # The number before the previous number

while(True):
    print(prev2)

    # Calculate the next value
    next = prev1 + prev2

    # Move the previous back and set the previous to the current value
    prev2 = prev1
    prev1 = next

    # Increment index
    index += 1

    # Check the condition
    if index > n:
        break

Результат:

Програми з меню

Цикл із післяумовою зручно використовувати, наприклад, для програм, у яких використовується меню. Після запуску програми виводиться меню і користувач вибирає потрібний пункт.

Якщо обрано будь-який варіант, крім виходу, виконуються відповідні дії, потім знову виводиться меню. Інакше здійснюється вихід із програми:

import java.util.*;
import java.time.LocalDate;
import java.time.LocalTime;

class Menu
{
    public static void main (String[] args) throws java.lang.Exception
    {
        boolean exitLoop = false;

        do
        {
            System.out.println("Choose an operation below.");
            System.out.println("1. Print current date.");
            System.out.println("2. Print current time.");
            System.out.println("3. Exit.");
            System.out.print("Your choice > ");

            Scanner scanner = new Scanner(System.in);

            String n = scanner.nextLine();

            switch (n){
                case "1":
                    LocalDate d = LocalDate.now();
                    System.out.println(d);
                    break;
                case "2":
                    LocalTime t = LocalTime.now();
                    System.out.println(t);
                    break;
                case "3":
                    exitLoop = true;
                    break;
                default:
                    System.out.print("Wrong input.");
            }
            System.out.println();
        } while(!exitLoop);
    }
}

Результат:

Ігровий цикл

Ще одним прикладом використання циклу з післяумовою може бути гра.

Після запуску програми користувачеві пропонується вгадати, яке число випаде, потім виводиться результат (вгадано чи ні) і пропонується обрати, грати знову чи вийти. Так повторюється, доки не буде вибрано вихід із гри.

Приклад коду гри з киданням кубика на Java

import java.util.*;

public class RollADie
{
    private void greet()
    {
        System.out.println();
        System.out.println("*".repeat(52));
        System.out.println("Welcome to The Roll A Die Game");
        System.out.println("*".repeat(52));
    }

    private boolean continueGame()
    {
        System.out.println();
        System.out.print("Enter 'Y' to roll a die again or anything else to exit: ");
        Scanner scanner = new Scanner(System.in);

        String n = scanner.nextLine();
        return n.equalsIgnoreCase("Y");
    }

    private void gameLoop()
    {

        // Get user input and check for errors
        int guess = 0;
        System.out.print("Your guess: ");
        Scanner scanner = new Scanner(System.in);

        final Random random = new Random();

        try
        {
            guess = scanner.nextInt();
        } catch (Exception e) {
            guess = 0;
        }

        if (guess < 1 || guess > 6){
            System.out.println("Wrong value. Must be from 1 to 6.");
        } else {
            // The user input lies between 1 and 6. Roll the dice.
            int r = random.nextInt(6) + 1;

            // Answer the user
            if (r == guess){
                System.out.println("You win! It's " + r);
            } else {
                System.out.println("You lose! It's " + r);
            }
        }
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        RollADie r = new RollADie();
        r.greet();

        do {
            // Execute the loop body if the precondition is satisfied
            r.gameLoop();
        } while (r.continueGame());
    }
}

Результат:

Цикл з порожнім тілом

Цикл з післяумовою може бути «пустотілим». Порожні цикли використовуються, коли обчислення здійснюються в умові циклу, як у прикладі на Java:

import java.util.*;

class Empty
{
    public static void main (String[] args) throws java.lang.Exception
    {
        int i, j;
        i = 20;
        j = 40;

        do{
            ;
        }while (++i < --j);
        System.out.println("Average is " + i);
    }
}

У цьому прикладі перед кожним обчисленням умови циклу здійснюється збільшення i на одиницю і зменшення j на одиницю. Це робиться за допомогою преінкременту (++i) та передекременту (--j).

Нескінченний цикл

Виконання циклу з післяумовою продовжується нескінченно, якщо в його тілі ніщо не робить значення умови хибним. Іноді таку ситуацію називають зациклюванням.

Розглянемо такий приклад на Java:

import java.util.*;

class InfiniteLoop
{
    public static void main (String[] args)
    {
        int i = 10;
        do{
            System.out.println(i);
            i--;
        } while (i > 0);
    }
}

Цей код виводитиме в консолі числа від 10 до 1:

10
9
8
7
6
5
4
3
2
1

Але якщо пропущено декремент (зменшення лічильника на одиницю), то цикл нескінченно виводитиме десятку. Щоб переконатися в цьому, закоментуємо рядок із декрементом:

import java.util.*;

class InfiniteLoop
{
    public static void main (String[] args)
    {
        int i = 10;
        do{
            System.out.println(i);
            // i--;
        } while (i > 0);
    }
}

Результат:

10
10
10
10
10
10
10
10
10
...

Якщо цикл стає нескінченним помилково, це викликає нестабільність програм. Але нескінченні цикли нерідко спеціально застосовуються на практиці. Це можливо завдяки конструкціям, що дозволяють здійснювати вихід із циклу. Крім того, для виходу може використовуватись сторожовий таймер.

Примусовий вихід з циклу

Нескінченні цикли використовуються, наприклад, у сценаріях, які керують ігровими персонажами, і як цикли обробки повідомлень у програмах із віконним інтерфейсом. Для виходу з них можна використовувати оператор break.

Розглянемо приклад програми з циклом обробки повідомлень мовою C:

do
{
    bRet = GetMessage(&msg, NULL, 0, 0);

    if (bRet > 0)  // (Such a message must be processed.)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    else if (bRet < 0)  // (Return code -1 indicates an error.)
    {
        // Handle the error.
        // ...
    }
    else  // (Return code 0 indicates "exit".)
    {
        break;
    }
} while (1);

У цьому фрагменті:

  • запускається цикл;
  • приймається повідомлення, і залежно від нього здійснюється розгалуження:
    • якщо значення, повернене функцією GetMessage (код виходу), більше за нуль, то воно відповідає повідомленню, яке потрібно обробити;
    • якщо код виходу менший за нуль, то сталася помилка, та її потрібно обробити, а потім, можливо, вийти з програми;
    • якщо код виходу дорівнює нуль, то здійснюється вихід із програми за допомогою оператора break;
  • якщо виходу з циклу не було, він повторюється (1 сприймається як булевське значення true).

Коли у циклі використовується змінна та її значення змінено в такий спосіб, що значення умови стає хибним, то цикл виконується до кінця.

Оператор break використовують, щоб примусово вийти з циклу після рядка із цим оператором.

Особливості циклу з післяумовою

Порівняння циклу з післяумовою з іншими видами циклів:

  • в циклі з післяумовою умова знаходиться після тіла, а в циклі з передумовою — перед ним;
  • цикл із післяумовою виконується щонайменше один раз, а цикл з передумовою може не виконатися ніколи;
  • цикл із післяумовою використовують, коли кількість повторень циклу заздалегідь невідома, але вона не менша за одиницю, а цикл із лічильником — коли відома.

Висновок

Отже, цикл з післяумовою використовується, коли потрібно виконати послідовність дій один раз і повторювати, поки дотримується зазначена умова. Ця умова перевіряється перед виходом з циклу, тому вона називається післяумовою. Вихід із циклу здійснюється, коли після чергової ітерації значення умови стає хибним або коли зустрічається оператор break.

Деякі мови дозволяють використовувати цикл з порожнім тілом. У цій конструкції обчислення виконуються в умові циклу.

Якщо в тілі циклу ніщо не впливає на значення умови, цикл може повторюватися нескінченно. Нескінченні цикли використовуються в іграх, програмах з віконним інтерфейсом та в інших випадках, коли потрібно повторювати дії, поки цикл не буде перервано ззовні.

Останні статті

Більше 8 млрд грн податків. Стільки сплатили резиденти Дія.City в І кварталі 2025 року

Резиденти Дія.City сплатили до бюджету понад 8 млрд грн податків в І кварталі 2025 року.…

18.04.2025

Китайських офісних працівників закликають менше працювати. Це має допомогти місцевій економіці

У Китаї закликають офісних працівників не працювати надто багато — держава сподівається, що вільний час…

18.04.2025

ChatGPT значно покращив пошук місць по фото. Це посилює проблеми конфіденційності

Експерти звертають увагу на тривожну тенденцію: люди все частіше використовують ChatGPT, щоб визначити місцезнаходження, зображене…

18.04.2025

Середовище розробки IntelliJ IDEA оновлено до версії 2025.1

Компанія JetBrains випустила нову версію мультимовного середовища розробки IntelliJ IDEA 2025.1. Оновлена IDE отримала численні…

18.04.2025

Discord впроваджує функцію сканування обличчя для перевірки віку користувачів

Платформа обміну миттєвими повідомленнями Discord впроваджує функцію перевірки віку за допомогою сканування обличчя. Зараз вона…

18.04.2025

Wikipedia випустила спеціальний датасет, щоб відволікти увагу ботів

Wikipedia намагається захистити себе від тисяч різноманітних ботів-скрейперів, які сканують дані цієї платформи для навчання…

18.04.2025