Sunteți pe pagina 1din 6

Lucrarea 4 Programare orientat pe obiecte. Clase compuse Scopul lucrrii: Familiarizarea cu noiunile de clasa compus, lista de iniializare, pseudo-constructori.

Desfurarea lucrrii: Se vor scrie programe n cadrul crora se vor utiliza elementele principale ale compunerii claselor:

Clase compuse; Folosirea listei de iniializare n cadrul funciilor constructor ai unei clase compuse; Pseudo-constructori; Utilizarea modificatorilor de acces n cadrul claselor compuse.

Se vor utiliza paradigmele de abstractizare a datelor i compunere a claselor, aplicaiile avnd fiiere header pentru declararea claselor i fiiere surs pentru implementarea funciilor membre, precum i un fiier surs pentru testare. Se vor identifica i proiecta modulele corespunztoare pentru rezolvarea fiecrei aplicaii. Declararea i folosirea claselor compuse: Prin agregarea unor obiecte instaniate din clase deja construite, ntr-o clas nou se definete o clas compus. Exemplu: // fisierul header ce contine declaratiile claselor #include <iostream> #include <string> using namespace std; class CStudent { string nume; int nrMatricol; float medie; public: //prototipul functiei constructor implicit CStudent(); //prototipul functiei constructor general CStudent(string, int, float); // declaratia pentru functia membru de citire a datelor unui student void citireDateStudent(); // declaratia pentru functia membru de afisare a datelor unui student

void afisareDateStudent(); // functia modificator pentru campul nume void setNume(string name) { nume = name; } // functia modificator pentru campul nrMatricol void setNrMatricol(int nrMatricol) { this->nrMatricol = nrMatricol; } // functia modificator pentru campul medie void setMedie(float m) { this->medie = m; } // functia accesor pentru campul medie float getMedie() { return medie; } }; // clasa compusa CGrupa ce contine un tablou de obiecte de tip CStudent class CGrupa { private: CStudent *studenti; int nrStudenti; public: // implementarea inline a functiei constructor cu parametrii CGrupa(int n){ // intializarea numarului de studenti nrStudenti = n; // alocarea memoriei pentru n obiecte de tip CStudent studenti = new CStudent[n]; // initializarea datelor celor n studenti la valori implicite for(int i = 0; i < n;i++){ studenti[i].setNume(" "); studenti[i].setNrMatricol(i); studenti[i].setMedie(0.0); } } // functia destructor ~CGrupa() {

// dealocarea memoriei pentru cei nrStudenti studenti delete [nrStudenti]studenti; cout<<"apel destructor clasa CGrupa"<<endl; } // declaratia functiei membru pentru citirea datelor studentilor din grupa void citireStudenti(); // declaratia functiei membru pentru ordonarea studentilor din grupa dupa medie void ordonareStudenti(); // declaratie functia membru pentru afisarea studentilor din grupa void afisareStudenti(); }; // fisierul sursa pentru implementarea metodelor claselor #include "test.h" //functia constructor implicit CStudent::CStudent(){ nume = " "; nrMatricol = 0; medie = 0.0; } //functia constructor general CStudent::CStudent(string nume, int nrMatricol, float medie){ this->nume = nume; this->nrMatricol = nrMatricol; this->medie = medie; } // functia membru pentru citire a datelor unui student void CStudent::citireDateStudent(){ cout<<"nume : "; cin>>nume; cout<<"nrMatricol : "; cin>>nrMatricol; cout<<"medie : "; cin>>medie; } // functia membru pentru afisare a datelor unui student void CStudent::afisareDateStudent(){

cout<<"nume : "<< nume <<endl; cout<<"nrMatricol : "<< nrMatricol <<endl; cout<<"medie : "<< medie <<endl; } // functiei membru pentru citirea datelor studentilor din grupa void CGrupa::citireStudenti(){ for(int i = 0; i < nrStudenti;i++) studenti[i].citireDateStudent(); } // functiei membru pentru ordonarea studentilor din grupa dupa medie void CGrupa::ordonareStudenti(){ bool ok = true; CStudent temp; while(ok){ ok = false; for(int i = 0; i < nrStudenti - 1;i++) if(studenti[i].getMedie() < studenti[i+1].getMedie()){ temp = studenti[i]; studenti[i] = studenti[i+1]; studenti[i+1] = temp; ok = true; } } } // functia membru pentru afisarea studentilor din grupa void CGrupa::afisareStudenti(){ cout<<"Grupa de studenti"<<endl; for(int i = 0; i < nrStudenti;i++) studenti[i].afisareDateStudent(); cout<<endl; } // fisierul sursa pentru testarea clasei compuse CGrupa #include "test.h" int main(){ CGrupa cr1020x(3); //apelul functiei pentru citirea datelor studentilor din grupa cr1020x cr1020x.citireStudenti();

//apelul functiei pentru afisarea studentilor neordonati dupa medie cr1020x.afisareStudenti(); //apelul functiei pentru odornarea descrescatoare a studentilor dupa medie cr1020x.ordonareStudenti(); //apelul functiei pentru citirea studentilor ordonati dupa medie cr1020x.afisareStudenti(); return 0; } Exemplu de utilizare a listei de iniializare n cadrul funciilor constructor ai unei clase compuse: class A{ int i; char c; public: //constructorul general A(int i1, char c1): i(i1), c(c1) // lista de intializare ce contine apelul pseudo-constructorilor tipurilor de baza int, respectiv // char {} }; //clasa compusa B class B{ A a; int b; public: //constructorul general B(int i,char c): a(i,c), b(10) // lista de intializare ce contine instantirea obiectului a din clasa A // si apelul pseudoconstructorului pentru variabila b de tip int {} }; n cadrul unei clase compuse pot fi accesai pentru obiectele componente numai membrii de tip public. Pentru a accesa i membrii de tip private putem utiliza doua metode:

1. Implementarea in cadrul claselor de functii accesor/modificator publice (ca in cazul clasei CStudent din exemplul de mai sus); 2. Declararea clasei compuse ca i clasa prieten claselor componente. Teme propuse: 1. Sa se modifice problema 4 (laboratorul 3) prin crearea unei noi clase asociata masinii Loto. Sa se implementeze o noua clasa Agentie Loto pentru activitatea de inregistrare a biletelor de joc. Pentru fiecare bilet se vor genera aleator 3 vectori cu 6 bile fiecare. Dupa simularea desfasurarii unei extrageri Loto se va verifica daca exista un bilet castigator in cadrul unei agentii Loto. 2. Sa se modifice problema 6 (laboratorul 3), utilizand clasa ISBN din problema 5 (laboratorul 3) in cadrul clasei cartilor. 3. Sa se modifice problema 6 (laboratorul 3), prin crearea unei clase suplimentare asociata bibliotecii. Se va valida unicitatea ISBN-urilor corespunzatoare cartilor bibliotecii. 4. Sa se modifice problema 7 (laboratorul 3) prin crearea unei noi clase asociata unei activitati dintr-o saptamana. O activitate consta dintr-un sir de caractere reprezentand numele activitatii, precum si din data calendaristica a acesteia. 5. Sa se modifice problema 7 (laboratorul 3) prin crearea unei noi clase reprezentand agenda electronica. 6. Sa se modifice problema 1 (laboratorul 3) prin crearea unei noi clase asociate alegerii sefului de tribut de catre membrii tribului. Fiecare din cei 6 candidati are asociata o fata a zarului. Numarul de membrii din cadrul tribului cu drept de vot este cunoscut, precum si numarul de voturi admis pentru fiecare membru. Sa se simuleze o runda de alegeri. In cazul in care nici un candidat nu va obtine jumatate plus 1 din numarul de voturi se va organiza un tur 2; in runda urmatoare vor avea access candidatii de pe primele doua pozitii. 7. Sa se modifice problema 3 (laboratorul 3) prin crearea unei noi clase asociate jocului de carti 21 (Blackjack sau Twenty-one sau Vingtet-un). Numarul jucatori este variabil si de asemenea numarul pachetelor de carti care poate fi 1, 2 sau 3.

S-ar putea să vă placă și