
- •П. Г. Ратайчук, а. М. Тихоненко
- •Алгоритмічна мова
- •Курс лекцій
- •Черкаси – 2003
- •Основні поняття навчальної алгоритмічної мови
- •Величини в навчальнiй алгоритмiчнiй мовi
- •Вирази в навчальнiй алгоритмiчнiй мовi
- •Загальні правила опису алгоритмів на нам
- •Переклад алгоритмiв на мову Паскаль
- •Лiнiйнi алгоритми
- •Команди побудови розгалужень в нам
- •Наступнi алгоритми вимагають застосування команди розгалуження
- •Наступнi алгоритми вимагають застосування команди вибору
- •Команди повторення нам
- •Приклади алгоритмів, що вимагають застосування iтерацiйного циклу
- •Лiнiйні таблиці
- •Приклади алгоритмів
- •Прямокутні таблиці
- •Приклади алгоритмів прямокутних таблиць
- •Лiтерні величини
- •Приклади алгоритмів літерних величин
- •Список рекомендованої літератури
- •Про авторів
- •Алгоритмічна мова
- •18028, М. Черкаси, вул. Смілянська, 120/1
Команди повторення нам
Вказiвки повторення НАМ призначенi для побудови циклiчних алгоритмiв (фрагментiв алгоритмiв), що мiстять групи команд, виконання яких повторюється декiлька разiв пiдряд. Передбачено три види команд, а саме: для реалiзацiї арифметичного циклу i для реалiзацiї iтерацiйних циклiв з передумовою та з постумовою.
Команда для реалiзацiї арифметичного циклу стислiша в записi та зручнiша у використаннi, але має обмежене застосування (тiльки у випадках, коли кiлькiсть повторень визначена наперед). Команди для реалiзацiї iтерацiйних циклiв складнiшi у застосуваннi, але можуть бути використанi незалежно вiд того, вiдома наперед чи нi кiлькiсть повторень. В цiлому обидвi цi команди рiвноцiннi i перевага однiй з них надається в залежностi вiд змiсту задачi.
Команда, що реалiзує арифметичний цикл, називається командою повторення з параметром. Загальний вигляд її такий:
для X вiд Xпоч до Xкiн крок Xкрок
виконувати <серiя>
Змiст позначень у заголовку команди:
- параметр циклу X; являє собою змiнну будь-якого числового типу; в процесi виконання циклу значення параметра пробiгають деякий наперед визначений фiксований промiжок значень;
- початкове значення параметра Xпоч;
- кiнцеве значення параметра Xкiн;
- крок змiни параметра Xкрок.
Величини Xпоч, Xкiн, Xкрок у загальному випадку - арифметичнi вирази, тип яких має бути сумiсним по присвоєнню з типом параметра циклу X. У найпростiших випадках цi величини являють собою деякi константи або змiннi. Якщо Xкрок=1, то частину заголовку "крок Xкрок" у записi команди можна опускати, тобто значення Xкрок=1 приймається за замовчуванням.
Виконувана в циклi серiя може мiстити будь-яку кiлькiсть команд, може бути порожньою. Якщо команд у складi серiї менше двох, то для її вiдзначення службовi слова пс та кс застосовувати необов'язково.
Правило виконання команди повторення з параметром подається у виглядi такого алгоритму:
1) параметру X присвоюємо початкове значення X:=Xпоч;
2) перевiряємо, чи не виходить значення X за межi кiнцевого значення Xкiн;
3) якщо параметр X за межi Xкiн не виходить, то виконуємо серiю, значення параметра змiнюємо на величину кроку X:=X+Xкрок, пiсля чого повертаємось на п.2;
4) якщо параметр X виходить за межi кiнцевого значення Xкiн, то вважаємо команду циклу виконаною.
Таким чином, виконання серiї команд циклу вiдбувається щоразу при новому значеннi параметра циклу X: спочатку при X=Xпоч, потiм при X=Xпоч+Xкрок, X=Xпоч+2*Xкрок i т.д. Повторення виконання серiї продовжуються, поки параметр X не виходить за межi Xкiн. Внаслiдок цього кiлькiсть повторень циклу повнiстю визначається спiввiдношення величин Xпоч, Xкiн та Xкрок, а саме: виконання серiї буде повторено стiльки разiв, скiльки рiзних значень може набувати параметр циклу X на промiжку вiд свого початкового значення Xпоч до свого кiнцевого значення Xкiн з кроком Xкрок. Якщо ж з самого початку значення параметра X виходить за межi Xкiн, то серiя не виконується жодного разу. Кажуть, що кiлькiсть повторень виконання серiї визначається зовнiшнiми по вiдношенню до команди причинами.
Правило виконання команди показує взаємну залежнiсть величин, указаних в її заголовку, якщо ми очiкуємо принаймнi одноразового виконання серiї циклу. Якщо крок змiни параметра циклу додатнiй Xкрок>0, то повинно виконуватись спiввiдношення Xпоч≤Xкiн, i навпаки, якщо Xкрок<0, то повинно виконуватись спiввiдношення Xпоч≥Xкiн.
Зауважимо, що змiна значень параметра X у процесi виконання циклу здiйснюється автоматично у вiдповiдностi iз промiжком значень та кроком, зафiксованими перед виконанням циклу. Тому серед команд серiї циклу не повинно бути таких, що якимсь чином змiнюють значення Xпоч, Xкiн, Xкрок, а також параметр X.
Команда повторення, що реалiзує iтерацiйний цикл з передумовою, має такий загальний вигляд:
поки <умова>
виконувати <серiя>
У записi команди умова являє собою деякий логiчний вираз, що може бути iстинним або хибним. Виконувана в циклi серiя записується за тими ж правилами, що й для команди повторення з параметром.
Правило виконання команди може бути представлене у виглядi такого алгоритму:
1) обчислюємо значення умови;
2) якщо умова iстинна, то виконуємо команди серiї, пiсля чого повертаємось на п.1;
3) якщо умова хибна, то вважаємо команду циклу виконаною.
Отже, повторення виконання серiї вiдбуваються, поки є iстинною указана в командi умова. Якщо умова хибна з самого початку, то серiю не буде виконано жодного разу.
Правило виконання команди показує, що кiлькiсть повторень виконання серiї визначається внутрiшнiми по вiдношенню до команди причинами, тобто зв'язаними з виконуваними в циклi командами. Саме вони повиннi якимсь чином впливати на перевiрювану умову, щоб кiлькiсть повторень була скiнченною.
На базi команди повторення з передумовою можна побудувати послiдовнiсть команд, еквiвалентну командi повторення з параметром:
X:=Xпоч
поки (Xкiн-X)*Xкрок≥0
виконувати пс <серiя>; X:=X+Xкрок кс
Як бачимо, команда повторення з параметром записується дещо компактнiше та зрозумiлiше.
Команда повторення, що реалiзує iтерацiйний цикл з постумовою, має такий загальний вигляд:
повторювати
<серiя>
до <умова>
У записi команди умова являє собою деякий логiчний вираз, що може бути iстинним або хибним. Виконувана в циклi серiя може мiстити будь-яку кiлькiсть команд, може бути порожньою. Вiдзначати серiю службовими словами пс та кс не потрiбно, оскiльки серiю обмежують службовi слова повторювати та до.
Правило виконання команди може бути представлене у виглядi такого алгоритму:
1) виконуємо команди серiї;
2) обчислюємо значення умови;
3) якщо умова хибна, то повертаємось на п.1;
4) якщо умова iстинна, то команду вважаємо виконаною.
Отже, повторення виконання серiї вiдбуваються до моменту iстинностi указаної в командi умови. Таким чином, дана команда забезпечує принаймнi одноразове виконання серiї, незалежно вiд своєї умови. Iз правила виконання випливає, що кiлькiсть повторень виконання серiї, вiдмiнна вiд одиницi, визначається внутрiшнiми причинами, тобто командами, якi впливають на значення перевiрюваної умови.
Для побудови циклiчних програм (фрагментiв програм) мова Паскаль пропонує три команди: для реалiзацiї арифметичного циклу, циклу з передумовою та циклу з постумовою.
Iтерацiйний цикл з передумовою (цикл-ПОКИ) у мовi Паскаль реалiзується такою командою:
While <умова> Do <серiя>;
Якщо серiя мiстить одну команду або порожня, то для її вiдзначення застосування операторних дужок Begin i End необов'язкове.
Iтерацiйний цикл з постумовою (цикл-ДО) у мовi Паскаль реалiзується такою командою:
Repeat <серiя> Until <умова>;
Для вiдзначення серiї операторнi дужки не потрiбнi, незалежно вiд кiлькостi команд у нiй.
Мiж указаними командами та аналогiчними командами НАМ iснує повна вiдповiднiсть.
Арифметичний цикл (цикл-ДЛЯ), у разi, якщо Xпоч≤Xкiн, реалiзується такою командою:
For X:=Xпоч To Xкiн Do <серiя>;
Той же самий арифметичний цикл, у разi, якщо Xпоч≥Xкiн, реалiзується такою командою:
For X:=Xпоч DownTo Xкiн Do <серiя>;
Якщо серiя мiстить одну команду або порожня, то для її вiдзначення застосування операторних дужок Begin i End не обов'язкове.
Указанi команди циклу з параметром у порiвняннi з аналогiчною командою НАМ мають деякi особливостi. Головна з них та, що цi команди можуть бути застосованi для параметра X тiльки порядкового типу. Але цей порядковий тип може бути будь-яким, тобто не тiльки цiлим числовим, але й символьним, логiчним або перелiчувальним. При цьому параметр циклу X, при умовi, що жодна команда серiї не впливає на це, послiдовно приймає всi свої значення вiд Xпоч до Xкiн. Зрозумiло, що вирази Xпоч та Xкiн теж повиннi мати вiдповiдний порядковий тип.
Таким чином, ми бачимо, що команда циклу з параметром НАМ може бути перекладена у команду циклу з параметром мови Паскаль, тiльки якщо її параметр X та вирази Xпоч, Xкiн мають цiлий числовий тип, а вираз Xкрок дорiвнює або 1, або -1. В усiх iнших випадках для перекладу на мову Паскаль має застосовуватись команда циклу з передумовою:
X:=Xпоч;
While (Xкiн-X)*Xкрок>=0 Do
Begin <серiя>; X:=X+Xкрок End;
При цьому загальна форма умови (Xкiн-X)*Xкрок>=0 в конкретних випадках може бути спрощена. Якщо Xкрок>0, то її можна замiнити умовою X<=Xкiн, а якщо Xкрок<0, то умовою X>=Xкiн.
Надзвичайно важливе значення при побудовi циклiчних алгоритмiв мають таблицi виконання, якi дозволяють прослiдковувати процеси виконання алгоритмiв i таким чином перевiряти їх правильнiсть.
Таблиця виконання алгоритму - прямокутна. В стовпчиках таблицi розмiщують всi тi змiннi алгоритму, що дiйсно змiнюють свої значення в процесi його виконання, а також всi умови, явнi та неявнi, якi в процесi виконання алгоритму перевiряються. Порядок розташування стовпчикiв довiльний. В рядках таблицi послiдовно записують значення змiнних та умов, якi одержують внаслiдок виконання команд.
Перед таблицею указують контрольний приклад до алгоритму, тобто конкретнi значення аргументiв та правильнi значення результатiв, що мають бути одержанi. Для правильно побудованого алгоритму фактично одержанi у таблицi значення результатiв мають спiвпадати з результатами контрольного прикладу. З метою ретельної перевiрки алгоритму таких таблиць виконання для одного алгоритму може бути побудовано декiлька для рiзних контрольних прикладiв.
Щоб таблиця виконання алгоритму була зрозумiлою, при запису значень в неї треба неухильно притримуватись такого правила: кожне наступне значення може вноситись в таблицю тiльки правiше вiд усiх попереднiх в останньому рядку або нижче вiд усiх попереднiх в наступному рядку.
Приклад 1. Побудувати таблицю виконання для алгоритму знаходження найбiльшого спiльного дiльника натуральних чисел M i N.
алг НСД(M,N: нат): нат
поч
поки MN
виконувати пс якщо M>N то M:=M-N
якщо N>M то N:=N-M кс
НСД:=M
кiн
Початковi данi: M=42, N=70. Очiкуваний результат: НСД=14.
-
M
N
MN
M>N
N>M
42
70
ТАК
НІ
ТАК
28
ТАК
ТАК
14
ТАК
14
НІ
Приклад 2. Побудувати таблицю виконання для алгоритму обчислення суми факторiалiв натуральних чисел в межах вiд 1 до N.
алг СУМАФАКТ(N: нат): нат
поч i,F,S: нат
F:=1; S:=0
для i вiд 1 до N
виконувати пс F:=F*i; S:=S+F кс
СУМАФАКТ:=S
кiн
Початковi данi: N=3. Очiкуваний результат: S=1!+2!+3!=9.
-
F
S
i
i≤N
1
0
1
ТАК
1
1
2
ТАК
2
3
3
ТАК
6
9
4
НІ
Приклад 3. Побудувати таблицю виконання для алгоритму пiдрахунку суми та кiлькостi тих членiв арифметичної прогресiї з рiзницею D, що знаходяться в промiжку мiж числами A i M включно. Тут A - перший член арифметичної прогресiї, M - граничне число.
алг СУМА(арг A,D,M: дiйс; рез S: дiйс, K: нат)
поч i: дiйс
S:=A; K:=1
для i вiд A+D до M крок D
виконувати пс S:=S+i; K:=K+1 кс
кiн
Дано: A=3.5, D=2, M=11. Очiкуваний результат: S=26, K=4.
-
S
K
i
i≤M
3.5
1
5.5
ТАК
9
2
7.5
ТАК
16.5
3
9.5
ТАК
26
4
11.5
НІ
Приклад 4. Побудувати таблицю виконання для алгоритму, що визначає, яку найменшу кiлькiсть парних натуральних чисел, починаючи з 2, треба взяти, щоб добуток їх квадратiв перевищив деяке наперед задане число M, а також визначає значення цього добутку.
алг ДОБУТОК(арг M: нат; рез D,K: нат)
поч a: нат
K:=0; D:=1; a:=2
повторювати
K:=K+1; D:=D*a^2; a:=a+2
до D>M кiн
Початковi данi: M=2000. Очiкуваний результат: D=2304, K=3.
-
K
D
a
D>M
0
1
2
1
4
4
НІ
2
64
6
НІ
3
2304
8
ТАК
Якщо порядок розташування стовпчикiв у таблицi виконання вибрати іншим, то послiдовнiсть значень у таблицi не змiниться, але змiниться їх загальне розташування. Змiниться також розмiр таблицi. Даний приклад показує, що розташування стовпчикiв у таблицi може бути вдалим або невдалим.
-
D
K
a
D>M
0
1
2
1
4
4
НІ
2
64
6
НІ
3
2304
8
ТАК
Приклади алгоритмів, що вимагають застосування арифметичного циклу
Приклад 5. "Сума членiв послiдовностi". Нескiнченну числову послiдовнiсть задано формулою загального члена
Ai = 1 / (2 + Sin(i)), i = 1, 2, 3, ... .
Побудувати алгоритм знаходження суми N перших членiв послiдовностi.
алг СУМА(N: цiл): дiйс
поч i: цiл, A,S: дiйс
S := 0
для i вiд 1 до N
виконувати пс A := 1/(2+Sin(i)); S := S+A кс
СУМА := S
Кiн
Алгоритм демонструє методику побудови алгоритму знаходження суми N перших членiв послiдовностi. В алгоритмi застосовано поступове циклiчне нарощення суми, починаючи вiд початкового значення S=0. Застосування арифметичного циклу обумовлене вiдомою наперед кiлькiстю додавань N. Алгоритм демонструє явище, що носить назву "зникнення iндексу". Це означає, що в процесi обчислень для всiх членiв послiдовностi використане одне й те ж позначення A, оскiльки в будь-який момент ми працюємо лише з одним членом послiдовностi. Аналогiчно може бути побудований алгоритм знаходження добутку N перших членiв послiдовностi. Для цього варто лише вибрати iнше присвоєння початкового значення S:=1, замiнити додавання множенням, а також помiняти назву алгоритму. Алгоритм коректно реагує на значення N=1.
Приклад 6. "Добуток членiв послiдовностi". Нескiнченну числову послiдовнiсть задано рекурентною формулою загального члена
Ai+1 = Ai * Ln(1.5 + Cos(i)); A1 = 2.5; i = 1, 2, 3, ... .
Побудувати алгоритм знаходження добутку N перших членiв послiдовностi.
алг ДОБУТОК(N: цiл):дiйс
поч i: цiл, A,D: дiйс
D := 1; A := 2.5
для i вiд 1 до N
виконувати пс D := D * A; A := A * Ln(1.5 + Cos(i)) кс
ДОБУТОК := D
кiн
Алгоритм демонструє методику побудови алгоритму знаходження добутку N перших членiв послiдовностi. В алгоритмi застосовано поступове циклiчне нарощення добутку, починаючи вiд початкового значення D=1. Застосування арифметичного циклу обумовлене вiдомою наперед кiлькiстю множень N. Алгоритм демонструє явище "зникнення iндексу". На вiдмiну вiд попереднього алгоритму, команди обчислення добутку та члена послiдовностi записанi в циклi в iншому порядку. Це обумовлено обчисленням першого члена послiдовностi перед циклом. Аналогiчно може бути побудований алгоритм знаходження суми N перших членiв послiдовностi. Алгоритм коректно реагує на значення N=0.
Приклад 7. "Числа Фiбоначчi". Знайти число Фiбоначчi з порядковим номером N.
алг ФIБОНАЧЧI(N: цiл): цiл
поч a,b,c,i: цiл
a := 1; b := 1; c := 1;
для i вiд 3 до N
виконувати пс c := a + b; a := b; b := c кс
ФIБОНАЧЧI := c
кiн
Послiдовнiсть натуральних чисел 1, 1, 2, 3, 5, 8, ... , в якiй кожне число (крiм перших двох) дорiвнює сумi двох попереднiх, називається числами Фiбоначчi. Значення N=0 недопустиме.
Приклад 8. "Пiднесення до степеня". Пiднести довiльне число A до цiлого додатнього степеня N.
алг СТЕПIНЬ(A: дiйс, N: цiл): дiйс
поч D: дiйс, i: цiл
D := 1
для i вiд 1 до N виконувати D := D * A
СТЕПIНЬ := D
кiн
Алгоритм є правильним для будь-яких A тiльки при N>0.
Приклад 9. "Найменше значення функцiї". Задано функцiю f(x), неперервну на промiжку [a,b]. Промiжок розбито на N рiвних частин. Знайти значення аргументу x, при якому досягається найменше iз значень функцiї, обчислених в точках розбиття.
алг MinF(a,b: дiйс, N: цiл): дiйс
поч h,min,t,fa: дiйс, i: цiл
h := (b-a)/N; t:=a; min := f(t)
для i вiд 1 до N
виконувати пс a := a + h; fa := f(a)
якщо fa < min то пс t:=a; min := fa кс кс
MinF := t
кiн
Обчислення значень функцiї здiйснюється шляхом звернень до допомiжної функцiї f(x). Значення аргументу, при якому досягається найбiльше значення функцiї, можна знайти за допомогою аналогiчного алгоритму. Для цього достатньо символ "<" замiнити символом ">".
Приклад 10. "Застосування рекурентних формул". Нескiнченну числову послiдовнiсть задано формулою загального члена
Побудувати алгоритм знаходження суми N перших членiв послiдовностi.
алг СУМА(N: цiл, x: дiйс): дiйс
поч i: цiл, B,C,D,F,S: дiйс
S := 0; B := -1; C := x; D := 1; F := 1
для i вiд 2 до N+1
виконувати пс S := S + B * C / (D * F)
B := -B; C := C * x; D := D * i; F := F + i кс
СУМА := S
кiн
Даний алгоритм демонструє методику побудови алгоритму шляхом застосування рекурентних формул. В данiй задачi певнi циклiчнi процеси потрiбнi не тiльки для знаходження суми членiв послiдовностi, а також i для обчислення кожного члена послiдовностi. Тут представлено найбiльш поширенi випадки: знакозмiна, пiднесення до степеня, факторiал, сума. За таких умов найдоцiльнiшим є застосування штучних рекурентних формул. Рекурентнi формули дозволяють простим способом знаходити наступнi значення, якщо вiдомi попереднi. При цьому весь вираз для обчислення члена послiдовностi розбивається на певнi елементи, до кожного з яких, при необхiдностi, пiдбирається обчислювальна рекурентна формула. За рахунок цього вдається позбавитись циклiв при обчисленнi значень членiв послiдовностi. В алгоритмi застосовано такi рекурентнi формули:
1) Bi = (-1)i; Bi = -Bi-1; B1 = -1;
2) Ci = xi; Ci = Ci-1 * x; C1 = x;
3) Di = i!; Di = Di-1 * i; D1 = 1;
4) Fi = 1+2+...+i; Fi = Fi-1 + i; F1 = 1.