Diferență între revizuiri ale paginii „PC Laborator 7”

De la WikiLabs
Jump to navigationJump to search
Linia 27: Linia 27:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
====Exemplul 1====
+
====Exemplu====
  
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
Linia 46: Linia 46:
 
Vectorii se pot iniţializa cu valori constante, în acest caz, compilatorul care va determina dimensiunea vectorului din numărul elementelor din listă.
 
Vectorii se pot iniţializa cu valori constante, în acest caz, compilatorul care va determina dimensiunea vectorului din numărul elementelor din listă.
  
====Exemplul 2====
+
Un alt mod de declarare este:
  
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">

Versiunea de la data 25 septembrie 2015 19:38

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]);
        }