lab6.docx

8
7/18/2019 lab6.docx http://slidepdf.com/reader/full/lab6docx 1/8 Universitatea Tehnica a Moldovei Catedra 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îrlici Andrian A veri&cat: M.Balan Chisinau ./,0

Transcript of lab6.docx

Page 1: 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

Page 2: lab6.docx

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

Page 3: lab6.docx

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;

Page 4: lab6.docx

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:

Page 5: lab6.docx

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

Page 6: lab6.docx

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

Page 7: lab6.docx

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:

Page 8: lab6.docx

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