Documente Academic
Documente Profesional
Documente Cultură
Laboratoul-3 Raileanu Emanoel CR221FR
Laboratoul-3 Raileanu Emanoel CR221FR
Laboratoul-3 Raileanu Emanoel CR221FR
MOLDOVA
RAPORT
Lucrare de laborator nr 3
la cursul „Programarea Orientată pe Obiecte”
Tema: Moştenirea şi compoziţia
Varianta 19
Chișinău 2024
Scopul lucrării:
studierea moştenirii, avantajele şi dezavantajele
studierea compoziţiei
studierea regulilor de definire a moştenirii şi compoziţiei
studierea formelor de moştenire
studierea iniţializatorilor
principiul de substituţie Barak
moştenire şi compoziţie
а) Să se creeze clasa student, care are un nume, specialitate, anul de învăţământ şi balul mediu.
Determinaţi funcţia de definire, schimbare a datelor şi de comparare. Pentru setarea câmpurilor
textuale să se folosească operatorul new. Determinaţi constructorii, destructorul şi alte funcţii
necesare. Creaţi clasa derivată student-diplomant, pentru care este definită tema de diplomă. De
asemenea, este necesar de definit toate funcţiile necesare.
b) Să se creeze clasa camera, care conţine suprafaţă. Determinaţi constructorii şi metodele de
acces. Creaţi clasa apartament cu o odaie, care conţine o odaie şi o bucătarie (suprafaţa ei), etajul
(camera este în clasa apartament cu o odaie). Determinaţi constructorii, metodele de acces.
Definiţi clasa derivată a apartamentelor cu o odaie cu adresă (un câmp adăugător - adresa).
Determinaţi constructorii, destructorul şi fluxul de ieşire.
2
Listingul programului ( sarcina a)
#include <iostream>
#include <cstring>
class Student {
private:
char* nume;
char* facultate;
int an;
float nota_medie;
public:
// Constructor
Student(const char* _nume, const char* _facultate, int _an, float
_nota_medie)
: an(_an), nota_medie(_nota_medie) {
nume = new char[strlen(_nume) + 1];
strcpy(nume, _nume);
// Destructor
~Student() {
delete[] nume;
delete[] facultate;
}
void changeData(const char* _nume, const char* _facultate, int _an, float
_nota_medie) {
char* new_nume = new char[strlen(_nume) + 1];
char* new_facultate = new char[strlen(_facultate) + 1];
strcpy(new_nume, _nume);
strcpy(new_facultate, _facultate);
delete[] nume;
delete[] facultate;
nume = new_nume;
facultate = new_facultate;
an = _an;
nota_medie = _nota_medie;
}
3
// Functia de comparare a notelor medie
bool comparareNote(const Student& other) const {
return nota_medie > other.nota_medie;
}
const char* getName() const {
return nume;
}
public:
// Constructor
StudentDiploma(const char* _nume, const char* _facultate, int _an, float
_nota_medie, const char* _lucrareTeza)
: Student(_nume, _facultate, _an, _nota_medie) {
lucrareTeza = new char[strlen(_lucrareTeza) + 1];
strcpy(lucrareTeza, _lucrareTeza);
}
// Destructor
~StudentDiploma() {
delete[] lucrareTeza;
}
//Schimbare lucrare de diploma
void changeDiploma(const char* newThesis) {
delete[] lucrareTeza;
lucrareTeza = new char[strlen(newThesis) + 1];
strcpy(lucrareTeza, newThesis);
}
4
// Functia de afisat pe display
void afisareDisplay() const {
display();
std::cout << "Lucrarea de Teza: " << lucrareTeza << std::endl;
}
};
int main() {
// Crearea obiect student
StudentDiploma student1("Ion Rusu", "Tehnologii Informatonale", 2023, 9.5,
"Machine Learning \n");
StudentDiploma student2("Barak Obama", "Calculatoare si Retele", 2023, 9.7,
"Tehnologii Network GEN 6 \n");
5
Rezultatul compilarii (sarcina a)
Concluzie (sarcina a)
În programul dat a fost creat clasa de bază Student, care are ca membri, Numele, Facultatea ,
Anul de absolvire și Nota medie. Sunt scrise câteva metode pentru lucru cu aceste date , cum
ar fi schimbarea datelor pentru un obiect, in cazul de față pentru un student, compararea notei
medii dintre doi studenti și afisarea pe ecran a tuturor datelo despre un student. Pentru a mări
funcționalul , se creaza a doua clasa care este o derivata de la prima, care ne permite de adăugat
și tema lucrării de diplomă.
Acest program ilustrează conceptul de moștenire în POO. Moștenirea face parte din fundamentul
conceptului de Programare Orientată pe Obiecte. Aceasta permite crearea de ierarhii de clase
astfel încât clasele „copii” să poată moștenii proprietățile clasei „părinte”.
Beneficiile moștenirii sunt : Reutilizarea codului - Crearea unei clase noi pe baza clasei
existente, astfel ca să fie posibil de utilizat deja codul scris. În acest program clasa
StudentDiploma moștenește comportamentul clasei de bază Student . Extinderea- putem
extinde funcționalul unei clase de baze fără a modifica codul existent. În acest caz crearea clasei
derivate StudentDiplomă ne dă posibilitatea să adăugam detalii suplimentare obiectelor.
6
Listingul programului (sarcina b)
#include <iostream>
#include <string>
public:
// Constructori
Camera(): suprafata(0) {} // Constructor implicit
Camera(int s): suprafata(s) {} // Constructor cu un parametru
// Destructor
~Camera() {}
7
// Definirea clasei ApartamentCuOdaie pentru reprezentarea unui apartament cu o
odaie și o bucătărie
class ApartamentCuOdaie {
private:
Camera odaie; // Camera pentru odaie
Camera bucatarie; // Camera pentru bucătărie
int etaj; // Etajul apartamentului
std::string adresa; // Adresa apartamentului
public:
// Constructori
ApartamentCuOdaie(): etaj(0), adresa("----") {} // Constructor implicit
ApartamentCuOdaie(int o, int b, int et, const std::string& adr)
: odaie(o), bucatarie(b), etaj(et), adresa(adr) {} // Constructor cu
parametri
// Destructor
~ApartamentCuOdaie() {}
8
// Crearea unui vector de apartamente
ApartamentCuOdaie* tab = new ApartamentCuOdaie[n];
if (tab == nullptr) { // Verificarea alocării corecte a memoriei
std::cout << "Memorie insuficienta!" << std::endl;
return 1;
}
// Citirea și afișarea datelor pentru fiecare apartament
for (int i = 0; i < n; ++i) {
std::cout << "Apartamenul Nr. " << i+1 << std::endl;
std::cin >> tab[i];
}
// Afișarea datelor pentru fiecare apartament
for (int i = 0; i < n; ++i) {
std::cout << "Apartamenul Nr. " << i+1 << std::endl;
std::cout << tab[i] << std::endl;
}
// Eliberarea memoriei alocate pentru vectorul de apartamente
delete[] tab;
return 0;
}
9
Concluzie (sarcina b)
În programul de față sunt create două clase, clasa Camera și clasa ApartamentCuOdaie . Clasa
ApartamentCuOdaie utilizează compoziția pentru a include obiecte de tip cameră pentru a
reprezenta odaia și bucătăria. Pentru a înțelege cand se folosește compoziția , este nevoie de a
raspunde la întrebarea „este în?”, și da , camera face parte din apartament, sau mai bine zis ,
apartamentul este compus din camere. Acest program permite introducerea unui număr n de
apartamente, numărul n fiind citit de la tastatură, pentru fiecare apartament, se introduce
suprafața fiecarei camere din apartament, a odăii și a bucătăriei. Pentru a accesa membrii clasei
Camera, folosim metoda de incapsulare set și get.
Clasele compuse permit organizarea logică a codului și permit ca clasele mai complexe sa fie
divizate în componente mai mici care ar fi mai ușor de gestionat. De exemplu, am putea ca la
acest cod sa adaugam pe langa clasa Camera și clasa Servicii unde va fi gestionat toate
serviciile de care dispune apartamentul ( internet, curent electric, IPTV, etc.). Clasa Locatari, și
altele.
10