Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.11 KB | None | 0 0
  1.  
  2. #include <cstdlib>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. class Matriz {
  8.  
  9.   private:
  10.  
  11.     int nLinha, nColuna;
  12.     double* m;
  13.  
  14.   public:
  15.     Matriz( int nLinha, int nColuna ):nLinha(nLinha), nColuna(nColuna),m(new double[nLinha*nColuna] ) {
  16.  
  17.             for( int i = 0; i < nLinha*nColuna; i++ ) m[i] = 0;
  18.     }
  19.   public:
  20.     class Linha {
  21.       private:
  22.         Matriz& ma;
  23.         int linha;
  24.         int col;
  25.  
  26.       public:
  27.         Linha( Matriz& ma, int linha ): ma(ma), linha(linha),col(0) {}
  28.  
  29.         double& operator[] (int coluna) {
  30.  
  31.           return ma.at( linha, coluna );
  32.         }
  33.         void imprime(Matriz ma,ostream& o ) {
  34.  
  35.  
  36.             cout << "Linha " << linha << ":";
  37.             for( int j = 0; j < ma.nColuna; j++ )  cout << " " << ma.m[linha*ma.nColuna + j];
  38.             cout << endl;
  39.  
  40.         }
  41.         Linha& operator=  (double valor ) {
  42.             ma.m[linha*ma.nColuna + col] = valor;
  43.             col++;
  44.             return *this;
  45.  
  46.         }
  47.         Linha& operator,  (double valor ) {
  48.  
  49.             if(col<ma.nColuna){
  50.                 ma.m[linha*ma.nColuna + col] = valor;
  51.                 col++;
  52.             }
  53.             return *this;
  54.  
  55.         }
  56.  
  57.     };
  58.     int getNumeroLinhas(const Matriz& x){
  59.  
  60.                return x.nLinha;
  61.     }
  62.     int getNumeroColunas(const Matriz& x){
  63.  
  64.                return x.nColuna;
  65.     }
  66.  
  67.     Linha operator [] ( int linha ) {
  68.  
  69.       return Linha( *this, linha );
  70.  
  71.     }
  72.     Linha operator , ( int linha ) {
  73.  
  74.       return Linha( *this, linha );
  75.  
  76.     }
  77.     double& at( int linha, int coluna ) {
  78.  
  79.        return m[linha*nColuna + coluna];
  80.     }
  81.     double& e( int l, int c ) {
  82.       if( l < nLinha && c < nColuna ) return m[l*nColuna + c];
  83.       else {
  84.  
  85.             cout << "Limite Ultrapassado" << endl;
  86.             exit(0);
  87.       }
  88.     }
  89.     Matriz operator+ (const Matriz x){
  90.               if ( x.nLinha != nLinha )
  91.               {
  92.                   cout<<"Erro ao somar: Numero Linhas diferentes"<<endl;
  93.                   exit(0);
  94.               }
  95.               if (x.nColuna != nColuna)
  96.               {
  97.                   cout<<"Erro ao somar: Numero de colunas diferentes"<<endl;
  98.                   exit(0);
  99.               }
  100.               Matriz temp(nLinha,nColuna);
  101.               for (int i = 0; i < nLinha; i++)
  102.               {
  103.                   for (int j=0; j < nColuna; j++)
  104.                   {
  105.                       temp.m[i*nColuna + j] = x.m[i*nColuna + j]+ m[i*nColuna + j];
  106.                   }
  107.               }
  108.               return temp;
  109.     }
  110.     Matriz operator- (const Matriz x){
  111.               if ( x.nLinha != nLinha )
  112.               {
  113.                   cout<<"Erro ao subtrair: Numero Linhas diferentes"<<endl;
  114.                   exit(0);
  115.               }
  116.               if (x.nColuna != nColuna)
  117.               {
  118.                   cout<<"Erro ao subtrair: Numero de colunas diferentes"<<endl;
  119.                   exit(0);
  120.               }
  121.               Matriz temp(nLinha,nColuna);
  122.  
  123.               for (int i = 0; i < nLinha; i++)
  124.               {
  125.                   for (int j=0; j < nColuna; j++)
  126.                   {
  127.                       temp.m[i*nColuna + j] =  m[i*nColuna + j] - x.m[i*nColuna + j] ;
  128.                   }
  129.               }
  130.               return temp;
  131.     }
  132.      Matriz operator* (const double valor){
  133.  
  134.               Matriz temp(nLinha,nColuna);
  135.  
  136.               for (int i = 0; i < nLinha; i++)
  137.               {
  138.                   for (int j=0; j < nColuna; j++)
  139.                   {
  140.                       temp.m[i*nColuna + j] =  m[i*nColuna + j] * valor ;
  141.                   }
  142.               }
  143.  
  144.               return temp;
  145.     }
  146.     Matriz operator* (const Matriz x){
  147.               if ( x.nColuna != nLinha )
  148.               {
  149.                   cout<<"Erro ao multiplicar: Numero de linhas de uma matriz diferente do numero de colunas da outra"<<endl;
  150.                   exit(0);
  151.               }
  152.               Matriz temp(nLinha,x.nColuna);
  153.  
  154.               for (int j = 0; j < x.nColuna; j++){
  155.  
  156.                   for (int i=0; i < x.nLinha; i++){
  157.  
  158.                       for(int k=0;k<x.nColuna;k++){
  159.  
  160.                             temp.m[j*x.nColuna + k] +=  m[j*x.nColuna + i] * x.m[i*x.nColuna + k] ;
  161.                       }
  162.                   }
  163.               }
  164.  
  165.               return temp;
  166.     }
  167.     Matriz& operator= (const Matriz& x){
  168.               if ( x.nLinha != nLinha )
  169.               {
  170.                   cout<<"Erro ao atribuir: Numero linhas diferentes"<<endl;
  171.                   exit(0);
  172.               }
  173.               if ( x.nColuna != nColuna )
  174.               {
  175.                   cout<<"Erro ao atribuir: Numero linhas diferentes"<<endl;
  176.                   exit(0);
  177.               }
  178.               for (int i = 0; i < nLinha; i++)
  179.               {
  180.                   for (int j=0; j < nColuna; j++)
  181.                   {
  182.                       m[i*nColuna + j] =  x.m[i*nColuna + j];
  183.                   }
  184.               }
  185.               return *this;
  186.  
  187.     }
  188.     Matriz operator~ (){
  189.  
  190.               Matriz temp(nColuna,nLinha);
  191.               int k =0;
  192.               for (int i = 0; i < nLinha; i++)
  193.               {
  194.                   for (int j=0; j < nColuna; j++)
  195.                   {
  196.                       temp.m[j*nLinha + i] =  m[i*nColuna + j] ;
  197.  
  198.                   }
  199.               }
  200.               return temp;
  201.  
  202.     }
  203.     void imprime( ostream& o ) {
  204.  
  205.         for( int i = 0; i < nLinha; i++ ) {
  206.  
  207.             cout << "Linha " << i << ":";
  208.             for( int j = 0; j < nColuna; j++ )  cout << " " << m[i*nColuna + j];
  209.  
  210.             cout << endl;
  211.         }
  212.     }
  213.  
  214. };
  215.  
  216. Matriz operator* (double valor,Matriz& x){
  217.  
  218.     return x*valor;
  219. }
  220. int main(int argc, char *argv[])
  221. {
  222.   Matriz v( 2, 3 );
  223.   Matriz u( 3, 2 );
  224.   Matriz w( 2, 3 );
  225.   Matriz z( 2, 2 );
  226.  
  227.   v[0]    = 1,1,1;
  228.   v[1][0] = 2;
  229.   v[1][1] = 2;
  230.   v[1][2] = 2;
  231.   u[0]    = 3,3;
  232.   u[1]    = 4,4;
  233.   z[0]    = 5,5;
  234.   z[1]    = 6,6;
  235.  
  236.   w = 3*v;
  237.  
  238.   v.imprime(cout);
  239.   cout<<endl;
  240.   u.imprime(cout);
  241.   cout<<endl;
  242.   w.imprime(cout);
  243.   cout << endl;
  244.   //w.imprime(cout);
  245.   return EXIT_SUCCESS;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement