Добавил:
... Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
3
Добавлен:
26.06.2024
Размер:
3.07 Mб
Скачать

2. Види циклів і їх характеристика.

Сьогодні ми переглянемо необхідну кількість циклів яку потрібно знати, для звичайного моделювання: безумовні цикли, цикл з передумовою, цикл з після умовою, цикл з виходом з середини, цикл з лічильником. Зараз ми з вами розглянемо такі види циклів:

2.1. Цикл з лічильником

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

Виникає питання: яке значення буде в підсумку присвоєно змінної k: 9, 10, 100, може бути, якесь інше? А якщо цикл завершиться достроково? Відповіді залежать від того, чи збільшується значення лічильника після останньої ітерації і не змінює Чи транслятор це значення додатково. Ще одне питання: що буде, якщо всередині циклу лічильнику буде явно присвоєно нове значення? Різні мови програмування вирішують дані питання по-різному. У деяких поведінку лічильника чітко регламентовано. В інших, наприклад, в тому ж Паскалі, стандарт мови не визначає ні кінцевого значення лічильника, ні наслідків його явної зміни в циклі, але не рекомендує змінювати лічильник явно і використовувати його по завершенні циклу без повторної ініціалізації. Програма на Паскалі, ігнорує цю рекомендацію, може давати різні результати при виконанні на різних системах і використанні різних трансляторів.

Зовні аналогічна вищенаведеному циклу на Паскалі, трактується однозначно: змінної k буде присвоєно значення 100, оскільки змінна i, використовувана поза даного циклу, не має ніякого відношення до лічильника i, який створюється і змінюється всередині циклу. Подібне відокремлення лічильника зручно і безпечно: не потрібний окремий опис для нього і мінімальна ймовірність випадкових помилок, пов'язаних з випадковим руйнуванням зовнішніх по відношенню до циклу змінних. Якщо програмістові потрібно включити в готовий код цикл з лічильником, то він може не перевіряти, чи існує змінна з ім'ям, яке він вибрав в якості лічильника, не додавати опис нового лічильника в заголовок відповідної процедури, не намагатися використовувати один з наявних, але в даний момент "вільних" лічильників. Він просто пише цикл із змінною-лічильником, ім'я якій йому зручно, і може бути впевнений, що ніякої колізії імен не відбудеться.

Цикл з лічильником завжди можна записати як умовний цикл, перед початком якого лічильнику присвоюється початкове значення, а умовою виходу є досягнення лічильником кінцевого значення; до тіла циклу при цьому додається оператор зміни лічильника на заданий крок. Однак спеціальні оператори циклу з лічильником можуть ефективніше транслюватися, так як формалізований вигляд такого циклу дозволяє використовувати спеціальні процесорні команди організації циклів.

У деяких мовах, наприклад, Сі та інших, що відбулися від нього, цикл for, незважаючи на синтаксичну форму циклу з лічильником, насправді є циклом з передумовою. Тобто в Сі конструкція циклу:

for ( i = 0 ; i < 10 ; + + i ) { ... тіло циклу }

фактично являє собою іншу форму запису конструкції [1] :

i = 0 ; while ( i < 10 ) { ... тіло циклу + + i ; }

Тобто в конструкції for спочатку пишеться довільне пропозицію ініціалізації циклу, потім - умова продовження і, нарешті, виконувана після кожного тіла циклу деяка операція (це не обов'язково має бути зміна лічильника; це може бути правка покажчика або яка-небудь зовсім стороння операція). Для мов такого виду вищеописана проблема вирішується дуже просто: змінна-лічильник поводиться цілком передбачувано і по завершенні циклу зберігає своє останнє значення.

Соседние файлы в папке Лекции