Аргументами (параметрами) функцій можуть бути не тільки змінні, але й масиви. У цьому випадку можна використовувати як масиви фіксованого розміру, так і невизначеного (масиви змінної довжини). При застосуванні масивів фіксованої довжини в заголовку функції в списку формальних аргументів указується тип масиву і його розмір, наприклад:
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
Введите 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.Для трьох заданих матриць переставити місцями парні та непарні строки з використанням функції введення матриці, функції виведення матриці і функції перестановки.
- Результати обчислень:
- 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
//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; }