Масиви як параметри функцій

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

void sort (int mas[30]);

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

void sort (int mas[ ],intn);

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

Наведемо приклад використання глобальних змінних для передачі даних у процесі роботи функції.

 Приклад9.3.У масива хm1(10),m2(15),m3(12)визначити міні­мальний елемент та його індекс.

/*Р9_З.СРР— определение минимальных значений нескольких массивов, использование глобальной переменной*/
#include <iostream.h>
#include <conio.h>
int ind=0;//--------------------------глобальная переменная
//-------------------функция ввода элементов массива vvod()
vvod(float mas[ ],int n)
{ for (int і = 0; і <n ;i++)
{ cout<<"Введите"<<і <<" элемент ";
сіn>>mas [і]; }
cout<<endl;
}
//---------------функция определения миним. элемента —fmin()
float fmin(float mas[ ],int n)
{ ind = 0; float min =mas[0];
for (int і = 1; і < n; i++)
if (mas[i] <min)
{ min = mas[i]; ind = i;
}
return min;
}
//---------------главная функция
main()
{
float ml[5], m2[6], m3[7];
cout« "*****Введите массив m1\n";
vvod(ml,5);//вызов функции vvod()— ввод массиваm1[]
//вызовфункцииfmin()
cout<<"min1 = "<<fmin (m1,5);
cout<<" ind = "<<ind<<endl;
cout<<"*****Введитемассивm2\n";
vvod(m2,6);//ввод массива m2[]
cout<<"min2 = "<<fmin (m2,6)<<endl;
cout<<" ind = "<<ind<<endl;
cout<<"*****Введите массивm3\n";
vvod(m3,7);//ввод массива т3[]
cout<<"min3="fmin(m3,7)<<endl;
cout<<"ind="<<ind<<endl;
getch();
}

Результати обчислень:

*****Введите массив    m1

Введите 0 элемент 5
Введите 1 элемент 7
Введите 2 элемент 3
Введите 3 элемент 9
Введите 4 элемент 1

min1= 1     ind= 4

***** Введите массим  m2

Введите 0 элемент 10
Введите 1 элемент 7.3
Введите 2 элемент 8.5
Введите 3 элемент 12
Введите 4 элемент 25.3
Введите 5 элемент 16

min2= 7.3    ind= 1

***** Введите массив mЗ

Введите 0елемент5
Введите 1 элемент 7
Введите 2 элемент 9
Введите 3 элемент 4
Введите 4 элемент 3
Введите 5 элемент 6
Введите 6 элемент 10

minЗ= 3        ind= 4

Програма, крім головної функції main(),має також функ­цію vvod()введення елементів деякого формального масиву та функцію fmin() визначення мінімального елемента цього маси­ву. У головній функції здійснюється виклик функцій для роз­в’язання необхідних обчислень кожного конкретного масиву, для передачі параметрів використовується глобальна змінна.

 Приклад9.4.Навести приклад програмної реалізації, в якій від­бувається передача символьного масиву у функцію.

//Р9_4.СРР— использование массивов как параметров функции
#include <iostream.h>
#include <string.h>
#include <conio.h>
void fun1 (char st[5]);//---------прототип функции fun1()
main()
{
char p[5] ="файл"; fun1 (p);
cout <<"p = " <<p <<endl;//p="диск"
getch();
return 0;
}
void fun1 (char st[5])//----------функцияfun1()
{
cout <<"p = " <<st <<endl;//р="файл"strcpy (st,"диск");
}

Результати виконання програми:
р=файл
р=диск
Параметрами функцій можуть бути не тільки одновимірні, але й багатовимірні масиви.Уцьому випадку використовуються масиви як фіксованої розмірності, так і невизначеної довжини.

У заголовку функції під час роботи з багатовимірним ма­сивом фіксованого розміру, наприклад матриціmat(7,10),вка­зуються розмірності масиву, тобто:

void fun1(intmat[7][10]);

Якщо застосовується багатовимірний масив невизначеної довжини, то невизначеним може бути тільки один вимір роз­мірності, наприклад:

void fun2 (int mat[][10], int rows, int cob);

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

//Р9_5.СРР— вычисление среднего значения столбцов матрицы
#include <iostream.h>
#include <conio.h>
const int mincol = 1;
const int maxcol = 20;
const int minrow = 2;
const int maxrow = 30;
//------функция getnum()для ввода количества строк и столбцов
int getnum (const char *elemtype, int low, int high)
{
int n;
do
{cout<<"Vvedite kolichestvo" <<elemtype<< "n ot["<<low<<"] do[" <<high<< "] : ";
cin >>n;
}
while (n <low ||n > high);
return n;
}
//---------------------функция inmatr() ввода элементов матрицы
void inmatr (float matr[][maxcol], int rows, int cols)
{
for (int і = 0; і < rows; і++)
{ cout <<"Vvedite " <<і << " stroky matrix " <<endl;
for (int j= 0;j<cols; j++)
cin >>matr [i][j];}
cout <<endl;
}
//функция srcols() определения средних значений столбцов
void srcols (float matr [ ] [maxcol], int rows, int cols)
{ float sum, sr;
for(intj= 0;j<cols;j++)
{ sum= 0.0;
for (intі= 0;і<rows; i++)
sum+=matr [i][j];
sr = sum/rows;
cout.precision(3);
cout <<"Srednee znachenie stolbca "<<j<<" = "<<sr<< endl;
}
}
//---------------------------------------------главная функция
void main( )
{
float matr [maxrow][maxcol]; int rows, cols;
//-------------------------ввод количества строк и столбцов
rows= getnum ("strok", minrow, maxrow);
cols = getnum ("stolbcov", mincol, maxcol);
//----------------------------------------вводматрицы
inmatr (matr, rows, cols);
//--------вычисление среднего значения столбцов матрицы
cout<<endl;
srcols(matr,rows,cols);
getch();
}

Результати обчислень:

Vvedite kolichestvo strok n ot [2] do[30] : 3
Vvedite kolichestvo stolbcov n ot [1] do [20] : 4
Vvedite 0 stroky matrix
5.6 8.9 1.25 6.78
Vvedite 1 stroky matrix
0.25 7.6 1.3 5.29
Vvedite 2 stroky matrix
3.6 10.5 0.6 11.67
Srednee znachenie stolbca0 = 3.15
Srednee znachenie stolbca1=9
Srednee znachenie stolbca2 = 1.05
Srednee znachenie stolbca 3 = 7.91

Масиви у функції можуть передаватися також за допомо­гою покажчиків. У цьому випадку функція повинна мати опис покажчика на той тип даних, елементами якого є масив, а у ви­кликаючій функції достатньо вказати лише ім’я масиву (як відомо, у мові С++ім’я масиву є адресою цього масиву).

 Приклад9.6.За допомогою функції, яка знаходить мінімальний та максимальний елементи одновимірного масиву, обчислити суму мі­німальних та суму максимальних елементів для трьох масивів різної довжини.

Алгоритм знаходження максимального і мінімального еле­ментів масиву розглянуто уприкладі1.3.

//Р9_6.СРР— определение сумм min и max элементов трех массивов
#include <iostream.h>
#include <conio.h>
const n=30; //---------------------------------------функция определения max и min
void minmax(int*x, int k, int*min, int&max)
/*минимальный элемент определен как параметр-указатель,а максимальный — как параметр-ссылка*/
{ *min=x[0];/*чтобы присвоить значение по адресу min,указатель разыменовывается:*min*/
max=x[0];
for (int і = 1; і < k; i++) if (x[i] <*min) *min=x[i];
else
if (x[i] > max) max=x[i];
}
//---------------------------------------------------------главная функция
void main() 
{int a[n], i, kol, smin=0, smax=0, minel, maxel; 
for (int k = 1; k <= 3; k++) 
{ cout <<"Vvedite kolicestvo elementov "<<k<<" massiva"<<endl; 
cin >>kol; cout <<"Vvedite massiv"<<endl;
 for (і = 0; і < kol; i++) cin >>a[i];         
minmax(a, kol, &minel, maxel); //вызов функции minmax()  
/*чтобы совпадали типы фактических и формальных параметров, &minel передается как адрес,a maxel— как значение*/ 
smin+=minel; 
smax+=maxel; } 
cout<< "smin="<<smin<< "\nsmax= "<<smax; 
getch ();  }

 

Результати обчислень:
Vvedite kolicestvo elementov 1massiva
3
Vvedite massiv
1 2 3
Vvedite kolicestvo elementov 2massiva
5
Vvedite massiv
5 3 8 6 3
Vvedite kolicestvo elementov 3massiva
3
Vvedite massiv
2 9 8 7
smin=6
smax=20

Слід нагадати, що за необхідності передачі багатовимірних масивів за допомогою покажчиків треба враховувати те, що в пам’яті такі масиви зберігаються як одновимірні.Таким чином, при використанні, наприклад, матриці a[n,m] у пам’яті послідовно розміщуються n рядків по m елементів у кожному(див.рис.6.4).Тому для роботи окремо з кожним рядком необ­хідно сформувати масив покажчиків на ці рядки, тобто:

int а[n][m], *b[n];
for(і= 0;і<kstrok;і++)
b[i] = &a[i][0];

Тоді кожен елемент масиву b[і] буде зберігати адресу і-го рядка матриці а[n,m], тому до кожного елемента і-го рядка j-ro стовпця можна звертатись якb[i][j] або *(*(b+i)+j).

Використовуючи масив покажчиків*b[n], можна передава­ти як параметр функції подвійний покажчик(**b), а у викли­каючій функції достатньо вказати лише ім’я матриці.

 Приклад9.7.Для трьох заданих матриць переставити місцями пар­ні та непарні строки з використанням функції введення матриці, функ­ції виведення матриці і функції перестановки.

//P9_7.CPP— обмен местами четных и нечетных строк матрицы
#include <iostream.h>
constn=10;
voidinmatr(int**,int,int); //прототип функций ввода матрицы
voidoutmatr(int**,int,int); //прототип функций вывода матрицы
voidobmen(int**,int); //прототип функций обмена строк
void main()
{
{
cout<<endl;
cout<<"Vvedite kolicestvo strok matrici " <<s[k] <<endl;
cin>>kstrok;
cout<<"Vvedite kolicestvo stolbcov matrici " <<s[k] <<endl;
cin>>kstolbcov;
cout<<"Vvedite matricu " <<s[k] <<endl;
//формирование массива указателей на каждую строку матрицы
for(і = 0; і< kstrok; i++) b [i] = &a[i][0];
cout << endl;
inmatr (b, kstrok, kstolbcov);//вызов функции ввода матрицы
obmen (b, kstrok); //вызов функции обмена строк
cout<<"Rezult matrica "<<s[k] <<endl;
outmatr(b, kstrok, kstolbcov);//вызов функции вывода матрицы
}
}
//--------------------------------------функция ввода матрицы inmatr()
void inmatr (int**x, int kstrok, int kstolbcov)
{for (intі = 0; і < kstrok; i++)
for (int j= 0;j < kstolbcov; j++)
cin>>x[i][j]; }
//-------------------------------------функция обмена строк—obmen()
void obmen (int**x, int kstrok)
{int *p;
for (intі= 0;i< kstrok-1; i+=2)
{P= x[i];
x[i]=x[i+1];
x[i+1]=p;}
}
//--------------------------------функция вывода матрицы —outmatr()
void outmatr (int**x, int kstrok, int kstolbcov)
{for (intі= 0;і<kstrok;і++)
{cout<<endl;
for (int j= 0; j < kstolbcov; j++)
cout <<x[i][j] <<" "; }
cout<<endl;
}
Результати обчислень:
Vvedite kolicestvo strok matrici A
2
Vvedite kolicestvo stolbcov matrici A
2
Vvedite matricu A
1 2
3 4
Rezult matrica A
3 4
1 2
Vvedite kolicestvo strok matriciВ
3
Vvedite kolicestvo stolbcov matriciВ
3
Vvedite matricuВ
1 2 3
5 6 7
8 6 4
Rezult matricaВ
5 6 7
1 2 3
8 6 4
Vvedite kolicestvo strok matriciС
4
Vvedite kolicestvo stolbcov matriciС
4
Vvedite matricuС
1 2 3 4
7 6 5 4
9 7 6 5
4 5 6 7
Rezult matricaС
7 6 5 4
1 2 3 4
4 5 6 7
9 7 6 5

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *