C++: Constructori si Destructori - aplicatii rezolvate
1) Sa se defineasca o clasa (un tip abstract de date) pentru memorarea i lucrul cu
numere complexe, care sa aiba: - date membru: elemente necesare pentru memorarea partii reale i a celei imaginare a unui numar complex; - functii membru pentru memorarea datelor ntr -un numar complex, calculul modulului, afiarea unui numar complex i suma, respectiv, produsul ntre doua numere complexe. Se cere existenta unui constructor explicit de initializare i al unuia de copiere (transfer de date). (rezolvare...)
2) Sa se implementeze operatiile pe o stiva statica. Pentru aceasta vom declara o clasa SStiva i metode pentru fiecare operatie : def inirea clasei, implementarea metodelor definite, folosirea clasei SStiva (rezolvare...)
Rezolvari 1) Sa se defineasca o clasa (un tip abstract de date) pentru memorarea i lucrul cu numere complexe, care sa aiba: - date membru: elemente necesare pentru memorarea partii reale i a celei imaginare a unui numar complex; - functii membru pentru memorarea datelor ntr -un numar complex, calculul modulului, afiarea unui numar complex i suma, respectiv, produsul ntre doua numere complexe. Se cere existenta unui constructor explicit de initializare i al unuia de copiere (transfer de date). #include <iostream> #include <fstream> #include <math.h> using namespace std;
class complex { float a,b; //a - partea reala, b - partea imaginara public: void atribuire(float=0,float=0); void citire(); float& retre(); float& retim(); complex(float,float); complex(){} complex(complex&); void afisare(char*); float modul();
//SUMAREA A DOUA NUMERE COMPLEXE PRIN MAI MULTE VARIANTE //1. cu transmitere prin tipul rezultat complex suma1(complex); /*un nr. complex este cel transmis prin obiectul curent, al doilea nr. complex este cel transmis prin parametru*/
//2. cu transmitere prin linia de parametri - transfer prin adresa void suma2(complex,complex*);
/*3. cu transmitere prin linia de parametri - transfer prin referinta*/ void suma3(complex,complex&);
//PRODUSUL A DOUA NUMERE COMPLEXE complex produs(complex); };
float complex::modul() { return sqrt(pow(a,2)+pow(b,2)); } /*se va realiza sumarea intre nr. complex reprezentat prin obiectul curent, cel care va apela functia, si nr. complex transmis prin obiectul cu numele "z" din linia de parametri*/
void main() { /*1.vom introduce date intr-un numar complex folosind functia de atribuire*/ complex z1; /*apel al constrctorului de initializare fara parametri si fara corp definit*/
int a,b; /*a nu se face confuzie: a si b de aici nu sunt cele din clasa, ptr ca acela fiind protejate nu putem avea acces la ele din afara clasei*/
//2.vom introduce date intr-un numar complex prin citirea acestuia complex z2; cout<<"Citim un numar complex.\n"; z2.citire();
//3.introducere directa a valorilor partii reale, respectiv, imaginare complex z3; cout<<"Introducem direct pe partea reala si imaginara, date.\n"; cout<<"\tpartea reala: "; cin>>z3.retre(); int c; cout<<"\tpartea imaginara: "; cin>>c; z3.retim()=c; /*acest transfer este posibil datorita faptului ca functia intoarce o referinta*/
/*4.introducere date in nr. complex prin intermediul constructorului de initializare cu parametri.*/ cout<<"Am introdus date direct printr-un constructor de initializare.\n"; complex z4(3,-2); /*valorile se pot da direct, sau, citite in prealabil*/
//afisam nr. complexe z1.afisare("z1"); z2.afisare("z2"); z3.afisare("z3"); z4.afisare("z4");
//SUMA A DOUA NR. COMPLEXE complex s; //putem apela oricare din cele 3 functii de calcul a sumei z1.suma3(z2,s); //s=z1+z2 s.afisare("z1+z2");
//PRODUSUL A DOUA NR. COMPLEXE complex p; p=z1.produs(z2); //p=z1*z2 p.afisare("z1*z2");
int g; cin >>g; }
2) Sa se implementeze operatiile pe o stiva statica. Pentru aceasta vom declara o clasa SStiva i metode pentru fiecare operatie : definirea clasei, implementarea metodelor definite, folosirea clasei SStiva. #include <iostream> #include <fstream> #include <math.h> #define dim 20 using namespace std; class Sstiva { int s[dim]; int vf; //varful stivei public: Sstiva(); ~Sstiva(); void Push(int e); //introduce elementul e in stiva int Pop(); //extrage un element din stiva. Se aplica tehnica LIFO int Lungime() //returneaza marimea stivei { return vf; } int Elem(int index); //returneaza elementul de pe un anumit index void Afisare(); }; Sstiva::Sstiva(void) { vf=0; cout<<"Stiva initializata."<<endl; } Sstiva::~Sstiva(void) { if(vf==0) cout<<"Stiva distrusa."<<endl; } void Sstiva::Push(int e) { if(vf==dim) { cout<<"Stiva este plina."<<endl; return; //se face iesire fortata din functie } s[vf]=e; vf++; } int Sstiva::Pop(void) { if(vf==0) { cout<<"Stiva depasita"<<endl; return 0; } vf--; return s[vf]; } int Sstiva::Elem(int index) { return s[index-1]; } void Sstiva::Afisare() { if(vf) { for(int i=0;i<vf;i++) cout<<s[i]<<" "; cout<<endl; return; } } void main() { Sstiva ob; int e; //variabila care retine variabilele introduse in stiva do { cout<<"Dati elementul (-1=scoate, 0=stop): "; cin>>e; if(e) if(e!=(-1)) { ob.Push(e); ob.Afisare(); cout<<"Dimensiunea stivei este: "<<ob.Lungime()<<endl; } else { ob.Pop(); ob.~Sstiva(); ob.Afisare(); } } while(e);