Это можно сделать через указатель на одномерный массив указателей на одномерные массивы известной размерности и заданного типа.


32,32,33,34,

21,22,23,24,

Функцию можно вызывать для любой размерности не превышающей 10.

А так как матрица квадратная, то и количество строк тоже 10.

Пример 10.11. Функция ввода элементов матрицы.

void input_matr(int Ma[100][100], int *n, int *m)
{ printf("Dimension? ");
scanf("%d%d", n , m);
for (int i=0; i<*n; i++)
for (int j=0; j<*m; j++)
scanf("%d",&Ma[i][j]);

}
В головной программе двумерный массив должен быть описан с размерностью 100х100, но можно обрабатывать размерности n*m, где n<=100, m<=100.
Вызов функции:
int M[100][100];
int n, m;

input_matr(M, &n, &m);

Пример 10.12. Функция вывода элементов матрицы
void print_ma(int Ma[100][100], int n, int m)
//void print_mа(int Ma[][100], int n,int m)
;
{for ( int i=0;i<n;i++)
{for (int j=0; j<=m; j++)
printf("%5d",Ma[i][j]);
printf("\n");

}
}
Двумерный массив должен быть описан со второй размерностью =100,
например
int Ma[10][100],
int Ma1[20][100],
int Ma2[100][100],
но можно
обрабатывать размерности n*m, где n<=100, m<=100.
print_mа(Ma,3,4);
print_mа(Ma1,20,12);

Пример 10.13 Функция генерации элементов матрицы
void rnd_ma(int Ma[100][100], int n, int m)
//void rnd_ma(int Ma[][100], int n, int m)
{
srand(time(0));
for (int i=0; i<n; i++)
for (int j=0;j<m; j++)
Ma[i][j] = rand()%100;
}

int sum_vt(int ma[100][100],int n)
{
int s = 0;
for (int i = 0; i < n; ++i)
for (int j = 0; j < n-i; ++j)
s += ma[i][j];
return s;
}

Вариант III.

Передача двумерного массива через указатель, которому соответствует адрес первого элемента двумерного массива.

Пример 10.14. Функция вывода матрицы.
void print_matr(int *ma,
int dim1, int dim2)
{for (int i = 0; i<dim1; ++i)
{for (int j = 0; j<dim2; ++j)
printf("%d\t",ma[i*dim2+j]);
printf("\n");
}
}

Если при вызове функции использовать как параметр адрес первого элемента, то в этом случае массив должен быть описан точно такой же размерности, как при вызове.
int mb[3][3]={1,2,3,1,2,3,1,2,3};
Вызов функции:
print_matr(&mb[0][0],3,3);

Вариант IV.Массив указателей на массивы строк.


Пример 10.15. Функция транспонирования квадратной матрицы .

void transpon(int * p[],int n)

{int r;

for (int i=0; i<n-1; i++)

for (int j=i+1; j<n; j++)

{

r=p[i][j];

p[i][j]=p[j][i];

p[j][i]=r;

}

}

int main()

{int Matr[4][4]={11,12,13,14,

41,42,43,44};

//вспомогательный массив указателей

int *ptr[]={(int *)&Matr[0],

(int *)&Matr[1],

(int *)&Matr[2],

(int *)&Matr[3]};

int k=4;

transpon(ptr,k);

cout << ”result\n”;

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

{for (int j=0; j<k; j++)

cout << Matr[i][j] << " ";

cout << endl;

}

return 0;

}
В головной программе матрица имеет фиксированные размеры. Чтобы передать ее в функцию как параметр вместо формального параметра со спецификацией int* ptr [] используется вспомогательный массив указателей, значениями которых будут адреса строк матрицы.

 

Вариант V. Использование динамического двумерного массива.

Пример 10.16. Транспонирование динамической матрицы.

void transpon(int **p,int n)
{int r;
for (int i=0; i<n-1; i++)
for (int j=i+1; j<n; j++)
{
r=p[i][j];
p[i][j]=p[j][i];
p[j][i]=r;
}
}

int main ()
{int i;
int k=4;
int **matr;
srand(time(0));
matr= new int *[k]; //массив указателей
for (i=0;i<k;i++)
matr[i]= new int [k];
for (int i=0; i<k; i++)
for (int j=0; j<k; j++)
matr[i][j]=rand()%10;
for (i=0;i<k;i++)

{for (int j=0;j<k;j++)

cout<<*(*(matr+i)+j)<<" ";

cout << endl;

}

transpon(matr,k);

cout << "_____________"<<endl;

for (i=0;i<k;i++)
{for (int j=0;j<k;j++)
cout<<*(*(matr+i)+j)<<" ";
cout << endl; }
for (i=0;i<k;i++)
delete *(matr+i);
delete [] matr;
}

 

Пример 10.17. Функция вывода динамической матрицы.
void print_maD(int **ma,int n, int m)
{
for (int i=0;i<n;i++)
{for (int j=0;j<m;j++) printf("%5d",ma[i][j]); //printf("%t",ma[i][j]);
printf("\n");
}
}

 

Пример 10.18. Перепишем функцию подсчета суммы элементов верхнего левого треугольника матрицы.
int sum_vt(int **ma, int n)
{int s = 0;
for (int i=0; i<n; ++i)
for (int j=0; j< n-i;++j)
s += ma[i][j];
return s;
}
//Вызов
int res=sum_vt(ma,n);

Передача двумерного массива, сформированного в функции в вызывающую программу

Пример 10.19. Динамическая единичная матрица, формируемая в функции.
int** single_matr(int n);
{

int **matr;//вспом указ на матр
matr=new int *[n];//массив указателей
if (matr == NULL)

{cout <<"Error"; return;}
for (i=0;i<n;i++)

{matr[i]= new int [n];
if (matr[i] == NULL)
{cout <<"Error"; return;}
}

for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (i != j)
*(*(matr+i)+j)=0;
else
*(*(matr+i)+j)=1;
return matr;
}

int main ()
{int n;
cout << ”Enter n”;
cin >> n;

int **ma;
ma=single_matr(n);
for (i=0;i<n;i++)
{
cout << endl;
for (int j=0;j<n;j++)
cout<<*(*(ma+i)+j)<<” ”;
}

for (i=0;i<n;i++)
delete [] *(ma+i);

delete [] ma;
}


Пример 10.20. Создание и инициализация динамической матрицы.

int** MatrInt(int **ma, int *n, int *m)
{ printf( "enter n, m");
scanf("%d%d",n,m);
ma= new int *[*n];
for (int i=0;i<*n;i++)
ma[i]= new int [*m];
for ( i=0;i<*n;i++)
for (int j=0;j<*m;j++)
ma[i][j]= rand()%2;
return ma;
}


Пример дополнительный.

Построить магический квадрат нечетного порядка.


Магический квадрат - это квадратная матрица, у которой сумма чисел каждого столбца равна сумме элементов каждой строки, а также каждой из двух диагоналей .
Рассмотрим построение магического квадрата нечетного порядка, используя индийский метод Москополуса.

#include <stdio.h>
void InitNull(int ma[19][19], int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
ma[i][j]=0;
}

void main ()
{
int mk[19][19];
int n,k,j,i;
do
{printf("enter n");
scanf("%d",&n);//нечетное
}
while (n % 2==0);
//Заполняем матрицу нулями
InitNull (mk,n);

//Определяем координаты первой заполняемой клетки
i=(n-2)/2;
j=n/2;
k=1;

while (k<=n*n)
{

if ((i==-1)&&(j==-1))//вышли в левый верх угол
{i=n-1; j=n-1;}
if (j>=n) j=0;
if (j<0) j=n-1;
if (i>=n) i=0;
if (i<0) i=n-1;
//Если клетка существует и не занята
if (mk[i][j]==0)
{

mk[i][j]=k;
i--; j--; k++;

}
else //Если клетка существует,но занята
{j++; i--;}
}

for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%4d",mk[i][j]);
printf("\n");
}
}