///////////////////////////////////////////////////////////////// // // // TENPLATE MATRICE // // // // Serban Alexandru-Claudiu Grupa 1067 // // // ///////////////////////////////////////////////////////////////// #include #include #include #include #include #include template class Matrice { public: int m, n; T **a; Matrice(int,int); Matrice(); Matrice(char*); ~Matrice(); Matrice unu(); Matrice zero(); Matrice transpusa(); Matrice operator+(Matrice b); Matrice operator-(Matrice b); Matrice operator*(float nr); Matrice operator*(Matrice b); Matrice operator/(float nr); Matrice operator/(Matrice b); T * operator[](int); Matrice inversa(); operator double(); float * sol_sistem(int *); void scrie_fis(); Matrice(Matrice &b) { m=b.m; n=b.n; a=(T **)malloc(m*sizeof(T *)); for(int i=0; i b) { for(int i=0; i>(istream &intrare, Matrice &b) { cout<<"\n m="; intrare>>b.m; cout<<" n="; intrare>>b.n; cout<<"\n"; for(int i=0; i void Matrice::scrie_fis() { FILE *f; int i,j; f=fopen("mat.cla","w+"); fwrite(&m,sizeof(int),1,f); T k; for(i=0;i Matrice::~Matrice() { for(int i=0; i Matrice Matrice::unu() { int i,j; if(m!=n) { cout<<"\n Matricea nu este patratica!"; } else { for(i=0; i Matrice Matrice::zero() { int i,j; for(i=0; i Matrice Matrice::transpusa() { Matrice b(n,m); b.m=n; b.n=m; for(int i=0; i Matrice Matrice::operator*(Matrice b) { int i,j,k; T atemp,btemp,ctemp; if(n!=b.m) { cout<<"\n Dimensiunile matricelor sunt incorecte!!"; cout<<"\n Matricele nu se pot inmulti!!"; Matrice d(1,0); return d; } else { Matrice c(m,b.n); for(i=0; i Matrice Matrice::operator*(float nr) { Matrice c(m,n); c.m=m; c.n=n; for(int i=0; i Matrice Matrice::operator+(Matrice b) { int i,j; if((m!=b.m)||(n!=b.n)) { printf("\n Matricile au dimensiuni diferite!!"); printf("\n Adunarea nu se poate efectua!!"); Matrice d(1,0); return d; } else { Matrice c(m,n); c.m=m; c.n=n; for(i=0; i Matrice Matrice::operator-(Matrice b) { int i,j; if((m!=b.m)||(n!=b.n)) { printf("\n Matricile au dimensiuni diferite!!"); printf("\n Scaderea nu se poate efectua!"); Matrice d(1,0); return d; } else { Matrice c(m,n); c.m=m; c.n=n; for(i=0; i Matrice Matrice::operator/(float nr) { int i,j; Matrice c(m,n); c.m=m; c.n=n; for(i=0; i Matrice Matrice::operator/(Matrice b) { int i,j,k; float atemp,btemp,ctemp; if((m!=b.m)||(n!=b.n)) { printf("\n Matricele nu au aceleasi dimensiuni!!"); printf("\n Impartirea nu se poate efectua!!"); Matrice d(1,0); return d; } else { int m_inv=b.inversa().m; int n_inv=b.inversa().n; Matrice inv(m_inv,n_inv); if((inv.m==1)&&(inv.n==0)) { printf("\n Impartirea nu se poate efectua!!"); Matrice e(1,0); return e; } else { Matrice c(b.m,b.n); // cout<<"\n INV B\n"< Matrice Matrice::inversa() { //cod=1 - exista inversa //cod=2 - nu exista inversa float eps, btemp, atemp, amax, mod, c; int i,j,k,imax,vb=0,cod=1; Matrice b(m,m); b.unu(); Matrice ca(m,m); for(i=0; iamax) { amax=mod; imax=i; } } if(imax!=k) for(j=0; jn-1) { cod=1; vb=1; } } } while(vb==0); } if (cod==2) { printf("\n Nu exista inversa!"); Matrice d(1,0); return d; } else return b; } /////////////////////////////////////////////////////////////////////////////////// template Matrice::operator double() { float eps; double det; float amax, atemp, c; int i,j,k,imax,vb=0,cod=1; if(m!=n) { printf("\n Matricea nu este patratica!!"); printf("\n Nu exista determinantul!!"); return 0xfffffff; } else { Matrice ca(m,n); for(i=0; iamax) { amax=c; imax=i; } } if(imax!=k) { det=-det; for(j=0; jn-1) { cod=1; vb=1; } } } while(vb==0); } if(cod==2) { printf("\n Det se aprox nul!!"); return det=0; } if(cod==1) return det; } /////////////////////////////////////////////////////////////////////////////////// template float * Matrice::sol_sistem(int * cod) { // cod=1: s-a obtinut solutia // cod=2: solutia nu este unica // cod=3: matricea nu este patratica float eps, atemp, amax, c; float *x; int i, j, k, imax, vb; Matrice a1(m,n+1); x=(float *)malloc(m*sizeof(float)); printf("\n Introduceti termenii liberi:\n"); for(i=0; i a; printf("\n Introduceti a doua matrice:"); Matrice b; cout<<"\n Elementul a[0][0] din prima matrice este: "<>nr_int; cout<<"\n Produsul primei matrice cu numarul "< c("mat.cla"); getch(); printf("\n Afisez matricea c citita din fisier:\n"); cout< a1; printf("\n Introduceti a doua matrice:"); Matrice b1; cout<<"\n Elementul a[0][0] din prima matrice este: "<>nr_float; cout<<"\n Produsul primei matrice cu numarul "< c1("mat.cla"); getch(); printf("\n Afisez matricea c citita din fisier:\n"); cout<