PC Laborator 7

De la WikiLabs
Versiunea din 26 septembrie 2015 16:13, autor: Rdflorea (Discuție | contribuții) (Exerciții pentru acasă)

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 */
Observatie: Vectorii declarați astfel 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 fiind o constantă).
#define MAX 100
...
unsigned long nume_vector[MAX]
Recomandare: 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,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];
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
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.
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]);
        }

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

  1. Fie v un vector cu N valori intregi. Să se numere cate valori sunt pare/impare.
  2. Să se insereze un nou element z in pozitia k, restul elementelor rămânând în aceeași ordine.
  3. Se citesc 2 vectori de maxim 100 elemente întregi, apoi determina și afișează intersecția celor 2 vectori.
  4. Declarați și afișați o matrice unitate.
  5. 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.
  6. 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.


Exerciții pentru acasă

  1. Se consideră o matrice de dimenisiune NxM,numere intregi. Să se determine linia (liniile) cu cele mai multe elemente nenule.
  2. Să se construiască o matrice cu n linii şi m coloane care conţine pe prima coloană, de sus în jos, toate numerele naturale de la 1 la n, în ordine crescătoare, pe coloana a doua, de sus în jos, toate numerele naturale de la 2 la n+1, în ordine crescătoare, pe a treia coloană, de sus în jos, toate numerele naturale de la 3 la n+2, în ordine crescătoare, pe a patra coloană, de sus în jos, toate numerele naturale de la 4 la n+3, în ordine crescătoare şi aşa mai departe până la coloana m. Scrieţi programul care citeşte de la tastatură două valori naturale n și m (2<n<25, 2<m<25), construieşte matricea conform cerinţei şi o afişează pe ecran, pe linii, cu spaţii între elementele de pe fiecare linie.

De exemplu, dacă se citeşte de la tastatură n=3 și m=5, se va construi şi se va afişa pe ecran matricea:

1 2 3 4 5
2 3 4 5 6
3 4 5 6 7


  1. Se consideră o matrice A de NxN elemente, cu componentele numere întregi. Să se calculeze:
  • suma elementelor de pe diagonala principală
  • produsul elmentelor de pe diagonala secundară
  • minimul elementelor aflate deasupra, respectiv sub diagonala principală
  1. Se consideră o matrice de NxM elemente, cu componentele numere întregi. Se cere să se calculeze suma elementelor de pe marginea matricii.