
- •Підпрограма. Визначення. 1
- •Підпрограма. Визначення. 2
- •Застосування підпрограм
- •Відкриті та закриті підпрограми
- •Закриті підпрограми. 1
- •Закриті підпрограми. 2
- •Процедурна абстракція
- •Абстракція управління
- •Оболонка підпрограмної капсули. Параметри підпрограми
- •Параметри закритої підпрограми. 1
- •Параметри закритої підпрограми. 2
- •Параметри закритої підпрограми. 3
- •Параметри закритої підпрограми. 4
- •Параметри закритої підпрограми. 5
- •Параметри закритої підпрограми. 6
- •Локальні об'єкти підпрограм. 1
- •Локальні об'єкти підпрограм. 2
- •Глобальні об'єкти підпрограм
- •Правило хорошого стилю програмування
- •Відмінності між параметрами та локальними об’єктами підпрограми. 1
- •Відмінності між параметрами та локальними об’єктами підпрограми. 2
- •Прототип підпрограми
- •Способи передачі значень параметрів підпрограми. 1
- •Способи передачі значень параметрів підпрограми. 2
- •Передавання значення вмісту. 1
- •Передавання значення вмісту. 2
- •Передавання значення вмісту. 3
- •Передавання імені. 3
- •Приклад застосування різних способів передачі параметрів
- •Передача значення
- •Передача посилання
- •Передача імені
- •Процедури
- •Функції
- •Абстрактний тип даних. 1
- •Абстрактний тип даних. 2
- •Операції абстрактних типів даних
- •Склад абстрактного типу даних
- •Процедурний тип
- •Процедурний тип. Приклад
- •Вказівник на функцію
- •Алгоритм читання оператора опису
- •Приклади читання оператора опису
- •Вказівник на функцію. Приклад
Функції
Підпрограми другого типу виробляють спеціальне значення, що є результатом роботи підпрограми. Оскільки у них завжди є результат, що повертається у зовнішнє оточення через певне місце в пам'яті, то їх називають функціями (function).
Для позначення функції може використовуватися зарезервоване слово function.
Оскільки функція як результат виробляє значення, причому єдине, то її виклик відрізняється від виклику процедури тим, що може стояти у правій частині оператора присвоювання як вираз, або складова виразу.
Опис підпрограми на мові С та її використання
// підпрограма fun є процедурою, яка нічого не отримує через параметри та нічого не повертає у оточення виклику.
void fun() // інтерфейс підпрограми
{ // тіло підпрограми
int i;
i = 25;
}
void main
{
fun(); // виклик підпрограми
}
Опис підпрограми swap
// підпрограма swap є процедурою, яка отримує два параметри по значенню та нічого не повертає у оточення виклику.
void swap(int, int); // прототип підпрограми
void main()
{
int nx, ny;
nx = 5;
ny = 6;
swap (nx, ny); // nx, ny – фактичні параметри
}
// а, b – формальні параметри, передані за значенням
void swap(int a, int b)
{
int t; // t – локальна змінна підпрограми
t = a; // а, b – параметри підпрограми
a = b;
b = t;
}
При x = 5, y = 6
t = 5, a = 6, b = 5
Після виклику x = 5, y = 6
Змінені значення формальних параметрів не впливають на значення фактичних (результати не повертаються з підпрограми)
Опис підпрограми на мові Pascal та її використання
// підпрограма fun є процедурою, яка нічого не отримує через параметри та нічого не повертає у оточення виклику.
program _;
procedure fun; // інтерфейс підпрограми
var // опис локальних змінних підпрограми
i : integer;
begin // тіло підпрограми
i := 25;
end;
Begin
fun; // виклик підпрограми
End.
Опис підпрограми swap
// підпрограма swap є процедурою, яка отримує два параметри по значенню та нічого не повертає у оточення виклику.
program _;
// а, b – формальні параметри, передані за значенням
procedure swap(a : integer; b: integer);
var
t : integer;
begin
t := a; // t – локальна змінна підпрограми
a := b; // а, b – параметри підпрограми
b := t;
end;
var
nx, ny : integer;
Begin
nx := 5;
ny := 6;
swap (nx, ny); // nx, ny – фактичні параметри
End.
При x = 5, y = 6
t = 5, a = 6, b = 5
Після виклику x = 5, y = 6
Змінені значення формальних параметрів не впливають на значення фактичних (результати не повертаються з підпрограми)
Опис підпрограми swap, яка впливає на оточення виклику
program _;
// а, b – формальні параметри, передані за посиланням
procedure swap(var a:integer; var b:integer);
var
t : integer;
begin
t := a;
a := b;
b := t;
end;
var
nx, ny : integer;
Begin
nx := 5;
ny := 6;
swap (nx, ny);
End.
При x = 5, y = 6
t = 5, a = 6, b = 5
Після виклику x = 6, y = 5
Змінені значення формальних параметрів впливають на значення фактичних (результати повертаються з підпрограми через параметри)
Опис підпрограми add
// підпрограма add є функцією, яка отримує два параметри по значенню та повертає значення цілого типу у оточення виклику.
int add(int, int); // прототип підпрограми
void main()
{
int nx, ny, sum;
nx = 5;
ny = 6;
sum = add(nx, ny);
}
int add(int a, int b)
{
int t;
t = a*2 + b;
return t; // спеціальний оператор повернення значення
}
При x = 5, y = 6
t = 16
sum = 16
В мові С спеціальним оператором повернення значення в оточення виклику є оператор return. Підпрограма може мати декілька таких операторів тілі і називається функцією.
Опис підпрограми add
// підпрограма add є функцією, яка отримує два параметри по значенню та повертає значення цілого типу у оточення виклику.
program _;
function add(a:integer; b:integer):integer;
var
t : integer;
begin
t := a*2 + b;
add := t;
end;
var
nx, ny, sum : integer;
Begin
nx := 5;
ny := 6;
sum := add(nx, ny);
End.
При x = 5, y = 6
t = 16
sum = 16
В мові Pascal спеціальним оператором повернення значення в оточення виклику є оператор привласнення з позначенням функції в правій частині.
Приклад побічного ефекту при використанні глобальних змінних
// підпрограма swap є процедурою, яка нічого не отримує та нічого не повертає у оточення виклику.
int x, y;
void swap();
void main()
{
x = 5;
y = 6;
swap();
}
void swap()
{
int t;
t = x; // використання глобальних об’єктів x, y
x = y;
y = t;
}
При x = 5, y = 6
t = 5, x = 6, y = 5
Після виклику x = 6, y = 5
Програма для компіляції та функціонування потребує опису двох змінних x, y, які мають існувати та бути доступними для використання в оточенні виклику, тому що підпрограма їх використовує як глобальні змінні, порушуючи цілісність та незалежність підпрограмної капсули від оточення.
Опис підпрограми swap, яка впливає на оточення виклику
void swap(int*, int*);
void main()
{
int nx, ny;
nx = 5;
ny = 6;
swap(&nx, &ny);
}
void swap(int *a, int *b)
{
int nTemp;
nTemp = *a;
*a = *b;
*b = nTemp;
}
Змінені значення формальних параметрів впливають на значення фактичних (результати повертаються з підпрограми через параметри)
Приклад використання посилання
void swap(int &a, int &b)
{
int nTemp;
nTemp = a;
a = b;
b = nTemp;
}
main()
{
int nJ;
int nI;
nJ = 10;
nI = 20;
swap (nI, nJ);
}
Змінені значення формальних параметрів впливають на значення фактичних (результати повертаються з підпрограми через параметри)
Приклад використання посилання і не типізованої вказівної змінної
void swap (void* &a, void* &b)
{
void *ptemp;
ptemp = a;
a = b;
b = ptemp;
}
main()
{
int *pnI;
int *pnJ;
pnI = new int;
pnJ = new int;
*pnI = 10;
*pnJ = 20;
swap (pnI, pnJ);
delete pnI;
delete pnJ;
}
Приклад формального параметру індексованого типу.
-
void swap(int nAr[2])
{
int ntemp;
ntemp = nAr[0];
nAr[0] = nAr[1];
nAr[1] = ntemp;
}
void main(void)
{
int myAr[2] = {10, 20};
swap(myAr);
}
При myAr[2] = {10, 20};
myAr[2] = {20, 10};
void swap(const int nAr[2])
{
int ntemp;
ntemp = nAr[0];
//Error: cannot modify a const object
//nAr[0] = nAr[1];
//nAr[1] = ntemp;
}
void main(void)
{
int myAr[2] = {10, 20};
swap(myAr);
}
При myAr[2] = {10, 20};
myAr[2] = {10, 20};
const SIZE_MAS1 = 6;
const SIZE_MAS2 = 7;
void init(int nAr[][SIZE_MAS2], int size1, int size2)
{
int i, j;
for (i = 0; i < size1; i = i + 1)
{
for (j = 0; j < size2; j = j + 1)
{
nAr[i][j] = i * j;
}
}
}
int add(int nAr[] [SIZE_MAS2], int size1, int size2)
{
int sum = 0;
int i, j;
for (i = 0; i < size1; i = i + 1)
{
for (j = 0; j < size2; j = j + 1)
{
sum = sum + nAr[i][j];
}
}
return sum;
}
void main()
{
int mas [SIZE_MAS1][SIZE_MAS2];
init(mas, SIZE_MAS1, SIZE_MAS2);
int sum;
sum = add(mas, SIZE_MAS1, SIZE_MAS2);
}
Приклад використання статичної змінної у підпрограмі.
int sum(int x)
{
static int nS;
nS = nS + x;
return nS;
}
main()
{
while (sum(1) < 10);
}
program ty;
const CountRow = 5;
const CountColumn = 6;
type ar = array [1 .. CountRow,1 .. CountColumn] of real;
function Avg(simpl : ar; sizeRow : integer) : real;
var
nCount : integer;
lSum : real;
begin
lSum:=0.0;
for nCount := 1 to sizeRow do
begin
simpl[nCount, 1] := nCount + 100;
lSum := lSum + simpl[nCount, 1];
end;
Avg := lSum/ sizeRow;
end;
var
mas : ar;
i : real;
Begin
i := Avg (mas, CountRow);
End.