Operații cu tablouri

În această secțiune vom studia principalele operații care se fac asupra tablourilor: crearea tabloului, atribuirea de valori componentelor de tablou, citirea valorii componentei, sortarea (ordonarea) componentelor de tablou după valoarea lor și căutarea unei valori  într-un tablou.

Operații de bază

Crearea tabloului constă în alocarea de spațiu în memorie pentru tablou și - eventual - atribuirea de valori inițiale componentelor tabloului. Alocarea de spațiu se poate face, în general, în memoria statică, pe stivă sau în memoria dinamică. În limbajele Pascal, C și C++ sunt posibile toate aceste trei forme de alocare. În limbajul Java, tablourile sunt obiecte, astfel că pentru ele este posibilă numai alocarea dinamică. În consecință, în acest limbaj se face distincție între declararea tabloului și crearea lui.

Fie urmatoarele instrucțiuni în 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 două din aceste instrucțiuni sunt declarații. Se declară că a este o variabilă de tip double, b este o referință la un tablou unidimensional cu elemente de tip double, c este o referință la un tablou bidimensional cu elemente de tip double, str este o referință la un obiect din clasa String (la un șir), iar tstr este o referință la un tablou unidimensional, ale cărui componente sunt obiecte din clasa String. Ca efect al executării primelor trei instrucțiuni, se alocă în memorie spațiu numai pentru valoarea variabilei a si pentru referințele b, c, str si tstr, dar nu și pentru obiectele indicate de aceste referinte. În instrucțiunile următoare, se folosește operatorul new pentru a aloca în memoria dinamica spațiu pentru obiectele respective și a atribui ca valori variabilelor referință, deja declarate anterior, referințele către aceste obiecte.

După cum se știe, este permis să se combine aceste instrucțiuni, ca în exemplul următor:
    double a=7.35, b[]=new double[4], c[][]=new double[2][5];
    String str=new String("Un sir"), tstr[]=new String[4];
Remărcam, totuși, că s-a menținut și aici distincția dintre declararea variabilei referință la tablou și alocarea de memorie prin operatorul new. Dimensiunile efective ale tabloului nu se dau la declararea acestuia, ci la alocarea de memorie.

La crearea tablourilor prin operatorul new, componentele tabloului se inițializează la valori nule. Este permisă și în Java, la fel ca în C/C++,  inițializarea tablourilor în cadrul declarațiilor de tip, ca în exemplul următor:
    int t[]={12,-3, 5}, w[][]={{2, 4},{1, -3},{-8, 5}};
    String s[]={"un sir", "alt sir"};
Remarcăm, totuși, că și în acest caz în partea declarativă propriu-zisă nu se indică dimensiunile tabloului, acestea rezultând implicit din expresia de inițializare pusă între acolade. Tot odată, remarcăm că și în acest caz tablourile sunt plasate tot în memoria dinamică, la fel ca atunci când ar fi fost create prin operatorul new.
 
In limbajele C si C++ sunt posibile declarații de forma
   double a[3], b[2][7];
In acest caz, alocarea de spațiu pentru tablouri nu se face în memoria dinamică, ci în cea statică sau pe stivă. Declarații de tablou similare se pot face și în alte limbaje de programare, dar nu în Java.

Componentele tabloului sunt tratate în program ca niște variabile simple, dacă aparțin unui tip primitiv, sau ca variabile-referință, când componentele sunt instanțe ale unei clase. Adresa sau referința componentei unui tabou, se poate afla cunoscând adresa de bază a tabloului  sau referința la acesta și indicii componentei respective. In consecință, accesul la oricare componentă a tabloului este direct, adică putem obține orice componentă a tabloului fără a parcurge în prealabil alte componente, cu condiția sa îi cunoastem indicele (indicii).

Atribuirea de valoare unei componente se face, deci, printr-o instrucțiune de forma
    referinta_la_componenta = expresie;
în care referința la componentă este numele referinței la tablou, însoțit de indicii componentei, de exemplu t[2] sau w[i][j]. Se observă ca numărul de operații elementare care se fac în această operație nu depinde de numărul de componente din tablou, deci operația are complexitatea O(1).

Preluarea valorii unei componente de tablou se face, de asemenea folosind într-o expresie referința la acea componenta și are tot complexitatea O(1).



© Copyright 2001 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați