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