Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de...

22
Programare orientata pe obiecte #4 Adrian Runceanu www.runceanu.ro/adrian 2016 C ++ Notiuni despre pointeri

Transcript of Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de...

Page 1: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

Programare orientata peobiecte

#4

Adrian Runceanuwww.runceanu.ro/adrian

2016

C++Notiuni despre pointeri

Page 2: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

Notiuni despre pointeri

Un pointer este o variabilă care are ca valori adrese.

Pentru modificarea unui parametru în cadrul uneifuncţii este necesar ca programul să transmită funcţieiadresa respectivului parametru (un pointer).

Funcţia, la rândul ei, utilizează apoi o variabilă pointer pentru a accesa locaţia de memorie corespunzătoare.

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

Page 3: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

Notiuni despre pointeri (continuare) Pentru simplitate (pentru reducerea codului), multe

programe tratează un şir de caractere ca un pointer şimanipulează conţinutul şirului cu ajutorul operaţiilor cu pointeri.

La incrementarea unei variabile pointer, C++ incrementeazăautomat adresa cu o valoare adecvată (1 octet pentru char, 2 octeţi pentru int, patru octeţi pentru float,etc.), astfelîncât pointerul să indice următoarea valoare pe care o are tipul pointerului.

Programele pot utiliza pointeri pentru a lucra cu vectoriîntregi sau în virgulă mobilă

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

Page 4: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

Notiuni despre pointeri (continuare)

Fie de exemplu:

int x,y;

atunci, dacă p are ca valoare adresa lui x (adica p=&x;) ,

Atribuirea y=x+100 este identică cu: y=*p+100

În mod analog, atribuirea:

*p=3 este identică cu: x=3.

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

Page 5: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

Probleme rezolvate

2. Să se realizeze un program ce ordoneazăcrescător elementele unui vector de numerereale şi apoi se afişează elementele şi adresele lacare acestea se află în memorie.

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

Page 6: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

Solutie:#include <iostream>using namespace std;float v[25];void ordoneaza_vector(float *vector, int nr_elem){

int i,j;float temp;

for(i=0; i<nr_elem; i++){

v[i]=*vector;vector=++vector;

}

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

Page 7: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

cout<<"\n Elementele vectrorului inainte de sortare: ";for (i=0; i<nr_elem; i++) cout<< v[i] <<" ";

for(i=0; i<nr_elem-1; i++)for (j=i+1; j<nr_elem; j++)

if ( v[i] > v[j] ){

temp=v[i];v[i]=v[j];v[j]=temp;

}

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

Page 8: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

cout<<"\n Elementele vectorului dupa sortare: ";

for (i=0; i<nr_elem; i++) cout<< v[i] <<" ";

cout<<"\nAdresele de memorie: ";

for (i=0; i<nr_elem; i++)

cout<< &v[i] <<" ";

}

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

Page 9: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

int main (void)

{

float vector[5] = {3, 4, 2, 1, 5};

ordoneaza_vector(vector, 5);

return 0;

}

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

Page 10: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

Executia programului este:

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

Page 11: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

3. Să se realizeze un program care foloseşte o funcţie ce primeşte ca argumente un pointer la un vector de numere reale şi un pointer la o funcţie şi returnează cel mai mic, respectiv celmai mare element al vectorului prin apelareaunei funcţii de calcul a minimului respectiv a maximului.

02.11.2016 P.O.O. - limbajul C++ (laborator) 11

Page 12: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

#include <iostream.h>using namespace std;int nr_elem;float min(float *vect){

float m;int i;m=*vect;vect++;for(i=1; i<nr_elem; i++){

if( m > *vect ) m=*vect;vect++;

}return m;

}02.11.2016 P.O.O. - limbajul C++ (laborator) 12

Page 13: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

float max(float *vect){

float m;int i;m=*vect;vect++;for(i=1; i<nr_elem; i++){

if( m < *vect ) m=*vect;vect++;

}return m;

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

Page 14: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

float functie (float *vect, float (*fct)(float *) ){

float r;r=(*fct)(vect);return r;

}

void afisare_vector(float *vect){

int i;cout<<"\n Elementele vectorului: "<<endl;for(i=0;i<nr_elem;i++)

cout<<"\t "<<*vect++;}02.11.2016 P.O.O. - limbajul C++ (laborator) 14

o funcţie ce primeşte ca argumente un pointer la un vector de numere reale şi un pointer la o funcţie şi returnează cel mai mic, respectiv cel mai mare element al vectorului prin apelarea unei funcţii de calcul a minimului respectiv a maximului.

Page 15: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

int main(){

float v[5]={3.5,2.7,5.6,4.5,10.2};nr_elem=5;float (*m1)(float *);m1=min;float (*m2)(float *);m2=max;afisare_vector(v);cout<<"\n minimul este: "<<functie(v,m1);cout<<"\n maximul este: "<<functie(v,m2)<<endl;

}

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

Page 16: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

Executia programului este:

02.11.2016 P.O.O. - limbajul C++ (laborator) 16

Page 17: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

Probleme propuse spre rezolvare

4. Să se scrie un program care citeşte o dată sub forma zz ll aaaa (de ex. 03 11 2016) şi o afişează sub forma yy luna aaaa (03 noiembrie 2016) folosind o funcţie ce returnează un pointer spre denumirea lunii calendaristice respective.

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

Page 18: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

Probleme propuse spre rezolvare

5. Să se scrie un program care determină rădăcina ecuaţiei f(x)=0 din intervalul [a,b] cu o eroare mai mică decât EPS=1e-8, ştiind că ecuaţia are o singură rădăcină în intervalul respectiv şi f(x) este o funcţie continuă pe acest interval.

Se va utiliza o funcţie ce apelează ca parametru funcţia f căreia i se calculează rădăcina.

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

Page 19: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4Probleme propuse spre rezolvare(Indicaţie:Una din cele mai simple metode de calcul este metoda înjumătăţirii al cărei algoritm este următorul:1) c=(a+b)/22) Dacă f(c)=0, atunci c este soluţia căutată şi se întrerupe procesul de calcul.3) Dacă f(a)*f(c)<0, atunci se pune b=c, altfel a=c4) Dacă b-a<EPS, atunci procesul de calcul se întrerupe şi rădăcina se ia media dintre a şi b.Altfel algoritmul se reia de la pasul 1).Se va aplica programul de mai sus la calculul rădăcinii ecuaţiei:x-sin(x+1)=0 în intervalul [0.5 , 1], cu o eroare mai mică de 1e-8.

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

Page 20: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

Probleme propuse spre rezolvare

6. Să se realizeze un program ce creează o listă simplă înlănţuită ale cărei noduri sunt structuri ce au următoarele câmpuri:

cheie, nume, prenume, vârstă, salariu.Se va ordona lista crescător după nume şi după vârstă.

02.11.2016 P.O.O. - limbajul C++ (laborator) 20

Page 21: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Lucrarea de laborator nr.4

Probleme propuse spre rezolvare

7. Să se realizeze un program pentru calculul rădăcinilor ecuaţiei de gradul II folosind o funcţie ai carei parametrii (coeficienţii ecuaţiei) vor fi apelaţi prin pointer şi prin referinţă.

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

Page 22: Programare orientata pe obiecte #4 C++ Notiuni despre pointeri … · 2016-11-02 · Lucrarea de laborator nr.4 Probleme rezolvate 2. Săse realizeze un program ce ordonează crescătorelementele

[email protected]

Întrebări?

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