Sunteți pe pagina 1din 14

Ministerul Educaţiei, Culturii și Cercetării al Republicii Moldova

Universitatea Tehnică a Moldovei

Departamentul Informatică și Ingineria Sistemelor

RAPORT
Lucrare de laborator nr.6
la Programarea Orientată pe Obiecte

A efectuat:
st. gr. CR-181 Patras Cristi

A verificat:
lector. univ. Oșovschi M.

Chişinău -2019
Lucrare de laborator nr.6
Tema: Polimorfism. Funcţii virtuale
Scopul lucrării:
 Studierea polimorfismului;
 Studierea principiilor legăturii întîrziate;
 Studierea funcţiilor virtuale;
 Polimorfismul ad-hoc;
 Realizarea funcţiilor virtuale;
 Studierea claselor abstracte.

Varianta 12:
Creaţi clasa abstractă de bază Figure cu funcţia virtuală - aria. Square, Circle, Triangle, Trapeze
în care funcţia dată este predefinită. În funcţia main determinaţi masivul de pointeri la clasa
abstractă, cărei i se atribuie adresele obiectelor claselor derivate. Aria trapezului: S=(a+b)h/2.

Mersul lucrării:
Codul programului:
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;

class Figure
{
int type;
public:
Figure(int type=0);
~Figure();
int fig();
virtual void Change(int type);
virtual void Aria();
};

int Figure::fig()
{
return type;
}

Figure::Figure(int type)
{
this->type=type;
}

Figure::~Figure()
{
}

void Figure::Change(int type)


{
this->type=type;
}

1
void Figure::Aria()
{
}

class Square : virtual public Figure


{
float l;
public:
Square(int type=1, float l=0):Figure(type)
{
this->l=l;
}
~Square();
void Change(float l);
void Aria();
};

Square::~Square()
{
}

void Square::Change(float l)
{
this->l=l;
}

void Square::Aria()
{
float Aria, Perimetrul;
cout << "Figura este : patrat" << endl;
cout << "Lungimea laturii este : " << l << "cm" << endl;
Aria=pow(l,2);
Perimetrul=4*l;
cout << "Aria este : " << Aria << "cm^3"<<endl;
cout << "Perimetrul este : " << Perimetrul<< " cm^3" <<endl;
}

class Circle : virtual public Figure


{
float raza;
public:
Circle(int type=2, float raza=0):Figure(type)
{
this->raza=raza;
}
~Circle();
void Change(float raza);
void Aria();
};

void Circle::Change(float raza)


{
this->raza=raza;
2
}

Circle::~Circle()
{
}

void Circle::Aria()
{
float Aria, Lungime;
cout << "Figura este : cerc" << endl;
cout << "Raza este : " << raza << "cm" << endl;
Aria=3.14*pow(raza, 2);
Lungime=2*3.14*raza;
cout << "Aria este : " << Aria << "cm^3" << endl;
cout << "Lungimea este : " << Lungime << "cm" << endl;
}

class Triangle : virtual public Figure


{
float a, b, c, h;
public:
Triangle(int type=3, float a=0, float b=0, float c=0, float
h=0):Figure(type)
{
this->a=a;
this->b=b;
this->c=c;
this->h=h;
}
void Change(float a, float b, float c, float h);
virtual void Aria();
};

void Triangle::Change(float a, float b, float c, float h)


{
this->a=a;
this->b=b;
this->c=c;
this->h=h;
}

void Triangle::Aria()
{
float Aria, Perimetrul;
cout << "Figura este : triunghi" << endl;
cout << "Lungimea AB : " << a << "cm" << endl;
cout << "Lungimea AC: " << b << "cm" << endl;
cout << "Lungimea BC : " << c << "cm" << endl;
cout << "Inaltimea este : " << h << "cm" << endl;
Aria=(c*h)/2;
Perimetrul=a+b+c;
cout << "Aria este : " << Aria << "cm^3" << endl;
cout << "Perimetrul este : " << Perimetrul << "cm^2" << endl;
}
3
class Trapeze : virtual public Figure
{
float B, b, h, l;
public:
Trapeze(int type=4, float B=0, float b=0, float l=0, float
h=0):Figure(type)
{
this->B=B;
this->b=b;
this->h=h;
this->l=l;
}
void Change(float B, float b, float h, float l);
void Aria();
};

void Trapeze::Change(float B, float b, float h, float l)


{
this->B=B;
this->b=b;
this->h=h;
this->l=l;
}

void Trapeze::Aria()
{
float Aria, Perimetrul;
cout << "Figura este : trapez" << endl;
cout << "Lungimea bazei mici este: " << b << "cm" <<endl;
cout << "Lungimea bazei mari este: " << B << "cm" << endl;
cout << "Lungimea laturii laterale este: " << l << "cm" << endl;
cout << "Inaltimea este: " << h << "cm" << endl;
Aria = (B+b)*h/2;
Perimetrul=b+B+2*l;
cout << "Aria este : " << Aria << "cm^3" << endl;
cout << "Perimetrul este : " << Perimetrul << "cm^2" << endl;
}

int main()
{
int n;
int figura;
int exec;
int alegere;
float a, b, c, l, h;
cout << "Introduceti numarul de figuri pe care doriti sa le
introduceti :" << endl;
cin >> n;
Figure ** A = new Figure*[n];
for(int i=0; i<n; i++)
{
system("cls");
cout << "Figura nr " << i+1 << endl;
4
cout << "Alegeti o figura din lista propusa : " << endl;
cout << "1) Patrat" << endl;
cout << "2) Cerc" << endl;
cout << "3) Triunghi" << endl;
cout << "4) Trapez" << endl;
do
{
cin >> figura;
if(figura<1 || figura>4)
{
cout << "Depasirea limitei propuse" << endl;
}
else
{
switch(figura)
{
case 1 :
{
cout << "Introduceti latura patratului" <<
endl;
cin >> l;
A[i] = new Square(1, l);
}
break;
case 2 :
{
cout << "Introduceti raza cercului" << endl;
cin >> l;
A[i] = new Circle(2, l);
}
break;
case 3 :
{
cout << "Introduceti laturile a triunghiului
BAC" << endl;
cout << "latura BA" << endl;
cin >> a;
cout << "latura AC" << endl;
cin >> b;
cout << "latura BC" << endl;
cin >> c;
cout << "Introduceti inaltimea triunghiului" <<
endl;
cin >> h;
A[i] = new Triangle(3, a, b, c, h);
}
break;
case 4 :
{
cout << "Introduceti baza mare" << endl;
cin >> a;
cout << "Introduceti baza mica " << endl;
cin >> b;
cout << "Introduceti lungimea laturii laterale"
5
<< endl;
cin >> l;
cout << "Introduceti inaltimea trapezului" <<
endl;
cin >> h;
A[i] = new Trapeze(4, a, b, l, h);
}
break;
}
}
}while(figura<1 || figura>4);
}
do
{
system("cls");
cout << "\t\t>>>Menu<<<\t\t" << endl;
cout << "1) Afisarea figurilor geommetrice" << endl;
cout << "2) Schimbarea datelor unei figuri geometrice" << endl;
cout << "3) Schimbarea unei figuri geometrice din una in alta"
<< endl;
cout << "0) Exit" << endl;
cin >> exec;
if(exec<0 || exec >3)
{
cout << "Dipasirea limitei propuse" << endl;
} else
{
switch (exec)
{
case 1:
{
system("cls");
for(int i=0; i<n; i++)
{
cout << "Figura nr " << i+1 << endl;
A[i]->Aria();
cout << endl;
}
}
break;
case 2:
{
system("cls");
cout << "Alegi o figura din cele propse "<< endl;
system("pause");
system("cls");
for(int i=0; i<n; i++)
{
cout << "Figura nr " << i+1 << endl;
A[i]->Aria();
cout << endl;
}
do
{
6
cin >> alegere;
alegere=alegere-1;
if(alegere<0||alegere>n-1)
{
cout << "Depasirea limitei propuse" <<
endl;
}
else
{
switch(A[alegere]->fig())
{
case 1 :
{
cout << "Introduceti latura
patratului" << endl;
cin >> l;
A[alegere] = new Square(1, l);
}
break;
case 2 :
{
cout << "Introduceti raza cercului"
<< endl;
cin >> l;
A[alegere] = new Circle(2, l);
}
break;
case 3 :
{
cout << "Introduceti laturile a
triunghiului BAC" << endl;
cout << "latura BA" << endl;
cin >> a;
cout << "latura AC" << endl;
cin >> b;
cout << "latura BC" << endl;
cin >> c;
cout << "Introduceti inaltimea
triunghiului" << endl;
cin >> h;
A[alegere] = new Triangle(3, a, b,
c, h);
}
break;
case 4 :
{
cout << "Introduceti baza mare" <<
endl;
cin >> a;
cout << "Introduceti baza mica " <<
endl;
cin >> b;
cout << "Introduceti lungimea
laturii laterale" << endl;
7
cin >> l;
cout << "Introduceti inaltimea
trapezului" << endl;
cin >> h;
A[alegere] = new Trapeze(4, a, b,
l, h);
}
break;
}
}
}while (alegere<0||alegere>n-1);
}
break;
case 3:
{
system("cls");
cout << "Alegi o figura din cele propse "<< endl;
system("pause");
system("cls");
for(int i=0; i<n; i++)
{
cout << "Figura nr " << i+1 << endl;
A[i]->Aria();
cout << endl;
}
do
{
cin >> alegere;
alegere=alegere-1;
if(alegere<0||alegere>n-1)
{
cout << "Depasirea limitei propuse" <<
endl;
}
else
{
system("cls");
cout << "Alegeti o figura din lista propusa
: " << endl;
cout << "1) Patrat" << endl;
cout << "2) Cerc" << endl;
cout << "3) Triunghi" << endl;
cout << "4) Trapez" << endl;
do
{
cin >> figura;
if(figura<1 || figura>4)
{
cout << "Depasirea limitei propuse"
<< endl;
}
else
{
switch(figura)
8
{
case 1 :
{
cout << "Introduceti latura
patratului" << endl;
cin >> l;
A[alegere] = new Square(1,
l);
}
break;
case 2 :
{
cout << "Introduceti raza
cercului" << endl;
cin >> l;
A[alegere] = new Circle(2,
l);
}
break;
case 3 :
{
cout << "Introduceti
laturile a triunghiului BAC" << endl;
cout << "latura BA" <<
endl;
cin >> a;
cout << "latura AC" <<
endl;
cin >> b;
cout << "latura BC" <<
endl;
cin >> c;
cout << "Introduceti
inaltimea triunghiului" << endl;
cin >> h;
A[alegere] = new
Triangle(3, a, b, c, h);
}
break;
case 4 :
{
cout << "Introduceti baza
mare" << endl;
cin >> a;
cout << "Introduceti baza
mica " << endl;
cin >> b;
cout << "Introduceti
lungimea laturii laterale" << endl;
cin >> l;
cout << "Introduceti
inaltimea trapezului" << endl;
cin >> h;
A[alegere] = new Trapeze(4,
9
a, b, l, h);
}
break;
}
}
}while(figura<1 || figura>4);
}
}while (alegere<0||alegere>n-1);
}
break;
case 0 :
{
for(int i=0; i<n; i++)
{
delete A[i];
}
delete []A;
}
break;
}
}
system("pause");
}while (exec!=0);
return 0;
}

Rezultatele rulării și testării programului :


La startarea programului acesta intreabă câte obiecte să creeze programul.

Alegem spre exemplu crearea a 4 obiecte si setam valorile.


După care programa afișează o listă de obțiuni, care permit manipularea cu prorgamul.

10
În caz ca dorim sa alegem o figurra din lista ne existentă. Programul nu ne va permite.

Dupa introducerea datelor, programul permite utilizatorului manipularea cu acesta prin


intermediul unui meniu.

1. Permite afisarea tutudor datelor, si automat alcularea Ariilorm lungimii și Parametrului


figurilor geometrice.

11
2. Permite Schimbarea datelor unei figuri. In acest caz in care figura reprezinta o adresa din
tabloul de adrese, va fi necesar apilarea distructorului și constructorului pentru crearea unui
obiect nou. Tipul figurii este returnat de functia din clasa principal Figura.

In caz ca alegem o figura inexistenta ce nu apartine listei de figure. Programul nu ne va permite sa


schimbam datele acestuia

Alegem spre exemplu figura nr 2. Ce reprezinta un cerc, si schimbam raza acestuia cu valoarea de
12.

3. Permite schimbarea figurii existente cu alta. Astfel in log de figura nr 1, ce reprezintă un


patrat. Creem un cerc, cu raza de 34 cm.

12
1) Permite eliberarea memoriei, prin apelarea distructurului, care distruge toate obiectele
create.
Concluzie :
1. Au fost obţinute noi cunoștințe spre elaborarea unui program în limbajul C++, cu folosirea
diferitor tipuri de constructori și distructori. Cât și crearea unui Polimorfism, cu functii virtuale.
2. Verificarea și validarea rezultatelor obţinute confirmă că programul elaborat lucrează corect.
3. Au fost folosite noi posibilități de manipulare cu funcțiile claselor, care în acest caz funcția
Aria, este la fiecare clasa derivată clasei Figură. Astfel din clasa de baza Figură, aceasta conține
termenul de virtual. Ceea ce ne permite sa apelăm funcția din clasa figurii derivată prin
intermediul adresei figurii create.
4. Avantajul programului elaborat este simplicitatea implementării algoritmului, ce permite
calculul rapid al cerințelor. Elaborarea sistemului ce nu face crash la program. Spre manipularea
mai ușoarpă cu programul, utilizatorului îi sunt dispuse o serie de meniuri și submeniuri, pentru a
executa cu ușurință obțiunea dorită de el.
5. Programul este dispus de o ierarhie de clase, care mostenesc toti parametrii, care ar putea fi
comuni pentru toate clasele. Ceea ce permite ca nivelul de randuri a programului sa fie mai redus,
cât și simplitatea execuției cerințelor progamului.

13

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