|
Хочу получить удостоверение. Сколько стоит оплата? |
Лекция 14:
Параметризованные функции
< Лекция 13 || Лекция 14 || Лекция 15 >
В приводимом ниже примере иллюстрируется использование параметризованной функции для обращения матриц. Параметризуется тип входного массива. При этом функция 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;
}
Результат:
| 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 |
| -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 |
В следующей программе производится сортировка матриц по строкам по возрастанию, а также, и транспонирование.
//==========================================================
// 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;
}
Результат:
< Лекция 13 || Лекция 14 || Лекция 15 >