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

Матеріал з Вікіпедії — вільної енциклопедії.
Версія від 21:53, 9 травня 2016, створена Vladkhard (обговорення | внесок) (Створена сторінка: У програмуванні '''нескінченним циклом''' називається цикл (програмува...)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

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

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

Роь нескінченних циклів в Тюринг-повноті мов

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

Будь-яка програма може бути написаною за допомогою:

  • нескінченних циклів;
  • команд виходу з циклу;
  • операторів розгалуження (if-then);
  • послідовністю команд, виконуваних одна за іншою;

Примітка: зверніть увагу, що універсальний оператор GOTO (безумовний перехід) не потрібен, а достатньо спеціального оператора виходу з циклу, при цьому, у випадку n вкладений циклів буде потрібно n спеціальних операторів виходу з циклу (окрім невеликої кількості мов з розширеним синтаксисом операторів виходу) або один оператор GOTO і одна мітка.

Приклади

Pascal

while true do
   begin
      { тіло циклу }
   end;

//або
repeat
{ тіло циклу }
until false;

Для С-подібних мов

for (;;) {
   /* тіло циклу */
}

// або
while(true) {
   /* тіло циклу */
}

// або
while(1) { 
   /* тіло циклу */
}

// або
do {
   /* тіло циклу */
} while(true)

// або
do {
   /* тіло циклу */
} while(1)

Python

while True:
    # тіло циклу

Пакетний файл MS-DOS

:loop
 rem тіло циклу
goto loop

Bash

while true
do
# тіло циклу
done

Ruby

Мова містить спеціальну конструкцію нескінченного циклу:

 loop {
    # тіло циклу
 }

Ада

Ада також містить спеціальну конструкцію, що описує нескінченний цикл:

loop
   -- тіло циклу
end loop;

Окрім того, варто відмітити, що Ада дозволяє здійснити вихід одразу з декількох вкладених циклів, а також має умовну форму оператора виходу, що дозволяє уникнути використання оператора розгалуження.

Out_Cycle:
loop
   ...
   loop
      ...
      exit Out_Cycle when Logic_Exp;
      -- рівносильно 
      if Logic_Exp then 
         exit Out_Cycle; 
      end if;
      ...
   end loop;
   ...
end loop Out_Cycle;
--звідси продовжиться виконання програми
--після виконання інструкції exit Out_Cycle;

Lua

while true do
  -- тіло циклу
end

Практика

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

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

Прийом заснований на тому факті, що кодна сучасна мова програмування пропонує ряд операторів, що дозволяють перервати виконання тіла циклу не після чергової ітерації, а під час чергового виконання (наприклад, Break в Delphi, EXIT FOR в BASIC і т. д.). Для економії часу учасник олімпіади пише нескінченний цикл while з умрврю виконання True (while True do ...), а потім при необхідності у тілі циклу записує оператори перевірки умов, які переривають виконання циклу Break-подібними операторами.

В C++ цикл проходу по деякому набору елементів з використанням абстрактного класу (ітератора) виглядає так:

Element* el;
SomeIterator it();
for (el=it.get(); el!=NULL; el=it.get())
{
  ... 
}

В деякх діалектах Pascal цей же цикл (із зберіганням можливості використовувати оператор continue, тобто, без el:=it.Get; в кінці циклу) виглядає так:

it := SomeIterator.Create;
repeat
  el := it.Get;
  if el=nil then break;
  ...
until false;

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

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