В приводимом ниже примере иллюстрируется использование параметризованной функции для обращения матриц. Параметризуется тип входного массива. При этом функция inversion производит обращение как целочисленных массивов, так и вещественных массивов двойной точности.
//==========================================================
// Name : template_inversion.cpp
// Author : Marat
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================
#include <iostream>
using namespace std;
#include<stdlib.h>
#include<math.h>
#define n 4 //Порядок матриц
long i,j,k;
#define col 100
#define lin 100
////////////////////////////////////////////////////
//Обращение квадратной матрицы методом Жордана-Гаусса
////////////////////////////////////////////////////
template<class type>void inversion(type *alpha)
{
long double a[col][lin];
long t,s;
long double c;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
a[i][j]=alpha[i][j];
a[i][n+j]=0;
}
a[i][n+i]=1;
}
for(s=0;s<n;s++)
{
for(t=s;t<n;t++)
{
if(a[t][s]!=0) goto beta;
}
cout<<"\nThere is no single root!"; exit(1);
beta:
for(j=0;j<2*n;j++)
{
long double b;
b=a[s][j];
a[s][j]=a[t][j];
a[t][j]=b;
}
c=1/a[s][s];
for(j=0;j<2*n;j++)
{
a[s][j]*=c;
}
for(t=0;t<n;t++)
{
if(t==s) goto teta;
c=-a[t][s];
for(j=0;j<2*n;j++)
{
a[t][j]+=c*a[s][j];
}
teta:; }
}
for(i=0;i<n;i++)
{
cout<<"\n";
for(j=0;j<n;j++)
{
a[i][j]=alpha[i][j];
cout.width(5); //Задание ширины в 5 символов
cout<<"\t"<<a[i][j];
}
}
cout<<"\nInverted matrix";
for(i=0;i<n;i++)
{
cout<<"\n";
cout.precision(2); //Два десятичных разряда
for(j=n;j<2*n;j++)
{
cout<<"\t"<<a[i][j];
}
}
cout<<"\nChecking results";
for(i=0;i<n;i++)
{
cout<<"\n";
for(j=0;j<n;j++)
{
c=0;
for(k=0;k<n;k++)
{
c+=a[i][k]*a[k][j+n];
}
cout.precision(0); //Нет десятичных разрядов
cout.setf(ios::fixed); //Использование фиксированного формата
cout.width(5); //Задание ширины в 5 символов
cout<<"\t"<<fabs(c);
}
}
cout<<"\n"<<endl;
}
int main() {
int gamma[col][lin]={
{7,5,3,1},
{0,1,1,1},
{4,2,1,3},
{8,1,9,5}
};
double beta[col][lin]={
{1.0, 2.0, 3.0, 4.0},
{2.0, 3.0, 4.0, 5.0},
{4.0, 2.0, 1.0, 3.0},
{8.0, 1.0, 9.0, 5.0}
};
cout<<"\nInteger array";
inversion(gamma);
cout<<"\nDouble array";
inversion(beta);
return 0;
}
Результат:
Integer array
| 7 |
5 |
3 |
1 |
| 0 |
1 |
1 |
1 |
| 4 |
2 |
1 |
3 |
| 8 |
1 |
9 |
5 |
Inverted matrix
| 0.053 |
-0.5 |
0.11 |
0.026 |
| 0.14 |
0.5 |
-0.053 |
-0.096 |
| 0.035 |
0.25 |
-0.26 |
0.1 |
| -0.18 |
0.25 |
0.32 |
-0.0044 |
Checking results
| 1 |
0 |
0 |
0 |
| 0 |
1 |
0 |
0 |
| 0 |
0 |
1 |
0 |
| 0 |
0 |
0 |
1 |
Double array
| 1 |
2 |
3 |
4 |
| 2 |
3 |
4 |
5 |
| 4 |
2 |
1 |
3 |
| 8 |
1 |
9 |
5 |
Inverted matrix
| -0.16 |
-0.053 |
0.21 |
0.053 |
| -2 |
1.8 |
-0.16 |
-0.12 |
| -0.6 |
0.58 |
-0.32 |
0.088 |
| 1.7 |
-1.3 |
0.26 |
-0.018 |
Checking results
| 1 |
0 |
0 |
0 |
| 0 |
1 |
0 |
0 |
| 0 |
0 |
1 |
0 |
| 0 |
0 |
0 |
1 |
В следующей программе производится сортировка матриц по строкам по возрастанию, а также, и транспонирование.
//==========================================================
// Name : template_matrix.cpp
// Author : Marat
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================
#include <iostream>
using namespace std;
#include<stdlib.h>
#define n 4 //Порядок матриц
long i,j,k;
////////////////////////////////////////////////
//Функция транспонирования квадратных матриц////
template<class type> void trans(type A[4][4]);//
////////////////////////////////////////////////
///////////////////////////////////////////////////////
//Сортировка матрицы по строкам по возрастанию
///////////////////////////////////////////////////////
template<class type> void sorting(type array[n][n]);///
///////////////////////////////////////////////////////
///////////////////////////////////////////
//Функция печати //////////////////////////
///////////////////////////////////////////
template<class type> void print(type *c);//
///////////////////////////////////////////
int main() {
double double_a[n][n]={ {4.1, 4.2, 4.3, 4.4},
{3.1, 3.2, 3.3, 3.4},
{2.1, 2.2, 2.3, 2.4},
{1.1, 1.2, 1.3, 1.4}};
int int_a[n][n] = {{41, 42, 43, 44},
{31, 32, 33, 34},
{21, 22, 23, 24},
{11, 12, 13, 14}};
cout<<"\nDouble array:";
print(double_a);
cout<<"\nSosting by ascending:";
sorting(double_a);
cout<<"\nTransponing:";
trans(double_a);
print(double_a);
cout<<"\nInteger array:";
print(int_a);
cout<<"\nSosting by ascending:";
sorting(int_a);
cout<<"\nTransponing:";
trans(int_a);
print(int_a);
return 0;
}
template<class type> void trans(type A[4][4])
{
type *ptr[]={(type *)A[0], (type *)A[1], (type *)A[2], (type *)A[3]};
type x;
for(int i=0; i<n-1; i++)
for (int j=i+1;j<n;j++)
{x = ptr[i][j];
ptr[i][j] = ptr[j][i];
ptr[j][i] = x;
}
}
template<class type> void sorting(type array[n][n])
{
type *par[n]; // Вспомогательный массив указателей
for (i=0; i<n; i++) // Цикл перебора строк
par[i] = (type *)array[i];
type si,sk;// Упорядочение указателей на строки массива
for (i=0; i<n-1; i++)
{
for (j=0,si=0;j<n;j++)
si=par[i][j];
for (int k=i+1;k<n;k++)
{
for (j=0, sk=0; j<n; j++)
sk=par[k][j];
if (si>sk)
{
type *pa = par[i] ;
par[i] = par[k];
par[k] = pa;
type a = si;
si = sk;
sk = a;
}
}
}
print(par);
}
template<class type> void print(type *c)
{
for(i=0;i<n;i++)
{
cout<<"\n";
for(j=0;j<n;j++)
{
cout<<"\t"<<c[i][j];
}
}
cout<<"\n"<<endl;
}
Результат:
Double array:
| 4.1 |
4.2 |
4.3 |
4.4 |
| 3.1 |
3.2 |
3.3 |
3.4 |
| 2.1 |
2.2 |
2.3 |
2.4 |
| 1.1 |
1.2 |
1.3 |
1.4 |
Sorting by ascending:
| 1.1 |
1.2 |
1.3 |
1.4 |
| 2.1 |
2.2 |
2.3 |
2.4 |
| 3.1 |
3.2 |
3.3 |
3.4 |
| 4.1 |
4.2 |
4.3 |
4.4 |
Transponing:
| 4.1 |
3.1 |
2.1 |
1.1 |
| 4.2 |
3.2 |
2.2 |
1.2 |
| 4.3 |
3.3 |
2.3 |
1.3 |
| 4.4 |
3.4 |
2.4 |
1.4 |
Integer array:
| 41 |
42 |
43 |
44 |
| 31 |
32 |
33 |
34 |
| 21 |
22 |
23 |
24 |
| 11 |
12 |
13 |
14 |
Sorting by ascending:
| 11 |
12 |
13 |
14 |
| 21 |
22 |
23 |
24 |
| 31 |
32 |
33 |
34 |
| 41 |
42 |
43 |
44 |
Transponing:
| 41 |
31 |
21 |
11 |
| 42 |
32 |
22 |
12 |
| 43 |
33 |
23 |
13 |
| 44 |
34 |
24 |
14 |