Передача массива в качестве параметра функции

Сначала рассмотрим передачу массива в качестве параметра самостоятельной функции без использования класса и указателей.

Независимо от того, является ли массив входным для функции, получается (формируется) в ней или одновременно входным и выходным (передаётся в функцию, преобразуется в ней и возвращается в точку вызова), правила передачи одномерного или двумерного массива в качестве параметра функции одинаковы.

Есть два варианта объявления массива в скобках в заголовке (прототипе) функции:

* c помощью явных или предварительно объявленных констант (const n=10; const m=10) указываем одну или обе размерности:

void FunMatr1(…, int M[10],int size1,…).//для одномерного

где обрабатываются все 10 элементов массива или меньшее их количество переданные через - size1;

void FunMatr2(…, int M[10][10],int size1,…). //для двухмерного

где обрабатываем либо все (у нас 10) строки, либо меньшее их количество, которое можно, но не обязательно, передать через параметр (size1);

* первую левую размерность можно оставить свободной, т. е. вместо количества строк оставляем пустые скобки:

void FunMatr1(…, int M[],int size1,…).//для одномерного

где количество элементов передается через параметр - size1;

void FunMatr2(…,int M[][10], int size1…). //для двухмерного

где количество столбцов записать обязательно, а количество строк передаётся в качестве параметра (size1), которое используется в соответствующих циклах.

Замечание.

1) Нельзя оставить свободными обе размерности для двухмерного массива или одну вторую правую размерность. В таком случае непонятно, где заканчивается предыдущая строка и начинается следующая.

2) В обоих вариантах в функции необязательно обрабатывать указанное количество столбцов (у нас 10). Его (size2), как и первую размерность (size1), можно также передать в качестве параметра и затем использовать в теле функции:

void FunMatr2(…, int M[][10], int size1, int size2…);

В вызываемой функции (у нас в main) объявляем матрицу int A[10][10] ( или int A[n][m]), учитывая следующее ограничение: количество столбцов при объявлении должно быть точно таким, как и в заголовке функции. Количество строк может быть меньше, чем в заголовке, например, int A[5][10]. При этом обрабатываться будут пять строк (а не 10).

При вызове функции в любом случае указываем только имя матрицы без указания размерности и типа её элементов, реальное количество строк и, если надо, столбцов:

FunMatr1(…, A, 5,…);

или FunMatr2(…, A, 5, 6, …);

где 5 — количество обрабатываемых строк, 6 — количество обрабатываемых столбцов.

Замечание.

1) При использовании массива в качестве параметра функции фактически передаётся не сам массив, а указатель на него (адрес массива), то есть номер первого байта первой ячейки массива (с индексом 0). Поэтому если в функции массив изменить каким либо образом, то этим самым мы изменим и массив A в основной программе.

2) Независимо от того, массив является входным для функции, получается в нём, или одновременно входным и выходным, т. е. преобразуется в функции, массив всегда передаётся в функцию с помощью указателя. Никакого ссылочного типа для возврата массива из функции не требуется.

Пример. Составим функции для ввода, вывода прямоугольной матрицы и сортировки строк по элементам k –го столбца, где k передаём как параметр функции. При этом содержимое каждой строки не меняется.

const int m=10;//глобальная константа для описания количества столбцов

void in_mas2(double x[][m], int, int);//прототипы функций формирование массива

void out_mas2(double x[][m], int, int);//вывод массива

void sort_mas2(double x[][m], int, int, int);//сортировка

void main()

{ int n1, n2; //количество строк и столбцов

int k;//номер столбца для сортировки

double a[m][m];

cout<<”Введите кол-во строк-->”; cin>>n1;

cout<<”Введите кол-во столбцов-->”; cin>>n2;

in_mas2(a,n1,n2);

cout<<"\nСтарая матрица\n";

out_mas2(a,n1,n2);

cout <<"\nВведите номер столбца для сортировки =>";

while (1) // проверка правильности ввода

{ cin>>k;

if (k>=0 && k<m) break;

cout<<"Повторите ввод: 0 <= k < " << m<<”\n”;

}

sort_mas2(a, n1,n2, k);

cout<<"\nМатрица после сортировки \n";

out_mas2(a,n1,n2);

getch();

}

//*************************************

void sort_mas2(double x[][m], int n1, int n2, int k)

{

int i,j,m,mn,N;

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

{

min=x[i][k]; N=i;

// Поиск в k –м столбце минимального элемента, начиная с i–го (min), и его номера(N)

for (m=i+1;m<n;m++)

if (x[m][k]<min) { min=x[i][k]; N=m;}

// Перестановка i –й и N –й строк

for(j=0;j<n2;j++)

{ double dop=x[i][j];

x[i][j]=x[N][j]; x[N][j]=dop;

}

}

}

void out_mas2(double x[][m], int n1, int n2)

{

for (int i=0; i<n1; i++)

{ for (int j=0; j<n2; j++) printf(“%7.2f”,x[i][j];

printf(“\n”);

}

}

void in_mas2(double x[][m],int n1, int n2)

{randomize();

for (int i=0; i<n1; i++)

for (int j=0; j<n2; j++)

x[i][j]=random(20)-10;

}

Работа с матрицей в методах класса

При работе с матрицей в методах класса необходимо руководствоваться следующими правилами и рекомендациями.

Матрица объявляется в классе в качестве поля с максимальными первой и второй размерностями, в качестве которых можно использовать глобальные константы. Реальное количество строк и столбцов также объявляем, как два поля класса, и определяем их с помощью конструктора. Желательно в нём предусмотреть проверку, не превосходят ли реальные размерности матриц их наибольшие значения.

В методах класса матрица и её размерности в качестве параметров не записываются. Значения элементов матрицы определяются в каком-нибудь из методов класса одним из описанных в § 1 способов.

Для использования методов такого класса создаём объект.

Ту же задачу, что и в предыдущем примере, решим с помощью функций класса:

const

unsigned n1max=5, n2max=10;

class MatrClass

{

double x[n1max][n2max];

unsigned size1, size2;

public:

MatrClass (unsigned n1, unsigned n2)

{ if (n1<=0 || n1>n1max) n1=n1max;

if (n2<=0 || n2>n2max) n2=n2max;

size1=n1; size2=n2;

}

void INP1();

/* Поля класса (матрицу и её две размерности) в качестве параметров методов не записываем! Размерности передаём с помощью конструктора, а матрицу получаем с помощью метода INP1. */

void OUT1();

void SORT1(int);

};

void MatrClass::INP1()

{ for (int i=0; i<size1; i++)

for (int j=0; j<size2; j++)

x[i][j]=random(20)-10;

}

void MatrClass::SORT1(int k)

{ int i,j,m,mn,N;

for (m=0;m<size1-1;m++)

{ mn=x[m][k]; N=m;

for (i=m+1;i<size1;i++)

if (x[i][k]<mn)

{ mn=x[i][k]; N=i;

}

for(j=0;j<size2;j++)

{ double t; t=x[m][j];

x[m][j]=x[N][j]; x[N][j]=t;

}

}

}

void MatrClass::OUT1()

{ int X,j,Y=wherey();

for (int i=0; i<size1; i++, Y++)

for (X=1, j=0; j<size2; j++, X+=7)

{ gotoxy(X,Y);

cout<<x[i][j];

}

cout<<endl;

}

int main()

{

const int N1=3, N2=6; int k;

MatrClass ObjMatr (N1, N2);

ObjMatr.INP1(); cout<<"\nOld matrix\n";

ObjMatr.OUT1();

cout <<"\nInput the number of collumn for sorting =>";

// Ввод номера столбца, по которому будем сортировать,

//с контролем ввода

while(1)

{ cin>>k;

if (k>=0 && k<N2) break;

cout<<"k>=0 && k<"<<N2<<" Repeat ";

}

ObjMatr.SORT1(k);

cout<<"\nMatrix after sorting\n";

ObjMatr.OUT1();

getch();

return 0;

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: