lab6.docx
Transcript of lab6.docx
7/18/2019 lab6.docx
http://slidepdf.com/reader/full/lab6docx 1/8
Universitatea Tehnica a MoldoveiCatedra Automatica si Tehnologii Informationale
Disciplina: Programarea in limbajul C++
AP!T"ucrare de laborator #r$%
Tema: Polimor&sm$ 'unc(ii virtuale
A efectuat : studentul grupei I)*M,-, PîrliciAndrian
A veri&cat:M.Balan
Chisinau ./,0
7/18/2019 lab6.docx
http://slidepdf.com/reader/full/lab6docx 2/8
)copul si sarcina lucrarii:
)tudierea polimor&smului1
)tudierea principiilor leg2turii t3r4ii1
)tudierea func(iilor virtuale1
Polimor&smul ad-hoc1
eali4area func(iilor virtuale1
)tudierea claselor abstracte$
Varianta 10
Crea(i clasa abstract2 de ba42 Figure cu func(ia virtual2 5 aria suprafe(ei$ Crea(i
clasele derivate paralelipiped6 tetraedru6 sfer2 7n care func(ia dat2 este prede&nit2$
Aria suprafe(ei paralelipipedului: S=xyz $
Aria suprafe(ei sferei: S=4π r 2$
Aria suprafe(ei tetraedrului: S8a^(2 √ 3 )
, Indicatii teoretice:
Polimor&smului ii este caracteristic mecanismul de transmitere a mesajului$ Datele din
clasa de ba4a sunt preluate de la clasele subordonate$ Clasa polimorfa e socotita clasa
care are macar o functie virtuala pura$ Insasi functia data si are rolul de a transmite
mesajele$
'unctia virtuala:
Virtual void Suma()=0;Pe cind functiile obisnuite sunt prede&nite fara egalarea cu 4ero si nu sunt insotite de
cuvintul cheie Virtual si intre parante4e este introdus tipul parametrilor folositi de
functie:
void Suma(it);
eali4area &4ica a functiilor virtuale are loc prin intermediul claselor subordonate care
reali4ea4a calculul functiei caracteristice si returnea4a in clasa de ba4a re4ultatul primit$
Insa este necesar ca clasa data sa &e declarata ca mostenitoare a clasei de ba4a$
cla!! S"era# $u%lic Sur"ace&
dou%le r;
$u%lic#
S"era();
S"era(dou%le);
'S"era();
void arie();;
void S"era##arie()&
dou%le !;
!=4*$i*$o+(r,2);
cout.Su$ra"ata !"erei e!te .!; retur ;
Unde arie() pre4inta clasa de ba4a$
"egatura tir4ie pre4inta mecanismul care permite de&nirea tipului dinamic 7ntimpul e9ecut2rii programului6 dar nu 7n timpul compil2rii$ Un mecanism asem2n2tor
7/18/2019 lab6.docx
http://slidepdf.com/reader/full/lab6docx 3/8
sunt descriptorii de &iere6 aa cum &ierele se deschid 7n timpul e9ecut2riiprogramului6 dar nu 7n timpul compil2rii$ Acest mecanism este ba4a polimor&smului6aa cum reali4ea42 func(iile virtuale$
/icludeio!treamh1
cla!! imal&
$u%lic#
void Say()& cout.333.;
;
cla!! 5og# $u%lic imal&
$u%lic#
void Say()& cout.6V.;
;
cla!! 7at# $u%lic imal&
$u%lic#
void Say()& cout.89:.;
;
void FuSay(imal a)& aSay();
void mai()&
imal a;
5og d;
7at c;
FuSay(a);
FuSay(d);
FuSay(c);
Polimor&smul adhog repre4inta polimor&smul de suprascriere a functiilor cu
schimbarea parametrilor variabilelor$
Clasa abstracta repre4inta clasa care nu are variabila prede&nita6 insa variabila sa este
prede&nita in clasa &ica6 iar clasa obisnuita are parametrii prede&niti initial$
cla!! Sha$e &
$u%lic#
virtual void dra+() = 0; ;
. eali4area sarcinii:
-$, Initial declar o clasa de ba4a abstracta cu o functie virtuala pura:
cla!! Sur"ace&
$u%lic#
virtual void arie()=0;
;
Apoi declar clasele &ice mostenitoare in care se introduce parametrii pentru calculul
ariei &gurilor necesare$ Pentru clasa Cub se introduce acele trei laturi ale
paralilepipedului$ Apoi se efectuia4a functia in care se calculea4a aria dupa care se
returnea4a re4ultatul obtinut la clasa de ba4a
cla!! 7u%# $u%lic Sur"ace&
dou%le a, %, c;
7/18/2019 lab6.docx
http://slidepdf.com/reader/full/lab6docx 4/8
$u%lic#
7u%();
7u%(dou%le ,dou%le ,dou%le ) ;
'7u%();
void arie();
;
7u%##7u%()&a=0,%=0,c=0; 7u%##7u%(dou%le a,dou%le %,dou%le c)#a(a),%(%),c(c)&
7u%##'7u%()&a=0;%=0;c=0;
void 7u%##arie()&
dou%le !;
!=a*%*c;
cout.Su$ra"ata cu%ului e!te .!;
retur ;
)i in re4ultat obtinem:
In mod similar se efectuia4a si cu clasele celelalte:
cla!! S"era# $u%lic Sur"ace&
dou%le r;
$u%lic#
S"era();
S"era(dou%le);
'S"era();
void arie();
;
S"era##S"era()&r=0;
S"era##S"era(dou%le r)#r(r)&
S"era##'S"era()&r=0;
void S"era##arie()&
dou%le !;
!=4*$i*$o+(r,2);
cout.Su$ra"ata !"erei e!te .!;
retur ;
e4ultatul obtinut:
7/18/2019 lab6.docx
http://slidepdf.com/reader/full/lab6docx 5/8
)i in ca4ul functiei tetraedru avem:
cla!! etraedru# $u%lic Sur"ace&
dou%le a;
$u%lic#
etraedru();
etraedru(dou%le);
'etraedru();
void arie();
;
etraedru##etraedru()&a=0;
etraedru##etraedru(dou%le a)#a(a)&
etraedru##'etraedru()&a=0;
void etraedru##arie()&
dou%le !;
!=$o+(a,(2*!<rt()));
cout.Su$ra"ata tetraedrului e!te .!;
retur ;
e4ultatul obtinut:
In functia mai;< are loc atribuirea parametrilor obtinuti de la clasele &ice la clasa de
ba4a
Sur"ace *!";)f repre4inta valoarea functiei virtuale
cout.9trodu raza !"erei .edl;
ci11a;
S"era !r(a);
!"=>!r;
!"-1arie();
Conclu4ie:
In urma efectuarii lucrarii date de laborator am determinat ca pentru a efectua o clasa
7/18/2019 lab6.docx
http://slidepdf.com/reader/full/lab6docx 6/8
ce necesita re4olvarea unei functii universale6 ce ar trebui sa returne4e re4ultate ce
depind de parametri diferiti6 se poate folosi polimor&smul ce este un mecanism mai
=e9ibil si permite de utili4a mai optim timpul si volumul codului sursa$
*ibliogra&e:
, Conspect C++ prof$ M$*alan
. I#DUMA D> "A*!AT! ?"UCA>A D> "A*!AT! @% Besursa electronica
Anexa
Codul sursa a programului:
include EiostreamF
include Econio$hFinclude Estdlib$hF
include Emath$hF
de&ne pi -$,0
using namespace std1
class )urfaceG
public:
virtual void arie;<8/1H1
class Cub: public )urfaceG
double a6 b6 c1
public:
Cub;<1
Cub;double 6double 6double < 1
Cub;<1 void arie;<1
H1
Cub::Cub;<Ga8/6b8/6c8/1H
Cub::Cub;double a6double b6double c<:a;a<6b;b<6c;c<GH
Cub::Cub;<Ga8/1b8/1c8/1H
void Cub::arie;<G
double s1
s8aJbJc1
coutEEK)uprafata cubului este KEEs1
return 1H
7/18/2019 lab6.docx
http://slidepdf.com/reader/full/lab6docx 7/8
class )fera: public )urfaceG
double r1
public:
)fera;<1
)fera;double<1
)fera;<1 void arie;<1
H1
)fera::)fera;<Gr8/1H
)fera::)fera;double r<:r;r<GH
)fera::)fera;<Gr8/1H
void )fera::arie;<G
double s1 s80JpiJpoL;r6.<1
coutEEK)uprafata sferei este KEEs1
return 1H
class Tetraedru: public )urfaceG
double a1
public:
Tetraedru;<1 Tetraedru;double<1
Tetraedru;<1
void arie;<1
H1
Tetraedru::Tetraedru;<Ga8/1H
Tetraedru::Tetraedru;double a<:a;a<GH
Tetraedru::Tetraedru;<Ga8/1H
void Tetraedru::arie;<G double s1
s8poL;a6;.Jsrt;-<<<1
coutEEK)uprafata tetraedrului este KEEs1
return 1
H
void main ;<G
int com6a6b6c1 )urface Jsf1
d:
7/18/2019 lab6.docx
http://slidepdf.com/reader/full/lab6docx 8/8
coutEEKAlege optiunea KEEendlEEendl1
coutEEKB,Aria cubului KEEendl1
coutEEKB.Aria sferei KEEendl1
coutEEKB-Aria tetraedrului KEEendl1
cinFFcom1
if;com88,<G
coutEEKIntrodu lungimile celor trei muchii a paralilepipedului KEEendl1cinFFaFFbFFc1
Cub cb;a6b6c<1
sf8Ncb1
sfFarie;<1H
else if;com88.<G
coutEEKIntrodu ra4a sferei KEEendl1
cinFFa1
)fera sr;a<1 sf8Nsr1
sfFarie;<1H
else if;com88-<G
coutEEKIntrodu lungimea muchiei tetraedrului KEEendl1
cinFFa1
Tetraedru tt;a<1
sf8Ntt1
sfFarie;<1Helse GcoutEEK!ptiune gresita OOO KEEendl1
getch;<1
clrscr;<1
goto d1H
getch;<1
H