Descărcați ca docx, pdf sau txt
Descărcați ca docx, pdf sau txt
Sunteți pe pagina 1din 10

Ministerul Educației și Cercetării al Republicii Moldova

Universitatea Tehnică a Moldovei

Facultatea Calculatoare, Informatică și Microelectronică

RAPORT
Lucrarea de laborator nr. 4

la Programarea Calculatoarelor

A efectuat:
st. gr. TI-237 Surdu Nichita

A verificat: V. Toncu
Asis. Univ.

Chișinău 2023
Lucrarea de laborator nr. 4

Теmа: Alocarea dinamică a memoriei pentru tablourile bidimensionale. Utilizarea funcţiilor şi a


pointerilor

Scopul lucrării: Programarea algoritmilor de prelucrare a tablourilor bidimensionale prin


utilizarea funcţiilor, pointerilor şi alocarea dinamică a memoriei pentru tablou.

Sarcină:
Pentru tabloul bidimensional dat din n linii şi m coloane să se afişeze la ecran următorul meniu
de opţiuni:
1. Alocarea dinamică a memoriei pentru tablourile bidimensionale
2. Introducerea elementelor tabloului de la tastatură
3. Completarea tabloului cu valori aleatorii
4. Sortarea elementelor tabloului (cоnform variantelor)
5. Afișarea elementelor tabloului la ecran
6. Eliberarea memoriei alocate pentru tablou
0. Ieșire din program
Să se elaboreze funcţiile pentru realizarea opţiunilor meniului.

Varianta 18
Să se sorteze liniile impare ale tabloului în ordine ascendentă folosind metoda de sortare prin
inserție.
Noţiuni din teorie şi metodele folosite:
Funcții
Funcţiile împart taskuri complexe în bucăţi mici mai uşor de înţeles şi de programat. Acestea
pot fi refolosite cu alte ocazii, în loc să fie rescrise de la zero. De asemenea, funcţiile sunt
utile pentru a ascunde detalii de funcţionare ale anumitor părţi ale programului, ajutând la
modul de lucru al acestuia. Utilizând funcţii, care reprezintă unitatea fundamentală de
execuţie a programelor C, se obţine o divizare logică a programelor mari şi complexe.
Caracteristicile definitorii ale unei funcţii în C sunt: numele, parametrii de apel şi valorea
returnată. Sintaxa standard de declarare a unei funcţii este:

tip_returnat nume_functie (tip_param1 nume_param1, tip_param2


nume_param2, ...);
Această declarare poartă numele de antetul funcţiei (function signature sau
simplu signature). Lista de parametri poate lipsi.
Odată declarată, o funcţie trebuie definită, în sensul că trebuie expandat corpul acesteia cu
instrucţiunile pe care trebuie să le execute.
Definirea unei funcţii are forma:

tip_returnat nume_functie(tip_param1 nume_param1, tip_param2


nume_param2, ...) {
declaratii de variabile si instructiuni;

return expresie;
}

Limbajul C permite separarea declaraţiei unei funcţii de definiţia acesteia (codul care o
implementează). Pentru ca funcţia să poată fi folosită, este obligatorie doar declararea
acesteia înainte de codul care o apelează. Definiţia poate apărea mai departe în fişierul
sursă, sau chiar într-un alt fişier sursă sau bibliotecă.
Pointeri
Un pointer este o variabilă care reţine o adresă de memorie.
În C, un pointer poate reprezenta:
1. adresa unor date de un anumit tip
 tip elementar, structură, şir de caractere etc.
 operațiile cu pointeri sunt determinate de dimensiunea tipului de date
2. adresa unei funcții
 adresa la care punctul curent de execuţie va sări, în cazul în care acea funcţie
este apelată
3. adresa unei adrese de memorie
 acest tip de pointer poate fi redus la prima situaţie
4. adresa unei zone cu conținut necunoscut (pointer către void)
Operatorul de referențiere
& - apare în fața variabilei asupra căreia acționează
Este aplicat unei variabile, avand ORICE tip de date, și obține ADRESA de (din) memorie a
variabilei respective.
Operatorul de dereferențiere
* - apare în fața variabilei asupra căreia acționează
Este aplicat unei variabile de tip pointer și obține valoarea stocată la adresa respectivă
(indicata de pointer).
Pentru ca dereferențierea să aibă loc cu succes, pointer-ul trebuie să indice o adresă de
memorie validă, la care programul are acces. Această adresă poate fi adresa unei variabile
declarate în prealabil sau adresa unui bloc de memorie alocat dinamic.

Funcţii de alocare şi eliberare a memoriei


Funcțiile standard de alocare și de eliberare a memoriei sunt declarate în fişierul antet stdlib.h.
 void *malloc (size_t size);
 void *calloc (size_t nmemb, size_t size);
 void *realloc (void *ptr, size_t size);
 void free (void *ptr);
Exemplu:
char *str = malloc(30); // Aloca memorie pentru 30 de caractere
int *a = malloc(n * sizeof(int)); // Aloca memorie pt. n numere intregi

Matrice alocate dinamic


Alocarea dinamică pentru o matrice este importantă deoarece:

 foloseşte economic memoria şi evită alocări acoperitoare, estimative.


 permite matrice cu linii de lungimi diferite (denumite uneori ragged arrays, datorită
formelor “zimţate” din reprezentările grafice)
 reprezintă o soluţie bună la problema argumentelor de funcţii de tip matrice.
Rezultatele testarii si functionarii programului:
Analiza rezultatelor și concluzii:

1. Au fost obţinute deprinderi de elaborare, compilare, rulare și testare a unui program


utilizand funcții, pointeri și alocare dinamică a memoriei pentru tablou.
2. O funcţie care trebuie să modifice mai multe valori primite prin argumente sau care
trebuie să transmită mai multe rezultate calculate în cadrul funcţiei trebuie să
folosească argumente de tip pointer.
3. Cunoaşterea reprezentării în memorie a tablourilor ne ajută să înţelegem mai bine cum
se lucrează cu aceste tipuri de date şi să evităm atât erorile comune, cât şi pe cele mai
subtile. Aşa cum se ştie, fiecare variabilă are asociata o anumită adresă în memorie şi
ocupă o anumită lungime, măsurată în octeţi.

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