/* Matrice

   Programma a cura di Vincenzo Capuano. 
   I diritti sul programma sono riservati all'autore.
   Per informazioni: www.sitoserio.it
*/

#include<iostream.h>
#include<stdio.h>

class matrice{
   int **p;
   int r,c;
   public:
   matrice(int riga,int colonna); //costruttore
   ~matrice();  //distruttore
   matrice(const matrice &ob1); //costruttore di copie
   void riempi(); //input
   void visual(); //output
   void operator=(const matrice &ob); //overloadig op. di assegnamento
   matrice operator++(); //incremento valori di una matrice
   matrice operator+(const matrice &ob); //somma di due matrici
   friend matrice operator+(const matrice &ob,const int &x);
   friend matrice operator+(const int &x,const matrice &ob);
};

matrice::matrice(int riga,int colonna)
{
 int i,j;
 r=riga;
 c=colonna;
 p=new int*[r];
 for(i=0;i<r;i++)
 {
  p[i]=new int[c];
  for(j=0;j<c;j++)
  p[i][j]=0;
 }
}

matrice::~matrice()
{
 int i;
 for(i=0;i<r;i++)
  delete[]p[i];
 delete[]p;
}

matrice::matrice(const matrice &ob1)
{
 int i,j;
 r=ob1.r;
 c=ob1.c;
 p=new int*[r];
 for(i=0;i<r;i++)
 {
  p[i]=new int[c];
  for(j=0;j<c;j++)
   p[i][j]=ob1.p[i][j];
 }
}

void matrice::riempi()
{
 int i,j;
 for(i=0;i<r;i++)
  for(j=0;j<c;j++)
  {
   cout<<"\n Inserisci il valore ["<<i<<"],["<<j<<"]: ";
   cin>>p[i][j];
  }
}

void matrice::visual()
{
 int i,j;
 for(i=0;i<r;i++)
 {
  cout<<"\n";
  for(j=0;j<c;j++)
   cout<<p[i][j]<<" ";
 }
}

void matrice::operator=(const matrice &ob)
{
 int i,j;
 for(i=0;i<r;i++)
  delete[]p[i];
 delete[]p;
 r=ob.r;
 c=ob.c;
 p=new int*[r];
 for(i=0;i<r;i++)
  {
   p[i]=new int[c];
   for(j=0;j<c;j++)
    p[i][j]=ob.p[i][j];
  }
 }

matrice matrice::operator++()
{
 int i,j;
 for(i=0;i<r;i++)
  for(j=0;j<c;j++)
   p[i][j]=p[i][j]+1;
 return *this;
}

matrice matrice::operator+(const matrice &ob)
{
 int i,j;
 matrice temp(ob.r,ob.c);
 for(i=0;i<ob.r;i++)
  for(j=0;j<ob.c;j++)
   temp.p[i][j]=p[i][j]+ob.p[i][j];
 return temp;
}

matrice operator+(const matrice &ob,const int &x)
{
 int i,j;
 matrice temp(ob);
 for(i=0;i<ob.r;i++)
  for(j=0;j<ob.c;j++)
   temp.p[i][j]=temp.p[i][j]+x;
 return temp;
}

matrice operator+(const int &x,const matrice &ob)
{
 int i,j;
 matrice temp(ob);
 for(i=0;i<ob.r;i++)
  for(j=0;j<ob.c;j++)
   temp.p[i][j]=temp.p[i][j]+x;
 return temp;
}

void main()
{
 int r,c,val,rip;
 do
 {
  cout<<"\n   ***MATRIX 4.0 by Enzo***\n";
  cout<<"\n inserisci il numero di righe: ";
  cin>>r;
  cout<<"\n inserisci il numero di colonna: ";
  cin>>c;
  matrice A(r,c);
  cout<<"\n-Riempimento-";
  A.riempi();
  A.visual();
  do
  {
   cout<<"\n digita 1 per continuare: ";
   cin>>rip;
  }
  while(rip!=1);
  cout<<"\n -costruttore di copie-";
  matrice B(A);
  B.visual();
  do
  {
   cout<<"\n digita 1 per continuare: ";
   cin>>rip;
  }
  while(rip!=1);
  cout<<"\n -incremento di 1-";
  ++A;
  A.visual();
  cout<<"\n -incremento manuale-";
  cout<<"\n digita il valore: ";
  cin>>val;
  B=B+val;
  B.visual();
  cout<<"\n\n -somma delle due matrici incrementate-";
  matrice S(r,c);
  S=A+B;
  S.visual();
  cout<<"\n\n Vuoi continuare ancora?";
  cout<<"\n (si=1,no=altro): ";
  cin>>rip;
 }
 while(rip==1);
}
