Operatii cu tablouri

In aceasta sectiune vom studia principalele operatii care se fac asupra tablourilor: crearea tabloului, atribuirea de valori unei componentelor de tablou, citirea valorii componentei, sortarea (ordonarea) componentelor de tablou dupa valoarea lor si cautarea unei valori  intr-un tablou.

Operatii de baza

Crearea tabloului consta in alocarea de spatiu in memorie pentru tablou si - eventual - atribuirea de valori initiale componentelor tabloului. Alocarea de spatiu se poate face, in general, in memoria statica, pe stiva sau in memoria dinamica. In limbajele Pascal, C si C++ sunt posibile toate aceste trei forme de alocare. In limbajul Java, tablourile sunt obiecte, astfel ca pentru ele este posibila numai alocarea dinamica. In consecinta, in acest limbaj se face distinctie intre declararea tabloului si crearea tabloului.

Fie urmatoarele instructiuni in limbajul Java:
    double a, b[], c[][];
    String str, tstr[];
    a=7.35;
    b=new double[4];
    c=new double[2][5];
    str=new String("Un sir");
    tstr=new String[4];
Primele doua din aceste instructiuni sunt declaratii. Se declara ca a este o variabila de tip double, b este o referinta la un tablou unidimensional cu elemente de tip double, c este o referinta la un tablou bidimensional cu elemente de tip double, str este o referinta la un obiect din clasa String (la un sir), iar tstr este o referinta la un tablou unidimensional, ale carui componente sunt obiecte din clasa String. Ca efect al executarii acestei instructiuni, se aloca in memorie spatiu numai pentru valoarea variabilei a si pentru referintele b, c, str si tstr, dar nu si pentru obiectele indicate de aceste referinte. In instructiunile urmatoare, se foloseste operatorul new pentru a aloca in memoria dinamica spatiu pentru obiectele respective si a atribui ca valori variabilelor referinta deja declarate anterior referintele catre aceste obiecte.

Dupa cum se stie, este permis sa se combine aceste instructiuni, ca in exemplul urmator:
    double a=7.35, b[]=new double[4], c[][]=new double[2][5];
    String str=new String("Un sir"), tstr[]=new String[4];
Remarcam, totusi, ca s-a mentinut si aici distinctia dintre declararea variabilei referinta la tablou si alocarea de memorie prin operatorul new. Dimensiunile efective ale tabloului nu se dau la declararea acestuia, ci la alocarea in memorie.

La crearea tablourilor prin operatorul new, componentele tabloului se initializeaza la valori nule. Este permisa si in Java initializarea tablourilor in cadrul declaratiilor de tip, ca in exemplul urmator:
    int t[]={12,-3, 5}, w[][]={{2, 4},{1, -3},{-8, 5}};
    String s[]={"un sir", "alt sir"};
Remarcam, totusi, ca si in acest caz in partea declarativa propriu-zisa nu se indica dimensiunile tabloului, acestea rezultand implicit din expresia de initializare pusa intre acolade. Tot odata, remarcam ca si in acest caz tablourile sunt plasate tot in memoria dinamica, la fel ca atunci cand ar fi fost create prin operatorul new.
 
In limbajele C si C++ sunt posibile declaratii de forma
   double a[3], b[2][7];
In acest caz, alocarea de spatiu pentru tablouri nu se face in memoria dinamica, ci in cea statica sau pe stiva. Declaratii de tablou similare se pot face si in alte limbaje de programare, dar nu in Java.

Componentele tabloului sunt tratate in program ca niste variabile simple, daca apartin unui tip primitiv, sau ca variabile-referinta, cand componentele sunt instante ale unei clase. Adresa sau referinta componentei unui tabou, se poate afla cunoscand adresa de baza a tabloului  sau referinta la acesta si indicii componentei respective. In consecinta, accesul la oricare componenta a tabloului este direct, adica putem obtine orice componenta a tabloului fara a parcurge in prealabil alte componente, cu conditia sa ii cunoastem indicele (indicii).

Atribuirea de valoare unei componente se face, deci, printr-o instructiune de forma
    referinta_la_componenta = expresie;
in care referinta la componenta este numele referintei la tablou, insotita de indicii componentei, de exemplu t[2] sau w[i][j]. Se observa ca numarul de operatii elementare care se fac in aceasta operatie nu depinde de numarul de componente din tablou, deci operatia are complexitatea O(1).

Preluarea valorii unei componente de tablou se face, de asemenea folosind intr-o expresie referinta la acea componenta si are, de asemenea, complexitatea O(1).



© Copyright 2001 - Severin BUMBARU, Universitatea "Dunarea de Jos" din Galati