Цикл do while

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

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

Блок-схема циклу do while

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

Оскільки цикл do while перевіряє стан після виконання блоку, така структура керування часто називається циклом з післяумовою, на відміну від циклу while, у якому умова перевіряється перед виконанням блока операторів (цикл з передумовою). Якщо цикл while встановлює істинність висловлювання як умову виконання коду, то цикл do while передбачає постійне виконання дії, яке переривається за умови хибності твердження.

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

У різних мовах використовуються різні правила запису цього типу циклу. Наприклад, у мові програмування Pascal такий тип циклу оформлюється як repeat until, який продовжує виконуватися доти, поки вираз не стане істинним.

Еквівалентні конструкції[ред. | ред. код]

Така синтаксична конструкція

do {
    loop_block();  
} while (condition);

рівнозначна

loop_block();

while (condition) {
    loop_block();
}

Записаний таким чином цикл do while забезпечує виконання блока операторів щонайменше один раз через застосування loop_block() до початку циклу while.

Без застосування оператора continue можна утворити такі рівнозначні конструкції (наведені приклади не є зразками типового або сучасного стилю програмування):

while (true) {
   loop_block();
   if (!condition) break;
}

або

LOOPSTART:
    do_work();
    if (condition) goto LOOPSTART;

Конструкція do while в мовах програмування[ред. | ред. код]

Наведені приклади різними мовами програмування демонструють розрахунок факторіалу числа 5 із використанням циклу do while.

Ada[ред. | ред. код]

Приклад мовою програмування Ada:

with Ada.Integer_Text_IO;

procedure Factorial is
    Counter   : Integer := 5;
    Factorial : Integer := 1;
begin
    loop
        Factorial := Factorial * Counter;
        Counter   := Counter - 1;
        exit when Counter = 0;
    end loop;

    Ada.Integer_Text_IO.Put (Factorial);
end Factorial;

BASIC[ред. | ред. код]

Ранні діалекти BASIC (такі як GW-BASIC) використовували синтаксис WHILE/WEND. Сучасні діалекти BASIC, такі як PowerBASIC, забезпечують структури WHILE/WEND та DO/LOOP із синтаксисом DO WHILE/LOOP, DO UNTIL/LOOP, DO/LOOP WHILE, DO/LOOP UNTIL і DO/LOOP (без умови виконання циклу, але з із використанням перевірки EXIT LOOP всередині циклу).

Типовий код

Dim factorial As Integer
Dim counter As Integer

factorial = 1
counter = 5

Do 
    factorial = factorial * counter
    counter = counter - 1
Loop While counter > 0

Print factorial

C#[ред. | ред. код]

Приклад на C#:

int counter = 5;
int factorial = 1;

do {
    factorial *= counter--; /* Multiply, then decrement. */
} while (counter > 0);

System.Console.WriteLine(factorial);

C[ред. | ред. код]

Приклад на C:

int counter = 5;
int factorial = 1;

do {
    factorial *= counter--; /* Multiply, then decrement. */
} while (counter > 0);

printf("factorial of 5 is %d\n", factorial);

Оператори do-while(0) також часто використовуються в макросах C як спосіб обернути декілька операторів на звичайний (на відміну від складеного) оператор. Макрос повинен закінчуватись крапкою з комою. Це забезпечує більш схожий на функції зовнішній вигляд і спрощує синтаксичний аналіз та сприйняття програмістами, а також усуває проблему визначення області дії оператора if. Рекомендується у стандарті правил кодування CERT C Coding Standard PRE10-C[1]

C++[ред. | ред. код]

Приклад на C++:

int counter = 5;
int factorial = 1;

do {
    factorial *= counter--;
} while (counter > 0);

std::cout << "factorial of 5 is "<< factorial << std::endl;

D[ред. | ред. код]

Приклад на D:

int counter = 5;
int factorial = 1;

do {
    factorial *= counter--; // Помножили, потім зменшили
} while (counter > 0);

writeln("factorial of 5 is ", factorial);

Fortran[ред. | ред. код]

Приклад на Fortran. Стандартний FORTRAN 77 не має конструкції DO-WHILE, проте її можна втілити через застосування GOTO:

INTEGER CNT,FACT
      CNT=5
      FACT=1
    1 CONTINUE
      FACT=FACT*CNT
      CNT=CNT-1
      IF (CNT.GT.0) GOTO 1
      PRINT*,FACT
      END

Fortran 90 й пізніші діалекти також не мають цієї конструкції, але вони мають звичайний цикл while:

program FactorialProg
    integer :: counter = 5
    integer :: factorial = 1
    
    factorial = factorial * counter
    counter = counter - 1
    
    do while (counter > 0) ! Перевіряємо цикл до входу в цикл
        factorial = factorial * counter
        counter = counter - 1
    end do
    
    print *, factorial
end program FactorialProg

Java[ред. | ред. код]

Приклад на Java:

int counter = 5;
int factorial = 1;

do {
    factorial *= counter--; /* Множимо, потім зменшуємо */
} while (counter > 0);

System.out.println("The factorial of 5 is " + factorial);

JavaScript[ред. | ред. код]

Приклад на JavaScript[2]:

let counter = 5; //Оголошуємо дві змінні - лічильник та факторіал
let factorial = 1; 

do {
    factorial *= counter--; //Тіло циклу
} while (counter > 0); //Умова циклу

console.log(factorial); //Показуємо результат

Pascal[ред. | ред. код]

Pascal замість конструкції do while використовує repeat until. Як згадувалось у вступі, таку конструкцію можна вважати еквівалентом конструкції do loop_block() while not loop_expression().

factorial := 1;
counter := 5;
repeat
   factorial := factorial * counter;
   counter := counter - 1;
until counter = 0;

Python[ред. | ред. код]

Python також не має окремої конструкції do while, але її можна побудувати із використанням нескінченого циклу та оператора break:

counter = 5
factorial = 1

while True:
    factorial *= counter
    counter -= 1
    
    if counter == 0:
        break
    
print(factorial)

Див. також[ред. | ред. код]

Примітки[ред. | ред. код]

  1. C multi-line macro: do/while(0) vs scope block. Stack Overflow.
  2. do...while. MDN Web Docs.