Під основним алгоритмом будемо розуміти алгоритм, використання якого забезпечує розв’язування даної (основної) задачі.
Іноді при повному розв’язку основної задачі можна виділити деякий її фрагмент – окрему допоміжну задачу, яка або раніше була розв’язана кори
тувачем, або розв’язок якої є відомим (типова задача, чи задача розв’язана іншими користувачами). Врахуємо й те, що допоміжна задача може використовуватися декілька разів при розв’язуванні основної задачі. Для допоміжної задачі окремо від основного алгоритму може розроблятися новий алгоритм або використовуватися раніше описаний. Про алгоритм розв’язку допоміжної задачі говорять як про допоміжний по відношенню до алгоритму розв’язку основної задачі.
Таким чином, розроблені користувачем алгоритми можна використовувати для певних задачах як основні, а дл новий алгоритм або використовуватися раніше описаний. Про алгоритм розв’язку допоміжної задачі говорять як про допоміжний по відношенню до алгоритму розв’язку основної задачі.
Таким чином, розроблені користувачем алгоритми можна використовувати для певних задачах як основні, а для інших – як допоміжні.
У мовах програмування розрізняють два види допоміжних алгоритмів: алгоритми – функції користувача та алгоритми – процедури користувача. Функція користувача – це незалежна іменована частина програми, яку можна викликати для виконання певних дій. Вона дозволяє знайти лише одне значення, передати його у точку виклику, і ім’я функції може бути частиною виразу (входити до виразу як операнд). Процедура аналогічна функції, але процедура не може бути частиною виразу (операндом), і після виконання процедури завжди є можливість викори я інших – як допоміжні.
У мовах програмування розрізняють два види допоміжних алгоритмів: алгоритми – функції користувача та алгоритми – процедури користувача. Функція користувача – це незалежна іменована частина програми, яку можна викликати для виконання певних дій. Вона дозволяє знайти лише одне значення, передати його у точку виклику, і ім’я функції може бути частиною виразу (входити до виразу як операнд). Процедура аналогічна функції, але процедура не може бути частиною виразу (операндом), і після виконання процедури завжди є можливість використати у програмі не тільки один, а декілька результатів її роботи. Зауважимо, що і про програми, у залежності від того, який алгоритм вони подають, іноді говорять як про основні та допоміжні (підпрограми).
Розбиваючи задачу на частини і формуючи відокремлені модулі як процедури та функції, програміст реалізує основні принципи структурного програмування.
Навчальна алгоритмічна мова.
Для того, щоб у Е-практикумі скористатися допоміжним алгоритмом необхідно після конструкції основного алгоритму вставити нову конструкцію (комбінація клавіш ) Така конст них дій. Вона дозволяє знайти лише одне значення, передати його у точку виклику, і ім’я функції може бути частиною виразу (входити до виразу як операнд). Процедура аналогічна функції, але процедура не може бути частиною виразу (операндом), і після виконання процедури завжди є можливість використати у програмі не тільки один, а декілька результатів її роботи. Зауважимо, що і про програми, у залежності від того, який алгоритм вони подають, іноді говорять як про основні та допоміжні (підпрограми).
Розбиваючи задачу на частини і формуючи відокремлені модулі як процедури та функції, програміст реалізує основні принципи структурного програмування.
Навчальна алгоритмічна мова.
Для того, щоб у Е-практикумі скористатися допоміжним алгоритмом необхідно після конструкції основного алгоритму вставити нову конструкцію (комбінація клавіш ) Така конструкція розглядатиметься системою як допоміжний алгоритм тільки тоді, коли текст основної програми містить вказівку з назвою допоміжного алгоритму.
Якщо допоміжний алгоритм є процедурою, то у основному алгоритмі при посиланні на процедуру у дужках вказуються вхідні та вихідні дані (аргументи та результат). Наприклад, якщо допоміжний алгоритм має заголовок виду алг Min2 (цел K, N, целтаб B[1:К,1:N], цел min, v, w), то у основному алгоритмі має бути окрема вказівка, подібна до такої: Min2 (KA, NA, A, b1, x2, y2).
Якщо допоміжний алгоритм є функцією користувача, то у основному алгоритмі при посиланні на функцію у дужках записуються лише вхідні дані (аргументи). При цьому у допоміжному алгоритмі використовується змінна знач, якій обов’язково присвоюється результат роботи і перед іменем заголовку такого алгоритму вказується тип вихідних даних – результатів функції. Наприклад, якщо заголовок допоміжного алгоритму алг вещ длина (вещ x, y, x0, y0), то у основному алгоритмі звернення до функції длина має бути подібне до такого: y := длина (x2, y2, x1, y1).
Basic.
Користувач має можливість використовувати не тільки стандартні функції мови Basic, а й нові. Перед використанням функції користувача її спочатку описують за допомогою команди DEF:
DEF FN<літера>(аргументи) = <вираз>
де <літера> — будь-яка літера латинського алфавіту. Ім’я функції користувача складається таким чином з трьох літер, причому перші дві фіксовані — FN. Після імені в круглих дужках можуть бути вказані вхідні дані — аргументи, які відокремлюються комами; після знаку = записується арифметичний вираз, яких у вигляді формули подає алгоритм обчислення значення нової функції. Наприклад, опишемо нову функцію :
20 DEF FNF ( X, Y, X0, Y0 ) = SQR ( ( X - X0 )^2 + ( Y - Y0 )^2 )
При зверненні до функції користувача замість формальних аргументів підставляються їх фактичні значення. Наприклад,
30 X1=2, Y1=2, X2=1, Y2=0
40 A = FNF ( X1, Y1, X2, Y2 )
Використання функції користувача доцільно при багаторазовому обчисленні за певною формулою і лише тоді, коли обчислювальний алгоритм достатньо простий та зводиться до однієї формули.
У тих випадках, коли для описання допоміжного алгоритму необхідно декілька операторів, використовують підпрограми. Підпрограма — це послідовність операторів, до виконання якої ЕОМ переходить з основної програми за оператором GOSUB, і яка закінчується оператором RETURN.
При використанні підпрограм важливим є те, що у основній програмі необхідно:
§ спочатку підготувати аргументи для передачі у підпрограму. Наприклад:
100 KK=K : NN=N
§ викликати підпрограму - записати оператор GOSUB N (де N – номер рядка програми, починаючи з якого записана підпрограма). Наприклад:
110 GOSUB 250
§ забезпечити повернення до основної програми результатів роботи підпрограми. Наприклад:
120 C1=MIN : X1=X : Y1=Y .
При цьому основна програма обов’язково має закінчуватися оператором END.
Програма може мати декілька підпрограм і до однієї підпрограми може бути звернення з декількох місць як основної програми так із інших підпрограм.
Pascal.
Функція, що визначається користувачем, складається з заголовка і тіла функції. Структура функції має вигляд:
FUNCTION <ім'я> (параметри) : <тип результату> ;
Const … ;
Type … ;
Var … ;
BEGIN
<оператори>
END ;
Заголовок містить: зарезервоване слово FUNCTION; ім'я функції, задане користувачем; параметри - список змінних (кількість змінних необмежена і вказується користувачем), для кожної з яких вказується тип; тип результату, тобто тип значення, яке обчислює функція (такий тип має бути скалярним). Зауважимо, що типи заголовку функції можна позначати тільки іменами, тому, наприклад, тип масиву потребує попереднього опису в розділі Type основної програми.
Тіло функції є локальним блоком, за структурою аналогічним програмі, але закінчується не крапкою, а крапкою з комою. У тілі функції обов’язково має бути оператор присвоєння, у лівій частині якого записане ім’я функції. Тоді ім’я функції виступає у ролі змінної, якій присвоюється деяке значення, і таке значення є результатом роботи функції. При цьому у точку виклику функції повертається результат останнього присвоювання. Звернення до функції в основній програмі здійснюється за іменем функції з переліком списку аргументів, який є необов’язковим. Якщо аргументи вказані, то порядок запису і типи аргументів повинні бути такими ж, як у параметрів заголовку функції.
Після описання функції її можна використовувати у виразах разом зі стандартними функціями. Аргументами при звертанні можуть бути будь-які вирази.
Процедура користувача - це самостійна програмна одиниця, що виконується по команді з іншої програмної одиниці (програми, процедури або функції). Процедура використовується тоді, коли підзадача не схожа на функцію, тобто не повертає жодного або повертає багато значень. Процедура відрізняється від функції тільки заголовком і способом звертання до неї.
Схема заголовка процедури така:
PROCEDURE <ім'я> (параметри) ;
Зауважимо, що описання міток, констант, типів тощо дійсні тільки у межах даної процедури. В тілі процедури можна використовувати будь-які глобальні константи та змінні.
Процедура може не тільки одержувати значення від програми, але і повертати в програму нові значення. Для цієї цілі існують параметри-змінні.
У той час, як параметр одержує значення аргументу шляхом присвоєння, параметр-змінна - це просто інше ім'я для аргументу. Під цим ім'ям значення аргументу стає доступним у процедурі. Всі перетворення, виконувані в процедурі над параметром-змінною, виконуються над аргументом.
У списку параметрів заголовка процедури перед параметрами-змінними ставлять слово VAR. Наприклад,
procedure dataOUT ( Var A, B, C : integer ) ;
Параметри-змінні можна використовувати не тільки в процедурах, але й у функціях.
У деяких питаннях розходження між процедурами і функціями не є суттєвим. Обговорюючи такі питання, будемо називати їх загальним іменем - блок.
У програмі може бути описано скільки завгодно блоків. Усередині цих блоків можуть бути описи інших блоків і т.д. без видимих обмежень. Важливо знати, звідки які блоки можуть бути викликані (тобто встановити видимість). Для відповіді на це питання уявіть, що блок - це будинок, у якого в вікнах одностороннє дзеркало. Зсередини через них видно усе, що знаходиться зовні, всередину ж заглянути не можна.
Видимість - це властивість всіх описів, а не тільки блоків. Знаходячись у блоці, можна користуватися всім, що видно з нього.
Об'єкти, описані в блоці, називаються внутрішніми, а ті, що описані в блоках, що охоплюють даний, - зовнішніми відносно блока. Зовнішні змінні дають додатковий канал зв'язку між блоками (головним каналом варто вважати параметри і параметри-змінні). Користуватися цим каналом треба обережно, тому що він посилює залежність блоків один від одного і цим ускладнює розробку програми.
Може статися, що імена різних зовнішніх змінних співпадуть. Яка з однойменних змінних буде видна з блока? Буде видна та, що описана в найближчому з зовнішніх блоків. Якщо ж конкуренція виникне між зовнішньою і внутрішньою змінними, то видима буде внутрішня.
Приклад 1. Дано два цілочисельних масиви С (3х2) та D (3х2). Знайти більший серед мінімальних елементів даних масивів, індекси такого елемента та ім’я відповідного масиву.
початок
K, N,
C, D
с1, x1, y1
d1, x2, y2
c1 > d1
z := “D” z := “C”
m : = d1 m : = c1
x:=x2 y:=y2 x := x1 y := y1
z, m, x, y
кінець
мал. 20
|
І етап. Спочатку у кожному масиві визначимо мінімальний елемент та його індекси: для цього двічі скористаємося допоміжним алгоритмом, що забезпечує пошук мінімального елемента масиву. Знайдені мінімальні елементи порівняємо та визначимо більший.
a) алг БЗМ (целтаб С[1:3,1:2], D[1:3,1:2], цел х, y, m, K, N, лит z)
b) арг K, N, С, D = 3, 2, 0,-5,1,4,2,1, 0,-2,-3,4,3,1
c) рез z, m, x, y
d) нач цел x1, x2, y1, y2, с1, d1
e) Min2 (K, N, C, с1, x1, y1)
f) Min2 (K, N, D, d1, x2, y2)
g) если с1>d1
h) то z :=”С”
i) m := c1
j) x := x1
k) y := y1
l) иначе z := “D”
m) m := d1
n) x := x2
o) y := y2
p) все
q) z := z
r) m := m
s) x := x
t) y := y
u) кон
v) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
w) алг Min2(цел KK, NN, целтаб B [1:KK,1:NN], цел min, v, w)
x) арг KK, NN, B
y) рез min, v, w
z) нач цел i, j
aa) min :=B [1,1]
bb) v := 1
cc) w := 1
dd) нц для i от 1 до KK
ee) . нц для j от 1 до NN
ff) . . если min > B [ i , j ]
gg) . . то min := B [ i , j ]
hh) . . v := I
ii) . . w := j
jj) . . все
kk) . кц
ll) кц
mm)кон
НАМ-програма 12
|
ІІ етап. Блок-схема (мал. 20).
ІІІ етап. Запишемо програму.
nn) 10 REM Більший серед менших
oo) 20 INPUT “Розмірн. масивів K, N” ; K, N
pp) 30 DIM C(K, N):DIM D(K, N):DIM B(K, N)
qq) 40 FOR i=1 TO K
rr) 50 FOR j=1 TO N
ss) 60 INPUT “Елемент масиву С” ; C(i, j)
tt) 70 B(i, j)=C(i, j)
uu) 80 NEXT j
vv) 90 NEXT i
ww)100 KK=K : NN=N
xx) 110 GOSUB 250
yy) 120 C1=MIN : X1=X : Y1=Y
zz) 130 FOR i=1 TO K
aaa)140 FOR j=1 TO N
bbb)150 INPUT “Елемент масиву D” ; D(i, j)
ccc)160 B(i, j)=D(i, j)
ddd)170 NEXT j
eee)180 NEXT i
fff) 190 KK=K : NN=N
ggg)200 GOSUB 250
hhh)210 D1=MIN : X2=X : Y2=Y
iii) 220 IF C1>D1 THEN Z$=“C”:M=C1:X=X1: Y=Y1 ELSE Z$=“D”:M=D1:X=X2:Y=Y2
jjj) 230 PRINT Z$, M, X, Y
kkk)240 END
lll) 250 REM - - - - - - - Мінімальне - - - - - - -
mmm)260 MIN=B(1,1): X=1: Y=1
nnn)270 FOR i = 1 TO KK
ooo)280 FOR j = 1 TO NN
ppp)290 IF MIN > B( i, j) THEN MIN= B(i,j) : X=i : Y=1
qqq)300 NEXT j
rrr) 310 NEXT i
sss)320 RETURN
Basic-програма 12
|
ttt)
|
uuu)Program Big_small ;
vvv) Const
www) K=3 ; N=2 ;
xxx) Var
yyy) x1,y1,x2,y2,x,y, i, j, c1,d1,min : integer ;
zzz) kk, nn, M : integer ;
aaaa) c, d, b : array[1..K,1..N] of integer ;
bbbb) z : string ;
cccc) Procedure Minimum ;
dddd) Begin
eeee) Min := B [1,1] ; X :=1 ; Y :=1 ;
ffff) For i := 1 to KK do
gggg) For j := 1 to NN do
hhhh) If Min > B [i, j] Then
iiii) begin
jjjj) Min := B [i, j] ; X := i ; Y := j
kkkk) end
llll) End;
mmmm)Begin
nnnn) For i := 1 to K do {введення масиву С}
oooo) For j := 1 to N do ReadLn ( C[i, j] ) ;
pppp){пошук мін. елементу у масиві С}
qqqq) KK :=K ; NN := N ; B := C ;
rrrr) Minimum ;
ssss) C1 := Min ; X1 :=X ; Y1 :=Y ;
tttt) For i := 1 to K do {введення масиву D}
uuuu) For j := 1 to N do ReadLn ( D [i, j] ) ;
vvvv){пошук мін. елементу у масиві D}
wwww) KK :=K ; NN := N ; B := D ;
xxxx) Minimum ;
yyyy) D1 := Min ; X2 := X ; Y2 := Y ;
zzzz) If C1 > D1 Then
aaaaa) begin
bbbbb) z := ‘C’ ; M := C1 ; X := X1 ; Y := Y1
ccccc) end
ddddd) Else
eeeee) begin
fffff) z := ‘D’ ; M := D1 ; X := X2 ; Y := Y2
ggggg) end ;
hhhhh) WriteLn ( z, ‘ M=’, M :4, X :4, Y :4)
iiiii)End.
|
|
jjjjj)
|
Pascal-програма 12
|
Тест1. K=3, N=2, масив С:, масив D:. Елемент D(3,1)= –3.
Тест2. K=3, N=2, масив С:, масив D:. Елемент C(2,1)= –1.
Приклад 2. Обчислити площу трикутника, який задано координатами своїх вершин.
І етап. Визначимо довжину кожної із сторін трикутника: скористаємося функцією користувача, яка за координатами двох точок знаходить довжину відрізка. Площу визначимо за формулою Герона.
початок
x1,y1,x2,
y2,x3,y3
а
b
c
p, S
S
кінець
мал. 21
|
ІІ етап. Блок-схема (мал. 21).
kkkkk)алг Герон (вещ x1, y1, x2, y2, x3, y3, S)
lllll) арг x1, y1, x2, y2, x3, y3
mmmmm) рез S
nnnnn)нач вещ a, b, c, p
ooooo) a := длина (x2, y2, x1, y1)
ppppp) b := длина (x2, y2, x3, y3)
qqqqq) с := длина (x3, y3, x1, y1)
rrrrr) p := (a + b +с ) / 2
sssss) S := (p*(p-a)*(p-b)*(p-c))**(1/2)
ttttt) S := S
uuuuu)кон
vvvvv)- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
wwwww)алг цел длина (вещ x, y, x0, y0)
xxxxx) арг x, y, x0, y0
yyyyy) рез
zzzzz)нач
aaaaaa) знач :=((x-x0)**2+(y-y0)**2)**(1/2)
bbbbbb)кон
НАМ-програма 13
|
ІІІ етап. Запишемо текст програми.
cccccc)
dddddd)10 REM Герон
eeeeee)20 DEF FNF (X,Y,X0,Y0)=SQR((X-X0)^2+(Y-Y0)^2)
ffffff)30 INPUT “Введіть координати точок” ; X1, Y1, X2, Y2, X3, Y3
gggggg)40 A = FNF (X1,Y1,X2,Y2)
hhhhhh)50 B = FNF (X2,Y2,X3,Y3)
iiiiii)60 C = FNF (X1,Y1,X3,Y3)
jjjjjj)70 P = (A + B + C) / 2
kkkkkk)80 S = SQR (P*(P-A)*(P-B)*(P-C))
llllll)90 PRINT “Площа дорівнює ”; S
mmmmmm)100 END
Basic-програма 13
|
nnnnnn)
|
oooooo)Program Geron;
pppppp) Var
qqqqqq) a, b, c, p, s, x1, y1, x2, y2, x3, y3 : real ;
rrrrrr) Function D (x, y, x0, y0 : real) : real ;
ssssss) begin
tttttt) d := Sqrt ( Sqr (x-x0)+Sqr (y-y0) ) ;
uuuuuu) end;
vvvvvv)Begin
wwwwww) Write ( ‘ Введіть координати точок ’ ) ;
xxxxxx) ReadLn (x1, y1, x2, y2, x3, y3) ;
yyyyyy) a := d (x1, y1, x2, y2) ; b := d (x3, y3, x2, y2) ;
zzzzzz) c := d (x1, y1, x3, y3) ; p := ( a + b +c ) / 2 ;
aaaaaaa) s := Sqrt ( p* (p-a) * (p-b) * (p-c) ) ;
bbbbbbb) Writeln ( ‘ s= ’, s :10 :4 )
ccccccc) End.
|
|
ddddddd)
|
Pascal-програма 13
|
ІV етап. Тест. Вхідні дані: x1=0 , y1=0 , x2=3 , y2=3 , x3=7 , y3= -1 .
Результат: S=12. n |