У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент


Паскаль: цикл "поки" та його використання

Цикл – це ряд подій, що регулярно повторюються в тому самому порядку.

З Оксфордського словника англійської мови

1. Поки...

Приклад 4.1. Розглянемо дещо штучну задачу: написати цілочислову функцію з ім'ям pow для обчислення степеня an за довільним натуральним a і n? 0. Задача має елементарне розв'язання: an=enlna, і в тілі функції достатньо написати pow:=round(exp(n*ln(a))). Проте невід'ємні степені цілих чисел є цілими, тому спробуємо обійтися без нецілих виразів із функціями exp і ln.

За означенням, an є a? a? ...? a, тобто a0=1, ai=ai-1? a для i=1, 2, ... , n. Це підштовхує до спроби обчислення an шляхом багаторазового множення на a. Спочатку шуканий степінь p=1, і треба n разів умножити його на a. Після першого множення p=a, і треба n-1 разів умножити його на a тощо. Перед останнім множенням p=an-1. Таким чином,

спочатку p=1 і треба виконати n множень на a, і поки залишаються "невикористані" множники a, ми множимо p на a, одержуємо новий степінь p і запам'ятовуємо, що "невикористаних" множників стало менше на 1.

Остання фраза, власне, і є алгоритмом обчислення an. Перекладемо його на мову Паскаль.

Нам потрібні змінні p і a для збереження степеня і його основи, а також змінні n і k для збереження показника степеня й кількості "невикористаних" множників. Змінні a і n – параметри нашої функції, тому їх початкові значення тут не важливі. Тепер алгоритм можна уточнити:

p:=1; k:=n;

поки k>0 виконувати {залишилися "невикористані" співмножники}

begin p:=p*a; k:=k-1 end

Якщо перекласти на англійську мову слова поки і виконувати як while і do, то утвориться:

p:=1; k:=n;

while k>0 do{залишилися "невикористані" співмножники}

begin p:=p*a; k:=k-1 end

Але це вже Паскаль! Справа в тім, що вираз вигляду

while умова do оператор

називається while-оператором, або оператором циклу з перед-умовою. Вираз "while умова do" називається заголовком циклу, "оператор" – тілом. Ми б назвали while-оператор циклом з умовою продовження, але цей термін дотепер у літературі не з'являвся.

Опишемо семантику оператора циклу та прокоментуємо всі ці назви. Виконання оператора циклу починається з того, що обчислюється умова, записана в заголовку. Якщо вона істинна, то виконується тіло циклу і знову обчислюється умова. Якщо вона істинна, усе повторюється. Якщо ж при черговому обчисленні умова стає хибною, то тіло циклу не виконується і взагалі виконання оператора циклу на цьому закінчується. Зокрема, якщо при першому обчисленні умова хибна, то тіло циклу не виконується жодного разу.

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

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

Повернемося до задачі. Послідовність операторів для обчислення an при a=2, n=3 задає процес

p:=1; k:=3;

обчислення умови k>0: true ;

p:=1*2; k:=3-1; {p=2; k=2}

обчислення умови k>0: true;

p:=2*2; k:=2-1; {p=4; k=1}

обчислення умови k>0: true;

p:=4*2; k:=1-1; {p=8; k=0}

обчислення умови k>0: false,

а при a=5, n=0 – процес

p:=1; k:=0;

обчислення умови k>0: false.

У вигляді коментарів тут указано стани пам'яті наприкінці циклів.

Запишемо, нарешті, функцію pow:

function pow(a, n:integer):integer;

var p, k: integer;

begin

p:=1; k:=n;

while k>0 do

begin p:=p*a; k:=k-1 end;

pow:=p

end;

?

Приклад 4.2. Розглянемо задачу: за цілим A>0 обчислити мінімальне n таке, що n! ? A.

За означенням, n!=1? 2? …? n, тобто 1!=1, 2!=1!? 2, 3!=2!? 3 тощо, n!=(n-1)!? n. Обчислимо 1! та порівняємо з A; якщо 1!<A, то обчислимо 2!=2? 1! і знову порівняємо тощо. Зрештою після чергового збільшення n виявиться, що n!? A, і отримане значення n – шукане. Наприклад, при A=5 треба дійти до n=3, при A=120 – до n=5. Нам потрібна змінна n для запам'ятовування чисел 1, 2, 3 тощо, та змінна f – для значень 1!, 2!, 3! тощо. Отже,

спочатку n:=1, f:=1, і

поки f<A, треба збільшувати n на 1 і f домножати на n.

Перекладемо цей алгоритм на Паскаль. Скористаємося while-оператором із умовою продовження f<A і тілом, у якому задано зміни n і f:

n:=1; f:=1;

while f<A do {значення n менше шуканого}

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

{f>=A, f=n! , тому значення n – шукане}

Коментар після циклу містить умову f>=A – по суті, заперечення умови продовження f<A.

Коментар із запереченням умови продовження після оператора циклу може істотно допомогти в розробці циклічних операторів, тому радимо записувати його.

Оформлення алгоритму у вигляді функції з параметром A залишається як вправа.?

Досвідчені програмісти в деяких випадках користуються "нескінченним циклом" вигляду while true do оператор. Засоби, якими задається вихід із тіла циклу незалежно від значення умови продовження, ми розглянемо в підрозділах 5.3, 5.4.

Задачі

1.* Проімітувати виконання послідовності операторів:

а) i:=1; x:=1; y:=2;

while x<y do

begin

i:=i+1; x:=x*i; y:=y*2;

writeln(i, ' ', x, ' ', y)

end;

б) i:=1; x:=1; y:=2;

while i<=10 do

begin

i:=i+1; x:=x*i; y:=y*2;

writeln(i, ' ', x, ' ', y)

end;

2. За цілим A>0 обчислити найбільше n таке, що n!? A.

3.* Написати функцію обчислення n!, де n? 0 (0!=1).

2. Рекурентні послідовності та співвідношення

2.1. Деталі конструктора

У прикладі 4.1 змінна p у процесі виконання операторів приймала значення 1, a, a2, a3, … , an. У цій послідовності перший член 1, а


Сторінки: 1 2 3 4