Цикл з післяумовою: принцип роботи та приклади коду
Для повторення послідовності дій у програмуванні використовуються цикли. Існує кілька видів циклів. Цю статтю присвячено циклу, який виконується принаймні один раз і повторюється, поки умова, яку вказано після його тіла, залишається істинною. Це цикл з післяумовою.
Що таке цикл з післяумовою
Цикл із післяумовою — це послідовність дій, яка виконується принаймні один раз і повторюється, поки зазначена в кінці умова залишається істинною.
Завдання й принцип роботи циклу з післяумовою
Цикл з післяумовою використовують, коли потрібно виконати дії один раз і повторювати їх виконання, поки виконується умова циклу.
Цикл з післяумовою працює за такою схемою:
- здійснюється вхід у цикл і виконуються інструкції, які становлять його тіло;
- дії, що виконуються, змінюють істинність післяумови;
- після завершення ітерації (повторення) перевіряється істинність умови;
- якщо умова є істинною, тіло циклу виконується знову;
- інакше здійснюється вихід із циклу.
Приклади роботи циклу з післяумовою
Цикл з післяумовою різними мовами програмування виглядає так:
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
.
Деякі мови дозволяють використовувати цикл з порожнім тілом. У цій конструкції обчислення виконуються в умові циклу.
Якщо в тілі циклу ніщо не впливає на значення умови, цикл може повторюватися нескінченно. Нескінченні цикли використовуються в іграх, програмах з віконним інтерфейсом та в інших випадках, коли потрібно повторювати дії, поки цикл не буде перервано ззовні.
Favbet Tech – це ІТ-компанія зі 100% українською ДНК, що створює досконалі сервіси для iGaming і Betting з використанням передових технологій та надає доступ до них. Favbet Tech розробляє інноваційне програмне забезпечення через складну багатокомпонентну платформу, яка здатна витримувати величезні навантаження та створювати унікальний досвід для гравців.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: