|
Vectori multidimensionali (Matrice)
O matrice bidimensionala poate fi memorata in cateva moduri:
- Ca un vector de vectori. Exemplu :
char a[20][20]; // a[i] este un vector
- Ca un vector de pointeri la vectori. Exemplu:
char* a[20]; // sau char ** a;
- Ca un singur vector ce contine elementele matricei, fie in ordinea liniilor, fie in ordinea coloanelor.
Matricele alocate dinamic sunt vectori de pointeri la liniile matricei.
Pentru comparatie vom folosi o functie care ordoneaza un vector de nume (de siruri) si functii de citire si afisare a numelor memorate si ordonate.
Prima forma (vector de vectori) este cea clasica, posibila in toate limbajele de programare, si are avantajul simplitatii si claritatii operatiilor de prelucrare.
De remarcat ca numarul de coloane al matricei transmise ca argument trebuie sa fie o constanta, aceeasi pentru toate functiile care lucreaza cu matricea.
#define M 30 // nr maxim de caractere intr-un sir
// ordonare siruri
void sort ( char vs[][M], int n)
// citire siruri in matrice
int citmat ( char vs[][M] )
// afisare matrice cu siruri
void scrmat (char vs[][M],int n)
O matrice alocata dinamic este de fapt un vector alocat dinamic ce contine pointeri la vectori alocati dinamic (liniile matricei). Liniile matricei pot avea toate aceeasi lungime sau pot avea lungimi diferite. Exemplu cu linii de lungimi diferite :
// ordonare vector de pointeri la siruri
void sort ( char * vp[],int n)
// citire siruri si creare vector de pointeri
int readstr (char * vp[])
return n;
// afisare siruri reunite in vector de pointeri
void printstr ( char * vp[], int n)
In exemplul anterior am presupus ca vectorul de pointeri are o dimensiune fixa si este alocat in functia "main".
Daca se cunoaste de la inceput numarul de linii si de coloane, atunci putem folosi o functie care aloca dinamic memorie pentru matrice. Exemplu:
// alocare memorie pentru o matrice de intregi
// rezultat adresa matrice sau NULL
int * * intmat ( int nl, int nc)
Utilizarea unui singur vector pentru a memora toate liniile unei matrice face mai dificila selectarea de elemente din matrice (prin indici de linie si coloana) si chiar sortarea liniilor (de lungime fixa).