Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЕТОД_ЛАБ.doc
Скачиваний:
4
Добавлен:
14.11.2019
Размер:
1.04 Mб
Скачать

Параметри і аргументи функції.

У мові С є особливість, зв’язана з тим, що всі аргументи функції передаються за значенням. При виклику функції в стеку виділяється місце для формальних параметрів. Туди заносяться значення фактичного параметра. Далі функція міняє і використовує значення зі стеку. При виході з підпрограми вони втрачаються.

В мові С викликана функція не може змінити змінні, вказані як фактичні параметри при зверненні до неї. Функція swap(), яка ніби повинна поміняти місцями значення, цього не робить.

Void swap (int a, int b)

{

int tmp = a;

a = b;

b = tmp;

}

Якщо це необхідно зробити, то треба в якості параметра передавати, не значення, а адреси змінних, які необхідно поміняти, (передавати вказівники на змінну). Такий прийом в мові С називається передача параметра за посиланням.

Функція swap() буде виглядати так:

Void swap (int *a, int *b)

{

int tmp = *a;

*a = *b;

*b = tmp;

}

Якщо в якості аргумента використовується масив, то є тільки один спосіб – передача параметра за посиланням. В якості аргумента функції треба вказати адресу початку масиву. Це можна зробити трьома способами:

  1. function ( int ar[10] );

  2. function ( int ar[ ] );

  3. function ( int *ar );

При використанні масиву в якості аргумента функції можлива зміна значень елементів масиву в результаті роботи функції. ( бо вказується адреса початку масиву ).

Приклад – впорядкуваня масиву з використанням функції.

#include,stdio.h> /* сортуваня*/

void sort (int arr[ ], int n);

main ( )

{

int mass [10] = {1,3,-5,7,9,0,22,4,6,8};

int size = 10, i;

printf (“Before sorting:”);

for (i = 0; i<10; i++)

printf (“%d”,mass[i]);

printf (“\n”);

sort (mass,size);

printf (“ after sorting:”);

for (i=0; i<10;i++)

printf (“%d”,mass[i]);

return 0;

}

Void sort (int arr[ ],int n ) /*можна ще писати void sort(int arr[10], int n), або void sort(int *arr, int n)*/

{

int i, j, tmp;

for(i=0; i<n-1; i++)

for(j=0; j<n-1; j++)

if (arr[j+1] < arr[j])

{

tmp = arr[j];

arr[j] =arr[j+1];

arr[j+1] = tmp;

}

Елементи масиву mass[] змінять свої значення (будуть впорядковані).

Приклад. Дана прямокутна матриця А розміром 4*5. Скласти програму обчислення добутку ненульових елементів кожного рядка матриці. Обчислення добутку в рядку виконати у вигляді процедури.

Блок-схема Блок-схема

програми процедури

так

нік

Текст програми

Program prc;

Var

A:array [1..4,1..5] of real;

D: array [1..4] of real;

I,j : integer;

F : real;

Procedure dob(k : integer);

Var n : integer;

Begin

F:=1;

For n:=1 to 5 do

If a[k,n]<>0 then f:=f* a[k,n]

End;

Begin

For i:=1 to 4 do

For j:=1 to 5 do

Begin

Write(‘a[‘,i,’,’,j,’]=’);

Readln(a[i,j])

End;

For i:=1 to 4 do

Begin

Dob(i); d[i]:=f;

Writeln(‘d[‘,i,’]=’,d[i]:8:2)

End

End.

Приклад. Дана прямокутна матриця А розміром 4*5. Скласти програму обчислення добутку ненульових елементів кожного рядка матриці. Обчислення добутку в рядку виконати у вигляді функції.

Блок-схема Блок-схема

програми функції

так

нік