Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
колоквіум_2.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
259 Кб
Скачать
☆

15. Вкладені цикли

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

Повна кількість виконання тіла внутрішнього циклу не перевищує добутку кількості ітерацій внутрішнього і всіх зовнішніх циклів. Наприклад взяв три вкладених один в одного цикли, кожний по 10 ітерацій, отримаємо 10 виконань тіла зовнішнього циклу, 100 для циклу другого рівня і 1000 в найбільш вкладеному циклі.

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

Розв'язків проблеми виходу з вкладених циклів декілька.

  • Найпростіший — використати оператор безумовного переходу goto для выходу в точку програми, наступну безпосередньо за вкладеним циклом. Цей варіант критикується прихильниками структурного програмування, як і всі конструкції, що вимагають використання goto. Деякі мови програмування, наприклад, Модула-2, просто, не має оператора безумовного переходу, і них подібна ситуація неможлива.

  • Альтернатива — використовувати штатні засоби завершення циклів, у випадку необхідності встановлюючи особливі прапорці, що вимагають негайного завершення обробки. Недолік — ускладнення коду, зниження виробності без яких-небудь переваг, окрім теоретичної «правильності» через відмову від goto.

  • Розташування вкладеного циклу в процедурі. Ідея полягає в тому, щоб всю дію, в якій може виникнути потреба дострокового переривання, оформити у вигляді окремої процедури, і для дострокового виходу викликати оператор виходу з процедури (якщо такий в наявності в мові програмування) В мові Сі, наприклад, можна побудувати функцію з вкладеним циклом, а вихід з нею організувати за допомогою оператора return. Недолік — виділення уривка коду в окрему процедуру не завжди обґрунговане, і не всі мови мають штатні засоби для дострокового завершення процедур.

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

  • Насамкінець, існують спецальні мовні засоби для виходу з вкладених циклів. Так в мові Ада програміст може позначити верхній цикл позначкою, і в команді дострокового завершення циклу вказати цю позначку. Вихід відбудеться не з поточного циклу, а з усіх вкладених циклів до позначеного, включно.