Sunteți pe pagina 1din 10

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei

Catedra: Automatica i Tehnologii Informaionale

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

A efectuat:

A verificat:

Chisinau 2015

LUCRAREA DE LABORATOR NR4


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.
Noiuni de baz
Motenirea
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.
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.
class Car{
Engine e;
};

Varianta 4
) De creat o ierarhie a claselor om i colaborator, care ocup un post anumit i primete un
salariu anumit. Determinai fluxul de ieire i fluxul de intrare, constructorul de copiere,
operatorii de atribuire prin anumite funcii a clasei de baz.
Textul Programului:
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <cstring>
using namespace std;
class om {
char* post;
public:
om(){ post="";};
om(char*);
om(om&);
~om(){delete[] post;};
void set_post(char*);
char* get_post();
friend ostream& operator <<(ostream &,om&);
friend istream& operator >>(istream &,om&);
};
om::om(char* post):post(new char[strlen(post)+1]){
strcpy(this->post,post);
};
om::om(om&obj){
if(this->post!=NULL) delete[] this->post;
this->post = new char[strlen(obj.post)+1];
strcpy(this->post,obj.post);
};

void om::set_post(char *post){


if(this->post!=NULL)delete[]this->post;
this->post=new char[strlen(post)+1];

strcpy(this->post,post);
};
char* om::get_post(){
return post;
};

istream& operator >>(istream& in,om& obj){


char buff[100];
in>>buff;
obj.set_post(buff);
return in;
}
ostream& operator <<(ostream& out,om&obj){
out<<"Post: "<<obj.post<<endl;
return out;
}
class coloborator:public om {
float salariu;
public:
coloborator(){salariu=0;};
coloborator(float);
~coloborator(){salariu=0;};
coloborator& operator = (coloborator&);
friend ostream& operator <<(ostream &,coloborator&);
friend istream& operator >>(istream &,coloborator&);
};
coloborator::coloborator(float salariu):salariu(salariu){};
coloborator& coloborator:: operator = (coloborator&obj){

this->set_post(obj.get_post());
this->salariu=obj.salariu;

return *this;
};
istream& operator >>(istream& in,coloborator& obj){
char buff[100];
cout<<"Dati postul omului: "<<endl;
in>>buff;
obj.set_post(buff);
cout<<"Dati salariul omului: "<<endl;
in>>obj.salariu;
return in;
}
ostream& operator <<(ostream& out,coloborator&obj){
out<<"Post: "<<obj.get_post()<<endl;
out<<"Salariu: "<<obj.salariu<<endl;
return out;
}
int main(void){
coloborator c,c1;
cout<<"Dati datele despre om:"<<endl;
cin>>c;
cout<<"\nDati datele despre colaborator:"<<endl;
cin>>c1;
cout<<"Om:"<<endl;
cout<<c;
cout<<"\nColaborator:"<<endl;
cout<<c1;
cout<<"\nAtribuire"<<endl;
c=c1;
cout<<"Om:"<<endl;
cout<<c;
system("pause");
}

b) De creat clasa carte, care conine grad i culoare. Cartea poate fi ntoars i deschis.
Creai clasa butuc de cri, a crii pe care o conine. Creai dou clase derivate de la butuc
de cri, n una crile pot fi scoase numai ntr-o ordine, iar n alta aleator.
Textul Programului:
#include <iostream>
#include <time.h>
#include <cstring>
#include <windows.h>
using namespace std;
class block_books {
int type;
public:
block_books(){ type=0;};
block_books(int);
void set_type(int);
int get_type();
friend ostream& operator <<(ostream &,block_books&);
friend istream& operator >>(istream &,block_books&);
};
block_books::block_books(int type):type(type){};
void block_books::set_type(int type){this->type=type;};
int block_books::get_type(){ return type;};
istream& operator >>(istream& in,block_books& obj){
int temp;
cout<<"Dati tipul cartii(0-intoarsa , 1-deschisa): ";
in>>temp;
if((temp==0)||(temp==1)){
obj.set_type(temp);
}
else {cout<<"A fost introdusa cifra incorecta! ";}
return in;
}
ostream& operator <<(ostream& out,block_books&obj){

if((obj.type==0)){
out<<"Tipul cartii: intoarsa"<<endl;
}
if((obj.type==1)){
out<<"Tipul cartii: deschisa"<<endl;
}
return out;
}
class book:public block_books {
char* grade;
char* color;
public:
book(){grade=""; color="";};
~book(){delete[]grade; delete[]color;}
void set_grade(char*);
void set_color(char*);
char* get_grade();
char* get_color();
friend ostream& operator <<(ostream &,book&);
friend istream& operator >>(istream &,book&);
};

void book::set_grade(char *grade){


if(this->grade!=NULL)delete[]this->grade;
this->grade=new char[strlen(grade)+1];
strcpy(this->grade,grade);
};
void book::set_color(char *color){
if(this->color!=NULL)delete[]this->color;
this->color=new char[strlen(color)+1];
strcpy(this->color,color);
};

char* book::get_grade(){ return grade;};

char* book::get_color(){ return color;};


istream& operator >>(istream& in,book& obj){
char temp1[100],temp2[100];
cout<<"Dati gradul cartii: "<<endl;
in>>temp1;
cout<<"Dati culoarea cartii: "<<endl;
in>>temp2;
obj.set_grade(temp1);
obj.set_color(temp2);
return in;
}
ostream& operator <<(ostream& out,book&obj){

out<<"Gradul cartii: "<<obj.get_grade()<<endl;


out<<"Culoarea cartii: "<<obj.get_color()<<endl;
return out;
}
class post_order:public book {
int n_order;
public:
friend ostream& operator <<(ostream &,post_order&);
friend istream& operator >>(istream &,post_order&);
};

istream& operator >>(istream& in,post_order& obj){


char temp2[100],temp3[100];
int temp1;
cout<<"Dati tipul cartii(0-intoarsa , 1-deschisa): ";
in>>temp1;
if((temp1==0)||(temp1==1)){
obj.set_type(temp1);
}
else {cout<<"A fost introdusa cifra incorecta! "; obj.set_type(1);}
cout<<"Dati gradul cartii: "<<endl;

in>>temp2;
obj.set_grade(temp2);
cout<<"Dati culoarea cartii: "<<endl;
in>>temp3;
obj.set_color(temp3);
return in;
}
ostream& operator <<(ostream& out,post_order&obj){
if((obj.get_type()==0)){
out<<"Tipul cartii: intoarsa"<<endl;
}
if((obj.get_type()==1)){
out<<"Tipul cartii: deschisa"<<endl;
}
out<<"Gradul cartii: "<<obj.get_grade()<<endl;
out<<"Culoarea cartii: "<<obj.get_color()<<endl;
return out;
}

class post_random:public book {


public:
friend ostream& operator <<(ostream &,post_random&);
friend istream& operator >>(istream &,post_random&);
};
ostream& operator <<(ostream& out,post_random&obj){
out<<"Tipul cartii: "<<obj.get_type()<<endl;
out<<"Gradul cartii: "<<obj.get_grade()<<endl;
out<<"Culoarea cartii: "<<obj.get_color()<<endl;
return out;
}
int main(){
book b;
post_order p1,p2;

cout<<"Dati datele pentru cartea 1"<<endl;


cin>>p1;
cout<<"Dati datele pentru cartea 2"<<endl;
cin>>p2;
post_order p[2]={p1,p2};
cout<<endl<<"Afisare in ordine:"<<endl;
cout<<"Cartea 1"<<endl;
cout<<p[0];
cout<<"Cartea 2"<<endl;
cout<<p[1];
srand(time(0));
int i=rand()%1;
cout<<endl<<"Afisare random:"<<endl;
cout<<"Cartea "<<i+1<<endl;
cout<<p[i];
int k;
if (i==0) k=1;
else if (i==1) k=0;
cout<<"Cartea "<<k+1<<endl;
cout<<p[k];
system("pause");
return 0;
}

Concluzie