При розв’язуванні багатьох задач іноді доводиться багаторазово виконувати певні дії. Такий процес назвемо циклічним, а відповідні алгоритми та програми – циклічними. Для графічного описання алгоритмів розв’язку таких задач використовується базова структура “цикл&rdqu
;.
У математиці прикладом циклу є процес табулювання функції, де значення функції, заданої деяким виразом (формулою) обчислюється декілька разів при різних значеннях аргументу.
З погляду на програму, цикл - це така її конструкція, за допомогою якої деяка серія вказівок (операторів) програми повторюється скінчену кількість разів. Причому вказівки серії для кожного повтору, як правило, використовують різні значення величин.
Серія повторюваних вказівок (операторів) програми складає тіло циклу. Умову, за якої відбуваються повтори тіла циклу, називати вказівок (операторів) програми повторюється скінчену кількість разів. Причому вказівки серії для кожного повтору, як правило, використовують різні значення величин.
Серія повторюваних вказівок (операторів) програми складає тіло циклу. Умову, за якої відбуваються повтори тіла циклу, називатимемо умовою циклу. У залежності від взаємного розташування тіла та умови розрізняють два види циклів: цикл-поки (цикл з передумовою) та цикл-до (цикл з післяумовою). З циклу-поки можна виділити окремий вид – цикл-для (цикл з параметром).
Цикл-для. У такому циклі вказується для яких послідовних значень параметра потрібно циклічно виконати серію вказівок. При цьому для параметра циклу (і) задається початкове значення, і в кожному оберті циклу параметр змінюється за законом арифметичної прогресії (і = і + h, де h – крок циклу) доти, доки по мемо умовою циклу. У залежності від взаємного розташування тіла та умови розрізняють два види циклів: цикл-поки (цикл з передумовою) та цикл-до (цикл з післяумовою). З циклу-поки можна виділити окремий вид – цикл-для (цикл з параметром).
Цикл-для. У такому циклі вказується для яких послідовних значень параметра потрібно циклічно виконати серію вказівок. При цьому для параметра циклу (і) задається початкове значення, і в кожному оберті циклу параметр змінюється за законом арифметичної прогресії (і = і + h, де h – крок циклу) доти, доки поточне значення параметра не перевищить задане кінцеве значення. Зауважимо, що для деяких мов програмуванням h може бути нецілим числом.
Такий вид циклу використовується тоді, коли у програмі, перед виконанням тіла циклу, наперед відомо яку кількість повторів тіла циклу необхідно виконати.
При структурному підході до графічного описання алгоритмів для вказаного циклу використовується базова структура “цикл-поки”. Можна також використати структуру з блоком послідовної зміни параметра – шестигранником (структура “для”). Наприкл ться для яких послідовних значень параметра потрібно циклічно виконати серію вказівок. При цьому для параметра циклу (і) задається початкове значення, і в кожному оберті циклу параметр змінюється за законом арифметичної прогресії (і = і + h, де h – крок циклу) доти, доки поточне значення параметра не перевищить задане кінцеве значення. Зауважимо, що для деяких мов програмуванням h може бути нецілим числом.
Такий вид циклу використовується тоді, коли у програмі, перед виконанням тіла циклу, наперед відомо яку кількість повторів тіла циклу необхідно виконати.
При структурному підході до графічного описання алгоритмів для вказаного циклу використовується базова структура “цикл-поки”. Можна також використати структуру з блоком послідовної зміни параметра – шестигранником (структура “для”). Наприклад, для одного і того ж циклу з параметром j, що послідовно змінюється від 1 до n з кроком h, наведемо вказані базову структуру “цикл-поки” (мал. 12) та структуру “для” (мал. 13)
Цикл-поки (цикл з передумовою) призначений для повторного виконання деякої вказівки чи серії вказівок, поки виконується умова циклу. Цей цикл використовується у тих випадках, коли наперед невідома кількість повторень тіла циклу. Зауважимо, що при виконанні циклу-поки можлива ситуація, коли тіло циклу не виконається жодного разу. Для графічного описання алгоритмів вказаного циклу використовується базова структура “цикл-поки”.
Варто зазначити, що у програмах, які використовують цикл-поки, тіло циклу має містити команду, циклічне виконання якої приводить до зміни істинності умови циклу. Інакше цикл може виконувати нескінченну кількість повторів - програма “зациклюється”.
Цикл-до (цикл з післяумовою) повторно виконує деяку вказівку чи серію вказівок доти, доки не виконається умова виходу з циклу. Як і цикл-поки цей цикл, як правило, використовують тоді, коли наперед невідома кількість повторень тіла циклу. Але, на відміну від циклу-поки, тіло циклу-до виконається хоча б один раз за будь-яких умов. Для графічного описання алгоритмів вказаного циклу використовується базова структура “цикл-до”.
Аналогічно програмам з циклом-поки, програми, що використовують цикл-до, у тілі циклу мають містити команду, циклічне виконання якої приводить до зміни істинності умови циклу.
Навчальна алгоритмічна мова
Для реалізації циклічної конструкції у НАМ використовують вказівку пока або вказівку для. Вказівка пока у програмі забезпечує роботу циклу-поки (циклу з передумовою). Структура вказівки:
нц пока <умова> {початок тіла циклу}
<серія команд> {тіло циклу}
кц {кінець тіла циклу}
Структура вказівки для, яка реалізує цикл з параметром:
нц для <змінна> от <поч_знач.> до <кінц_знач.> шаг <значення>
<серія команд> {тіло циклу}
кц
Basic
У мові Basic для реалізації циклу для використовують оператор FOR...NEXT. Цей оператор має таку структуру:
foR < змінна > = < знач1> TO < знач2 > STEP < знач3 >
<серія операторів> {тіло циклу}
NEXT <змінна>
Тут змінна є параметром циклу, знач1 - початкове значення параметра, знач2 - кінцеве значення параметра, знач3 - крок циклу.
Після кожного виконання тіла циклу, при виконанні оператора NEXT, значення змінної збільшується на величину, що стоїть після вказівки STEP (знач3). Якщо ця вказівка не записана, то крок циклу вважається рівний 1.
Циклічну конструкцію у програмі можна організувати також за допомогою операторів умовного та безумовного переходу (див. приклад на стор. 56).
Pascal
Конструкція “цикл-поки” (цикл з передумовою) у мові Pascal реалізована оператором, що має форму:
WHILE < логічний вираз > DO < тіло циклу > ;
Тіло циклу буде повторюватися доти, доки істинний логічний вираз. Нагадаємо, що для того, щоб програма не “зациклювалася”, тіло циклу має містити оператори, які впливали б на істинність умови циклу. Якщо тіло циклу складається з декількох операторів, то їх об'єднують у складовий оператор.
Конструкція “цикл-до” (цикл з післяумовою) реалізована оператором, що має форму:
REPEAT < тіло циклу > UNTIL < логічний вираз > ;
Тіло циклу, розміщене між ключовими словами REPEAT (повторювати) і UTIL (до), повторюється доти, доки логічний вираз, що йде після слова UNTIL, не стане істинним. Якщо тіло циклу для вказаного оператора містить не один, а декілька операторів, то записувати їх в оператор них дужках не має потреби. На відміну від оператора WHILE обчислення логічного виразу відбувається не до, а після чергового повторення циклу.
Отже, цикл REPEAT обов'язково виконується хоча б один раз, а цикл WHILE може не виконуватися жодного разу.
Конструкцію “цикл-для” (цикл з передумовою) реалізує оператор, що має форму:
FOR < змінна > := < вираз1 > TO < вираз2 > DO < тіло циклу > ;
де змінна - змінна порядкового типу, яка приймає послідовно зростаючі значення; вираз1 і вираз2 того ж типу, що і змінна. Виконання розпочинається з обчислення значень вираз1 і вираз2. Далі змінна одержує значення вираз1 і виконується перевірка, чи не перевищує одержане значення змінної вираз2: якщо не перевищує, то виконується тіло циклу. Тоді, коли значення змінної стає неменшим значення вираз2, оператор виконується останній раз.
Можливе використання оператора FOR для випадку, коли змінна приймає послідовно спадаючі значення:
FOR < змінна > := < вираз1 > DOWNTO < вираз2 > DO < тіло циклу > ;
Для того, щоб такий цикл виконався хоча б раз, значення вираз1 має бути не менше значення вираз2. Наприклад:
For С := ’ Z ' Downto ' A ' Do WriteLn ( С ) ;
Зауважимо, що в обох випадках (зростання, спадання) параметр циклу може змінюватися тільки з кроком, рівним 1.
Оператор, повторюваний у циклі, сам може бути циклом. Така структура має назву вкладений цикл. У мові Pascal немає обмежень на кількість і глибину вкладення циклів.
For С := ’ Z ' Downto ' A ' Do WriteLn ( С ) ;
Зауважимо, що в обох випадках (зростання, спадання) параметр циклу може змінюватися тільки з кроком, рівним 1.
Оператор, повторюваний у циклі, сам може бути циклом. Така структура має назву вкладений цикл. У мові Pascal немає обмежень на кількість і глибину вкладення циклів.
Приклад 1. Знайти суму перших n членів ряду .
І етап. Подамо суму членів даного ряду так:
початок
N
S := 0
i, 1, N, 1
a
S := S + a
S
кінець
мал. 14
|
У змінній S будемо накопичувати шукану суму. Перед виконанням такого накопичення очистимо область пам’яті S – змінній S присвоїмо 0.
Для накопичення організуємо цикл з параметром і, що змінюється від 1 до n. Для кожного обороту циклу (та для кожного нового значення і) будемо повторювати такі дії: обчислимо аі, викличемо з пам’яті поточне значення змінної S, додамо до S обчислене аі, результат додавання знову присвоїмо S (значення S + аі відправимо у область пам’яті S).
ІІ етап. Складемо блок-схему (мал. 14).
ІІІ етап. Запишемо текст програми.
алг Сума1 (вещ S, цел n)
арг n
рез S
нач цел i
S :=0
нц для i от 1 до n шаг 1
S := S + 1 / ( i**2 )
кц
кон
НАМ-програма 6
|
10 REM Сума1
20 INPUT “ Введіть значення для n=” ; N
30 S=0
40 FOR I=1 TO N STEP 1
50 S=S+1/(I^2)
60 NEXT
70 PRINT “S=”; S
80 END
|
|
Program SUMA1;
Var
S : Real;
N, i : Integer;
Begin
Write ( ‘ Введіть значення для n= ’ ) ;
ReadLn ( N ) ;
S := 0;
For i := 1 to N do
S := S + 1 / Sqr ( i ) ;
WriteLn ( ‘ S= ’, S :10 :6 )
End.
|
Basic-програма 6
|
|
Pascal-програма 6
|
IV етап. n
Приклад 2. Знайти суму членів гармонійного ряду з точністю Е.
початок
E
S := 0
i := 1, a := 1
| a | > E
S := S + a
i := i + 1
a
S
кінець
мал. 15
|
І етап. Математична модель. Знайти суму ряду з точністю Е означає сумувати члени ряду доти, доки модуль різниці між знайденою сумою Sі (для і членів) та попередньою сумою Sі-1 (для і-1 члена) більший заданого числа Е: | Sі-Sі‑1 | > Е. Якщо у виразі, що стоїть під знаком модуля звести подібні доданки, то одержимо, що | aі | > Е, де aі - і-й член ряду. Тому оцінюємо лише останній доданок.
ІІ етап. Блок-схема (мал. 15).
алг Сума2 (вещ S, E)
арг Е
рез s
нач цел i, вещ a
i := 1 ; a := 1 ; S := 0
нц пока abs (a) > E
. S := S + a
. i := i+1
. a := ((-1)**(i+1)) / (i**2)
кц
S := S
кон
НАМ-програма 7
|
ІІІ етап. Запишемо текст програми.
10 REM Сума2
20 INPUT “Введіть E = ” ; E
30 S=0 : I=1 : A=1
40 IF ABS(A) > E THEN 50 ELSE 90
50 S=S + A
60 I= I + 1
70 A=((-1) ^ (I+1)) / (I^2)
80 GOTO 40
90 PRINT “S=” ; S
100 END
Basic-програма 7
|
|
Program SUMA2 ;
Var
E, S, A : Real ;
I, J : Integer ;
Begin
Write ( ‘ Введіть E = ’ ) ;
ReadLn ( E ) ;
S := 0 ; I :=1 ; J:=1 ; A:=1;
While Abs(A) > E do
Begin
S := S + A;
I := I+1; J :=J*(-1) ; A := J / Sqr(I)
End;
WriteLn ( ‘ S= ’, S :10 :6 )
End.
|
|
|
Pascal-програма 7
|
IV етап. n |