
Incerc sa implementez cateva operatii pe matrici rare de numere complexe: suma, inmultire, determinant si inversa si am ajuns la un impas cu implementarea. Am decis sa fac o matrice-lista cu putinele elemente diferite de 0 legate intre ele. Am ceva dificultati la suma in privinta adunarii elementelor diferite de 0 cu cele egale cu 0, mai specific cele egale cu 0 fiindca nu sunt propriu-zis puse intr-o structura de matrice dupa cum o sa vedeti in cod. Ma gandeam sa introduc o constanta cu valoarea 0 in else-ul care l-am lasat gol si sa adun cu elementele din ambele matrici unde le intalnesc dar nu mi-am infasurat creierul in jurul ideiei inca si ma intrebam(de fapt va intreb) daca pot face ceva mai elegant fiindca presimt ca o sa imi dea ceva dureri de cap forma asta de implementare la determinant si inversa. Daca nu, ma gandeam sa fac precum Wile E Coyote si sa revin la plansa, in sensul ca o sa implementez o clasa de numere complexe, si o clasa de matrici rare cu o data matrice de tip numere complexe si plec de acolo. A si o alta intrebare...prima data cand am vrut sa fac functia membru SumaMatrici am vrut sa aiba doar 2 parametri si primul obiect care apeleaza functia sa fie cel modificat (am incercat cu pointerul this dar am aflat repede ca nu ma pot juca asa cum vreau cu el, imi dadea eroare -anchorism- si m-am prins repede ce faceam gresit, vroiam sa ii modific adresa


Code: Select all
#include<iostream>
using namespace std;
const short nMax = 6;
class MRare
{
int *valReal,*valImaginar,linie,coloana;
MRare *urm;
public:
MRare();
~MRare();
void CitesteMatrice(MRare*&);
void AfiseazaMatrice(MRare*);
short comparaPozitie(MRare*);
void SumaMatrici(MRare*&,MRare*,MRare*);
};
MRare::MRare()
{
valReal = new int; valImaginar = new int;
}
MRare::~MRare()
{ delete valReal; delete valImaginar;
}
short MRare::comparaPozitie(MRare* M)
{
short rez;
if(linie < M->linie) rez = -1;
if(linie == M->linie && coloana < M->coloana) rez = -1;
if(linie == M->linie && coloana == M->coloana) rez = 0;
if(linie > M->linie) rez = 1;
if(linie == M->linie && coloana > M->coloana) rez = 1;
return rez;
}
void MRare::CitesteMatrice(MRare*& M)
{int nr;
cout<<"Introduceti numaul de elemente diferite de 0 ";cin>>nr;cout<<"\n\n";
MRare *man ,*q;M = NULL;
for(int begin = 1; begin <= nr; begin++)
{
cout<<"Elementul "<<begin<<"\n\n";
cout<<"Introdu linia elementului: "; cin>>linie;cout<<"\n\n";
cout<<"Introdu coloana elementului: "; cin>>coloana;cout<<"\n\n";
if(linie>nMax || coloana>nMax || linie<1 || coloana<1)
{cout<<"Eroare de input! Reintrodu!\n"; continue;}
q = new MRare;
cout<<"Introdu valoarea reala a elementului: "; cin>>*valReal;cout<<"\n\n";
cout<<"Introdu valoarea imaginara a elementului: "; cin>>*valImaginar;cout<<"\n\n";
cout<<"Elementul de pe linia "<<linie<<"|coloana "<<coloana<<"= "<<*valReal<<"+i"<<*valImaginar;cout<<"\n\n";
q->linie = linie; q->coloana = coloana; *q->valReal = *valReal; *q->valImaginar = *valImaginar;
if(M == NULL) {q->urm = NULL; M = q;}
else
if((q->comparaPozitie(M))<0)
{
q->urm = M;
M = q;
}
else
{
man = M;
while(man->urm && man->comparaPozitie(q)<0)
man = man->urm;
if(man->urm)
{
q->urm = man->urm;
man->urm = q;
}
else
{
q->urm = NULL;
man->urm = q;
}
}
}
}
void MRare::AfiseazaMatrice(MRare* M)
{
int i,j,elem1,elem2;
for( i=1;i<=nMax;i++)
{
cout<<"\n";
for( j=1;j<=nMax;j++)
{
elem1 = 0; elem2 = 0;
if( M && i==M->linie && j==M->coloana)
{
elem1 = *M->valReal; elem2 = *M->valImaginar;
M = M->urm;
}
cout<<elem1<<"+i"<<elem2<<" ";
}
}
cout<<"\n";
}
void MRare::SumaMatrici(MRare*& R,MRare* M1,MRare* M2)
{MRare *prim1 = M1,*prim2,*q,*man; R = NULL;
for(;prim1!=NULL;prim1 = prim1->urm)
{
prim2 = M2;
while(prim2 != NULL)
{
if(prim1->comparaPozitie(prim2) == 0)
{
q = new MRare;
q->linie = prim1->linie; q->coloana = prim1->coloana;
*q->valReal =*prim1->valReal + *prim2->valReal;
*q->valImaginar =*prim1->valImaginar + *prim2->valImaginar;
if(R == NULL)
{
q->urm = NULL;
R = q;man = R;
}
else
{
q->urm = NULL;
man->urm = q;
man = man->urm;
}
}
else
{
.................................
}
prim2 = prim2->urm;
}
}
}
int main()
{
MRare *A,*B,*Rezultat; A = new MRare;B = new MRare;Rezultat = new MRare;
A->CitesteMatrice(A);
A->AfiseazaMatrice(A);
B->CitesteMatrice(B);
B->AfiseazaMatrice(B);
Rezultat->SumaMatrici(Rezultat,A,B);
Rezultat->AfiseazaMatrice(Rezultat);
system("pause");
}