Laboratoul-3 Raileanu Emanoel CR221FR

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

Sunteți pe pagina 1din 10

MINISTERUL EDUCAȚIEI ȘI CERCETĂRII AL REPUBLICII

MOLDOVA

Universitatea Tehnică a Moldovei


Facultatea Calculatoare, Informatică şi Microelectronică
Departamentul Informatică şi Ingineria Sistemelor

RAPORT
Lucrare de laborator nr 3
la cursul „Programarea Orientată pe Obiecte”
Tema: Moştenirea şi compoziţia
Varianta 19

A efectuat : St. gr. CR-221FR


A verificat: Asis.univ.

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

Sarcina de lucru conform variantei

а) 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);

facultate = new char[strlen(_facultate) + 1];


strcpy(facultate, _facultate);
}

// 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;
}

const float getNota_Medie() const {


return nota_medie;
}

// Afisarea pe ecran a datelor


void display() const {
std::cout << "Nume: " << nume << std::endl;
std::cout << "Facultate: " << facultate << std::endl;
std::cout << "Anul de absolvire: " << an << std::endl;
std::cout << "Nota medie: " << nota_medie << std::endl;
}
};

class StudentDiploma : public Student {


private:
char* lucrareTeza;

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");

// Afisare pe ecran a obiectului student


student1.afisareDisplay();
student2.afisareDisplay();

// Schimbam datele a obiectului student1


student1.changeData("Alexei Mamaliga","Tehnologiile Comunicatiei",2022,9.8);
student1.changeDiploma("Tehnologii 6G \n");
student1.afisareDisplay();

//Compararea notelor medii a obiectului 1 si 2


if (student1.comparareNote(student2)){
std::cout<< "Studentul "<<student1.getName()<<" are o medie mai mare ca
studentul "<<student2.getName()<<" cu "<<student1.getNota_Medie()-
student2.getNota_Medie()<<std::endl;
} else{
std::cout<< "Studentul "<<student2.getName()<<" are o medie mai mare ca
studentul "<<student1.getName()<<" cu "<<student2.getNota_Medie()-
student1.getNota_Medie()<<std::endl;
}
return 0;
}

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>

// Definirea clasei Camera pentru reprezentarea unei camere


class Camera {
private:
int suprafata; // Suprafața camerei în metri pătrați

public:
// Constructori
Camera(): suprafata(0) {} // Constructor implicit
Camera(int s): suprafata(s) {} // Constructor cu un parametru

// Destructor
~Camera() {}

// Metode pentru accesarea și modificarea suprafeței camerei


int getSuprafata() const {
return suprafata;
}
void setSuprafata(int s) {
suprafata = s;
}

// Supraincarcarea operatorilor de citire și afișare


friend std::istream& operator>>(std::istream& in, Camera& obj) {
// Citirea suprafeței camerei de la intrare
in >> obj.suprafata;
return in;
}

friend std::ostream& operator<<(std::ostream& out, const Camera& obj) {


// Afișarea suprafeței camerei
out << obj.suprafata << " m2";
return out;
}

// Supraincarcarea operatorului de atribuire


Camera& operator=(const Camera& obj) {
// Verificarea auto-atribuirii și actualizarea suprafeței camerei
if (this != &obj) {
suprafata = obj.suprafata;
}
return *this;
}
};

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() {}

// Supraincarcarea operatorilor de citire și afișare


friend std::istream& operator>>(std::istream& in, ApartamentCuOdaie& obj) {
// Citirea datelor apartamentului de la intrare
std::cout << "Introdu suprafata odaiei= ";
in >> obj.odaie;
std::cout << "Introdu suprafata bucatariei= ";
in >> obj.bucatarie;
std::cout << "Introdu Etajul= ";
in >> obj.etaj;
std::cout << "Introdu Adresa= ";
std::getline(in >> std::ws, obj.adresa); // Citeste linia intreaga,
inclusiv spatii
return in;
}

friend std::ostream& operator<<(std::ostream& out, const ApartamentCuOdaie&


obj) {
// Afișarea datelor apartamentului
out << "Suprafata odaiei= " << obj.odaie << std::endl;
out << "Suprafata bucatariei= " << obj.bucatarie << std::endl;
out << "Etajul: " << obj.etaj << std::endl;
out << "Adresa: " << obj.adresa;
return out;
}
};

// Funcția principală a programului


int main() {
int n; // Numărul de apartamente introduse de utilizator
std::cout << "Introdu un numar N de apartamente: ";
std::cin >> n;

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;
}

Rezultatul compilării (sarcina b)

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.

Conceptul de compoziție este fundamental pentru a înțelege gestionarea și proiectarea claselor în


Programarea Orientată pe Obiecte.

10

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