rendered paste body
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iostream>
#include <cstdlib>
#include <math.h>
using namespace std;
class macierz;
class wektor{
friend void wyswW(wektor & w);
public:
friend class macierz;
double *tab;
int wier;
wektor(int n);
void wysw(wektor & w);
wektor & wektor::operator=(wektor w);
wektor & wektor::operator=(double liczba);
void fill();
wektor operator++(int);
wektor operator++();
};
class macierz{
public:
int wier,kol;
double **tab;
macierz(int n,int m);
friend void uzup(macierz & m,wektor & w,double d);
friend void wyswM(macierz &m);
void trojD();
void U(macierz & m);
void D(macierz & m);
void macierz::L(macierz & m);
void Dminus1();
void fill();
macierz operator*(double liczba);
macierz & macierz::operator=(macierz m);
double operator()(int a,int b);
};
macierz operator+(macierz & m1,macierz & m2);
macierz operator-(macierz & m1,macierz & m2);
macierz operator*(macierz & m1,macierz & m2);
macierz operator++(macierz &m,int);
wektor operator+(wektor &w1,wektor &w2);
wektor operator*(macierz &m,wektor &w);
class lepsza_macierz: private macierz{
int superkolumna;
lepsza_macierz(int n,int m);
public:
using macierz:: tab;
};
wektor::wektor(int n)
{
wier=n;
tab=new double[wier];
for(int i=0;i<wier;i++)
tab[i]=0;
}
macierz::macierz(int n,int m)
{
wier=n;
kol=m;
tab=new double*[wier];
for(int i=0;i<wier;i++)
tab[i]=new double[kol];
for(int i=0;i<wier;i++)
for(int j=0;j<kol;j++)
tab[i][j]=0;
}
void wektor::wysw(wektor & w)
{
cout << "\nwektor: \n";
for(int i=0;i<w.wier;i++)
cout << tab[i] << endl;
}
macierz::macierz operator+(macierz & m1,macierz & m2)
{
if(m1.wier==m2.wier && m1.kol==m2.kol) {
macierz m3(m1.wier,m1.kol);
for(int i=0;i<m1.wier;i++)
for(int j=0;j<m1.kol;j++)
m3.tab[i][j]=m1.tab[i][j]+m2.tab[i][j];
return m3;
}
else { cout << "roznica w ilosci wierszy lub kolumn danych macierzy\n" ;
}
}
macierz::macierz operator-(macierz & m1,macierz & m2)
{
if(m1.wier==m2.wier && m1.kol==m2.kol) {
macierz m3(m1.wier,m1.kol);
for(int i=0;i<m1.wier;i++)
for(int j=0;j<m1.kol;j++)
*(*(m3.tab+i)+j)=*(*(m1.tab+i)+j)-*(*(m2.tab+i)+j);
return m3;
}
else { cout << "roznica w ilosci wierszy lub kolumn danych macierzy\n" ;
}
}
macierz::macierz operator*(macierz & m1,macierz & m2)
{
if(m1.wier==m2.kol && m1.kol==m2.wier) {
macierz m3(m1.wier,m2.kol);
for(int i=0;i<m1.wier;i++)
for(int j=0;j<m2.kol;j++)
for(int k=0;k<m2.wier;k++)
*(*(m3.tab+i)+j) += *(*(m1.tab+i)+k) * *(*(m2.tab+k)+j);
return m3;
}
else { cout << "roznica w ilosci wierszy lub kolumn danych macierzy\n" ;
}
}
wektor::wektor operator+(wektor &w1,wektor &w2)
{
if(w1.wier==w2.wier){
wektor w3(w1.wier);
for(int i=0;i<w1.wier;i++)
w3.tab[i]=w1.tab[i]+w2.tab[i];
return w3;
}
else {
cout << "roznica w ilosci wspolrzednych wektora\n";
return w1;
}}
wektor::wektor operator*(macierz &m,wektor &w)
{
wektor w2(w.wier);
for(int i=0;i<w.wier;i++)
for(int j=0;j<w.wier;j++)
w2.tab[i]+=m.tab[i][j]*w.tab[j];
return w2;
}
void uzup(macierz &m,wektor &w,double d)
{
for(int i=0;i<w.wier;i++)
w.tab[i]=d;
for(int i=0;i<m.wier;i++)
for(int j=0;j<m.kol;j++)
*(*(m.tab+i)+j)=d;
}
void wyswM(macierz &m )
{
for(int i=0;i<m.wier;i++)
for(int j=0;j<m.kol;j++)
{
cout << " " << *(*(m.tab+i)+j) << " " ;
if(j==m.kol-1) cout << endl ;
}
cout << endl;
}
void wyswW(wektor & w)
{
for(int i=0;i<w.wier;i++)
cout << w.tab[i] << endl;
}
void macierz::trojD()
{
for(int i=0;i<wier;i++)
for(int j=0;j<kol;j++)
*(*(tab+i)+j)=0;
for(int i=0;i<wier;i++)
for(int j=0;j<kol-1;j++)
{ *(*(tab+j+1)+j)=1;
*(*(tab+i)+i)=4;
*(*(tab+j)+j+1)=1;
}
}
void macierz::U(macierz & m)
{
for(int i=0;i<wier;i++)
for(int j=i+1;j<kol;j++)
*(*(tab+i)+j)=*(*(m.tab+i)+j);
}
void macierz::D(macierz & m)
{
for(int i=0;i<wier;i++)
*(*(tab+i)+i)=*(*(m.tab+i)+i);
}
void macierz::L(macierz & m)
{
for(int i=1;i<wier;i++)
for(int j=0;j<i;j++)
*(*(tab+i)+j)=*(*(m.tab+i)+j);
}
wektor & wektor::operator=(wektor w)
{
for(int i=0;i<wier;i++)
this->tab[i]=w.tab[i];
return *this;
}
wektor & wektor::operator=(double liczba)
{
for(int i=0;i<wier;i++)
this->tab[i]=liczba;
return *this;
}
macierz & macierz::operator=(macierz m)
{
for(int i=0;i<wier;i++)
for(int j=0;j<kol;j++)
this->tab[i][j]=m.tab[i][j];
return *this;
}
void macierz::Dminus1()
{
for(int i=0;i<this->wier;i++)
*(*(tab+i)+i)=pow(*(*(tab+i)+i),-1);
}
void wektor::fill()
{
cout << "podaj wartosci wektora:\n";
for(int i=0;i<wier;i++)
cin >> tab[i];
}
void macierz::fill()
{
cout << "podaj wartosci macierzy:\n";
for(int i=0;i<wier;i++)
for(int j=0;j<kol;j++)
{
cout << "wiersz: " << i << ", kolumna:" << j <<":";
cin >> tab[i][j];
}
}
macierz macierz::operator*(double liczba)
{
for(int i=0;i<wier;i++)
for(int j=0;j<kol;j++)
tab[i][j]*=liczba;
return *this;
}
wektor wektor::operator++(int)
{
for(int i=0;i<wier;i++)
tab[i]=tab[i]+1;
return *this;
}
wektor wektor::operator++()
{
for(int i=0;i<wier;i++)
tab[i]=tab[i]+1;
return *this;
}
macierz operator++(macierz &m,int)
{
for(int i=0;i<m.wier;i++)
for(int j=0;j<m.kol;j++)
m.tab[i][j]=m.tab[i][j]+1;
return m;
}
double macierz::operator()(int a,int b)
{
return tab[a][b];
}
ostream& operator<<(ostream& ekran,macierz &m)
{
for(int i=0;i<m.wier;i++)
for(int j=0;j<m.kol;j++)
{ekran << m.tab[i][j] << " " ;
if(j==(m.kol-1)) ekran << endl;}
return ekran;
}
istream& operator>>(istream& kw,wektor &w)
{
for(int i=0;i<w.wier;i++)
{
cout << "podaj wspolrzedna wektora nr " << i << ":\n";
kw >> w.tab[i];
}
return kw;
}
int main(int argc, char *argv[])
{
int n;
cout << "podaj ilosc niewiadomych:";
cin >> n;
macierz A(n,n),L(n,n),D(n,n),U(n,n);
wektor x(n),b(n),X(n);
cin >> b;
cout << (A);
A++;
cout << A;
A.fill();
L.L(A);
U.U(A);
D.D(A);
wyswM(D);
wyswM(U);
D.Dminus1();
wyswM(D);
b=D*b;
L=(L+U);
wyswM(L);
L=L*(-1);
wyswM(L);
wyswW(b);
D=D*L;
wyswM(D);
wektor pomocniczy=X;
for(int i=0;i<20;i++)
{
cout << "wektor X:\n";
X=D*pomocniczy;
x=X+b;
wyswW(X);
pomocniczy=x;
x=0;
}
wyswW(pomocniczy);
system("PAUSE");
return EXIT_SUCCESS;
}