Sunteți pe pagina 1din 5

4) Sa se dezvolte un tip abstract de date pentru prelucrarea unei matrice

bidimensionate, si realizarea principalelor operatii pe aceasta, prin operatori


supraincarcati.
#include <iostream>
using namespace std;
#include<conio.h>
#include<string.h>
class matrice
{
int m,n; // m - numarul de linii, n - numarul de coloane
int* mat; // matricea, pentru se va aloca memorie in zona de memorare
HEAP
public:
matrice(int=1,int=1); // constructor de initializare cu parametri
int* operator()(int,int); /* supraincarcarea operatorului special
'apel de functie' pentru
determinarea unui element al matricei dintr-o anumita pozitie, pozitie
data ca parametru*/
friend istream& operator>>(istream&,matrice&); /* supraincarcarea
operatorului 'extragere
din flux' pentru citirea
elementelor unei matrice*/
friend ostream& operator<<(ostream&,matrice); /*

supraincarcarea

operatorului 'insertie in
flux' pentru afisarea elementelor unei matrice*/
friend matrice operator+(matrice&,matrice&); /* supraincarcarea
operatorului '+' pentru adunarea
a doua matrice*/
friend matrice operator-(matrice&); /* supraincarcarea operatorului
'-' pentru determinarea opusei
unei matrice*/

friend matrice operator-(matrice&,matrice&); /* supraincarcarea


operatorului '-' pentru diferenta
a doua matrice*/
friend matrice operator~(matrice&); // transpusa unei matrice
};
// constructor de initializare cu parametri
inline matrice::matrice(int i,int j)
{
m=i;
n=j;
mat=new int[m*n]; /*alocam memorie suficienta in zona HEAP
pentru pastrarea unui tablou m*n elemente intregi*/
}
/*supraincarcarea operatorului special 'apel de functie' pentru determinarea
unui element al matricei dintr-o anumita pozitie, pozitie data ca parametru*/
int* matrice::operator()(int i,int j)
{
return mat+i*n+j; // elementul de pe pozitia de linie i si coloana j a
unei matrice
}
// supraincarcarea operatorului 'extragere din flux' pentru citirea
elementelor unei matrice
istream& operator>>(istream& x,matrice& a)
{
for(int i=0;i<a.m;i++)
for(int j=0;j<a.n;j++)
{
cout<<"\telem["<<i+1<<"]["<<j+1<<"]= ";
x>>*a(i,j); // apel al operatorului '()' supraincarcat
}
return x;
}
// supraincarcarea operatorului 'insertie in flux' pentru afisarea
elementelor unei matrice
ostream& operator<<(ostream& x,matrice a)

{
for(int i=0;i<a.m;i++)
{
for(int j=0;j<a.n;j++)
x<<'\t'<<*a(i,j);
x<<endl;
}
return x;
}
// supraincarcarea operatorului '+' pentru adunarea a doua matrice
matrice operator+(matrice& a,matrice& b)
{
matrice c;
c.m=a.m; //sau, c.m=b.m;
c.n=a.n; //sau, c.n=b.n;
for(int i=0;i<c.m;i++)
for(int j=0;j<c.n;j++)
*c(i,j)=*a(i,j)+*b(i,j);
return c;
}
// supraincarcarea operatorului '-' pentru determinarea opusei unei matrice
matrice operator-(matrice& a)
{
matrice c;
c.m=a.m;
c.n=a.n;
for(int i=0;i<c.m;i++)
for(int j=0;j<c.n;j++)
*c(i,j)=-*a(i,j);
return c;
}
// supraincarcarea operatorului '-' pentru diferenta a doua matrice
matrice operator-(matrice& a,matrice& b)
{
return a+(-b);

}
// supraincarcarea operatorului '~' pentru transpusa unei matrice
matrice operator~(matrice& a)
{
matrice c;
c.m=a.m;
c.n=a.n;
for(int i=0;i<c.m;i++)
for(int j=0;j<c.n;j++)
*c(j,i)=*a(i,j);
return c;
}
void main()
{
int m,n; // m - nr de linii, n - nr de coloane
cout<<"Dati dimensiunea matricelor:\n";
cout<<"\tnumarul de linii: ";
cin>>m;
cout<<"\tnumarul de coloane: ";
cin>>n;
matrice a(m,n),b(m,n); // apel al constructorului de initializare cu
parametri
cout<<"Citim matricea A:\n";
cin>>a; // apel al functiei ce supraincarca operatorul '>>'
cout<<"Citim matricea B:\n";
cin>>b;
cout<<"Afisam matricea A:\n";
cout<<a; // apel al functiei ce supraincarca operatorul '<<'
cout<<"Afisam matricea B:\n";
cout<<b;
cout<<endl<<"Dati o tasta ptr. a continua..."<<endl;
getch();
cout<<"Afisam A+B:\n";

cout<<a+b; // apel al functiilor ce supraincarca operatorii '+' si


'<<'
matrice c(m,n);
c=(-a)-(~b); // apel al functiilor ce supraincarca operatorii 'unar', '- binar' si '~'
cout<<"Afisam expresia -A - ~B:\n";
cout<<c;
int k;
cin>>k;
}