Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 20-21.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
380.74 Кб
Скачать

Функції

Підпрограми другого типу виробляють спеціальне значення, що є результатом роботи підпрограми. Оскільки у них завжди є результат, що повертається у зовнішнє оточення через певне місце в пам'яті, то їх називають функціями (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.