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

Post on 08-Aug-2020

17 views 2 download

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

Programare orientata peobiecte

#4

Adrian Runceanuwww.runceanu.ro/adrian

2016

C++Notiuni despre pointeri

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr.4

Executia programului este:

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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.

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr.4

Executia programului este:

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

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

copyright@www.adrian.runceanu.ro

Întrebări?

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