POO: probleme rezolvate

Post on 02-Feb-2017

1.306 views 29 download

Transcript of POO: probleme rezolvate

Programare orientată peobiecte

# 7

Adrian Runceanuwww.runceanu.ro/adrian

2016

C++Proprietati ale mecanismului de mostenire

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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()

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

- John Johnson

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