Сначала рассмотрим передачу массива в качестве параметра самостоятельной функции без использования класса и указателей.
Независимо от того, является ли массив входным для функции, получается (формируется) в ней или одновременно входным и выходным (передаётся в функцию, преобразуется в ней и возвращается в точку вызова), правила передачи одномерного или двумерного массива в качестве параметра функции одинаковы.
Есть два варианта объявления массива в скобках в заголовке (прототипе) функции:
* 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). Его (size 2), как и первую размерность (size 1), можно также передать в качестве параметра и затем использовать в теле функции:
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 _ mas 2( 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 n 1, n 2; //количество строк и столбцов
int k ;//номер столбца для сортировки
double a[m][m];
cout <<”Введите кол-во строк-->”; cin >> n 1;
cout <<”Введите кол-во столбцов-->”; cin >> n 2;
in_mas2(a,n1,n2);
cout <<"\n Старая матрица \n";
out _ mas 2( 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–го (m in), и его номера(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;
}
Дата: 2018-12-28, просмотров: 246.