REFERATUA.ORG.UA — База українських рефератів
















Реферат на тему:

Види циклів

1. Доти, поки не...



Повернемося до обчислення квадратного кореня (приклад 4.4):

X:=(a+1)/2; Y:=0.5*(X+a/X);

while abs(X-Y)>d do

begin

X:=Y; Y:=0.5*(X+a/X);

end;

Цей алгоритм задає послідовність дій такого вигляду:

X:= (a+1)/2;

Y:= 0.5*(X+a/X);

обчислення умови продовження: true;

X:=Y;

Y:= 0.5*(X+a/X);

обчислення умови продовження: true;

...

X:=Y;

Y:= 0.5*(X+a/X);

обчислення умови продовження: false.

Якщо в цій послідовності замінити найперший оператор на Y:=(a+1)/2; X:=Y, то вона буде циклічною, починаючи з другого оператора, і циклом буде

X:=Y;

Y:= 0.5*(X+a/X);

обчислення умови продовження

Можна було б подумати про оператор

do X:=Y;

Y:=0.5*(X+a/X);

while abs(X-Y)>d;

або в загальному вигляді

do послідовністьоператорів

whileумова.

Такого оператора в мові Паскаль немає, а є схожий за виглядом

repeat

послідовністьоператорів

untilумова

Він називається repeat-оператором, або операторомциклу зпост-умовою ("пост" означає "після"), і дослівно перекладається українською мовою як

повторювати

послідовністьоператорів

доти, поки неумова.

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

Перепишемо алгоритм із прикладу 4.4 з використанням repeat-оператора. Цикл повинен починатися оператором X:=Y, тому перед циклом треба задати ініціалізацію Y. Умовою завершення повинно стати

not abs(X-Y)>d, або abs(X-Y)<=d,

тобто заперечення умови продовження:

Y:=(a+1)/2;

repeat

X:=Y;

Y:=0.5*(X+a/X);

until abs(X-Y)<=d;

{abs(X-Y)<=d; значення Y – шукане}

Оператору циклу з пост-умовою відповідає блок-схема, зображена на рис.5.1.

2. "Для"

Розглянемо алгоритм обчислення n!=1 2 ... n при n>0, 0!=1, припускаючи, що всі змінні в ньому цілі й значення змінної n є невід'ємним:

f:=1;

{! }

k:=1;

while k<=n do

begin f:=f*k; k:=k+1 end

{k=n+1, останнім співмножником у значенні f було n}

Очевидно, що кількість виконань тіла циклу збігається зі значенням змінної n і, якщо n>0, то оператор f:=f*k виконується при k=1, 2, ... , n (за n=0 не виконується жодного разу). "Забудемо на хвилинку" про останнє виконання оператора k:=k+1. Тоді дії, задані операторами після коментарю {!}, можна описати словами "для k=1, 2, ... , n виконати f:=f*k" або англійською мовою "for k=1, 2, ... , n do f:=f*k". А це вже майже оператор мови Паскаль:

for k := 1 to n do f:=f*k

Його назва – for-оператор, або операторциклупереліком, оскількив ньому задано перелік значень змінної k, при яких виконується тіло циклу. Ця змінна називається параметромциклу. Загальний вигляд for-оператора:

forім'я := вираз1toвираз2doоператор

Ім'я позначає змінну цілого типу (параметр циклу), а вирази однотипні з нею. У розд. 6 ми дізнаємося, що параметр циклу може бути не лише цілого типу. Частина оператора від слова for до слова do називається заголовком циклу, а оператор – тілом. Виконується for-оператор не так просто, як це може здатися на перший погляд. Опишемо його докладніше.

Спочатку обчислюються значення виразів у заголовку й порівнюються. Ці значення називаються граничними; позначимо їх відповідно lv і hv. Якщо lv>hv, то виконання закінчується. При цьому тіло циклу не виконується жодного разу, а параметр циклу (нехай його ім'я k) не одержує ніякого значення! Якщо ж lv<=hv, то виконується k:=lv, потім тіло циклу. Потім порівнюються k і hv: при k<hv значення k збільшується на 1. Це збільшення називається неявним, тому що явно ніяк не позначено в операторі. Потім знову виконується тіло циклу і збільшується значення параметра тощо.

Коли після чергового збільшення значення k досягає hv, то виконується тіло циклу та після порівняння k і hv усе закінчується, тобто значення параметра циклу більше не збільшується.

Зверніть увагу на такі особливості:

  • граничні значення обчислюються один раз. Вирази в заголовку можуть містити імена змінних – їх зміни в тілі циклу ніяк не впливають на граничні


 
Загрузка...