Sunteți pe pagina 1din 21

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei

RAPORT

Lucrarea de laborator nr.4

La Programarea orientata pe obiecte

A efectuat:

st. gr. CR-182 Conea Cristian

A verificat:

lector,univ. Oșovschi Mariana

Chişinău -2019
Tema: Moştenirea şi compoziţia

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
moştenire şi compoziţie

Varianta 12
a) Să se creeze o ierarhie a claselor Figură de şah - clasa abstractă, care conţine câmpul –
culoare. Creaţi pentru toate figurile clase derivate , care conţin denumirea figurii şi coordonatele
poziţiei pe tablă. Pentru setarea cîmpurilor textuale, utilizaţi operatorul new. Determinaţi fluxul
de ieşire şi fluxul de intrare, constructorul de copiere, operatorul de atribuire prin funcţiile
corespunzătoare ale clasei de bază.
b) Să se creeze clasa figuri de şah, care este compusă din setul de figuri din sarcina a, şi tabla de
şah – tablou bidimensional 8 pe 8. Să se creeze posibilitatea de a elimina figurile de pe tablă.
Definiţi constructorul care creează dinamic figuri şi le dă poziţii utilizînd notarea pentru şah
(E2). Definiţi constructorul de copiere şi operatorul de atribuire.
A)
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;

class Figura_De_Sah
{
int culoare;
public:
Figura_De_Sah(int culoare=-1)
{
this->culoare=culoare;
}
~Figura_De_Sah()
{
}
virtual void Print()=0;
void SetColor(int color)
{
culoare=color;
}
int GetCollor()
{
return culoare;
}
};

class Figura : public Figura_De_Sah


{
char *name;
int cordX;
int cordY;
public:
Figura(char name[7]="Figura", int cordX=0, int cordY=0, int culoare=-1) :
Figura_De_Sah(culoare)
{
this->name=new char[strlen(name)+1];
strcpy(this->name, name);
this->cordX=cordX;
this->cordY=cordY;
}
~Figura()
{
delete []name;
}
Figura(Figura & RFigura)
{
if(!this->name)
{
this->name=new char[strlen(RFigura.name)+1];
strcpy(this->name, RFigura.name);
}
else
{
delete []name;
this->name=new char[strlen(RFigura.name)+1];
strcpy(this->name, RFigura.name);
}
SetColor(RFigura.GetCollor());
cordY = RFigura.cordY;
cordX = RFigura.cordX;
}
void operator=(Figura RFigura);
void Print();
void SetFigureChar();
void Move();
};

void Figura ::operator=(Figura RFigura)


{
if(!this->name)
{
this->name=new char[strlen(RFigura.name)+1];
strcpy(this->name, RFigura.name);
}
else
{
delete []name;
this->name=new char[strlen(RFigura.name)+1];
strcpy(this->name, RFigura.name);
}
SetColor(RFigura.GetCollor());
cordY = RFigura.cordY;
cordX = RFigura.cordX;
}

void Figura::SetFigureChar()
{
char name[40];
int cordX, cordY, color;
cout << "Introdu numele figurei de sah" << endl;
cout << "Figuri disponibile : Rege, Regina, Turn, Nebun, Cal, Pion" <<
endl;
cin >> name;
do
{
cout << "Introdu culoarea acestuia" << endl;
cout << "1) Alb" << endl;
cout << "2) Negru" << endl;
cin >> color;
if(color<1 || color>2)
{
cout << "Alegere inexistenta" << endl;
}
}while (color<1 || color>2);
cout << "Seteaza coordonata pe axa OY (de la 1 pana la 8)" << endl;
do
{
cin >> cordY;
if(cordY<1 || cordY>8)
{
cout << "Alegere inexistenta" << endl;
}
}while (cordY<1 || cordY>8);
cout << "Seteaza coordonata pe axa OX (de la 1 pana la 8)" << endl;
cout << "Aceasta fa vi automat convertita conform coordonatei pentru
tabla de sah." << endl;
do
{
cin >> cordX;
if(cordX<1 || cordX>8)
{
cout << "Alegere inexistenta" << endl;
}
}while (cordX<1 || cordX>8);
this->name=new char[strlen(name)+1];
strcpy(this->name, name);
this->cordX=cordX;
this->cordY=cordY;
SetColor(color);
}

void Figura::Move()
{
cout << "Actual va aflati pe pozitia : ";
switch(cordX)
{
case 1 : cout << "Se afla pe coordonata : a" << cordY << endl; break;
case 2 : cout << "Se afla pe coordonata : b" << cordY << endl; break;
case 3 : cout << "Se afla pe coordonata : c" << cordY << endl; break;
case 4 : cout << "Se afla pe coordonata : d" << cordY << endl; break;
case 5 : cout << "Se afla pe coordonata : e" << cordY << endl; break;
case 6 : cout << "Se afla pe coordonata : f" << cordY << endl; break;
case 7 : cout << "Se afla pe coordonata : g" << cordY << endl; break;
case 8 : cout << "Se afla pe coordonata : h" << cordY << endl; break;
}
cout << "\nAlegeti o alta coordonata pentru a modifica pozitia " << endl;
cout << "Seteaza coordonata pe axa OY (de la 1 pana la 8)" << endl;
do
{
cin >> cordY;
if(cordY<1 || cordY>8)
{
cout << "Alegere inexistenta" << endl;
}
}while (cordY<1 || cordY>8);
cout << "Seteaza coordonata pe axa OX (de la 1 pana la 8)" << endl;
cout << "Aceasta fa vi automat convertita conform coordonatei pentru
tabla de sah." << endl;
do
{
cin >> cordX;
if(cordX<1 || cordX>8)
{
cout << "Alegere inexistenta" << endl;
}
}while (cordX<1 || cordX>8);
this->cordX=cordX;
this->cordY=cordY;
}

void Figura::Print()
{
int culoare=GetCollor();
cout << "Figura : " << name << endl;
switch (culoare)
{
case 1 : cout << "Culoarea : Alba" << endl; break;
case 2 : cout << "Culoarea : Neagra" << endl; break;
}
switch(cordX)
{
case 1 : cout << "Se afla pe coordonata : a" << cordY << endl; break;
case 2 : cout << "Se afla pe coordonata : b" << cordY << endl; break;
case 3 : cout << "Se afla pe coordonata : c" << cordY << endl; break;
case 4 : cout << "Se afla pe coordonata : d" << cordY << endl; break;
case 5 : cout << "Se afla pe coordonata : e" << cordY << endl; break;
case 6 : cout << "Se afla pe coordonata : f" << cordY << endl; break;
case 7 : cout << "Se afla pe coordonata : g" << cordY << endl; break;
case 8 : cout << "Se afla pe coordonata : h" << cordY << endl; break;
}
}

int main()
{
int n;
int menu;
int alb=0, negru=0;
int choise, chx;
cout << "Introdu numarul de figuri care doriti sa le introduceti pe tabla
de sah" << endl;
cin >> n;
Figura ** Fig = new Figura*[n];
cout << "Setati figurile de sah" << endl;
for(int i=0; i<n; i++)
{
system("cls");
cout << "Figura nr :" << i+1 << endl;
Fig[i] = new Figura();
Fig[i]->SetFigureChar();
}
do
{
system("cls");
cout << "Menu" << endl;
cout << "1) Afiseaza Figurile de sah" << endl;
cout << "2) Adauga o figura noua pe tabla de sah" << endl;
cout << "3) Miscarea figurii pe tabla de sah" << endl;
cout << "4) Calculul figurilor dupa Culoare" << endl;
cout << "0) Exit" << endl;
cin >> menu;
switch (menu)
{
case 0 :
{
system("cls");
for(int i=0; i<n; i++)
{
delete []Fig[i];
Fig[i]=NULL;
}
delete []Fig;
return 0;
}
break;
case 1:
{
system("cls");
cout << "Figurile de sah sunt : " << endl;
for(int i=0; i<n; i++)
{
Fig[i]->Print();
cout << endl;
}
}
break;
case 2:
{
system("cls");
n+=1;
Fig=(Figura**)realloc(Fig, n*sizeof(Figura*));
Fig[n-1] = new Figura();
cout << "Doriti sa copiati datele unei figuri actuale, sau sa
generati date noi ?" << endl;
cout << "1) Copii datele" << endl;
cout << "2) Generez date noi" << endl;
do
{
cin >> choise;
if(choise<1 || choise>2)
{
cout << "Obtiune inexistenta" << endl;
}
}while (choise<1 || choise>2);
if (choise==1)
{
system("cls");
cout << "Alegeti o figura de sah din lista propusa : " <<
endl;
for(int i=0; i<n-1; i++)
{
Fig[i]->Print();
cout << endl;
}
do
{
cin >> chx;
if(chx<1 || chx>n)
{
cout << "Figura inexistenta" << endl;
}
}while (chx<1 || chx>n);
Fig[n-1]=Fig[chx-1];
}
if (choise==2)
{
Fig[n-1]->SetFigureChar();
}
}
break;
case 3:
{
system("cls");
cout << "Alegeti o figura de sah din lista propusa : " <<
endl;
for(int i=0; i<n; i++)
{
Fig[i]->Print();
cout << endl;
}
do
{
cin >> choise;
if(choise<1 || choise>n)
{
cout << "Figura inexistenta" << endl;
}
}while (choise<1 || choise>n);
Fig[choise-1]->Move();
}
break;
case 4:
{
system("cls");
alb=0;
negru=0;
for(int i=0; i<n; i++)
{
if(Fig[i]->GetCollor()==1)
{
alb+=1;
} else if (Fig[i]->GetCollor()==2)
{
negru+=1;
}
}
cout << "Total figure pe tabal de sah sunt : " << alb+negru
<< endl;
cout << "Figure albe sunt : " << alb << endl;
cout << "Figure negre sunt : " << negru << endl;
}
break;
}
system("pause");
}while(menu!=0);
}

Rezultatele rularii

B)

#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;

class Figura_De_Sah
{
int culoare;
public:
Figura_De_Sah(int culoare=-1)
{
this->culoare=culoare;
}
~Figura_De_Sah()
{
}
virtual void Print()=0;
void SetColor(int color)
{
culoare=color;
}
int GetCollor()
{
return culoare;
}
};

class Figura : public Figura_De_Sah


{
char *name;
int cordX;
int cordY;
public:
Figura(char name[7]="Figura", int cordX=0, int cordY=0, int culoare=-1) :
Figura_De_Sah(culoare)
{
this->name=new char[strlen(name)+1];
strcpy(this->name, name);
this->cordX=cordX;
this->cordY=cordY;
}
~Figura()
{
delete []name;
}
Figura(Figura & RFigura)
{
if(!this->name)
{
this->name=new char[strlen(RFigura.name)+1];
strcpy(this->name, RFigura.name);
}
else
{
delete []name;
this->name=new char[strlen(RFigura.name)+1];
strcpy(this->name, RFigura.name);
}
SetColor(RFigura.GetCollor());
cordY = RFigura.cordY;
cordX = RFigura.cordX;
}
void operator=(Figura RFigura);
void Print();
void PrintTBL();
void SetFigureChar();
void Move();
void RetunrCoord(int &x, int &y);
};

void Figura::RetunrCoord(int &x, int &y)


{
x=cordX;
y=cordY;
}

void Figura::PrintTBL()
{
int culoare=GetCollor();
if (culoare!=-1)
{
if (strcmp(name,"Rege")==0)
{
if(culoare==1)
{
cout << "ARG";
}
else
{
cout << "NRG";
}
}
else if (strcmp(name,"Regina")==0)
{
if(culoare==1)
{
cout << "ARg";
}
else
{
cout << "NRg";
}
}
if (strcmp(name,"Turn")==0)
{
if(culoare==1)
{
cout << "AT";
}
else
{
cout << "NT";
}
}
else if (strcmp(name,"Nebun")==0)
{
if(culoare==1)
{
cout << "AN";
}
else
{
cout << "NN";
}
}
if (strcmp(name,"Cal")==0)
{
if(culoare==1)
{
cout << "AC";
}
else
{
cout << "NC";
}
}
else if (strcmp(name,"Pion")==0)
{
if(culoare==1)
{
cout << "AP";
}
else
{
cout << "NP";
}
}
}
}

void Figura ::operator=(Figura RFigura)


{
if(!this->name)
{
this->name=new char[strlen(RFigura.name)+1];
strcpy(this->name, RFigura.name);
}
else
{
delete []name;
this->name=new char[strlen(RFigura.name)+1];
strcpy(this->name, RFigura.name);
}
SetColor(RFigura.GetCollor());
cordY = RFigura.cordY;
cordX = RFigura.cordX;
}

void Figura::SetFigureChar()
{
char name[40];
int cordX, cordY, color;
cout << "Introdu numele figurei de sah" << endl;
cout << "Figuri disponibile : Rege, Regina, Turn, Nebun, Cal, Pion" <<
endl;
cin >> name;
do
{
cout << "Introdu culoarea acestuia" << endl;
cout << "1) Alb" << endl;
cout << "2) Negru" << endl;
cin >> color;
if(color<1 || color>2)
{
cout << "Alegere inexistenta" << endl;
}
}while (color<1 || color>2);
cout << "Seteaza coordonata pe axa OY (de la 1 pana la 8)" << endl;
do
{
cin >> cordY;
if(cordY<1 || cordY>8)
{
cout << "Alegere inexistenta" << endl;
}
}while (cordY<1 || cordY>8);
cout << "Seteaza coordonata pe axa OX (de la 1 pana la 8)" << endl;
cout << "Aceasta fa vi automat convertita conform coordonatei pentru
tabla de sah." << endl;
do
{
cin >> cordX;
if(cordX<1 || cordX>8)
{
cout << "Alegere inexistenta" << endl;
}
}while (cordX<1 || cordX>8);
this->name=new char[strlen(name)+1];
strcpy(this->name, name);
this->cordX=cordX;
this->cordY=cordY;
SetColor(color);
}

void Figura::Move()
{
cout << "Actual va aflati pe pozitia : ";
switch(cordX)
{
case 1 : cout << "Se afla pe coordonata : A" << cordY << endl; break;
case 2 : cout << "Se afla pe coordonata : B" << cordY << endl; break;
case 3 : cout << "Se afla pe coordonata : C" << cordY << endl; break;
case 4 : cout << "Se afla pe coordonata : D" << cordY << endl; break;
case 5 : cout << "Se afla pe coordonata : E" << cordY << endl; break;
case 6 : cout << "Se afla pe coordonata : F" << cordY << endl; break;
case 7 : cout << "Se afla pe coordonata : G" << cordY << endl; break;
case 8 : cout << "Se afla pe coordonata : H" << cordY << endl; break;
}
cout << "\nAlegeti o alta coordonata pentru a modifica pozitia " << endl;
cout << "Seteaza coordonata pe axa OY (de la 1 pana la 8)" << endl;
do
{
cin >> cordY;
if(cordY<1 || cordY>8)
{
cout << "Alegere inexistenta" << endl;
}
}while (cordY<1 || cordY>8);
cout << "Seteaza coordonata pe axa OX (de la 1 pana la 8)" << endl;
cout << "Aceasta fa vi automat convertita conform coordonatei pentru
tabla de sah." << endl;
do
{
cin >> cordX;
if(cordX<1 || cordX>8)
{
cout << "Alegere inexistenta" << endl;
}
}while (cordX<1 || cordX>8);
this->cordX=cordX;
this->cordY=cordY;
}

void Figura::Print()
{
int culoare=GetCollor();
cout << "Figura : " << name << endl;
switch (culoare)
{
case 1 : cout << "Culoarea : Alba" << endl; break;
case 2 : cout << "Culoarea : Neagra" << endl; break;
}
switch(cordX)
{
case 1 : cout << "Se afla pe coordonata : A" << cordY << endl; break;
case 2 : cout << "Se afla pe coordonata : B" << cordY << endl; break;
case 3 : cout << "Se afla pe coordonata : C" << cordY << endl; break;
case 4 : cout << "Se afla pe coordonata : D" << cordY << endl; break;
case 5 : cout << "Se afla pe coordonata : E" << cordY << endl; break;
case 6 : cout << "Se afla pe coordonata : F" << cordY << endl; break;
case 7 : cout << "Se afla pe coordonata : G" << cordY << endl; break;
case 8 : cout << "Se afla pe coordonata : H" << cordY << endl; break;
}
}

int main()
{
int n;
int menu;
int alb=0, negru=0;
int x, y;
int choise, chx;
cout << "Introdu numarul de figuri care doriti sa le introduceti pe tabla
de sah" << endl;
cin >> n;
Figura ** Fig = new Figura*[n];
Figura *** TablouSah = new Figura**[8];
for(int i=0; i<8; i++)
{
TablouSah[i]=new Figura*[8];
}
cout << "Setati figurile de sah" << endl;
for(int i=0; i<n; i++)
{
system("cls");
cout << "Figura nr :" << i+1 << endl;
Fig[i] = new Figura();
Fig[i]->SetFigureChar();
}
do
{
system("cls");
cout << "Menu" << endl;
cout << "1) Afiseaza Figurile de sah" << endl;
cout << "2) Adauga o figura noua pe tabla de sah" << endl;
cout << "3) Miscarea figurii pe tabla de sah" << endl;
cout << "4) Calculul figurilor dupa Culoare" << endl;
cout << "5) Afisez Tabloul de sah" << endl;
cout << "6) Sterge o figura" << endl;
cout << "0) Exit" << endl;
cin >> menu;
switch (menu)
{
case 0 :
{
system("cls");
for(int i=0; i<n; i++)
{
delete []Fig[i];
Fig[i]=NULL;
}
delete []Fig;
for(int i=0; i<8; i++)
{
delete []TablouSah[i];
}
delete []TablouSah;
return 0;
}
break;
case 1:
{
system("cls");
cout << "Figurile de sah sunt : " << endl;
for(int i=0; i<n; i++)
{
if(Fig[i]!=NULL)
{
cout << "Figura ID = " << i+1 << endl;
Fig[i]->Print();
cout << endl;
}
}
}
break;
case 2:
{
system("cls");
n+=1;
Fig=(Figura**)realloc(Fig, n*sizeof(Figura*));
Fig[n-1] = new Figura();
cout << "Doriti sa copiati datele unei figuri actuale, sau sa
generati date noi ?" << endl;
cout << "1) Copii datele" << endl;
cout << "2) Generez date noi" << endl;
do
{
cin >> choise;
if(choise<1 || choise>2)
{
cout << "Obtiune inexistenta" << endl;
}
}while (choise<1 || choise>2);
if (choise==1)
{
system("cls");
cout << "Alegeti o figura de sah din lista propusa : " <<
endl;
for(int i=0; i<n-1; i++)
{
if(Fig[i]!=NULL)
{
cout << "Figura ID = " << i+1 << endl;
Fig[i]->Print();
cout << endl;
}
}
cout << "0) Exit" << endl;
do
{
cin >> chx;
if(chx==0)
{
n=n-1;
break;
}
if(chx<0 || chx>n)
{
cout << "Figura inexistenta" << endl;
}
}while (chx<0 || chx>n);
if(chx!=0)
{
Fig[n-1]=Fig[chx-1];
}
}
if (choise==2)
{
Fig[n-1]->SetFigureChar();
}
}
break;
case 3:
{
system("cls");
cout << "Alegeti o figura de sah din lista propusa : " <<
endl;
for(int i=0; i<n; i++)
{
if(Fig[i]!=NULL)
{
cout << "Figura ID = " << i+1 << endl;
Fig[i]->Print();
cout << endl;
}
}
cout << "0) Exit" << endl;
do
{
cin >> choise;
if(choise<0 || choise>n)
{
cout << "Figura inexistenta" << endl;
}
}while (choise<0 || choise>n);
if(choise!=0)
{
Fig[choise-1]->Move();
}
}
break;
case 4:
{
system("cls");
alb=0;
negru=0;
for(int i=0; i<n; i++)
{
if(Fig[i]!=NULL)
{
if(Fig[i]->GetCollor()==1)
{
alb+=1;
} else if (Fig[i]->GetCollor()==2)
{
negru+=1;
}
}
}
cout << "Total figure pe tabal de sah sunt : " << alb+negru
<< endl;
cout << "Figure albe sunt : " << alb << endl;
cout << "Figure negre sunt : " << negru << endl;
}
break;
case 5:
{
system("cls");
cout << "Denumirea figurilor de sah sunt : " << endl;
cout << "Figuri disponibile : Rege = RG , Regina = Rg, Turn =
T, Nebun = N, Cal = C, Pion = P" << endl;
cout << "Culoarea este evidentiata inaintea numenul figurii
conform notatiei : A = Alb, N = Negru" << endl;
cout << "Exemplu ARG = Rege de culoaea alba ; NRg = Regina de
culoarea neagra" << endl;
system("pause");
for(int j=0; j<8; j++)
{
for(int k=0; k<8;k++)
{
{
TablouSah[j][k]=NULL;
}
}
}
for(int i=0; i<n; i++)
{
if(Fig[i]!=NULL)
{
Fig[i]->RetunrCoord(x, y);
TablouSah[y-1][x-1]=Fig[i];
}
}
for(int i=0; i<9; i++)
{
if(i>0)
{
cout << i << "\t";
}
for(int j=0; j<9; j++)
{
if(i==0 && j==0)
{
cout << "\t";
}
if(i>0 && j>0)
{
if(TablouSah[i-1][j-1]==NULL)
{
cout <<"\t";
} else
{
TablouSah[i-1][j-1]->PrintTBL();
cout <<"\t";
}
}
if(i>0 && j==8)
{
cout << "\n";
}
if(i==0 && j>0)
{
switch (j)
{
case 1 : cout << "A\t"; break;
case 2 : cout << "B\t"; break;
case 3 : cout << "C\t"; break;
case 4 : cout << "D\t"; break;
case 5 : cout << "E\t"; break;
case 6 : cout << "F\t"; break;
case 7 : cout << "G\t"; break;
case 8 : cout << "H\n"; break;
}
}
}
}
}
break;
case 6:
{
system("cls");
cout << "Alegeti o figura de sah din lista propusa : " <<
endl;
for(int i=0; i<n; i++)
{
if(Fig[i]!=NULL) {
cout << "Figura ID = " << i + 1 << endl;
Fig[i]->Print();
cout << endl;
}
}
cout << "0) Exit" << endl;
do
{
cin >> choise;
if(choise<0 || choise>n)
{
cout << "Figura inexistenta" << endl;
}
}while (choise<0 || choise>n);
if(choise!=0)
{
delete Fig[choise-1];
Fig[choise-1]=NULL;
}
}
}
system("pause");
}while(menu!=0);
}

Rezultatele rularii

Concluzie

In urma elaborarii acestui program am invatat regulile de mostenire


,avantajele si dezavantajele acesteia.Am aflat ca Mostenirea este o proprietate prin
care o clasa de obiecte poate fi obtinuta din derivarea unei clase sau a mai multor clase anterior
definite,si astfel am aflat cum se lucreaza cu mostenire.

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