Програмування з використанням функцій і процедур
Функцією називається певним чином оформлений фрагмент програми, що має власне ім'я і використовуються для обчислення одного значення, яке присвоюється імені функції
Опис формату функції включає в себе заголовок функції, розділ описів (міток, констант, типів, змінних, функцій і процедур, які називаються локальними, тобто використовуються лише в межах даної функції), тіло функції.
У заголовку функції за ключовим словом Function (функція) вказується її ім'я, а в дужках – список формальних параметрів із вказанням їх типів. Остаточний результат присвоюється імені функції в кінці тіла функції.
Загальна структура запису функції
Function
f(
:
;
:
;...):t;
<Розділ визначень і описів локальних параметрів і підпрограм>
begin
<тіло функції>;
f:= <вираз>
end;
де f – ім'я функції;
– імена
формальних параметрів;
– типи
формальних параметрів;
t – тип імені функції.
<вираз> – довільний вираз TurboPascal.
Звернення до функції в програмі здійснюється в правій частині оператора присвоєння
y
:=
f(
,...)
де
y – довільна змінна ТurboРascal;
f – ім'я функції;
– фактичні
параметри, які відповідають формальним
за кількістю, типом, місцем розташування.
Процедурою називається певним чином оформлений фрагмент програми, що має власне ім'я і використовується, коли в основній програмі необхідно отримати кілька результатів. Вказання цього імені в тексті програми призводить до активізації процедури і називається її викликом. Зразу після виклику процедури починають виконуватися оператори, що входять в неї, а після виконання останнього з них керування передається назад в основну програму і виконуються оператори, що йдуть відразу за оператором виклику процедури.
Для обміну інформацією між основною програмою і процедурою використовується один чи кілька параметрів виклику.
Процедура визначається в розділі опису процедур. Опис процедури включає в себе заголовок процедури, розділи описів, тіло процедури. В заголовку процедури за ключовим словом Procedure (процедура) вказується ім'я процедури, а в дужках – список формальних параметрів. Деякі з цих параметрів призначені для передачі даних в процедуру (вхідні параметри), інші – для одержання результатів з процедури (вихідні параметри). Для того, щоб у процедурі відрізнити вхідні параметри від вихідних, перед кожним вихідним параметром пишеться службове слово var). Ці параметри використовуються тільки в тілі процедури і локальні по відношенню до неї.
Загальна структура запису процедури
Procedure f(var q1:t1; q2:t2;...);
<розділи визначень і описів локальних
параметрів і підпрограм>
begin
<тіло процедури>;
end;
де f – ім'я процедури;
–
імена
формальних параметрів;
ti – типи формальних параметрів.
Звернення до процедури здійснюється оператором процедури
f( ,...),
де
– фактичні
параметри, які відповідають формальним
за кількістю, типом, місцем розташування.
У тих випадках, коли в процедурі і основній програмі використовуються одні й ті ж імена параметрів (глобальні змінні), процедуру можна організувати без параметрів.
Приклади розв’язування задач
Програмування алгоритмів циклічної структури з використанням одновимірних масивів
Приклад. Знайти суму двох одновимірних масивів дійсних чисел А(30) і В(30).
Pascal-програма розв’язку задачі.
program zavd5; {алгоритм сумування двох одновимірних масивів}
var a,b,c:array[1..n] of real;
i,n: integer;
begin
writeln('введіть кількість елементів масиву');
readln(n);
writeln('введіть значення елементів масиву А');
for i:=1 to n do read(a[i]);
writeln('введіть значення елементів масиву В');
for i:=1 to n do read(B[i]);
write('Масив C:');
writeln;
for i:=1 to n do
begin
c[i]:=a[i]+b[i];
write(' ',c[i]:8:4);
end;
end.
Програмування алгоритмів циклічної структури з використанням двовимірних масивів.
Приклад. Знайти три найменші елементи матриці цілих чисел А(6,6).
Pascal-програма розв’язку задачі.
PROGRAM zavd6; {алгоритм знаходження трьох найменших елементів двовимірного масиву}
const n=6;m=6;
var r:array[1..n,1..m] of integer;
i,j,s,K,L,min:integer;
BEGIN
for i:=1 to n do
for j:=1 to m do
r[i,j]:=round(100-random*46);
writeln(' ZADANA MATR.:');
for i:=1 to n do begin
for j:=1 to m do
write(' ',r[i,j]); writeln
end;
for s:=1 to 3 do
begin
min:=r[1,1]; K:=1; L:=1;
for i:=1 to n do
for j:=1 to m do if r[i,j]<min then
begin
min:=r[i,j];
K:=i;
L:=j
end;
writeln('min=',min);
r[K,L]:=100;
end
END.
Є багато інших способів розв’язування даної задачі, серед них, наприклад, – сортування масиву за зростанням і вибір трьох перших елементів.
Програмування з використанням функцій.
Приклад. Задані натуральне ціле число n і масив дійсних чисел
.
Обчислити:
,
де
,
,
.
Pascal-програма розв’язку задачі.
Program zavd_7_1;
const n=3; nm=9;
type index=1..nm;
mas=array[index] of integer;
var b:mas; I,x1,x2,x3: integer; y:real;
FUNCTION F(a:mas;z:integer; nn:index): integer;
var p.j:integer;
begin {розділ операторів функції}
p:=0;
for j:=z to nn do p:=p+a[j];
f:=p
end; {кінець опису функції}
begin {розділ операторів програми}
writeln (‘введіть масив b’);
for i:=1 to nm do read(b[I]); writeln;
x1:=F(b,1,n);
x2:=F(b,n+1,2*n);
x3:=F(b,2*n+1,3*n);
writeln(‘x1=’,x1; ‘x2=’,x2; ‘x3=’,x3);
y:=(exp(1/3*ln(x))+3*x1*x3-sqr(x2))/(sqr(x1+x2+x3);
writeln(‘y=’,y:6:2)
end. {кінець програми}
Приклад.
Обчислити вираз:
;
для заданих значень a та b.
Pascal-програма розв’язку задачі.
program zavd_7_2;
var a,b,z,t1,t2,t3: real;
function sh(x:real):real; {опис функції}
begin {розділ операторів функції}
sh:=(exp(x)-exp(-x))/2;
end; {кінець опису функції}
begin {розділ операторів програми}
read(a,b);
t1:=sh(a);
t2:=sh(a+b);
t3:= sh(a*a+b*b);
z:=(sqr(t1)+t2)/(t1+sqrt(t3));
write('z=',z:8:4)
end. {кінець програми}
Програмування з використанням процедур.
Попeредня програма з використанням процедури може мати вигляд:
program zavd_8;
var a,b,z,t1,t2,t3: real;
procedure sh(x:real; var R:real);
begin
R:=(exp(x)-exp(-x))/2;
end;
begin
read(a,b);
sh(a,t1);
sh(a+b,t2);
sh(a*a+b*b,t3);
z:=(sqr(t1)+t2)/(t1+sqrt(t3));
write('z=',z:8:4)
end.
Приклад. Знайти середнє арифметичне додатних елементів кожного рядка матриці дійсних чисел М(5х5).
Pascal-програма розв’язку задачі.
Program zavd_9; {знаходження середнього арифметичного кожного рядка матриці}
uses crt;
const n=5; m=5;
var m: array [1..n,1..m] of real;
f,sa1,sa2,sa3,sa4,sa5:real;
i,j:integer;
procedure ser_ar(l:integer; var sa:real);
var k:integer;
s:real;
begin
k:=0;s:=0;
for i:=1 to m do
if m[l,i]>0 then
begin s:=s+m[l,i];
k:=k+1;
end;
sa:=s/k;
end;
BEGIN
clrscr;
for i:=1 to n do
begin
for j:=1 to m do
begin
m[i,j]:=random*(i/5 - j/8);
write (m[i,j]:8:3);
end;
writeln;
end;
ser_ar(1,sa1);
ser_ar(2,sa2);
ser_ar(3,sa3);
ser_ar(4,sa4);
ser_ar(5,sa5);
writeln(' sa1=',sa1:8:6,' sa2=',sa2:8:6,' sa3=',sa3:8:6);
writeln(' sa4=',sa4:8:6,' sa5=',sa5:8:6);
END.
Приклад. Задано масиви цілих чисел Х(23), У(15). Знайти суму та кількість додатних елементів кожного масиву.
Pascal-програма розв’язку задачі.
program zavd_10;
{знаходження суми та кількості додатних елементів масивів}
uses crt;
const n=25;
type index=1..n;
mas=array[index] of integer;
var x,y:mas;
i,sx,sy,kx,ky:integer;
z:real;
PROCEDURE S_K(m:mas;k:integer; var sm,km:integer);
var j:integer;
begin
sm:=0; km:=0;
for j:=1 to k do if m[j]>0 then
begin
sm:=sm+m[j]; km:=km+1
end;
end;
begin clrscr;
for i:=1 to 23 do x[i]:=20-round(10*random);
writeln('X:');
for i:=1 to 23 do write(' ',x[i]); writeln;
s_k(x,23,sx,kx);
writeln('sx=',sx,' kx=',kx);
for i:=1 to 15 do y[i]:=round(30*random);
writeln('Y:');
for i:=1 to 15 do write(' ',y[i]); writeln;
s_k(y,15,sy,ky);
writeln('sy=',sy,' ky=',ky);
z:=(sx+sy)/(kx*ky);
writeln('z=',z:6:2)
end.
