Un array (masiv) este un bloc continuu de celule din memoria calculatorului, reunit sub un nume comun. Array-ul descrie o structură de entităţi (componente) care, geometric, sunt atît de regulate încît oricare dintre ele pot fi specificate în mod unic prin precizarea coordonatelor. Aceste coordonate sunt numite indici. În limbajul Pascal indicii sunt listaţi în paranteze drepte care urmeaza numelui array-ului ca în a[3] (se citeşte a de 3) şi b[i,j] (se citeşte b de i şi j!). Deşi [3] şi [i,j] nu pot apărea ca indici, ei sunt versiuni liniarizate ale indicilor folosiţi în notaţii ca a3 şi bi,j. Din moment ce array-urile sunt stocate în memorie, orice componente ale acestora pot fi accesate (regăsite) foarte repede, timpul de acces fiind independent de locaţia componentei (array-ului).
Array-urile ale căror componente pot fi identificate folosind un singur indice sunt numite array-uri unidimensionale, array-urile ca b[i,j] cu doi indici sunt numite bidimensionale, iar cele cu mai mult de doi indici sunt numite multidimensionale.
Matematicienii şi oamenii de ştiinţă folosesc frecvent array-uri bidimensionale pe care le numesc matrici. Toate array-urile ilustrate mai jos respectă definitia unui array, dar ele nu sunt în egală masură acceptate de Pascal
Array-urile sunt folositoare, dar nu necesare pentru însumarea numerelor. Consideram urmatorul program pentru adunarea a cinci valori întregi:
PROGRAM suma5;
var
a,b,c,d,e,suma:integer;
begin
writeln(‘Introduceti a,b,c,d,e ‘);
readln(a,b,c,d,e);
suma:=a+b+c+d+e;
writeln(‘Suma este: ‘,suma)
end {suma5}.
Acum, presupunem ca în loc de cinci valori de intrare avem 50, 500 sau 5000! Evident, tehnica utilizată în programul suma5 nu “prea ţine”; cine este dispus să inventeze 5000 de nume diferite de variabile? Altfel stau lucrurile dacă vom folosi un array, ca în programul nouasuma5.
PROGRAM nouasuma5;
const
n=5000;
var
a:array[1..n] of integer;
i,suma:integer;
begin
suma:=0; { initializare suma }
for i:=1 to n do
begin
read(a[i]);
suma:=suma+a[i];
end;
write(suma);
end {nouasuma5}.
Se pune următoarea întrebare: a fost necesară definirea unui array? Raspunsul este: nu. Argumentul este simplu – nu a fost exploatată proprietatea de acces direct a array-ului. Pentru această problemă, soluţia preferată este cea ilustrată în programul prezentat mai jos, care foloseşte o singură variabilă de intrare a:
PROGRAM suma;
var
s,a:integer;
begin
s:=0;
while NOT eof do
begin
read(a);
s:=s+a;
end;
write(s);
end {suma}.
§3. Managementul indicilor
Presupunem că a este de tip array [0..n] of integer; unde n este o constantă, iar i un înteger. Pentru a atribui fiecărui element a[i] valoarea indicelui este usor.
for i:=0 to n do
a[i]:=i;
Pentru a atribui fiecărui element a[i] valoarea n-i procedam ca în exemplul urmator:
Exemplu:
for i:=0 to n do
a[i]:=n-i;
for i:=0 to n do
a[n-i]:=i;
În fiecare caz a trebuit să descoperim cîte o relaţie între a[i], a[n-i] şi i şi între a[i] şi n-i.
Iata un exemplu mai interesant.
Presupunem că procedura exchange este corespunzător definită ca un array ce conţine cîteva valori şi că dorim să inversăm ordinea acelor valori.
a[0]<->a[n]
a[1]<->a[n-1]
a[2]<->a[n-2]
Relaţia dintre indicii succesivi este uşor de stabilit:
a[i]<->a[n-i]
Dar ce limită superioară ar trebui să fie folosită de ciclul for astfel încît să minimalizăm numărul de schimbări necesare ?
Exprimarea din exemplul urmator, dupa cum se poate constata uşor, nu face mai nimic!
Exemplu:
for i:=0 to n do
exchange(a[i],a[n-i]);
Ceea ce ne trebuie este soluţia următoare, care lucrează atît pentru o valoare para a lui n, cît şi pentru o valoare impară.
Exemplu:
for i:=0 to (n-1) div 2 do
exchange(a[i],a[n-i]);
Exemplele prezentate sunt tipice utilizării array-ului cu o dimensiune. Cheia succesului constă în managementul indicilor.