All pastes #813636 Raw Edit

jacoby

public text v1 · immutable
·published 2007-12-12 17:56 UTC
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;
}