Sie sind auf Seite 1von 4

#include

#include
#include
#include
#include

<iostream>
<iomanip>
<stdexcept>
<new>
"TestCurenja.h"

template <typename TipElemenata>


struct Matrica
{
int br_redova, br_kolona;
TipElemenata **elementi = nullptr;
};
template <typename TipElemenata>
void UnistiMatricu(Matrica<TipElemenata> mat)
{
if(!mat.elementi) return;
for(int i = 0; i < mat.br_redova; i++) delete[] mat.elementi[i];
delete[] mat.elementi;
mat.elementi = nullptr;
}
template <typename TipElemenata>
Matrica<TipElemenata> StvoriMatricu(int br_redova, int br_kolona)
{
Matrica<TipElemenata> mat;
mat.br_redova = br_redova;
mat.br_kolona = br_kolona;
mat.elementi = new TipElemenata*[br_redova];
for(int i = 0; i < br_redova; i++) mat.elementi[i] = nullptr;
try
{
for(int i = 0; i < br_redova; i++)
mat.elementi[i] = new TipElemenata[br_kolona];
}
catch(...)
{
UnistiMatricu(mat);
throw;
}
return mat;
}
template <typename TipElemenata>
void UnesiMatricu(char ime_matrice, Matrica<TipElemenata> &mat)
{
for(int i = 0; i < mat.br_redova; i++)
for(int j = 0; j < mat.br_kolona; j++)
{
std::cout << ime_matrice
<< "(" << i + 1 << "," << j + 1 << ") = ";
std::cin >> mat.elementi[i][j];
}
}
template <typename TipElemenata>
void IspisiMatricu(const Matrica<TipElemenata> &mat, int sirina_ispisa, int prec
iznost=6, bool treba_brisati=false)
{
for(int i = 0; i < mat.br_redova; i++)
{
for(int j = 0; j < mat.br_kolona; j++)
std::cout <<std::setw(sirina_ispisa)<<std::setprecision(preciznost)<
< mat.elementi[i][j];

std::cout << std::endl;


}
if (treba_brisati==true) UnistiMatricu(mat);
}
template <typename TipElemenata>
Matrica<TipElemenata> ZbirMatrica(const Matrica<TipElemenata> &m1, const Matrica
<TipElemenata> &m2)
{
if(m1.br_redova != m2.br_redova || m1.br_kolona != m2.br_kolona)
throw std::domain_error("Matrice nemaju jednake dimenzije!");
auto m3(StvoriMatricu<TipElemenata>(m1.br_redova, m1.br_kolona));
for(int i = 0; i < m1.br_redova; i++)
for(int j = 0; j < m1.br_kolona; j++)
m3.elementi[i][j] = m1.elementi[i][j] + m2.elementi[i][j];
return m3;
}
template <typename TipElemenata>
Matrica<TipElemenata> ProduktMatrica (const Matrica<TipElemenata> &m1, const Mat
rica<TipElemenata> &m2)
{
if(m1.br_kolona != m2.br_kolona)
throw std::domain_error ("Matrice nisu saglasne za mnozenje");
auto m3=StvoriMatricu<TipElemenata>(m1.br_redova, m2.br_kolona);
for(int i = 0; i < m1.br_redova; i++)
for(int j = 0; j < m2.br_kolona; j++)
{
double suma(0);
for (int k=0; k< m2.br_redova; k++) suma+= m1.elementi[i][k] * m2.el
ementi [k][j];
m3.elementi[i][j]=suma;
}
return m3;
}
template <typename TipElemenata>
Matrica<TipElemenata> MatricniHarmonijskiPolinom (const Matrica<TipElemenata> A,
int n)
{
if (n<=0) throw std::domain_error ("Stepen mora biti prirodan broj");
if (A.br_redova != A.br_kolona) throw std::domain_error ("Matrica mora biti
kvadratna");
Matrica<TipElemenata> rez, H, pomocna;
rez=StvoriMatricu<TipElemenata>(A.br_redova, A.br_kolona);
for (int i=0; i<rez.br_redova; i++)
for (int j=0; j<rez.br_kolona; j++) rez.elementi[i][j]=0;
H=StvoriMatricu<TipElemenata>(A.br_redova, A.br_kolona);
for (int i=0; i<H.br_redova; i++)
for (int j=0; j<H.br_kolona; j++) H.elementi[i][j]=0;
pomocna=StvoriMatricu<TipElemenata>(A.br_redova, A.br_kolona);
for (int i=0; i<pomocna.br_redova; i++)
for (int j=0; j<pomocna.br_kolona; j++) pomocna.elementi[i][j]=0;

for (int k=1; k<2; k++)


{
try
{
for(int j=0; j<rez.br_redova; j++)
for (int i=0; i<rez.br_kolona; i++)
rez.elementi[j][i]=A.elementi[j][i];
try
{
for(int j=0; j<H.br_redova; j++)
for (int i=0; i<H.br_kolona; i++)
H.elementi[j][i]=A.elementi[j][i];
}
catch(...)
{
UnistiMatricu(H);
}
}
catch(...)
{
UnistiMatricu(rez);
UnistiMatricu(H);
}
}
for (int k=2; k<=n; k++)
{
try
{
for(int i = 0; i < H.br_redova; i++)
for(int j = 0; j < A.br_kolona; j++)
{
double suma(0);
for (int k=0; k< A.br_redova; k++) suma+= H.elementi[i][k] *
A.elementi [k][j];
H.elementi[i][j]=suma;
}
try
{
for (int i=0; i<pomocna.br_redova; i++)
for (int j=0; j<pomocna.br_kolona; j++)
pomocna.elementi[i][j]=1./k*H.elementi[i][j];
try
{
for (int i=0; i<pomocna.br_redova; i++)
for (int j=0; j<pomocna.br_kolona; j++)
rez.elementi[i][j]=rez.elementi[i][j]+pomocna.elemen
ti[i][j];
}
catch(...)
{
UnistiMatricu(pomocna);
UnistiMatricu(H);
}
}

catch(...)
{
UnistiMatricu(pomocna);
UnistiMatricu(H);
}
}
catch(...)
{
UnistiMatricu(H);
UnistiMatricu(pomocna);
}
}
UnistiMatricu(H);
UnistiMatricu(pomocna);
return rez;
}
int main()
{
int m, n;
Matrica<double> a, c;
std::cout << "Unesi broj redova i kolona za matrice:\n";
std::cin >> m >> n;
try
{
a = StvoriMatricu<double>(m, n);
std::cout << "Unesi matricu A:\n";
UnesiMatricu('A', a);
try
{
std::cout << "Matricni harmonijski polinom je:\n";
IspisiMatricu(c = MatricniHarmonijskiPolinom(a,6), 10);
}
catch (std::domain_error ne_postoji)
{
std::cout<<ne_postoji.what();
UnistiMatricu(c);
}
catch(...)
{
std::cout<<"Nema dovoljno memorije!\n";
UnistiMatricu(c);
}
}
catch(std::bad_alloc)
{
std::cout << "Nema dovoljno memorije!\n";
UnistiMatricu(a);
UnistiMatricu(c);
}
catch (char znak[])
{
std::cout<<znak;
}
UnistiMatricu(a);
UnistiMatricu(c);
return 0;
}

Das könnte Ihnen auch gefallen