Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основи програмування Паскаль.docx
Скачиваний:
51
Добавлен:
12.05.2015
Размер:
511.7 Кб
Скачать

10. Цикл із лічильником і дострокове завершення циклів

Перш, ніж перейти до прикладів, обговоримо ще ряд проблем, пов'язаних із циклами. Як для while, так і дляrepeat, по-перше, ніде в явному виді не задається число кроків циклу (хоча його звичайно можна обчислити), по-друге, при використанні обох циклів програміст повинен опікуватися про зміну керуючої змінної. Тим часом, досить поширені завдання, де обсяг послідовно оброблюваних даних відомий заздалегідь (а виходить, відомо й необхідне число кроків циклу), а керуюча змінна міняється із кроком, рівним одиниці. Розглянутий вище приклад із двадцятьома значеннями x ставиться саме до таких завдань. Томудля обробки заздалегідь відомого обсягу даних із кроком по керуючій змінній, рівним одиниці, замість циклуwhileвикористовуєтьсяцикл із лічильником(цикл for). Його загальний вид наступний:

for лічильник := початкове_значення to кінцеве_значення do begin

{оператори тіла циклу}

end;

Тут лічильник – цілочисельна змінна, початкове й кінцеве значення – Цілочисельні вирази або константи. Тіло циклу утворене не менш, чим одним оператором, якщо цей оператор єдиний, операторные дужки можна не писати. Працює цикл forу такий спосіб:лічильник автоматично міняється від початкового значення до кінцевого включно, для кожного значення лічильника виконується тіло циклу. Після кожного кроку циклу значення лічильника автоматично збільшується на одиницю. Якщо потрібно, щоб значення лічильниказменшувалося, а не збільшувалося, замість ключового словаtoвикористовуєтьсяdownto.

Подібно while, циклforможе не виконатися й жодного разу – якщо початкове значення керуючої змінної відразу ж більше кінцевого ( при використанніto) або менше ( при використанніdownto).

Запишемо розглянутий вище цикл по змінній xза допомогою оператораfor:

for x:=1 to 20 do begin

{оператори тіла циклу}

end;

Зручності очевидні – границі зміни xзадані відразу ж при вході в цикл, а виконувати крок поxокремим оператором не потрібно. Зрозумілі й обмеження –xповинен бути описаний з типомinteger, а у випадку зміниxіз кроком, не рівним одиниці, використовуватиforзамістьwhileне вдалося б.

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

x:=1;

while x<10 do begin

y:=ln(x);

if y>2 then x:=10; { При y>2 цикл потрібно завершити}

x:=x+0.5;

end;

Однак, щоб уникнути трудноуловимых помилок, що управляє змінну не прийнято міняти інакше, чому для виконання кроку циклу. Наприклад, після оператораif y>2 then x:=10; у нашім лістингу виконання поточного кроку продовжиться, що чревате зайвими або неправильними обчисленнями. Крім того, текст такої програми сприймається нелегко.

Тому для дострокового виходу із циклуіснує операторbreak ( від англ. "to break" - перервати), що негайно припиняє його виконання:

x:=1;

while x<10 do begin

y:=ln(x);

if y>2 then break; { При y>2 цикл потрібно завершити}

x:=x+0.5;

end;

Breakтут передасть керування на оператор, що випливає безпосередньо за циклом. На відміну від попереднього прикладу, тут не буде виконуватися частина тіла циклу, що випливає заbreak;.

Для негайного продовження циклу з наступного крокувикористовується операторcontinue( від англ. "to continue" – продовжити):

var n:integer;

begin

repeat

writeln ('Уведіть позитивне число:');

read (n);

if n<1 then continue; {Якщо введене n<1, знову запросити число}

{Тут розташовані оператори обробки позитивного числа}

break; {Вихід із циклу обробки}

until false;

end.

У цьому прикладі оператор continueвикористаний для повторного перехід до введенняn, якщо введенеn<1. Тому що цикл обробки тут – нескінченний, для виходу з нього необхіднийbreak;. Крім того, приклад показує одну з можливостей контролю правильності введення даних. Указавши директиву{$I-}, вивчену в главі 8, ми могли б захистити програму й від уведення користувачем нечислових значень у якостіn.

У темі "Кратні цикли" другої частини курсу буде розглянутий оператор goto, також здатний розв'язати проблему аварійного завершення циклів.