Documente Academic
Documente Profesional
Documente Cultură
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()
{
}
1
void Figure::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;
}
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;
}
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::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;
}
10
În caz ca dorim sa alegem o figurra din lista ne existentă. Programul nu ne va permite.
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.
Alegem spre exemplu figura nr 2. Ce reprezinta un cerc, si schimbam raza acestuia cu valoarea de
12.
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