Diferență între revizuiri ale paginii „PC Laborator 7”
Linia 80: | Linia 80: | ||
| 120 | | 120 | ||
| 460 | | 460 | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|} | |} | ||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
− | printf("%d",v); // v stochează adresa primul element | + | printf("%d",v); // v stochează adresa primul element |
printf("%d",v[1]); // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33 | printf("%d",v[1]); // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33 | ||
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Versiunea de la data 26 septembrie 2015 15:56
Obiective
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
Tabloul 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.
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 */
#define MAX 100
...
unsigned long nume_vector[MAX]
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,restul fiind completate automat cu zero
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];
Modul de adresare
Indici | 0 | 1 | 2 | 3 |
---|---|---|---|---|
Valoare | 12 | 33 | 120 | 460 |
printf("%d",v); // v stochează adresa primul element
printf("%d",v[1]); // reprezintă valoarea din a 2a locație de memorie a vectoritului v adică 33
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.
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];
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]);
}
Tablouri multidimensionale
Noţiunea generală de tablou cu mai multe dimensiuni, se declară astfel:
<tip_elemente> <nume_tablou>[<dim_1>][<dim_2>]...[<dim_n>];
Exemplu
int cub[3][3][3];
În acest caz 3 dimensiuni pot avea un sens fizic,însă tablourile cu mai mult de 3 dimensiuni pot să nu mai aibă un sens clar,ușor perceptibil.
Exerciții
- Fie v un vector cu N valori intregi. Să se numere cate valori sunt pare/impare.
- Să se insereze un nou element z in pozitia k, restul elementelor rămânând în aceeași ordine.
- Se citesc 2 vectori de maxim 100 elemente întregi, apoi determina și afișează intersecția celor 2 vectori.
- Declarați și afișați o matrice unitate.
- Să se scrie un program care citește de la tastatură o matrice de M întregi. Să se asigure că utilizatorul introduce valori doar între 0 și 9 și să se afișeze sub forma unui vector pe ecran elementele de deasupra diagonalei principale.
- Se se scrie un program ce permite citirea matrici A si B reale de dimensiune MxN. Să se calculeze matricea produs C și să se stocheze toate elementele matricii mai mari ca x într-un vector v. Să se afieseze vectorul.