Sunteți pe pagina 1din 14

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei

Catedra ISA

RAPORT
Lucrarea de laborator nr.4
la Programarea Orientată pe Obiecte

A efectuat:
st. gr. AI-161 S. Chiu

A verificat:
Lector univ. M. Oșovschi

Chişinău 2017
Lucrarea de laborator nr.4

Tema: Moștenirea și compoziția

Scopul lucrării: familiarizarea studenților cu noțiunile:


 Moștenirea, avantaje și dezavantaje;
 Compoziția;
 Reguli de definire a moștenirii și compoziției;
 Formele de moștenire;
 Inițializatori;
 Principiul de substituție;
 Moștenirea și compoziția – ce alegem.

Condiţia problemei (sarcina de lucru):


Varianta 2:
Să se scrie un program pentru implementarea:
a) Clasei Student, care are un nume, specialitate, anul de învățământ și balul
mediu. Determinați funcția de definire, schimbare a datelor și comparare. Pentru
sarcina câmpurilor textuale se folosește operatorul new. Determinați constructorul,
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) Clasei Camera, care conține suprafață. Determinați constructorii și metodele
de acces. Creați clasa Apartamente_cu_o_odaie, care conține o odaie și o bucătărie
(suprafața ei), etajul (camera este în clasa apartament cu o odaie). Determinați
constructorii, metodele de acces. Determinați clasa derivată Apartamente cu o
odaie cu adresă (un câmp adăugător – adresa). Determinați constructorii,
destructorii și fluxul de ieșire.

Codul (textul) programului în limbajul C++:


#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
typedef unsigned int us;
class Student
{
protected:
char nume[20];
char specialitate[20];
us anul;
float nmed;
public:
Student()
2
{
strcpy(nume, "unknown");
strcpy(specialitate, "unknown");
anul = 0;
nmed = 5;
}
Student(char *nume, char *specialitate, us anul, float nmed)
{
strcpy(this->nume, nume);
strcpy(this->specialitate, specialitate);
this->anul = anul;
this->nmed = nmed;
}
void init_Student(char *nume, char *specialitate, us anul, float nmed)
{
cout<<"Dati datele despre Student: ";
cout<<"\nDati numele Studentului: ";
cin>>nume;
cout<<"\nDati specialitatea Studentului: ";
cin>>specialitate;
cout<<"\nDati anul de studii: ";
cin>>anul;
cout<<"\nDati nota medie: ";
cin>>nmed;
}
void change_Student()
{
cout<<"Dati datele de schimbat despre Student: "<<endl;
cout<<"\nDati numele Studentului: ";
cin>>nume;
cout<<"\nDati specialitatea Studentului: ";
cin>>specialitate;
cout<<"\nDati anul de studii: ";
cin>>anul;
cout<<"\nDati nota medie: ";
cin>>nmed;
}
void set_NumeS(char *nume)
{
strcpy(this->nume, nume);
}
void set_SpecS(char *specialitate)
{
strcpy(this->specialitate, specialitate);
}
3
void set_AnS(us anul)
{
this->anul = anul;
}
void set_NmedS(float nmed)
{
this->nmed = nmed;
}
us compare_nmedS(Student ob1, Student ob2)
{
if (ob1.nmed>ob2.nmed)
return 1;
else
return 0;
}
void show_Student()
{
cout<<"Info despre Student:"<<endl;
cout<<"Nume: "<<nume<<"\nSpecialitate: "<<specialitate<<"\nAnul:
"<<anul<<"\nNota medie: "<<nmed<<endl;
}
void compare_Student(Student op2)
{
if (nmed>op2.nmed)
cout<<"Studentul: "<<nume<<" este mai exemplar decat
Studentul:"<<op2.nume<<"!"<<endl;
else cout<<"Studentul: "<<op2.nume<<" este mai exemplar decat
Studentul:"<<nume<<"!"<<endl;
}
~Student(){cout<<"Datele studentului: "<<nume<<" au fost
sterse."<<endl;}
};

class Student_Diplomant:public Student


{
protected:
char tema_diploma[30];
public:
Student_Diplomant()
{
strcpy(this->tema_diploma, "-");
}
Student_Diplomant(char *nume, char *specialitate, us anul, float nmed,
char *tema_diploma):Student(nume, specialitate, anul, nmed)
{
4
strcpy(this->tema_diploma, tema_diploma);
}
void change_StudentD()
{
char numele[20], specialit[30];
us an;
float nmedie;
cout<<"Dati datele de schimbat despre Studentul diplomant: "<<endl;
cout<<"\nDati numele Studentului: ";
cin>>numele;
set_NumeS(numele);
cout<<"\nDati specialitatea Studentului: ";
fflush(stdin);
gets(specialit);
set_SpecS(specialit);
cout<<"\nDati anul de studii: ";
cin>>an;
set_AnS(an);
cout<<"\nDati nota medie: ";
cin>>nmedie;
set_NmedS(nmedie);
cout<<"\nDati tema de diploma: ";
fflush(stdin);
gets(this->tema_diploma);
}
void set_TemaDSD(char *tema_diploma)
{
strcpy(this->tema_diploma, tema_diploma);
}
void show_SD()
{
cout<<"Info despre Student Diplomant:"<<endl;
cout<<"Nume: "<<nume<<"\nSpecialitate: "<<specialitate<<"\nAnul:
"<<anul<<"\nNota medie: "<<nmed<<"\nTema de diploma:
"<<tema_diploma<<endl;
}
~Student_Diplomant(){cout<<"Datele Studentului Diplomant:
"<<nume<<" au fost sterse."<<endl;}
};//end class Student_Diplomant

class Camera
{
protected:
float suprafata;//m^2
public:
5
Camera()
{
suprafata = 25;
}
Camera(float suprafata)
{
this->suprafata = suprafata;
}
Camera (Camera &ob2)
{
suprafata = ob2.suprafata;
}
void show_Camera()
{
cout<<"Suprafata Camerei:(m^2) "<<suprafata<<endl;
}
float get_suprafata_Camera()
{
return suprafata;
}
void set_suprafata_Camera(float suprafata)
{
this->suprafata = suprafata;
}
~Camera()
{
cout<<"S-au sters datele despre suprafata camerei!"<<endl;
}
};//end class Camera

class Apartament_cu_o_odaie
{
protected:
Camera odaie;
Camera bucatarie;
us etaj;
public:
Apartament_cu_o_odaie()
{
odaie.set_suprafata_Camera(30);
bucatarie.set_suprafata_Camera(20);
etaj = 1;
cout<<"Constructor prestabilit (Apartament_cu_o_odaie)."<<endl;
}

6
Apartament_cu_o_odaie(float suprafata_odaie, float suprafata_bucatarie, us
etaj)
{
odaie.set_suprafata_Camera(suprafata_odaie);
bucatarie.set_suprafata_Camera(suprafata_bucatarie);
this->etaj = etaj;
}
Apartament_cu_o_odaie(Apartament_cu_o_odaie &ob2)
{
odaie.set_suprafata_Camera(ob2.odaie.get_suprafata_Camera());
bucatarie.set_suprafata_Camera(ob2.bucatarie.get_suprafata_Camera(
));
etaj = ob2.etaj;
}
void show_Apartament_cu_o_odaie()
{
cout<<"Apartament cu o odaie:"<<endl;
cout<<"Suprafata odaii:(m^2)
"<<odaie.get_suprafata_Camera()<<endl;
cout<<"Suprafata bucatariei:(m^2)
"<<bucatarie.get_suprafata_Camera()<<endl;
cout<<"Etajul: "<<etaj;
}
float get_suprafata_odaie()
{
return odaie.get_suprafata_Camera();
}
float get_suprafata_bucatarie()
{
return bucatarie.get_suprafata_Camera();
}
us get_etaj()
{
return etaj;
}
void set_suprafata_odaie(float suprafata_odaie)
{
odaie.set_suprafata_Camera(suprafata_odaie);
}
void set_suprafata_bucatarie(float suprafata_bucatarie)
{
bucatarie.set_suprafata_Camera(suprafata_bucatarie);
}
void set_etaj(us etaj)
{
7
this->etaj = etaj;
}
~Apartament_cu_o_odaie()
{
cout<<"S-au sters datele despre Apartament cu o odaie"<<endl;
}
};//end class Apartament_cu_o_odaie

class Apartament_cu_o_odaie_adr:public Apartament_cu_o_odaie


{
protected:
char adresa[30];
public:
Apartament_cu_o_odaie_adr()
{
cout<<"Constructor prestabilit (Apartament_cu_o_odaie_adr)"<<endl;
strcpy(adresa, "unknown");
}
Apartament_cu_o_odaie_adr(float suprafata_odaie, float
suprafata_bucatarie, us etaj, char*
adresa):Apartament_cu_o_odaie(suprafata_odaie, suprafata_bucatarie, etaj)
{
strcpy(this->adresa, adresa);
}
Apartament_cu_o_odaie_adr(Apartament_cu_o_odaie_adr &ob2)
{
set_suprafata_odaie(ob2.get_suprafata_odaie());
set_suprafata_bucatarie(ob2.get_suprafata_bucatarie());
set_etaj(ob2.get_etaj());
strcpy(adresa, ob2.adresa);
}
void show_Apartament_cu_o_odaie_adr()
{
cout<<"\nApartament cu o odaie si adresa:"<<endl;
cout<<"Suprafata odaii:(m^2) "<<get_suprafata_odaie()<<endl;
cout<<"Suprafata bucatariei:(m^2)
"<<get_suprafata_bucatarie()<<endl;
cout<<"Etajul: "<<get_etaj()<<endl;
cout<<"Adresa: "<<adresa<<endl;
}
char* get_adresa()
{
return adresa;
}
void set_adresa(char* adresa)
8
{
strcpy(this->adresa, adresa);
}
void InitData(float suprafata_odaii, float suprafata_bucatarie, us etaj, char*
adresa)
{
set_suprafata_odaie(suprafata_odaii);
set_suprafata_bucatarie(suprafata_bucatarie);
set_etaj(etaj);
strcpy(this->adresa, adresa);
}
~Apartament_cu_o_odaie_adr()
{
cout<<"S-au sters datele despre Apartament cu o odaie si
adresa"<<endl;
}
};//end class Apartament_cu_o_odaie_adr

int main()
{
us f;
us n;
float suprafata_odaii, suprafata_bucatarie;
us etaj;
char adresa[30];
cout<<"Sarcina 1:************************"<<endl;
Student_Diplomant ob1, ob2("Ion", "AI", 3, 9.0f, "Redresor Monofazat dubla
alternanta");
cout<<"\nStudentul Diplomant 1: "<<endl;
ob1.show_SD();
cout<<"\nSchimbati datele Studentului Diplomant 1"<<endl;
ob1.change_StudentD();
cout<<"Studentul Diplomant 2: "<<endl;
ob2.show_SD();
cout<<"\nSchimbati datele Studentului Diplomant 2"<<endl;
ob2.change_StudentD();
ob2.show_SD();
cout<<"\nComparatie Studentul 1 ? Studentul 2.(Dupa nota medie)"<<endl;
ob1.compare_Student(ob2);

cout<<"\n\n"<<"Sarcina 2:************************"<<endl;
cout<<"Dati numarul de apartamente cu o odaie si adresa:";
cin>>n;
Apartament_cu_o_odaie_adr *apartamente;
apartamente = new Apartament_cu_o_odaie_adr[n];
9
cout<<"\nDati datele despre fiecare apartament>>"<<endl;
for (int i=0; i<n; i++)
{
cout<<"\nApartamentul nr. "<<i+1<<">>";
cout<<"\nIntroduceti suprafata odaii:(m^2) ";
cin>>suprafata_odaii;
cout<<"Introduceti suprafata bucatariei:(m^2) ";
cin>>suprafata_bucatarie;
cout<<"Introduceti etajul: ";
cin>>etaj;
cout<<"Introduceti adresa: ";
fflush(stdin);
gets(adresa);
apartamente[i].InitData(suprafata_odaii, suprafata_bucatarie, etaj,
adresa);
}
cout<<"\nDoriti sa afisati apartamentele? (1/0)";
cin>>f;
if (f)
for (int i=0; i<n; i++)
{
cout<<"\nApartamentul nr. "<<i+1<<">>";
apartamente[i].show_Apartament_cu_o_odaie_adr();
}
f = 0;
cout<<"\nDoriti sa modificati datele despre apartamente? (1/0)";
cin>>f;
if (f)
for (int i=0; i<n; i++)
{
f = 0;
cout<<"\nApartamentul nr. "<<i+1<<">>";
cout<<"\nSuprafata odaii:(m^2)
"<<apartamente[i].get_suprafata_odaie();
cout<<"\nModificati suprafata odaii? (1/0)";
cin>>f;
if (f)
{
cout<<"Introduceti suprafata odaii:(m^2) ";
cin>>suprafata_odaii;
apartamente[i].set_suprafata_odaie(suprafata_odaii);
}
f = 0;
cout<<"\nSuprafata bucatariei:(m^2)
"<<apartamente[i].get_suprafata_bucatarie();
10
cout<<"\nModificati suprafata bucatariei? (1/0)";
cin>>f;
if (f)
{
cout<<"Introduceti suprafata bucatariei:(m^2) ";
cin>>suprafata_bucatarie;
apartamente[i].set_suprafata_bucatarie(suprafata_bucatarie);
}
f = 0;
cout<<"\nEtajul: "<<apartamente[i].get_etaj();
cout<<"\nModificati etajul? (1/0)";
cin>>f;
if (f)
{
cout<<"Introduceti etajul: ";
cin>>etaj;
apartamente[i].set_etaj(etaj);
}
f = 0;
cout<<"\nAdresa: "<<apartamente[i].get_adresa();
cout<<"\nModificati adresa? (1/0)";
cin>>f;
if (f)
{
cout<<"Introduceti adresa: ";
fflush(stdin);
gets(adresa);
apartamente[i].set_adresa(adresa);
}
f = 0;
cout<<"\nDoriti sa afisati datele despre apartament? (1/0)";
cin>>f;
if (f)
apartamente[i].show_Apartament_cu_o_odaie_adr();
}//end for
system("PAUSE");
}//end main()

11
Rezultatele obținute:

Figura 1 – Screenshot-ul rezultatelor Sarcinii 1

12
Figura 2 – Screenshot-ul rezultatelor Sarcinii 2

13
Figura 3 – Screenshot-ul rezultatelor Sarcinii 2 (continuare)

Concluzii:
În lucrarea dată de laborator ne-am familiarizat cu noțiunile de moștenire și
compoziție în cazul claselor. Ca sarcini am avut de implementat 2 clase finale ce
constau în primul caz dintr-o clasă de bază, cealaltă rezultând a fi de bază, iar în
cel de-al doilea caz am avut o clasă de bază, apoi o clasă ce o include pe prima de
bază prin compoziție și apoi o clasă derivată din cea de-a doua.
În cadrul funcției main() am realizat o serie de exemplificări a ambelor clase
finale pentru a dovedi că programul a fost gîndit corect și că am înțeles cu success
această temă pentru lucrarea de laborator.

14

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