пятница, 1 июня 2012 г.

143. Цикли.Типи циклів.Поняття вкладеного циклу.

Визначення
Послідовність інструкцій, призначена для багаторазового виконання, називається тілом цикла. Одноразове виконання тіла циклу називається ітераціею. Вираз, що визначає чи буде вчергове виконуватися ітерація, чи цикл завершиться, називається умовою виходу або умовою завершення циклу (або умовою продовження в залежності від того, як інтерпретується його істинність — як ознака необхідності завершення або продовження циклу. Змінна, в якій зберігається номер поточної ітерації, називається лічильником ітерацій циклу або просто лічильником циклу. Цикл не обов'язково містить лічильник, також лічильник не забов'язаний бути одним — умова виходу із циклу може залежати від декількох змінюваних в циклі змінних, а може визначатися зовнішними умовами (наприклад, настанням певного часу), в останньому випадку лічильник взагалі не знадобиться.
Частинами виконання будь-якого циклу є початкова ініціалізауція змінних циклу, перевірка умови виходу, виконання тіла циклу і оновлення змінної циклу на кожній ітерації. Крім того, більшість мов програмування надають засоби для дострокового керування циклом, наприклад, оператори завершення циклу, тобто виходу з циклу незалежно від істинності умови виходу (в мові Сbreak) і оператори пропущення ітерації (в мові С — continue).

 Різновиди циклів

 Безумовні цикли

Іноді в програмах використовуються цикли, вихід з яких непередбачено логікою програми. Такі цикли називаються безумовними або нескінченними. Особливих синтаксичних засобів для створення таких циклів, через їхню нетиповість, мови програмування не передбачають, тому такі цикли створюються за допомогою конструкцій призначених для створення звичайних (або умовних) циклів. Для забезпечення нескінченного повторення перевірка умови в такому циклі відсутня (якщо дозволяє синтаксис, як, наприклад, у циклі LOOP…END LOOP мови Ада), або замінюється константним значенням (while true do … в Паскаль).

 Цикл з передумовою

Цикл з передумовою — цикл, що виконується доки істинна деяка умова, вказана перед його початком. Ця умова перевіряється до початку виконання тіла циклу, тому тіло може бути не виконане жодного разу (якщо умова з початку хибна). У більшості процедурних мов програмування здійснюється за допомогою інструкції while, звідси його друга назва — while-цикл. На мові Паскаль цикл з передумовою має наступний вигляд:
while <умова> do
begin 
  <тіло циклу> 
end;
На мові Сі:
while(<умова>)
{
   <тіло циклу>
}
Вкладені циклиІснує можливість утворити цикл всередині тіла другого циклу. Такий цикл зветься вкладеним циклом. Вкладений цикл щодо циклу в тіло якого він вкладений буде йменуватися внутрішнім циклом, і навпаки цикл в тілі якого ісеує вкладений цикл буде йменуватись зовнішнім щодо вкладеного. Всередині вкладеного циклу може бути наступний вкладений цикл, утворюючи наступний рівень вкладеності і так далі. Кількість рівнів вкладеності, як правило, не обмежується.
Повна кількість виконання тіла внутрішнього циклу не перевищує добутку кількості ітерацій внутрішнього і всіх зовнішніх циклів. Наприклад взяв три вкладених один в одного цикли, кожний по 10 ітерацій, отримаємо 10 виконань тіла зовнішнього циклу, 100 для циклу другого рівня і 1000 в найбільш вкладеному циклі.
Одна з проблем, пов'язаних із вкладеними циклами — організація дострокового виходу з них. В багатьох мовах програмуванняє оператор дострокового завершення циклу (break у Сі, exit у Паскалі, last в Perl і т. п.), але він, як правило, забезпечує вихід лише з циклу того рівня, звідки викликаний. Виклик його у вкладеному циклі призведе до завершення лиш цього вкладеного циклу, зовнішній цикл продовжить виконання. Проблема може здатися надуманою, але вона дійсно іноді виникає при програмуванні складної обробки даних, коли алгоритм вимагає негайного переривання за певних умов, наявність яких можна перевірити тільки в глубоко вкладеному циклі.
Розв'язків проблеми виходу з вкладених циклів декілька.
  • Найпростіший — використати оператор безумовного переходу goto для выходу в точку програми, наступну безпосередньо за вкладеним циклом. Цей варіант критикується прихильниками структурного програмування, як і всі конструкції, що вимагають використання goto. Деякі мови програмування, наприклад, Модула-2, просто, не має оператора безумовного переходу, і них подібна ситуація неможлива.
  • Альтернатива — використовувати штатні засоби завершення циклів, у випадку необхідності встановлюючи особливі прапорці, що вимагають негайного завершення обробки. Недолік — ускладнення коду, зниження виробності без яких-небудь переваг, окрім теоретичної «правильності» через відмову від goto.
  • Розташування вкладеного циклу в процедурі. Ідея полягає в тому, щоб всю дію, в якій може виникнути потреба дострокового переривання, оформити у вигляді окремої процедури, і для дострокового виходу викликати оператор виходу з процедури (якщо такий в наявності в мові програмування) В мові Сі, наприклад, можна побудувати функцію з вкладеним циклом, а вихід з нею організувати за допомогою оператора return. Недолік — виділення уривка коду в окрему процедуру не завжди обґрунговане, і не всі мови мають штатні засоби для дострокового завершення процедур.
  • Скористатись механізмом генерації і обробки виняткив (виняткових ситуацій), який зараз наявний у більшості мов високого рівня. В цьому випадку в нештатній ситуації код у вкладеному циклі створює виняткову ситуацію, а блок обробки винятків, в якому знаходиться вкладений цикл, перехоплює та обробляє його. Недолік — реалізація механізму обробки винятків у більшості випадків такова, що швидкість роботи програми зменшується. Правда, в сучасних умовах це не особливо важливо: практично втрата виробності так мала, що має значення лиш для зовсім небагатьох застосунків.
  • Насамкінець, існують спецальні мовні засоби для виходу з вкладених циклів. Так в мові Ада програміст може позначити верхній цикл позначкою, і в команді дострокового завершення циклу вказати цю позначку. Вихід відбудеться не з поточного циклу, а з усіх вкладених циклів до позначеного, включно.