PC Laborator 7
De la WikiLabs
Versiunea din 25 septembrie 2015 19:40, autor: Rdflorea (discuție | contribuții) (→Matrici bidimensionale)
Obiectiv
La încheierea acestui laborator studentul va fi capabil:
- să înteleagă modul de utilizare a tablourilor de memorie
- să declare şi să iniţializeze vectori/matrici
- să implementeze algoritmi simpli în lucru cu vectori pentru rezolvarea diverselor probleme
Tablouri
Tablou de memorie este o colecţie de date stocate în locaţii succesive din memorie. Toate elementele acestuia au acelaşi tip de dată numit de obicei tip de bază.
Tablourile pot fi :
- vectori (tablouri unidimensionale): șiruri de valori
- matrici (tablouri bidimensionale): catalogul cu note
- multidimensionale: pixeli unui imagini în timp
Vectori
Un vector reprezintă o colecție de date de acelaşi tip reprezentate sub forma unei linii sau coloane.
Declarația unei variabile de tip vector
<tip_elemente> <nume_vector>[<număr_maxim_elemente>];
Exemplu
int v[10]; /* astfel se alocă 10 locații de memorie consecutive de tip int, ce vor corespunde valorilor vectorului v */
float nume_vector[100]; /* vector de tip float cu 100 elemente */
Observatie: Vectori sunt denumiți statici (static arrays) deoarece numărul de elemente şi spaţiul de memorie ocupat este constant în timpul compilării. (număr_maxim_elemente trebuie să fie o constantă).
#define MAX 100
...
unsigned long nume_vector[MAX]
Observatie: Numărătoarea elementelor începe de la 0.
int v[10]; // primul element va fi v[0],iar ultimul element v[9]
Vectorii se pot iniţializa cu valori constante, în acest caz, compilatorul care va determina dimensiunea vectorului din numărul elementelor din listă.
Un alt mod de declarare este:
int v[10] = {1, 5, 6, 8, 6, 10, 22, 32, 34, 13}; // Toate elemente sunt initializate
float nume_vector[] = {1.2, 2.2, 6.1, -9.3}; // Compilatorul determina dimensiunea vectorului=4
int vect[1000] = {0, 1, 2, 3, 5}; // Sunt initializate doar primele 5 elemente
Parcurgerea vectorilor
Cum deja am discutat prima poziție dintr-un vector este v[0]. Presupunem un vector are N elemente, constatăm că ultimul element este v[N-1]. A trece prin elementele vectorului presupune parcurgerea tuturor celor N elemente , de la V[0] la V[N-1]. Acest lucru este posibil prin:
for(i=0; i < N; i++)
// instrucțiune v[i];
Observatie: Se poate ingnora poziția zero,însă daca avem un vector de 100 elemente declararea uzuală ar fi int v[100];, gândim valorile de la v[0] la v[99]. Daca folosim numărarea de la 1, vom avea doar 99 de locații de memorie disponibile pentru cele 100 de valori. În acest caz declararea corecta ar fi int v[101];.
Modul de adresare
Indici | 0 | 1 | 2 | 3 |
---|---|---|---|---|
Valoare | 12 | 33 | 120 | 460 |
Adresa | N | N+1 | N+2 | N+3 |
printf("%d",v); // v stochează adresa primul element adică N
printf("%d",v[1]); // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33
printf("%d",&v[2]); // operatorul & returnează adresa din memorie a variabilei ce urmează adică N+2
Citirea vectorilor
int v[100], n, i; // vectorul a are maxim 100 de intregi
scanf("%d", &n); // citeste nr de elemente
for (i = 0; i < n; i++) {
scanf("%d", &v[i]); // citire elemente
}
for (i = 0; i < n; i++) {
printf("%d ", v[i]); // scrie elemente
}
Matrici
O matrice reprezintă o colecție de date de acelaşi tip,ce este structurată pe linii şi coloane. Datele sunt identificate prin indicele liniei şi respectiv indicele coloanei.
Observatie: Un vector este un caz particular de matrice cu o singură linie.
Declarația unei matrici
<tip_elemente> <nume_matrice>[<număr_linii>][<număr_coloane>];
Exemplul 1
int matrice[5][10]; // o matrice de întregi cu 5 linii și 10 coloane care ocupă 5*10*4=200 octeți
#define MAX 100
float a[MAX][MAX]; // în acest caz număr linii = număr coloane = 100
Parcurgerea matricilor
int mat[N][M];
for (int i=0; i < N; i++) {
for (int j=0; j < M; j++)
// instrucțiune mat[i][j];
Observatie: Accesarea elementului de pe linia i şi coloana j se face cu mat[i][j];
Adresarea matricilor
Adresarea este similară cu cea a vectorilor,doar ca în acest caz lucrăm cu doua dimensiuni (2D)-matrici.
printf("%d",mat[1][3]) // reprezintă valorea de pe linia 1 și coloana 3 a matricii mat
printf("%d",&mat[1][3]) // reprezintă adresa de memorie a elementului de pe linia 1 și coloana 3 a matricii mat
Citirea matricilor
int mat[10][10], i, j;
for (i=0; i < 10; i++)
for (j=0; j < 10; j++){
printf("v[%d][%d]=", i, j);
scanf("%d",&mat[i][j]);
}