POO: probleme rezolvate

19
Programare orientat ă pe obiecte # 7 Adrian Runceanu www.runceanu.ro/adrian 2016 C++ Proprietati ale mecanismului de mostenire

Transcript of POO: probleme rezolvate

Page 1: POO: probleme rezolvate

Programare orientată peobiecte

# 7

Adrian Runceanuwww.runceanu.ro/adrian

2016

C++Proprietati ale mecanismului de mostenire

Page 2: POO: probleme rezolvate

[email protected]

Lucrarea de laborator nr. 7

1. Transmiterea parametrilor în mecanismul de moştenireForma generală a declaraţiei constructorului este următoarea:Derivata constructor(lista_argumente): baza1(lista_argumente1) : baza2(lista_argumente2) .... : bazaN(lista_argumenteN) { // corpul constructorului derivatei}În declaraţia precedentă, baza1 până la bazaN reprezintă clasele de bază pentru clasa derivată, iar lista_argumente este formată din lista_argumente1, ..., lista_argumenteN, plus argumentele necesareconstructorului clasei Derivata

23.11.2016 P.O.O. - limbajul C++ (laborator) 2

Page 3: POO: probleme rezolvate

[email protected]

Lucrarea de laborator nr. 7

2. Moştenirea pe mai multe niveluri

Aşa cum s-a vazut moştenirea multiplă constă înfolosirea a două sau mai multe clase la bază pentru a deriva o nouă clasă.

Moştenirea pe mai multe nivele, are loc la derivareaunei clase dintr-o clasă de bază care, la rândul ei estederivată din altă clasă.

23.11.2016 P.O.O. - limbajul C++ (laborator) 3

Page 4: POO: probleme rezolvate

[email protected]

Lucrarea de laborator nr. 7

3. Conflictele de nume între clasele de bază şi cele derivate

Atunci când se derivează o nouă clasă din una sau maimulte clase de bază, este posibil ca numele unuimembru din clasa derivată să fie identic cu numele unuimembru din una sau mai multe clase de bază. Atuncicând apare un astfel de conflict, C++ utilizează numelemembrului din clasa derivată

23.11.2016 P.O.O. - limbajul C++ (laborator) 4

Page 5: POO: probleme rezolvate

[email protected]

Diagrama UML

1. Clasa Punct

23.11.2016 P.O.O. - limbajul C++ (laborator) 5

Punct

(#) double fi, teta, ro;(+) double x,y,z;

(+) punct()(+) punct (double fic, double tetac, double roc)(+) ~punct()(+) void cartezian()(+) void afisare_coordonate_polare()(+) void afisare_coordonate_carteziene()friend class Segment

Page 6: POO: probleme rezolvate

[email protected]

Diagrama UML

2. Clasa Segment

23.11.2016 P.O.O. - limbajul C++ (laborator) 6

Segment

(-) double d;Punct P1;Punct P2;

(+) segment(double f1, double teta1, double ro1, double f2, double teta2, double ro2) : P1(fi1, teta1, ro1), P2(fi2, teta2, ro2)(+) ~segment()(+) void distanta()(+) void afisare_segment()

Page 7: POO: probleme rezolvate

[email protected]

Lucrarea de laborator nr. 7

Problema nr. 1

1. Să se implementeze o clasă Punct care conţine 6 date de tip privat:

- 3 reprezintă coordonatele polare ale punctuluiîn spaţiu (unghiurile, şi distanţa, aşa cum aratăfigura următoare):

23.11.2016 P.O.O. - limbajul C++ (laborator) 7

Page 8: POO: probleme rezolvate

[email protected]

Lucrarea de laborator nr. 7

Problema nr. 1 (continuare)

iar 3 sunt coordonatele carteziene ale punctului(x, y şi z).

Constructorul clasei va iniţializa cele treicoordonate polare, iar clasa va avea o funcţie de calcul a coordonatelor carteziene ştiind căformulele de calcul sunt următoarele:

23.11.2016 P.O.O. - limbajul C++ (laborator) 8

sin

sincos

coscos

z

y

x

Page 9: POO: probleme rezolvate

[email protected]

Lucrarea de laborator nr. 7

Solutie:

#include <iostream>#include<math.h>using namespace std;

class Punct {protected:double fi, teta, ro;double x, y, z;

public:Punct() {x=0; y=0; z=0;};

23.11.2016 P.O.O. - limbajul C++ (laborator) 9

Page 10: POO: probleme rezolvate

[email protected]

Lucrarea de laborator nr. 7

Punct(double fic,double tetac,double roc) { cout<<"\n s-a apelat constructorul clasei punct";fi=fic;teta=tetac;ro=roc;

}

~Punct() {cout<<"\n s-a apelat destructorul clasei punct";

}

23.11.2016 P.O.O. - limbajul C++ (laborator) 10

Page 11: POO: probleme rezolvate

[email protected]

Lucrarea de laborator nr. 7

void cartezian(){

x=ro*cos(teta)*cos(fi);y=ro*cos(teta)*sin(fi);z=ro*sin(teta);

}

void afisare_coordonate_polare(){

cout<<"\n fi="<<fi;cout<<"\n teta="<<teta;cout<<"\n ro="<<ro<<endl;

}23.11.2016 P.O.O. - limbajul C++ (laborator) 11

Page 12: POO: probleme rezolvate

[email protected]

Lucrarea de laborator nr. 7

void afisare_coordonate_carteziene(){

cout<<"\n x="<<x;cout<<"\n y="<<y;cout<<"\n z="<<z<<endl;

}

friend class Segment;}; // sfarsit definire clasa Punct

23.11.2016 P.O.O. - limbajul C++ (laborator) 12

Page 13: POO: probleme rezolvate

[email protected]

Lucrarea de laborator nr. 7

class Segment {private:

double d;Punct P1;Punct P2;

public:Segment(double fi1, double teta1, double ro1,

double fi2, double teta2, double ro2): P1(fi1, teta1, ro1), P2(fi2, teta2, ro2)

{ cout<<"\n s-a apelat constructorul claseisegment";

}23.11.2016 P.O.O. - limbajul C++ (laborator) 13

Page 14: POO: probleme rezolvate

[email protected]

Lucrarea de laborator nr. 7

~Segment() {cout<<"\n s-a apelat destructorul clasei segment";

}

void distanta(){

P1.Cartezian();P2.Cartezian();d=sqrt(pow((P2.x-P1.x),2)+pow((P2.y-

P1.y),2)+pow((P2.z-P1.z),2));}

23.11.2016 P.O.O. - limbajul C++ (laborator) 14

Page 15: POO: probleme rezolvate

[email protected]

Lucrarea de laborator nr. 7void afisare_segment(){

cout<<"\n capetele segmentului in coord. polare:";cout<<"\n punctul P1:";P1.afisare_coordonate_polare();cout<<"\n punctul P2:";P2.afisare_coordonate_polare();cout<<"\n capetele segmentului in coord. carteziene:";cout<<"\n punctul P1:";P1.afisare_coordonate_carteziene();cout<<"\n punctul P2:";P2.afisare_coordonate_carteziene();cout<<"\n lungimea segmentului este "<<d<<endl;

}}; // sfarsit definire clasa Segment23.11.2016 P.O.O. - limbajul C++ (laborator) 15

Page 16: POO: probleme rezolvate

[email protected]

Lucrarea de laborator nr. 7

int main(){

cout<<"\n primul segment:";Segment s1(0,0,1,3.1416,0,1);s1.distanta();s1.afisare_segment();

cout<<"\n al doilea segment:";Segment s2(0,3.1416,2,3.1416,0,3);s2.distanta();s2.afisare_segment();return 0;

}23.11.2016 P.O.O. - limbajul C++ (laborator) 16

Page 17: POO: probleme rezolvate

[email protected]

23.11.2016 P.O.O. - limbajul C++ (laborator) 17

Page 18: POO: probleme rezolvate

[email protected]

Lucrarea de laborator nr. 7

Problema propusa spre rezolvare

2. Să se implementeze o clasă Punct care să conţină două date de tip privat x şi y ce reprezintă coordonatele carteziene în plan ale unui punct, o funcţie constructor care iniţializează cele două coordonate şi o funcţie de afişare a coordonatelor. Să se creeze o clasă Triunghi de tip friend cu clasa Punct, care să conţină trei elemente de tipul Punct ce reprezintă vârfurile unui triunghi. Să se creeze o funcţie care să stabilească dacă triunghiul este echilateral, isoscel sau oarecare şi o funcţie care să calculeze perimetrul triunghiului.

23.11.2016 P.O.O. - limbajul C++ (laborator) 18

Page 19: POO: probleme rezolvate

[email protected]

“First, solve the problem. Then, write the code.”

- John Johnson

23.11.2016 P.O.O. - limbajul C++ (laborator) 19