Sunteți pe pagina 1din 5

PROGRAMAREA CALCULATOARELOR LUCRAREA NR.

8


POINTERI. ALOCAREA DINAMIC A MEMORIEI

1. Pointeri
Un pointer este o variabil care conine adresa altei variabile sau a unei funcii dac
este iniializat cu aceast adres.
2. Alocarea dinamic a memoriei
void *malloc(size_t n);
aloc un bloc de memorie de n octei n heap (zon de memorie folosit pentru
alocri dinamice);
n caz de succes, returneaz un pointer la blocul de memorie alocat (cruia nu-i
schimb coninutul)
returneaz valoarea 0 (zero) dac nu s-a putut face alocarea de memorie (pentru
c nu exist spaiu liber cu mrimea solicitat sau dac se apeleaz cu n = 0).
Funcia returneaz un pointer generic de tip void, a crui valoare poate fi asignat
unui pointer de orice tip folosind o conversie explicit. Se recomand s se testeze
totdeauna dac valoarea returnat este sau nu 0 (zero).

void *calloc(size_t nrElemente, size_t dimElement);
aloc un bloc de memorie de mrime nrElemente * dimElement (care nu trebuie
s depeasc 64 Ko octei din heap), coninutul blocului fiind resetat (se scrie 0);
n caz de succes, returneaz un pointer la blocul de memorie alocat;
returneaz 0 dac nu exist spaiu liber de mrimea solicitat (sau dac se
apeleaz cu valorea 0).

void *realloc(void* block, size_t marime);
funcia redimensioneaz (prim mrire sau micorare) un bloc de memorie (alocat
dinamic anterior) la numrul de octei specificai de parametrul marime;
block trebuie s indice un bloc de memorie obinut prin apelarea funciilor malloc()
/ calloc() / realloc() (altfel rezultatul este imprevizibil);
dac block este 0 (zero), lucreaz exact ca malloc();
funcia ajusteaz mrimea blocului alocat la marime, copiind (dac este cazul)
coninutul su la o nou adres;
1
PROGRAMAREA CALCULATOARELOR LUCRAREA NR. 8
returneaz adresa blocului realocat (poate diferi de block) sau 0 (zero), dac nu se
poate face realocarea sau marime = 0 (n acest ultim caz funcia lucreaz ca i funcia
free()).

void free(void *block);
elibereaz un bloc de memorie alocat anterior de ctre malloc() / calloc() /
realloc();
rezultatul este dezastruos dac parametrul nu este rezultatul unei alocri dinamice
anterioare sau dac se apeleaz de doua ori la rnd cu acelai parametru.

TEMA
Problema nr. 1
S se citeasc de la tastatur elementele a dou tablouri unidimensionale (vectori)
de n numere ntregi a i b alocate dinamic. S se calculeze vectorul sum i s se afieze.
Rezolvarea problemei presupune construirea unui proiect (cu fiierul header
corespunztor) i scrierea urmtoarelor funcii:
funcie pentru: alocarea cu verificarea alocrii (funcia xmalloc din curs);
funcie pentru citirea unui vector de ntregi cu n elemente. Funcia trebuie s aib
urmtorul prototip:
int *citireVector(size_t n);
funcie pentru afiarea elementelor unui vector de ntregi, cu prototipul:
void afisareVector(int *a, size_t n);
funcie pentru calculul vectorului sum a doi vectori, cu prototipul:
int *sumaVectori(int *x, int *y, size_t n);

Problema nr. 2
Se citete de la tastatur un numr ntreg (poate fi pozitiv sau negativ). Citirea se
face cu scanf. Se determin numrul de cifre ale numrului (prin logaritmare n baza 10).
Se face alocare dinamic de memorie pentru un ir de caractere capabil s
memoreze cifrele numrului i eventualul semn. Numrul citit se transform n ir de
caractere, fr a folosi funcii de bibliotec. Transformarea se face astfel nct fiecare cifr
s se plaseze direct pe locul ei.
Se afieaz irul de caractere rezultat.
Rezolvarea problemei presupune realizarea unui proiect care, pe lng funcia main,
s cuprind i funcii pentru:
2
PROGRAMAREA CALCULATOARELOR LUCRAREA NR. 8
alocare dinamic cu verificare (funcia xmalloc din curs)
transformarea numrului n ir de caractere. n acest caz funcia are prototipul:
char *transformareToAscii(long int);

Problema nr. 3
Se citete de la tastatur un numr natural n i un vector de numere naturale v
pentru care se face alocare dinamic de memorie.
Se formeaz un nou vector w cu n elemente, de asemenea alocat dinamic, n care
valoarea fiecrui element este suma cifrelor elementului corespunztor din vectorul v.
S se afieze elementul din vectorul v care are cea mai mare sum a cifrelor sale.
Se vor scrie urmtoarele funcii:
Funcie pentru citirea unui vector de numere naturale care are ca parametru
numrul de elemente i returneaz un pointer.
Funcie pentru afiarea vectorului de numere naturale sub forma
A = (23, 543, 912)
Funcia are ca parametri vectorul de afiat (exprimat ca un pointer) i numrul de
elemente.
Funcie pentru calculul sumei cifrelor unui numr natural. Funcia are ca
parametru un numr natural (numrul pentru care se calculeaz suma cifrelor) i
returneaz un numr natural (suma calculat).
Funcie pentru determinarea elementelor vectorului w. Funcia are ca parametri
un pointer i un numr natural i returneaz un pointer la un numr natural. Aceast
funcie face apel, pentru calculul sumei cifrelor unui numr natural, la funcia definit
la punctul anterior.
Funcie pentru determinarea maximului dintr-un ir de numere. Funcia
primete ca parametri un pointer la un numr natural i un ntreg i returneaz
indexul elementului cu valoarea maxim.

Problema nr. 4
S se defineasc tipul de dat MULTIME ca o structur care cuprinde:
cardinalul mulimii (numrul de elemente din mulime) care este un numr
ntreg fr semn;
elementele mulimii (de tip real), stocate prin intermediul unui pointer
S se scrie un program care pentru dou mulimi
3
PROGRAMAREA CALCULATOARELOR LUCRAREA NR. 8
1. citete de la tastatur cardinalul i elementele mulimii i le stocheaz ntr-o
structur de tip MULTIME.
2. afieaz cele dou mulimi sub forma
A = {3.14, 5.12, 3.00, 4.39}
B = {34.29, 15.14, 3.14}
(se presupune c numele celor dou mulimi sunt A i B, iar numerele reale se vor afia
cu dou zecimale i vor fi separate de o virgul i un spaiu).

Observaie (referitoare la punctele 1 i 2):
Se scriu funcii pentru o singur mulime. Funciile se apeleaz de mai multe ori.

3. afieaz un meniu care d posibilitatea utilizatorului s aleag una din
urmtoarele prelucrri:
a) determinarea mulimii intersecie a celor dou mulimi (A&B) i cardinalul acestei
mulimi.
b) determinarea mulimii diferen simetric a celor dou mulimi (A-B) (mulimea
diferen simetric include elementele mulimii A care nu sunt n mulimea B i elementele
mulimii B care nu sunt n mulimea A) i cardinalul acestei mulimi.
c) determinarea mulimii reuniune a celor dou mulimi (A+B) i cardinalul acestei
mulimi.
4. Realizeaz prelucrarea dorit i afieaz mulimea care rezult n urma
prelucrrii.
Programul poate face o singur prelucrare n funcie de opiunea utilizatorului i va
trebui scris astfel nct s permit prelucrarea mai multor seturi de date.
Observaii:
1) Se va citi cu atenie tabelul urmtor care descrie n detaliu modul de rezolvare a
problemei i descrierea prototipurilor funciilor care trebuie scrise.
2) Dac nu se folosesc funciile indicate codul nu se puncteaz.
3) Punctajul maxim se acord pentru rezolvarea CORECT a fiecrei subprobleme.

1. Construirea structurii MULTIME (funcia primete ca parametru numele
mulimii i returneaz o structur de tip MULTIME)
1,0
2. Alocarea corect (cu verificare) de spaiu de memorie pentru pointeri 0,5
3. Citirea valorilor elementelor mulimii (ntr-o funcie care primete ca parametru
un numr natural i returneaz un pointer la real)
1,0
4
PROGRAMAREA CALCULATOARELOR LUCRAREA NR. 8
4. Afiarea valorilor vectorului din structur conform modelului dat n problem
(funcia are un parametru o structur de tip MULTIME i nu returneaz nimic)
1,0
5. Scrierea meniului de prelucrare (funcia nu are nici un parametru i returneaz
un numr care reprezint numrul opiunii de prelucrare)
0,75
6. posibilitatea de reluare a programului (prelucrarea mai multor seturi de date) 0,5
7. Folosire proiect (corect) 0,5
8. Fiier header (corect i complet) 0,5
9. Funcia main (complet inclusiv eliberarea corect a zonelor de memorie
folosite)
0,75
10. Funcie care stabilete dac o valoare aparine unei mulimi. Funcia are 2
parametri: valoarea i mulimea (reprezentat prin structur) i returneaz 1/0
dup cum valoarea se gsete sau nu n mulime.
0,5
11. Calculul mulimii intersecie (funcia primete ca parametri dou structuri de
tip MULTIME i returneaz o structur de tip MULTIME) inclusiv alocarea
corect de memorie.
1,0
12. Calculul mulimii diferen (funcia primete ca parametri dou structuri de tip
MULTIME i returneaz o structur de tip MULTIME) inclusiv alocarea corect
de memorie.
1,0
13. Calculul mulimii reuniune (funcia primete ca parametri doi pointeri la date
de tip MULTIME i returneaz o structur de tip MULTIME) inclusiv alocarea
corect de memorie.
1,0
TOTAL 10 p

5

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