24
Programare orientat ă pe obiecte # 10 Adrian Runceanu www.runceanu.ro/adrian 2017 C++ Probleme recapitulative ( partea I)

Programarea şi utilizarea calculatoarelor...Programarea şi utilizarea calculatoarelor Author User Created Date 12/10/2017 2:59:49 PM

  • Upload
    others

  • View
    123

  • Download
    2

Embed Size (px)

Citation preview

Programare orientată peobiecte

# 10

Adrian Runceanuwww.runceanu.ro/adrian

2017

C++Probleme recapitulative (partea I)

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

[email protected]

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

}

[email protected]

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