Повернемося до обчислення квадратного кореня (приклад 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)У діалекті Турбо Паскаль остання заборона відсутня. Крім того, при порівнянні k і hv насправді обчислюється значення виразу khv. Разом ці особливості дозволяють написати цикл for, тіло якого виконується аж ніяк не при значеннях параметра циклу, указаних у заголовку. Наприклад, для обчислення функції n!!, означеної за непарного n як 1 3 … n і як 2 4 … n за парного, в Турбо Паскаль можна, здавалося б, зробити такий трюк:
ff:=1; if odd(n) then lb:=1 else lb:=2;
{n і lb або обидва парні, або обидва непарні}
for k := lb to n do
begin ff:=ff*k; k:=k+1 end
Але це неправильно! Між двома послідовними виконаннями ff:=ff*k значення k збільшується двічі на 1 (явно і неявно), і, поки kn/2, то останній цикл також задає зайві обчислення. Наприклад, при n=8, k=7 тіло циклу виконується 7 разів, хоча значення 8 утворюється вже після першого виконання. Скористаємося тим, що , і напишемо остаточний варіант:
function C (n, k : integer) : integer;
var d : integer;
begin
if k > n div 2 then k:=n-k;
d:=1;
for i := 1 to k do d:=d*(n+1-i) div i;
C:=d
end;
Рефераты по информатике1. Доти, поки не... Повернемося до обчислення квадратного кореня (приклад 4.4): X:=(a+1)/2; Y:=0.5*(X+a/X); while abs(X-Y)>d do begin X:=Y;
Оценок: 391 (Средняя 5 из 5)
Специалисты RetsCorp работают в digital-сфере более 7 лет. За это время мы разработали более 500+ успешных проектов. Основываясь на своем опыте и знании рынка, мы с уверенностью можем сказать, что будет работать, а что — нет. Заказывая создание лендинга для бизнеса в нашей студии, вы получаете работающие решения, необходимые именно вашему бизнесу.
Сотрудничая с нами, вы будете не клиентом, а нашим партнером. Благодаря этому мы будем развивать ваш бизнес как собственный. Мы так же как и вы заинтересованы в успехе проекта, поскольку ваша успешность будет нашей рекламой.