Sei sulla pagina 1di 59

Universitatea Constantin Brncui Trgu-Jiu

Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu

PROIECTAREA
ALGORITMILOR
Lector dr. Adrian Runceanu
1

Curs 2

Alocarea dinamic de
memorie n C++

Proiectarea Algoritmilor - curs

Coninutul cursului
1. Tipuri de date
2. Conceptul de pointer
3. Operatori specifici pointerilor
4. Aritmetica pointerilor
4.1. Pointeri i tablouri
4.2. Echivalene de scriere
4.3. Expresii compacte cu pointeri

5. Legtura dintre pointeri i tablouri

Proiectarea Algoritmilor - curs

1. Tipuri de date
Informaia care st la dispoziia calculatorului const dintr-o
mulime de date care descriu lumea real prin abstractizare.
O abstractizare este de fapt o simplificare a faptelor prin
reinerea caracteristicilor relevante ale obiectelor reale.
O dat este orice entitate asupra creia poate opera
calculatorul.
Astfel apare noiunea de tip de date.
Prin tip de date se nelege o mulime de valori D care formeaz
domeniul tipului, mpreun cu o mulime de operatori pe acest
domeniu.
n cazul cnd elementele domeniului sunt valori compuse din
mai multe componente atomice, tipul de date obinut se
numete tip de date structurat sau structur de date.
Proiectarea Algoritmilor - curs

1. Tipuri de date
Din punct de vedere al implementrii lor, putem
vorbi despre:
1. date implementate static
2. date implementate dinamic
Criteriul de clasificare este dat de modul de
alocare a memoriei interne.

Proiectarea Algoritmilor - curs

1. Tipuri de date
1. Pentru structurile statice memoria se aloc la
nceputul programului i rmne alocat ct
timp programul se execut.
Astfel, caracteristicile variabilelor statice sunt
bine definite, cunoscute i fixe.
Structura, tipul i adresa de memorie nu se pot
modifica n timpul execuiei programului.
De asemenea, variabilele statice sunt referite
prin numele lor, fiecrui nume asociindu-i-se o
adres fizic de memorie.
Proiectarea Algoritmilor - curs

1. Tipuri de date
Unei variabile statice i se poate modifica doar
valoarea, nu i adresa din memoria intern.
Scopul definirii tipurilor de date este acela de:
a fixa domeniul valorilor pe care le pot lua aceste
variabile
de a preciza structura, dimensiunea i amplasarea
zonelor de memorie ce le sunt asociate

Deoarece toate aceste elemente sunt fixate de


la nceput de catre compilator, astfel de variabile
i structurile de date aferente lor se numesc
statice.
Proiectarea Algoritmilor - curs

1. Tipuri de date
Din motive de memorare a datelor n
calculator, n limbajele de programare, datele
sunt formate din dou clase:
a) date elementare
b) date compuse

Proiectarea Algoritmilor - curs

1. Tipuri de date
a) Datele elementare (aa numitele tipuri scalare)
sunt reprezentate n structura intern a
sistemului prin iruri de bii asupra crora
acioneaz mecanismul de adresare i care pot
constitui operanzii direci ai operaiilor sistemului
de calcul.
Date elementare se considera scalarii
predefinii:
1) ntregi
2) reali
3) caracter
Proiectarea Algoritmilor - curs

1. Tipuri de date
b) Datele compuse sunt determinate de o
descriere a tipului componentelor lor i prin
indicarea metodelor de structurare a
acestora.
Sunt considerate date compuse:
1) tablourile
2) nregistrrile(structurile)
3) irurile de caractere
4) fiierele, etc
Proiectarea Algoritmilor - curs

10

1. Tipuri de date
2. Pentru structurile dinamice se aloc memorie n
timpul execuiei programului, iar cnd nu mai
este necesar, memoria se elibereaz.
Totui, variabilele dinamice au un tip bine
precizat nc din faza de compilare, ns ele pot
fi alocate dinamic, pot fi utilizate prin adresa lor
din heap i pot fi distruse dac nu mai sunt utile.
Aceste variabile pot fi referite printr-o variabil
de tip referin ce conine adresa variabilei
dinamice.
Proiectarea Algoritmilor - curs

11

1. Tipuri de date
Structurile dinamice cuprind:
listele i arborii
Lista este o structur de date definit cu
ajutorul unor relaii de ordine asupra
nregistrrilor.
Arborele este o structur de date definit
cu ajutorul unor relaii de ordine asupra
listelor.
Proiectarea Algoritmilor - curs

12

Coninutul cursului
1. Tipuri de date
2. Conceptul de pointer
3. Operatori specifici pointerilor
4. Aritmetica pointerilor
4.1. Pointeri i tablouri
4.2. Echivalene de scriere
4.3. Expresii compacte cu pointeri

5. Legtura dintre pointeri i tablouri

Proiectarea Algoritmilor - curs

13

2. Conceptul de pointer
Un pointer (variabila referin) este o variabil
care are ca valoare adresa unui obiect cu care
opereaz limbajul C/C++ (variabil, constant,
funcie).

Folosirea pointerilor este determinat de dou


motive i anume:
1. este singura modalitate de a efectua anumite
calcule
2. folosirea pointerilor duce la generarea unui cod
surs de program mai eficient i mai compact
Proiectarea Algoritmilor - curs

14

2. Conceptul de pointer
Astfel putem enumera 2 (dou) situaii n care
limbajul C/C++ folosete pointerii, i anume:
atunci cnd se transmite unei funcii o matrice sau
un ir de caractere
sau cnd se transmit parametri prin referin,
adic atunci cnd vrem s modificm variabilele
respective
Proiectarea Algoritmilor - curs

15

2. Conceptul de pointer
Declararea unei variabile de tip pointer se face astfel:

tip *nume_pointer;
Unde:
tip reprezint oricare dintre tipurile limbajului C/C++
i indic tipul variabilei a crei adres este
memorat de variabila pointer.
nume_pointer reprezint numele ales de utilizator
pentru a identifica pointerul respectiv
operatorul * este obligatoriu la declarare
Proiectarea Algoritmilor - curs

16

2. Conceptul de pointer
Exemple:
char *pc; // pointer de tip caracter
int *pi;
// pointer de tip ntreg
float *pf; // pointer de tip real
Observaie:
Pot exista i pointeri fr tip, care se declar astfel:
void *nume_pointer;

Acetia se utilizeaz pentru ca n program s


primeasc valoarea oricrui tip de dat.
Proiectarea Algoritmilor - curs

17

2. Conceptul de pointer
Un pointer este un grup de octei (adesea doi
sau patru) care poate conine o adres.
Astfel dac c este un char i p un pointer care
trimite ctre el, atunci am putea reprezenta situaia
astfel:
c
Valoarea lui c
p
Adresa de
memorie a lui c
Proiectarea Algoritmilor - curs

18

Coninutul cursului
1. Tipuri de date
2. Conceptul de pointer
3. Operatori specifici pointerilor
4. Aritmetica pointerilor
4.1. Pointeri i tablouri
4.2. Echivalene de scriere
4.3. Expresii compacte cu pointeri

5. Legtura dintre pointeri i tablouri

Proiectarea Algoritmilor - curs

19

3. Operatori specifici pointerilor


Operatorii folosii pentru lucrul cu pointerii sunt
operatorii unari:
1. Operatorul & ( operator de adres ) se
aplic unei variabile furniznd adresa acelei
variabile.
2. Operatorul * ( operator de redirectare ) - se
aplic pointerilor i furnizeaz obiectul referit de
acel pointer.
Proiectarea Algoritmilor - curs

20

3. Operatori specifici pointerilor


1. Operatorul & ( operator de adres ) se
aplic unei variabile furniznd adresa acelei
variabile.
Exemplu: Urmtorul program arat cum se poate
folosi operatorul de adres pentru a afia adresele
unor variabile de tipuri diferite.

Proiectarea Algoritmilor - curs

21

3. Operatori specifici pointerilor


#include<iostream.h>
int main(void)
{
int indice=1;
float salariu_dolari=20000.0;
long salariu_lei=30000000L;
cout<<"\nAdresa variabilei indice este "<<&indice;
cout<<"\nAdresa variabilei salariu_dolari este
"<<salariu_dolari;
cout<<"\nAdresa variabilei salariu_lei este
"<<&salariu_lei;
}

Proiectarea Algoritmilor - curs

22

3. Operatori specifici pointerilor

Proiectarea Algoritmilor - curs

23

3. Operatori specifici pointerilor


Iniializarea pointerilor se poate face cu o valoare
de adres de memorie, prin folosirea operatorului de
adres &:
nume_pointer = &variabila;
Exemplu: Urmtorul program declar o variabil de
tip pointer i atribuie adresa unei variabile de tip
ntreg i apoi afieaz valoarea variabilei pointer
mpreun cu adresa variabilei de tip ntreg.
Proiectarea Algoritmilor - curs

24

3. Operatori specifici pointerilor


#include<iostream.h>
int main(void)
{
int indice = 1;
int *p_indice;
p_indice = &indice;
cout<<"Valoarea lui p_indice
"<<p_indice<<"\nValoarea lui indice
"<<indice<<"\nAdresa lui indice este
\n"<<&indice;
Proiectarea Algoritmilor - curs
}

25

3. Operatori specifici pointerilor

Proiectarea Algoritmilor - curs

26

3. Operatori specifici pointerilor


2. Operatorul * ( operator de redirectare ) - se
aplic pointerilor i furnizeaz obiectul referit de acel
pointer.

Exemplu:
Urmtorul program atribuie pointerului adresa
unei variabile de tip ntreg, afieaz adresa sa
mpreun cu valoarea memorat la adresa pe care o
are pointerul, apoi modific valoarea variabilei prin
intermediul pointerului i o afieaz.
Proiectarea Algoritmilor - curs

27

3. Operatori specifici pointerilor

Proiectarea Algoritmilor - curs

28

Coninutul cursului
1. Tipuri de date
2. Conceptul de pointer
3. Operatori specifici pointerilor
4. Aritmetica pointerilor
4.1. Pointeri i tablouri
4.2. Echivalene de scriere
4.3. Expresii compacte cu pointeri

5. Legtura dintre pointeri i tablouri

Proiectarea Algoritmilor - curs

29

4. Aritmetica pointerilor
4.1. Pointeri i tablouri
n limbajul C++ exist o stns legtur ntre
pointeri i tablouri, astfel nct orice problem care
se poate rezolva cu tablouri, poate fi rezolvat i
cu pointeri.
Putem spune c un pointer care reine adresa unui
tablou, reine de fapt adresa primului element al
tabloului.
Proiectarea Algoritmilor - curs

30

4. Aritmetica pointerilor
Exemplu:
int a[20], *p;

p:

p=&a[0];

a:

a[0] a[1]

Proiectarea Algoritmilor - curs

a[19]

31

4. Aritmetica pointerilor
Dac p este un pointer ctre un element al unui
tablou oarecare, atunci:
p+1 este un pointer ctre elementul urmtor al tabloului,
p+i se refer la elementul al i-lea,
iar p-i la elementul al i-lea nainte de p.
p

p+1

a[0] a[1] a[2]

p+i

Proiectarea Algoritmilor - curs

a[19]
32

4. Aritmetica pointerilor
Observaie:
n expresia p+i ne apare faptul c exemplificm pe
un tablou cu elemente de tip ntreg. De unde putem
concluziona c:
Dac p este un pointer ctre un obiect ( tip_obiect
*p ), atunci p+i va fi un pointer ctre al i-lea obiect
aflat dup obiectul referit de p.
Numele unei variabile de tip tablou este de fapt
adresa primului element ( adic adresa elementului
0 al tabloului ).
Deci: p = &a[0];
p = a;

33

4. Aritmetica pointerilor
Dac p i q sunt doi pointeri ctre elemente ale
aceluiai tablou ( adic p = &a[i] i q = &a[j] ), atunci
putem efectua urmtoarele operaii:
1) Comparaii:
p == q // adic se compar i cu j
p != q
p<q
p <= q
p>q
p >= q
2) p q // adic numrul de elemente ale tabloului, care
se afl ntre elementul referit de p i elementul referit de q
Proiectarea Algoritmilor - curs

34

4. Aritmetica pointerilor

Exemplu: Urmtorul program afieaz cu ajutorul unor tablouri


de tipuri diferite, diferena ntre doi pointeri.

Proiectarea Algoritmilor - curs

35

4. Aritmetica pointerilor
4.2. Echivalene de scriere

!
Deci, putem scrie:

a[i]

*(a+i)

p = &a[0]

p=a

p+1
*(p + 1)
p+i

&a[1]
a[1]
&a[i]

a+1
*(a + 1)
a+i

&a[1]
a[1]
&a[i]

*(a + i)

a[i]

*(i +a)

i[a]
36

4. Aritmetica pointerilor
Din echivalenele de mai sus, putem desprinde
o regul a compilatorului C++, i anume:
Orice expresie de forma a[i] este transformat
imediat ntr-o expresie *(a+i), adic o expresie
n care apare un pointer ( adic a ) i un
deplasament ( adic i ).

Proiectarea Algoritmilor - curs

37

4. Aritmetica pointerilor
Exemplu:
Urmtorul program prezint ultima regul
obinut mai sus i anume a[i] i[a].

Proiectarea Algoritmilor - curs

38

4. Aritmetica pointerilor
Observaie:
Succesiunea operatorilor &* aplicat unui pointer
cu deplasament are ca efect (evaluarea se face de
la dreapta la stanga):
la primul pas, selectarea coninutului (valorii) de la
respectiva adres
iar la al doilea pas, selectarea adresei respectivului
coninut

Deci aplicnd aceast succesiune de operatori de


obine tot obiectul.
Nu acelai lucru de poate spune despre
39
succesiunea *&.

4. Aritmetica pointerilor
Exemplu: Urmtorul program arat echivalena dintre
un tablou si un pointer care l refer.

Proiectarea Algoritmilor - curs

40

4. Aritmetica pointerilor
4.3. Expresii compacte cu pointeri
Cu ajutorul pointerilor se pot scrie expresii compacte n care
pointerii apar mpreun cu operatorii de incrementare ( ++ )
i decrementare ( -- ).
Astfel pot aprea urmtoarele situaii:
EXPRESIA
*p++
*p-*++p
*--p

OPERATIA
postincrementare
postdecrementare
preincrementare
predecrementare

CE SE MODIFIC
pointerul
pointerul
pointerul
pointerul

++*p
--*p
(*p)++
(*p)--

preincrementare
predecrementare
postincrementare
postdecrementare

obiectul
obiectul
obiectul
obiectul
41

4. Aritmetica pointerilor
Expresiile din prima grup modific pointerul i
nu obiectul la care se refer acesta.
Acest tip de expresii mbuntesc viteza de
execuie a unui program i se recomand utilizarea
acestora n ciclurile repetitive.
Expresiile din a doua grup modific obiectul
referit, astfel nct operatorii ++ i -- sunt
aplicai de ctre compilator asupra obiectului i
nu asupra pointerului.
Deci, nu putem utiliza n aceste expresii un pointer
la o structur, uniune sau o funcie.
Proiectarea Algoritmilor - curs

42

Exemplu: Urmtorul program prezint modul


n care acioneaz operatorii ++ i -- asupra
expresiilor compacte cu pointeri.

Proiectarea Algoritmilor - curs

43

Coninutul cursului
1. Tipuri de date
2. Conceptul de pointer
3. Operatori specifici pointerilor
4. Aritmetica pointerilor
4.1. Pointeri i tablouri
4.2. Echivalene de scriere
4.3. Expresii compacte cu pointeri

5. Legtura dintre pointeri i tablouri

Proiectarea Algoritmilor - curs

44

5. Legtura dintre pointeri i tablouri


n primul rnd, numele unui tablou este un
pointer deoarece el are ca valoare adresa
primului su element.
Totui exist o diferen ntre numele unui
tablou i o variabil de tip pointer, deoarece
dac unei variabile de tip pointer i se poate
atribui o adres, acest lucru nu se poate
realiza pentru numele unui tablou, el fiind
ntotdeauna un pointer spre primul element al
tabloului, deci un pointer constant.
Proiectarea Algoritmilor - curs

45

5. Legtura dintre pointeri i tablouri


Exemple:
1) Fie int a[100] un
tablou.
Urmtoarele secvene
sunt echivalente,
deoarece fiecare din
ele reprezint adresa
primului element din
tablou:
1) a
2) &a[0]
3) &*a

Prima expresie reprezint cele


spuse nainte conform definiiei.
n a doua expresie, &a[0]
reprezint adresa elementului de
index 0 al tabloului. Cum 0
reprezint
poziia
primului
element al tabloului, rezult c a
doua expresie reprezint adresa
de nceput a tabloului.
Compunerea operatorilor & i *
i anuleaz semnificaia, deci a
treia declaraie este echivalent
tot cu a.

Proiectarea Algoritmilor - curs

46

5. Legtura dintre pointeri i tablouri


2) Fie declaraiile:
int a[10],b[10],*c;
.
a=b; // greit deoarece a i b sunt pointeri constani
c=a; // corect deoarece c este un pointer variabil
b=c; // greit deoarece chiar dac c este un pointer variabil,
pointerul din partea stnga a atribuirii, b, este constant

Proiectarea Algoritmilor - curs

47

5. Legtura dintre pointeri i tablouri


Tablouri de pointeri i pointeri la tablouri
Pointerii fiind variabile, pot fi folosii pentru a
forma alte tipuri de date compuse.
Spre exemplu se pot forma tablouri de pointeri.
Sintaxa general de utilizare este:
Tip *tablou[dim];
Proiectarea Algoritmilor - curs

48

5. Legtura dintre pointeri i tablouri


Exemple:
Declaraia char *s[25]; reprezint un tablou de
25 pointeri la caracter.
Sortarea unor iruri de caractere:
#include<iostream.h>
#include<string.h>
void sort_lines(char *tp[ ], int n)
{
int i, sort = 0;
char *temp;
Proiectarea Algoritmilor - curs

49

5. Legtura dintre pointeri i tablouri


while (!sort)
{
sort=1;
for(i=0; i<n-1; i++)
if(strcmp(tp[i], tp[i+1]) > 0)
{
strcpy(temp, tp[i]);
strcpy(tp[i], tp[i+1]);
strcpy(tp[i+1], temp);
sort=0;
}
Proiectarea Algoritmilor - curs
}

50

5. Legtura dintre pointeri i tablouri


main()
{
int i;
char *sir[ ]=({"manual"}, {"carte"},
{"mare"}, {"12345"}, {"4542"});
sort_lines(sir,5);
for(i=0; i<5; i++)
cout<<sir[i]<<" ";
cout<<endl;
}
Proiectarea Algoritmilor - curs

51

5. Legtura dintre pointeri i tablouri


Pentru a arta c folosim pointeri la
tablouri (i nu tablouri la pointeri) avem
pentru declaraie sintaxa urmtoare:
Tip (*p) [dim];
Diferena dintre pointerii la tablouri de un tip i
tablourile de pointeri la acelai tip este modul
de stabilire a unitii de deplasare.
Proiectarea Algoritmilor - curs

52

5. Legtura dintre pointeri i tablouri


Exemplu:
n definiia
int (*x)[50];
int *x[50];

// x este un pointer la un tablou de 50 ntregi


// x este un tablou de 50 pointeri la ntregi

Se observ diferena de semnificaie care are


loc o dat cu folosirea parantezelor.

Proiectarea Algoritmilor - curs

53

Aplicatie
Se dau doua matrici. Sa se afiseze
suma matricelor. Matricele sunt alocate in
Heap.

Proiectarea Algoritmilor - curs

54

2
# include <iostream.h>

void *Cit_mat (int m, int n)


{
int i, j, (*a)[10]=new int[10][10];
for (i=0; i<m;i++)
for (j=0; j<n; j++)
{
cout<<"a["<<i+1<<"]["<<j+1<<"]= ";
cin>>a[i][j];
}
return a;
}
Proiectarea Algoritmilor - curs

55

2
void Tip_mat (int m, int n, int (*a) [10])
{
int i, j;
cout<<"Matricea rezultat\n";
for (i=0; i<m; i++)
{
for (j=0; j<n ; j++) cout <<a[i][j]<<" ";
cout<<endl;
}
}

Proiectarea Algoritmilor - curs

56

void *Suma_mat( int m, int n, int (*a)[10], int


(*b)[10])
{
int i, j, (*c)[10]=new int[10][10];
for (i=0; i<m; i++)
for (j=0; j<n; j++)
c[i][j] = a[i][j] + b[i][j];
return c;
}

Proiectarea Algoritmilor - curs

57

2
int main ( )
{
int m, n, i, j, (*c)[10], (*a)[10], (*b)[10];
cout<<"m = "; cin>>m;
cout<<"n = "; cin>>n;
cout<<"Prima matrice \n";
a=(int (*) [10]) Cit_mat(m,n);
cout<<"A doua matrice\n";
b=(int (*) [10]) Cit_mat(m,n);
c=(int (*) [10]) Suma_mat(m,n,a,b);
Tip_mat(m,n,c);
}
Proiectarea Algoritmilor - curs

58

ntrebri?

Proiectarea Algoritmilor - curs

59

Potrebbero piacerti anche