Sunteți pe pagina 1din 9

Ministerul Educatiei al Republicii Moldova

Universitatea Tehnic a Moldovei

Catedra: Tehnologii informationale

RAPORT
Lucrare de laborator Nr. 4
la Programarea in C++

A efectuat:

st.gr.TI-133
Plasiciuc Vadim

lect.asistent
Cojocaru Svetalana

A verificat:

Chiinu 2014

Tema:
Motenirea i compoziia
Scopul lucrrii:
studierea motenirii, avantajele i dezavantajele;
studierea compoziiei;
studierea regulilor de definire a motenirii i compoziiei;
studierea formelor de motenire;
studierea iniializatorilor;
principiul de substituie;
motenirea i compoziia ce s alegem.
Note teoretice:
Motenirea reprezint unul din cele trei mecanisme de baz a motenirii orientate pe
obiecte. Motenirea poate fi studiat din dou puncte de vedere: dezvoltatorului i utilizatorului
clasei.
Din punct de vedere a dezvoltatorului motenirea nseamn, c comportarea i proprietile
clasei derivate, sunt nite dezvoltri a clasei de baz. Din punct de vedere a utilizatorului
motenirea reprezint existena unor particulariti de schimbare independenta a claselor cu o
interfa unic (Inginerii TI i constructorii de automobile, n primul rnd sunt inginerii).
Avantajele motenirii:
- micorarea cantitii codului i folosirea lui repetat;
- micorarea cantitii erorilor i a preului de cost;
- o interfaa unic i substituia;
- mrirea vitezei de prelucrare;
Cheltuielile motenirii: unicele cheltuieli la folosirea motenirii poate fi numit micorarea
vitezei la compilarea codului. Totui preocuprile de eficacitate nu trebuie s intre in
contrazicere cu avantajele, aa cum cheltuielile, cu adevrat, nu sunt eseniale, aa cum unele
din ele pot fi ocolite prin utilizarea funciilor de substituire.
Formele motenirii
n relaiile motenirii, C++ este un limbaj foarte bogat, aa cum exist cinci forme diferite
de motenire. n aceast lucrare de laborator noi vom studia trei dintre ele, acele care se numesc
simple.
- deschis;
- nchis;
- protejat;
Diferite forme de motenire sunt utilizate, pentru a modifica starea accesului pentru
variabilele membre clasei. De exemplu, la utilizarea motenirii nchise, toate care sunt accesibile
(deschise i protejate) variabilele clasei de baz devin nchise n derivare. Dar prin utilizarea
derivrii protejate protejate. Variabilele nchise a clasei de baz prin orice forma de derivare
devin inaccesibile. Mai mult ca att, metodele de motenire, se deosebesc prin aceia, c
motenirea deschis creeaz un subtip de date, adic exist principiul de substituie, dar protejata
i deschisa nu.
Compoziia
Compoziia reprezint nc un mecanism, legat de programarea orientat pe obiecte, care
reprezint relaia dintre obiecte, atunci cnd motenirea este relaia dintre clase.
Motenirea realizeaz relaia a fi is a . Dog este mamifer, iar mamiferul animal.
Compoziia realizeaz relaia de a conine has a . Automobilul conine motor i roi.
Definirea compoziiei
Cu adevrat compoziia este folosit foarte larg, aa cum variabilele ncorporate conin un
tip i sunt utilizate la definirea clasei. Dar la folosirea variabilelor ncorporate nu apar ntrebri,
ceia ce nu se poate spune despre clasele utilizatorilor. Definirea nu este grea, ns utilizarea
constructorilor creeaz probleme.

Varianta 7
) De creat o ierarhie a claselor cldire administrarea cldirii cldire de locuit. Determinai
fluxul de ieire i fluxul de intrare, constructorul de copiere, operatorul de atribuire prin funcia
corespunztoare a clasei de baz.
b) De creat clasa student, care are un nume, specialitate, anul de nvmnt i balul mediu.
Determinai funcia de definire, schimbare a datelor i comparare. Pentru sarcina cmpurilor
textuale se folosete operatorul new. Determinai constructorul, destructorul i alte funcii
necesare. Creai clasa grupa, care conine studeni (o cantitate nelimitat). Definii metodele de
adugare i eliminare a studenilor, determinarea balului mediu pe grup, constructorii,
destructorii i alte funcii necesare.
Listingul programa a:
#include <iostream>
#include<string.h>
#include <conio.h>
#include<stdlib.h>
#include <time.h>
using namespace std;
class Cladire{
int nr;
char *adresa;
public:
Cladire();
Cladire(Cladire &);
void set_nr(int value)
{
nr=value;}
void set_cladire(char *x)
{
delete[]adresa;
adresa=new char[strlen(x)+1];
strcpy(adresa,x);
}
int get_nr()
{return nr;}
char* get_adresa(){ return adresa;};
friend istream &operator>>(istream &, Cladire&);
friend ostream &operator<< (ostream & ,Cladire&);
Cladire operator =(Cladire &);};
Cladire::Cladire():adresa(NULL),nr(0){};
Cladire::Cladire(Cladire &obj)
{
nr=obj.nr;
adresa=new char [strlen(obj.adresa)+1];
strcpy(adresa, obj.adresa);
}
Cladire Cladire::operator =(Cladire &obj)
{
if (this==&obj) return *this;
nr=obj.nr;
if(adresa) delete[]adresa;
adresa=new char [strlen(obj.adresa)+1];
strcpy(adresa,obj.adresa);
}
istream &operator >>(istream &in,Cladire &obj )
{
cout<<"Dati adresa Cladirii : ";

char buff[40];
cin>>buff;
if(obj.adresa) delete[]obj.adresa;
obj.adresa=new char [strlen(buff)+1];
strcpy(obj.adresa, buff);
cout<<"Dati nr cladirii: "<<endl;
in>>obj.nr;
}
class Administrarea_cladirii:public Cladire{
public:
char *numele;
Administrarea_cladirii();
Administrarea_cladirii(char*);
char*get_numele() {return numele;}};
Administrarea_cladirii::Administrarea_cladirii(){};
Administrarea_cladirii::Administrarea_cladirii(char* x)
{
numele=new char[strlen(x)+1];
strcpy(numele,x);
}
class Cladirea_de_locuit:public Administrarea_cladirii{
public:
int pretul;
Cladirea_de_locuit();
};
Cladirea_de_locuit::Cladirea_de_locuit ():pretul(0){}
int main()
{ m1: system("cls");
srand(time(NULL));
char buff[50]; int nr; int r;
Cladire x;
Administrarea_cladirii t;
Cladirea_de_locuit p;
cout<<"Dati Adresa cladirii: ";cin>>buff; t.set_cladire(buff);
cout<<"\nNr Blocului";cin>>nr; t.set_nr(nr);
system("cls");
r=1+rand()%8;
switch(r)
{
case 1:{char e[]={"Valera"}; t.numele=new char[strlen(e)+1];
strcpy(t.numele,e);break;} //for (int i=0; i<strlen(e); i++) { buff[i]=e[i];}
case 2:{char e[]={"Alexei"};t.numele=new char[strlen(e)+1];
strcpy(t.numele,e);break;}
case 3:{char e[]={"Aliona"};t.numele=new char[strlen(e)+1];
strcpy(t.numele,e);break;}
case 4:{char e[]={"Vasia"};t.numele=new char[strlen(e)+1];
strcpy(t.numele,e);break;}
case 5:{char e[]={"Alina"};t.numele=new char[strlen(e)+1];
strcpy(t.numele,e);break;}
case 6:{char e[]={"Marcel"};t.numele=new char[strlen(e)+1];
strcpy(t.numele,e);break;}
case 7:{char e[]={"Sveta"};t.numele=new char[strlen(e)+1];
strcpy(t.numele,e);break;}
case 8:{char e[]={"Aliona"};t.numele=new char[strlen(e)+1];
strcpy(t.numele,e);break;}
}
cout<<t.numele<<": Este administratorul acestei Cladirii";
r=1+rand()%8;
switch(r)

{
case 1:{int e=1000; p.pretul=e;break;}//for (int i=0; i<strlen(e); i++) {
buff[i]=e[i];}
case 2:{int e=2000; p.pretul=e;break;}
case 3:{int e=3000; p.pretul=e;break;}
case 4:{int e=4000; p.pretul=e;break;}
case 5:{int e=5000; p.pretul=e;break;}
case 6:{int e=6000; p.pretul=e;;break;}
case 7:{int e=7000; p.pretul=e;;break;}
case 8:{int e=8000; p.pretul=e;;break;}
}
cout<<"\nPretul dat de "<<t.numele<<"a apartamentului, este "<<p.pretul<<"$"<<endl;
cout<<"\n\n\n\n\n\n\n\ Doriti sa cautati alt Cladire ? Tastati Enter"<<endl;
if (_getch() == 13) goto m1;

}Screenshots

pentru programa a:

Listingul programei b:
#include <iostream>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
using namespace std;
class Student{
public:
char* nume;
char*specialitate;
int anul_de_invatamint;
float balul_mediu;
Student();
Student(char *,char*,int,float);
~Student();
Student operator=(const Student &);
Student operator>(const Student &);
friend istream &operator>>(istream &,Student &);
friend ostream &operator<<(ostream &,Student &);
};
Student::Student():nume(NULL),specialitate(NULL),anul_de_invatamint(0),balul_mediu(0){}
Student::Student(char*x, char *y, int z, float w):nume(new
char[strlen(x)+1]),specialitate(new
char[strlen(y)+1]),anul_de_invatamint(z),balul_mediu(w){
strcpy(nume,x);
strcpy(specialitate,y);}
Student::~Student()
{
delete[]nume; nume=NULL;
delete[]specialitate; specialitate=NULL;
anul_de_invatamint=0;
balul_mediu=0;
}
Student Student::operator=(const Student & obj)
{
if(this==&obj) return *this;
if(nume) delete[]nume;
nume=new char [strlen(obj.nume)+1];
strcpy(specialitate,obj.specialitate);
if(specialitate) delete[]specialitate;
specialitate=new char [strlen(obj.specialitate)+1];
strcpy(specialitate,obj.specialitate);
anul_de_invatamint=obj.anul_de_invatamint;
balul_mediu=obj.balul_mediu;
}
istream &operator>>(istream &in, Student &obj)
{
cout<<"Dati Numele Studentului : ";
char buff[50];
in>>buff;
obj.nume=new char[strlen(buff)+1];
strcpy(obj.nume,buff);
cout<<"\n\nDati Specialitate :";
delete[]buff;
in>>buff;
obj.specialitate=new char[strlen(buff)+1];
strcpy(obj.specialitate,buff);
cout<<"\n\n Dati anul de invatamint: ";
in>>obj.anul_de_invatamint;
cout<<"\n\n Dati balul_mediu : ";
in>>obj.balul_mediu;

}
ostream &operator <<(ostream &out,Student &obj)
{
cout<<"Numele studentului :" ;
out<<obj.nume;
cout<<"\n\nSpecialitate : ";
out<<obj.specialitate;
cout<<"\n\nAnul de invtamint : ";
out<<obj.anul_de_invatamint;
cout<<"\n\nBalul mediu : ";
out<<obj.balul_mediu;
}
class Grupa
{
public:
Student x;
float balul_medius;
friend istream &operator >>(istream& ,Grupa &);
friend ostream &operator <<(ostream& ,Grupa &);
Grupa delete_Student(Grupa &obj)
{
delete[]obj.x.nume;
delete[]obj.x.specialitate;
}
};
istream &operator >> (istream & in, Grupa &obj)
{
in>>obj.x;
}
ostream &operator << (ostream & out, Grupa &obj)
{
out<<obj.x;
}
int main()
{
Grupa z[50]; int i=0;int k; float x;
cin>>z[i];
z[0].balul_medius=z[i].x.balul_mediu;
system("cls");
cout<< z[i];
cout<<"\n\n\n\n\Mai doriti sa adaugati Studenti? "<<"\t Tastati Enter"<<endl;
while(_getch()==13){
system("cls");
i=i+1;
cin>>z[i];
system("cls");
cout<<z[i];
z[0].balul_medius+=(z[i].x.balul_mediu);
cout<<"\n\n\n\nBalul mediu a grupei formata din "<<i+1<<" Studenti , este
=:"<<z[0].balul_medius/(i+1);
cout<<"\n\n\n\n\n\n\Mai doriti sa adaugati Studenti? "<<"\t Tastati
Enter"<<endl;
x=z[0].balul_medius/(i+1);
k=i;}
system("cls");
for (int i=0; i<=k; i++)
{
cout<<"----------";
cout<<z[i];
cout<<"\n----------";
cout<<"\n\n";
}
cout<<"\n\n\nBalul mediu a grupei este : "<<x;}

Screenshots pentru programa b:

Concluzie:
Efectuind acest laborato am inteles cum functioneaza mecanismul de mostenire,acesta este unul
care usureaza foarte mult scrierea codului.Este destul sa declaram o clasa de baza si cimpurile ei
apoi sa facem mostenire de la clasa de baza la clasele care le mai avem in program si toate
cimpurile inafara de constructori si destructori se vor mosteni ceia ce reduce numarul de rinduri
dar si usureaza lucrul programatorului. La aceasta lucrarea de laborator nu am intilnit mari
dificultati.

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