Operatorul []

Am discutat pâna acum despre toti operatorii, care în mod traditional sunt considerati a fi operatori (Borland) PASCAL, dar în realitate exista unul foarte important : [] (subscript operator). Acest operator permite accesul ("look up") la un component particular al grupului de operanzi de tip ARRAY (masiv). Pâna în acest moment am facut numai aluzie la ARRAY, pentru ca este un tip de data structurata, pe care noi am concentrat-o în cele de tip simplu. O prezentare detaliata a datelor structurate de tip ARRAY, cât si aplicatiile acestora nu vor fi prezentate pâna în Conversatia 8, dar le vom prefata în cele ce urmeaza, datorita importantei pe care o prezinta operatorul "[]".

Un masiv tablou ARRAY este o secventa de valori de tipuri identice cu urmatoarele caracteristici:

  1. Un ARRAY (masiv) are un nume (identificator);
  2. Fiecare component este de acelasi tip si ocupa acceasi cantitate de memorie;
  3. Toate componentele sunt stocate în memorie în asa fel încât orice componenta a masivului poate fi accesata direct printr-un index;
  4. Timpul cerut pentru accesarea oricarui element al masivului, este acelasi, pentru orice index.

De exemplu, sa presupunem ca pentru variabila vector, vrem sa alocam în memorie o suta de zone, în loc de una pentru a memora valori întregi.

Masivul (ARRAY) dorit poate fi declarat direct intr-o sectiune VAR:

Exemplu:
VAR
vector : ARRAY [0..99] of integer;

Poate fi, în schimb declarat cu nume printr-o combinatie de enunturi type si var:

Exemplu:
TYPE
...secventa = ARRAY[0..99] of integer;
VAR
...vector : secventa;

Accesul la primul element al vectorului se realizeaza prin vector[0], la cel de-al doilea prin vector[1] si la ultimul prin vector[99]. In general, accesul la orice element al vectorului se realizeaza prin vector[e], unde e este o expresie PASCAL, valida, a carei valoare este un întreg ce apartine domeniului specificat (în cazul nostru de la 0 la 99 inclusiv).

Remarca. Expresia e se numeste index-ul masivului (vectorului). Vectoraeî se citeste "vector de e", fiind o prescurtare de la "elementul e al vectorului e", "[]" fiind un operator simbolic utilizat pentru indexare.

Variabila folosita pentru masive poate fi orice identificator legal. Sa exemplificam, în cele ce urmeaza, conceptul de variabila structurata de tip masiv pe enuntul de atribuire (vezi Conversatia 8) care transforma caracterele ASCII din majuscule în litere mici:

ch:=chr(ord(ch)+32);

Puteti folosi un masiv pentru a realiza acelasi lucru. Tot ceea ce avem de facut este sa construim un tabel în care literele majuscule sunt stocate în "cutii" (zone) adiacente.

Tabelul este un masiv (vector), iar cutiile sunt elemente masivului care sunt etichetate cu litere majuscule corespunzatoare.

Etichetele servesc ca index care poate fi folosit împreuna cu numele masivului pentru a regasi un element. De exmplu, daca numim masivul tabel, putem referi pe 'c' din a treia pozitie prin tabel['C'] sau putem schimba pe 'd' din a patra pozitie scriind tabel['D']:=’x’.

Daca variabila ch a fost declarata ca fiind de tip char si ne-am asigurat ca valoarea lui ch este o litera majuscula, atunci ea poate fi schimbata cu litera mica corespunzatoare scriind ch:stabel achî.

Intrebarea care se pune este urmatoarea: nu pierdem destul timp sa realizam acest tabel ?

Cu siguranta ca da. Pentru a elimina acest incovenient, va propunem solutia din urmatorul program.

PROGRAM schimb;
{schimba majusculele in litere mici}
VAR
...ch:char;
...tabel:ARRAY['A'..'Z'] of char;
 
PROCEDURE initializare;
VAR
...c:char;
...litera:char;
BEGIN
...litera:='a';
...FOR c:='A' to 'Z' DO
...BEGIN
......tabel[c]:=litera;
......litera:=succ(litera)
...END;
END {initializare};
 
BEGIN {program principal}
...intializare;
...writeln('introduceti liniile de text');
...writeln;
...WHILE NOT eof DO
.....BEGIN
......WHILE NOT eoln DO
......BEGIN
.........read(ch);
.........if ch in ['A'..'Z'] THEN
............write(tabel[ch])
.........else write (ch)
......END; {procesarea unei linii}
......readln;
......writeln
.....END
END {schimb}.

Remarca.

Programul utilizeaza procedura initializare pe care o apeleaza o singura data. Simulati cu creionul si hârtia modul de functionare al procedurii folosite.