Sunteți pe pagina 1din 57

Universitatea Constantin Brncui Trgu-Jiu 2

Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu

PROIECTAREA
ALGORITMILOR

Lector dr. Adrian Runceanu


1
2

Recomandare

A se citi cursul 19 de la disciplina


Programarea calculatoarelor, semestrul I,
anul universitar 2012-2013.

Proiectarea Algoritmilor - curs 2


2

Curs 2

Alocarea dinamic de
memorie n C++

Proiectarea Algoritmilor - curs 3


2

Coninutul cursului

1. Tipuri de date
2. Tipul referin
3. Operaii cu pointeri
4. Legtura dintre pointeri i tablouri

Proiectarea Algoritmilor - curs 4


2

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 5


2

1. Tipuri de date
Din punct de vedere al implementrii lor, putem vorbi despre
date implementate static i dinamic.
Criteriul de clasificare este dat de modul de alocare a
memoriei interne.
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 6


2

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 7


2

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 8


2

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 9
2

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
3) irurile de caractere
4) fiierele, etc
Proiectarea Algoritmilor - curs 10
2

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
2

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


2

Coninutul cursului

1. Tipuri de date
2. Tipul referin
3. Operaii cu pointeri
4. Legtura dintre pointeri i tablouri

Proiectarea Algoritmilor - curs 13


2

2. Tipul referin
Din punctul de vedere al unui programator, memoria
calculatorului se prezint ca o succesiune de octei,
fiecare octet avnd o adres binar bine stabilit.
Aceti octei sunt identificai prin numere cuprinse
ntre 0 i n-1(n este numarul de octeti al tipului de
date folosit pentru o variabila).
Putem numi aceast adres numrul de ordine al
unui octet.
Pentru fiecare tip de dat cunoscut exist o anumit
logic potrivit creia se face memorarea efectiv a
coninutului.

Proiectarea Algoritmilor - curs 14


2

2. Tipul referin

O variabil static folosit n program are:


un nume (simbolic)
o valoare
o adres la care o gsim memorat (adresa
primului octet din cei p octei consecutivi ocupai
de variabil).
n general, n limbajele evoluate nu este
necesar ca programatorul s cunoasc adresa
la care se gsesc variabilele cu care lucreaz.

Proiectarea Algoritmilor - curs 15


2

2. Tipul referin

Pentru alocarea dinamic se utilizeaz tipul


de date referin (pointer).
Structurile dinamice, neavnd nume, sunt
accesibile prin intermediul altor variabile,
care conin adresele lor, i n felul acestea
le indic.
Aceste variabile se numesc pointeri i
formeaz tipul referin.

Proiectarea Algoritmilor - curs 16


2

2. Tipul referin
Pointerii sunt variabile statice obinuite i au ca
valori adrese, care pot fi adresele de nceput ale
unor structuri dinamice sau a unei componente
a unei asemenea structuri.
Deci, accesul la o variabil dinamic, indicat de
o variabil pointer se realizeaz prin adresarea
indirect a variabilei pointer.
Aceast indirectare se pune n eviden prin
ataarea operatorului unar * (operator de
indirectare) nainte de numele variabilei pointer.
Proiectarea Algoritmilor - curs 17
2

2. Tipul referin
Variabila dinamic, indicat de o variabil pointer,
se va referi, nu printr-un nume propriu, ci prin
intermediul pointerului su:
*variabila de tip pointer
Astfel, n construcia *p operatorul * se
consider ca fiind un operator unar care
furnizeaz valoarea din zona de memorie a crei
adres este coninut n p
p = variabila de tip pointer
*p = variabila dinamic indicat de pointerul p

Proiectarea Algoritmilor - curs 18


2

2. Tipul referin

Operatorul unar * are aceeai prioritate ca i


ceilali operatori unari din limbajul C++.
Pentru a atribui unui pointer adresa unei
variabile, putem folosi operatorul unar adres
&.
Astfel, dac dorim ca p s pointeze spre x,
putem utiliza atribuirea p=&x.

Proiectarea Algoritmilor - curs 19


2

2. Tipul referin
Declararea unui pointer:
Un pointer se declar ca orice variabil, cu singura
deosebire c numele este precedat de caracterul
*.
Astfel, dac, de exemplu, dorim s declarm
variabila p utilizat anterior pentru a pstra
adresa unei variabile de tip int x, vom folosi
declaraia int *p.
Tipul int stabilete n acest caz faptul c p conine
adrese de zone de memorie alocate datelor de tip
int.
Proiectarea Algoritmilor - curs 20
2

2. Tipul referin
Declaraia lui p se poate interpreta n felul
urmtor:
*p reprezint coninutul zonei de
memorie spre care indic p, iar acest coninut
are tipul int.
n general, un pointer se declar prin:
tip *nume;
ceea ce nseamn c nume este un pointer
care pointeaz spre o zon de memorie ce
conine o dat de tipul tip.
Proiectarea Algoritmilor - curs 21
2

2. Tipul referin
O variabil pointer dat se poate referi la variabilele
indicate de un anumit tip, conform definirii sale.
Exist totui i pointerul nul identificat prin cuvntul
rezervat NULL i care este compatibil cu orice tip
pointer.
De asemenea, exist cazuri n care dorim ca un
pointer s fie utilizat cu mai multe tipuri de date.
n acest caz, la declararea lui nu dorim s specificm
un tip anume.
Aceasta se realizeaz folosind cuvntul cheie void:
void *nume

Proiectarea Algoritmilor - curs 22


2

2. Tipul referin

Dimensiunile pointerilor (numrul de


octei ocupai) depind de implementarea
limbajului.
Pointerii pot fi, dup tipul entitii
adresate, de dou tipuri:
pointeri de date
pointeri de funcii

Proiectarea Algoritmilor - curs 23


2

2. Tipul referin
Exemple:
Fie declaraiile:
int x, y;
y = x + 100;
este echivalent cu secvena
int *p;
p = &x;
y = *p + 100; // lui y i se atribuie suma dintre coninutul
zonei a crei adres se afla n p i 100

Proiectarea Algoritmilor - curs 24


2

2. Tipul referin
Exemplul 2:
x=y;
este echivalent cu secvena
p=&x;
*p=y; // coninutul zonei a crei adres se afl n p devine egal cu
valoarea lui y
Exemplul 3:
x++;
este echivalent cu secvena
p=&x;
(*p)++; // continuul zonei a crei adres se afl n p se mrete
cu 1

Proiectarea Algoritmilor - curs 25


2
2. Tipul referin

Ce efect are un apel de forma


Exemplul 4:
f(a,b); ?
Fie funcia f urmtoare:
Raspuns:
void f(int x,int y)
nu are nici un efect, deoarece la
{
acest apel valoarea lui a se
int aux;
transfer parametrului x, iar
aux=x;
valoarea lui b se transfer
x=y;
parametrului y.
y=aux;
Apoi funcia interschimb valorile
}
parametrilor x i y, ns prin
aceasta valorile parametrilor
actuali a i b rmn nemodificate.

Proiectarea Algoritmilor - curs 26


2

2. Tipul referin
Pentru a realiza o Avnd n vedere
interschimbare a valorilor acest lucru, funcia va
acestor variabile, este suferi modificri:
necesar s se transfere nu void f(int *x, int *y)
valorile, ci adresele
variabilelor. {
Acest lucru este posibil dac int aux;
modificm apelul n felul aux = *x;
urmtor: *x = *y;
f(&a, &b) - transmiterea *y = aux;
parametrilor prin referin.
}

Proiectarea Algoritmilor - curs 27


2

Coninutul cursului

1. Tipuri de date
2. Tipul referin
3. Operaii cu pointeri
4. Legtura dintre pointeri i tablouri

Proiectarea Algoritmilor - curs 28


2

3. Operaii cu pointeri

1. Atribuirea:
o variabil de tip pointer primete
valoarea unei alte variabile sau funcii de
acelai tip pointer cu ea sau este iniializat
cu constanta NULL.

Proiectarea Algoritmilor - curs 29


2
3. Operaii cu pointeri
p *p

nainte de atribuire: q *q

Dup atribuirea p=q: p *p

q *q

Proiectarea Algoritmilor - curs 30


2

3. Operaii cu pointeri
2. Operaii de incrementare i decrementare:
Asupra variabilelor de tip pointer operatorii de
incrementare i decrementare se execut altfel dect
asupra datelor de alte tipuri.
operatorul de incrementare aplicat asupra unui
operand de tip pointer spre tipul t mrete adresa
coninut de operand cu numrul de octei necesari
pentru a pstra o dat de tipul t;
operatorul de decrementare se execut n mod
analog, cu singura diferen ca n loc s se mreasc
valoarea pointerului, ea se micoreaz cu numrul
corespunztor de octei.
Proiectarea Algoritmilor - curs 31
2

3. Operaii cu pointeri
Aceste operaii sunt Fie atribuirea p=&tab[i]; unde
deosebit de utile cnd 0<i<100.
au loc prelucrri de n acest caz, instruciunea p++;
tablouri. mrete valoarea lui p cu 2 (tipul
Fie urmtoarele int se pstreaz pe doi octei) i
declaraii: deci n acest moment p conine
adresa elementului tab[i+1].
int tab[100]; n mod analog, instruciunea p--;
int *p; micoreaz valoarea lui p cu 2 i
deci n urma acestei decrementri
int i;
p conine adresa elementului
tab[i-1].

Proiectarea Algoritmilor - curs 32


2

3. Operaii cu pointeri

3. Adunarea i scderea unui ntreg dintr-un


pointer
Dac p este un pointer, sunt corecte expresiile
de forma:
p + n i p - n unde n este de tip ntreg.
Expresia p + n mrete valoarea lui p cu cu n*t,
unde t este numrul de octei necesari pentru a
memora o dat de un tip spre care indic p;
n mod analog, expresia p - n micoreaz
valoarea lui p cu n*t.
Proiectarea Algoritmilor - curs 33
2

3. Operaii cu pointeri
Dac x este un tablou de tipul t, atunci x este pointer,
deci o expresie de forma x+n este corect i
deoarece x este un pointer spre primul su element
x[0], x+n va fi un pointer spre elementul x[n].
Rezult c valoarea elementului x[n] se poate
reprezenta prin expresia *(x+n) care este o expresie
cu pointeri.
Astfel, o expresie cu indici se poate nlocui printr-o
expresie cu pointeri.
Acest lucru permite ca la tratarea tablourilor s se
foloseasc expresii cu pointeri n locul variabilelor cu
indici.
Proiectarea Algoritmilor - curs 34
2

3. Operaii cu pointeri

4. Compararea a doi pointeri


Doi pointeri care indic spre elementele
aceluiai tablou pot fi comparai folosind
operatorii de relaie i de egalitate.
Astfel, dac p i q sunt doi pointeri care indic
spre elementele t[i] respectiv t[j] ale tabloului t,
expresia p < q are sens i ea este adevrat
dac i<j.
De asemenea, p != q are valoarea adevrat
dac i<>j.
Proiectarea Algoritmilor - curs 35
2

3. Operaii cu pointeri

Observaii:
Pointerii nu pot fi comparai dect n condiia
amintit mai sus.
Operatorii de egalitate ( = = i ! = ) permit
totui compararea unui pointer cu constanta
simbolic NULL. Aceste comparaii permit s
stabilim dac un pointer conine o adres sau
nu.

Proiectarea Algoritmilor - curs 36


2

3. Operaii cu pointeri

5. Diferena a doi pointeri


Doi pointeri care indic spre elementele aceluiai
tablou pot fi sczui.
Rezultatul diferenei a doi pointeri este definit astfel:
- fie a un tablou de un tip oarecare i p, q doi
pointeri:
- p conine adresa elementului a[i], iar q conine
adresa elementului a[i+n].
Atunci diferena q - p are valoarea n.

Proiectarea Algoritmilor - curs 37


2

3. Operaii cu pointeri
Exemplul 1:
unsigned lungime(char *x) // returneaz lungimea
irului spre care pointeaz x
{
int i;
for(i=0; *x!=\0; i++)
x++;
return i;
}

Proiectarea Algoritmilor - curs 38


2

3. Operaii cu pointeri

Observaii:

Condiia *x!=\0 poate fi nlocuit cu *x,


deoarece *x!=\0 este adevarat cnd *x
este diferit de zero i invers.
Ciclul for poate fi compactat i mai mult:
for(i=0; *x++ ; i++) ;

Proiectarea Algoritmilor - curs 39


2

3. Operaii cu pointeri
Exemplul 2:
void copiaz(char *x, char *y) // copiaz irul spre care indic
y n zona spre care indic x
{ while(*x++ = *y++); }
Expresia de atribuire *x++=*y++ realizeaz atribuirea *x=*y
utiliznd valorile neincrementate ale lui x i y.
Dac valoarea atribuit este diferit de zero, expresia de
atribuire se consider adevarat, deci ciclul continu.
n momentul n care se atribuie valoarea 0, adic s-a ajuns
la sfaritul irului spre care indic y, expresia de atribuire
este fals i ciclul se ntrerupe.

Proiectarea Algoritmilor - curs 40


2

3. Operaii cu pointeri

Exemplul 3:
void concateneaz(char *x, char *y) // concateneaz
irul spre care indic y la sfritul irului spre care indic x
{
// se avanseaz cu pointerul x pn la sfritul irului
while(*x) x++;
// se copiaz irul spre care indic y n zona spre care indic x
while(*x++ = *y++);
}

Proiectarea Algoritmilor - curs 41


2

Coninutul cursului

1. Tipuri de date
2. Tipul referin
3. Operaii cu pointeri
4. Legtura dintre pointeri i tablouri

Proiectarea Algoritmilor - curs 42


2

4. 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 43
2

4. Legtura dintre pointeri i tablouri


Exemple: Prima expresie reprezint cele
1) Fie int a[100] un spuse nainte conform definiiei.
n a doua expresie, &a[0]
tablou.
reprezint adresa elementului de
Urmtoarele secvene index 0 al tabloului. Cum 0
sunt echivalente, reprezint poziia primului
deoarece fiecare din element al tabloului, rezult c a
ele reprezint adresa doua expresie reprezint adresa
primului element din de nceput a tabloului.
Compunerea operatorilor & i *
tablou: i anuleaz semnificaia, deci a
1) a treia declaraie este echivalent
2) &a[0] tot cu a.
3) &*a
Proiectarea Algoritmilor - curs 44
2

4. 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 45


2

4. 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 46


2

4. 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 47
2

4. 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 48
2

4. 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 49
2

4. 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 50


2

4. Legtura dintre pointeri i tablouri

Exemplu:
n definiia

int (*x) [50]; // x este un pointer la un tablou de 50 ntregi.


int* x[50]; // 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 51


2

Aplicatie

Se dau doua matrici. Sa se afiseze


suma matricelor. Matricele sunt alocate in
Heap.

Proiectarea Algoritmilor - curs 52


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 53
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 54


2

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 55


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 56


2

ntrebri?

Proiectarea Algoritmilor - curs 57

S-ar putea să vă placă și