Programarea şi utilizarea calculatoarelor...Programarea şi utilizarea calculatoarelor Author User...

Preview:

Citation preview

Programare orientată peobiecte

# 10

Adrian Runceanuwww.runceanu.ro/adrian

2017

C++Probleme recapitulative (partea I)

copyright@www.adrian.runceanu.ro

Problema 1

Exemplu de redefinire a unei functii care nu apeleaza functia corespunzatoare din clasa de baza.

Cele doua clase NumarComplex, clasa de baza si NumarReal, clasa derivata au definite cate o functie membru afisare(). In clasa derivata este redefinita fara a apela varianta din clasa de baza.

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

copyright@www.adrian.runceanu.ro

Problema 1

#include <iostream.h>

// clasa de baza NumarComplexclass NumarComplex{

protected:double re, im;

public:NumarComplex(double, double);void afisare();

};

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

copyright@www.adrian.runceanu.ro

Problema 1

NumarComplex::NumarComplex(double RE, double IM){

re = RE;im = IM;

}

void NumarComplex::afisare(){

cout<<"\n Numarul complex este : "<< re << "+" << im<<"*i";}

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

copyright@www.adrian.runceanu.ro

Problema 1

// clasa Numar Real derivata din clasa NumarComplexclass NumarReal:public NumarComplex{

public:NumarReal(double RR):NumarComplex(RR,0.0) { }void afisare();

};

void NumarReal::afisare(){

cout<<"\n Numarul real este : "<<re;}

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

copyright@www.adrian.runceanu.ro

Problema 1

int main(){

NumarReal r = NumarReal(15);NumarComplex z = NumarComplex(-1,3);r.afisare();z.afisare();

}

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

copyright@www.adrian.runceanu.ro

Problema 2

Sa se defineasca o clasa sir care sa se utilizeze la instantierea sirurilor de caractere.Sa se scrie un program care realizeaza urmatoarele operatii asupra obiectelor de tip sir:1) initializare2) citire de siruri de caractere de la tastatura3) copiere de obiecte de tip sir4) atribuiri de obiecte de tip sir5) afisari de siruri de caractere din compunerea

obiectelor de tip sir.

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

copyright@www.adrian.runceanu.ro

Problema 2

#include <iostream.h>#include <stdio.h>#include <string.h>class sir{

// date membru protejate(private)char *psir; // pointer catre zona de memorie in

care se pastreaza caracterele siruluiint lung; // lungimea sirului(numarul de

caractere)

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

copyright@www.adrian.runceanu.ro

Problema 2

// functii membru neprotejatepublic:

sir(char *s); /* constructor pt. intializarea obiectului cu pointerul spre sirul de caractere; acesta se pastreaza in memoria heap */

sir(int nrcar=70); // constructor care rezerva zona de memorie in memoria heap si pastreaza sirul vid

sir(const sir&); // constructor de copiere~sir(); //destructorint retlung(); //returneaza lungimea siruluivoid afsir(); //afiseaza sirul de caractereint citsir(); //citeste un sir de caractere

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

copyright@www.adrian.runceanu.ro

Problema 2

bool atribsir(sir *s); /* transfera sirul spre care pointeaza s in zona rezervata pentru sirul obiectului curent daca nu exista zona suficienta, se truncheaza sirul spre care pointeaza s si se returneaza valoarea false; in caz contrar se returneaza true */};sir::sir(char *s){

lung=strlen(s);psir=new char[lung+1];strcpy(psir,s);

}sir::sir(int dim){

lung=dim;psir=new char[lung+1];*psir='\0';

}

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

copyright@www.adrian.runceanu.ro

Problema 2sir::sir(const sir& s){

lung=s.lung;psir=new char[lung+1];strcpy(psir,s.psir);

}sir::~sir(){

delete psir;}int sir::retlung(){

return lung;}void sir::afsir(){

cout<<psir<<endl;}10.12.2017 P.O.O. - limbajul C++ (laborator) 11

copyright@www.adrian.runceanu.ro

Problema 2

/* citeste un sir de caractere de la tastatura si-l pastreaza in zona heap rezervatapentru obiectul current; returneaza 0 la sfarsit de fisier, -1 la trunchierea sirului citit, 1, altfel */int sir::citsir(){

char temp[255];if(gets(temp)==0) return 0;strncpy(psir,temp,lung);*(psir+lung)='\0';if(strlen(temp) > lung ) return 1;else return 1;

}bool sir::atribsir(sir* s){

strncpy(psir,s->psir,lung);if(strlen(s->psir) > lung ) return false;else return true;

}

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

copyright@www.adrian.runceanu.ro

Problema 2

int main(void){

sir sir1=("Limbajul C++ este un C mai bun");sir sir2=("Limbajul C++ suporta stilul de programare:\n\

- prin abstractizarea datelor;\n\- orientata spre obiecte");

sir sir3; // instantiere fara initializare; sir3 contine sirul vidsir sir4=sir1; //instantiere folosind constructorul de copiere//afisarea obiectelor instantiatecout<<"sir1 : "; sir1.afsir();cout<<"sir2 : "; sir2.afsir();cout<<"sir3 : "; sir3.afsir();cout<<"sir4 : "; sir4.afsir();

10.12.2017 P.O.O. - limbajul C++ (laborator) 13

copyright@www.adrian.runceanu.ro

Problema 2

// atribuiri de siruri

cout<<"========== Trunchieri ==========="<<endl;

if(sir3.atribsir(&sir1) == false) cout<<"trunchiere la

atribuire"<<endl;

sir3.afsir();

if(sir3.atribsir(&sir2) == false) cout<<"trunchiere la

atribuire"<<endl;

sir3.afsir();

}

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

copyright@www.adrian.runceanu.ro

Problema 3

Se consideră următoarea secvenţă de program, în care este definită clasa vector. Să se adauge clasei vector o metodă prin care să se poată calcula minimul elementelor unui obiect de tip vector.

Codul sursa se va introduce exact cum este prezentat mai jos.

Se vor completa cu instructiuni noi numai in zonele (1), (2) si (3).

10.12.2017 P.O.O. - limbajul C++ (laborator) 15

copyright@www.adrian.runceanu.ro

Problema 3

#include<iostream.h>class vector{

private:int *a; int nr_elemente;

public:vector(); // constructor implicitvector(int *vector, int nr); // constructor de copiere~vector(); // destructorvoid afisare(); // afisarea elementelor unui vector

/* (1) se adauga definitia metodei specificate in enunt

*/};10.12.2017 P.O.O. - limbajul C++ (laborator) 16

copyright@www.adrian.runceanu.ro

Problema 3

vector::vector(int *vector, int nr) // constructor de copiere{

nr_elemente = nr;a = new int[nr_elemente];for(int i=0; i < nr_elemente; i++) a[i] = vector[i];

}

vector::~vector() // destructor{

cout<<"se elibereaza "<< nr_elemente * sizeof(int)<<" octeti"<<endl;

delete[ ] a;}

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

copyright@www.adrian.runceanu.ro

Problema 3

void vector::afisare(){

for(int i=0; i < nr_elemente; i++) cout<<a[i]<<" ";cout<<endl;

}

/*(2) Se adauga definitia(implementarea) metodei

specificate in enunt*/

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

copyright@www.adrian.runceanu.ro

Problema 3

int main(void){

int nr_elemente_x, nr_elemente_y;int x[100], y[100];for(int i=0; i<nr_elemente_x; i++) cin>>x[i];for(int j=0; j<nr_elemente_y; j++) cin>>y[j]; vector v1(x, nr_elemente_x), v2(y, nr_elemente_y);cout<<"Vectorul v1 = "; v1.afisare();cout<<"Vectorul v2 = "; v2.afisare();/*(3) Secventa de instructiuni care sa rezolve cerinta problemei

*/}

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

copyright@www.adrian.runceanu.ro

Probleme propuse spre rezolvare

Problema 4. Să se adauge clasei vector (prezentata la problema 3) o metodă prin care să se poată calculanumerele palindrom dintre elementele unui obiect de tip vector.

Problema 5. Să se adauge clasei vector (prezentata la problema 3) o metodă prin care să se poată calculanumerele perfecte dintre elementele unui obiect de tip vector. (Reamintim că un număr se numeşte perfect, dacă este egal cu suma divizorilor săi, mai puţin el însuşi).10.12.2017 P.O.O. - limbajul C++ (laborator) 20

copyright@www.adrian.runceanu.ro

Probleme propuse spre rezolvare

Problema 6. Să se adauge clasei vector (prezentata la problema 3) o metodă prin care să se poată calculanumarul elementelor pozitive si numarul elementelornegative unui obiect de tip vector.

Problema 7. Să se adauge clasei vector (prezentata la problema 3) o metodă prin care să se poată calculasuma cifrelor pentru fiecare element al unui obiect de tip vector.

10.12.2017 P.O.O. - limbajul C++ (laborator) 21

copyright@www.adrian.runceanu.ro

Probleme propuse spre rezolvare

Realizaţi o clasă multime, care implementează operaţiile asupra unor mulţimi de valori.Clasa multime va avea implementate: funcţiile constructor, destructor şi operaţiile: adăugare element, eliminare element,

reuniune (operator +), intersecţie (operator *), diferenţa (operator-), test apartenenţă, test incluziune mulţimi (operator<), operator<<, operator>>.

Se va construi un program care să exemplifice folosirea obiectelor de tipul definit şi a metodelor definite.

10.12.2017 P.O.O. - limbajul C++ (laborator) 22

copyright@www.adrian.runceanu.ro

Probleme propuse spre rezolvare

Scrieţi o clasă Cerc care conţine o singur variabila membru, de tip int* şi implementaţi un constructor implicit, un constructor de copiere, un constructor explicit cu un parametru de tip int, un destructor, metode de acces la data membru şi metodele de calcul arie şi lungime cerc.

10.12.2017 P.O.O. - limbajul C++ (laborator) 23

class Cerc{private:

int* raza;public:

Cerc();Cerc(const Cerc&);Cerc(int);~Cerc();void setRaza(int);int getRaza();float aria();float lungime();

}

copyright@www.adrian.runceanu.ro

programming quotes

“Copy and paste is a design error.” - David Parnas

“Before software can be reusable it first has to be usable.” - Ralph Johnson

“First, solve the problem. Then, write the code.” -John Johnson

10.12.2017 P.O.O. - limbajul C++ (laborator) 24

Recommended