Vom
considera următoarea problemă: E necesar să efectuăm o
analiză a preţurilor la diferite articole. Fiecărui articol i se poate pune în
corespondenţă un nume de variabilă, valoarea căruia este costul articolului
dat. De exemplu: caiete – 2.5,
stilouri – 3.25, creioane -1.15.
Însă în aşa caz, cînd primim o informaţie
despre un nou articol, vom fi nevoiţi să introducem în program un nume nou de
variabilă, ceea ce ar duce la redactarea întregului program. În locul acestui
şir de variabile, noi avem posibilitatea să le introducem pe toate într-un
tablou, le dăm un singur nume, iar
articolul concret e determinat cu ajutorul indicelui.
Pentru adresarea la un careva element al
tabloului este de ajuns de indicat după numele tabloului în paranteze pătrate
indicele lui. Ca indice poate fi nu numai o constantă, dar şi o variabilă, ce
ne dă posibilitatea să indicăm o acţiune care se referă la orice element al
tabloului. Toate elementele unuia şi aceluiaşi tablou au acelaşi tip.
Tablourile pot avea cîţiva indici. Tabloul
care conţine un singur indice ni-l putem închipui ca o singură linie de valori.
Folosirea indicelui al doilea este analog cu introducerea dimensiunii a doua.
Fie că e necesar să fixăm preţul diferitor
articole în fiecare săptămînă în decursul unui an. Pentru
aceasta va trebui să folosim 52 de variabile diferite pentru fiecare
articol, dar să lucrezi cu un aşa număr mare de variabile e destul de incomod.
E mai bine de folosit 52 de tablouri unidimensionale, dar şi mai convenabil va
fi de folosit un tablou bidimensional. Primul indice al acestui tablou ar
indica articolul concret, iar al doilea – săptămîna.
Considerăm următoarea problemă: Fie că avem
rezultatele campionatului la fotbal. Deci avem N echipe cu rezultatele fiecărui
meci. Pentru a găsi din această informaţie numărul de echipe, ce au mai multe
cîştiguri decît pierderi, numărul de echipe ce au încheiat campionatul fără
pierderi sau dacă există vre-o echipă, care a cîştigat mai mult de jumătate din
jocuri e destul de greu. Vom fi nevoiţi
să cercetăm fiecare echipă în parte şi apoi să analizăm informaţia în
întregime. E mult mai comod să introducem această informaţie într-un tablou
bidimensional şi în aşa caz reducem problema
la careva operaţii simple asupra tablourilor.
Definirea tablourilor unidimensionale.
Limbajul
Pascal permite memorarea tuturor
elementelor unui şir într-o singură variabilă indexată, în care fiecare element
ocupă o anumită poziţie. Un şir de elemente de acelaşi tip se numeşte tablou
unidimensional sau vector. Un element al unui tablou unidimensional se numeşte
componenta tabloului, iar poziţia unui element se numeşte indicele elementului.
Se declară tabloul în secţiunea de
declaraţii a programului. În declaraţie trebuie să apară: identificatorul
tabloului, tipul indicelor şi tipul elementelor. Din tipul de date al indicelor
trebuie să reiasă numărul maxim de elemente, adică cel mai mare număr de
elemente care s-ar putea memora în tabloul respectiv.
Sintaxa: Var
<Id_tablou>:Array[Tipul_indicelor] Of [Tipul_elementelor];
Tipul de date pentru indici trebuie să
fie un tip ordinal (enumerare, subdomeniu etc., cu un număr finit de valori şi
poate fi şi anonim. În definirea acestuia pot fi folosite constante simbolice,
dar nu pot fi folosite variabile). Tipul elementelor poate fi orice tip
predefinit sau definit de utilizator.
Tipul de date Array este anonim, dar el
poate fi denumit ca orice tip de date, utilizînd Type.
În urma declarării unui tablou
unidimensional, compilatorul rezervă pentru elementele sale o zonă virtual
continuă de memorie reeşind din numărul maxim de elemente al acestuia. Dar în
general, într-un program în care am declarat un tablou unidimensional, nu
folosim toate elementele lui. Numărul elementelor efectiv folosite, care diferă
de la o execuţie la alta, se numeşte numărul real de elemente şi se declară ca
variabilă. La fiecare execuţie a programului elementele pot primi alte valori.
De aceea, de regulă, numărul real de elemente şi elementele se citesc de la
intrare.
Elementele unui tablou unidimensional se
comportă ca nişte variabile simple, deci pot fi citite, afişate şi folosite în
expresii şi atribuiri.
Parcurgerea, citirea şi afişarea
elementelor unui tablou unidimensional.
Considerăm tabloul A[1..N], unde N
reprezintă numărul real de elemente. Prin parcurgerea tabloului se înţelege
“vizitarea” tuturor elementelor pe rînd
şi prelucrarea acestora. Parcurgem într-un ciclu poziţiile elementelor din
tablou i=1,2,…,N şi pentru fiecare valoare a lui i, “vizităm” şi prelucrăm
elementul A[i]:
{ cu ciclul For} For i:=1 To N Do <prelucrează A[i]>;
{ cu ciclul While } i:=1;
While i<=N Do Begin
<prelucrează A[i]>; Inc(i)
End;
{ cu ciclul Repeat}
i:=1; Repeat
<prelucrează A[i]>;
Inc(i)
Until i>N;
Nu putem citi dintr-o dată toate
elementele tabloului printr-o instrucţiune {ReadLn(A)}, pentru că A este o
variabilă indexată, care înglobează mai multe valori. Vom citi mai întîi
numărul real de elemente N, apoi elementele A[1], A[2],…,A[N] le vom citi pe
rînd în cadrul unui ciclu. Folosim algoritmul de parcurgere a tabloului
unidimensional. Parcurgem într-un ciclu poziţiile elementelor i=1,2,…,N şi
pentru fiecare valoare a lui i, se citeşte elementul de pe poziţia i, adică
elementul A[i].
{ citirea cu ciclul For} Write(’numarul
de elemente:’);ReadLn(N);
For i:=1 To N Do Begin
Write(’A[’,I,’]=’);
ReadLn(A[I])
End;
{ citirea cu ciclul While } Write(’numarul
de elemente:’);ReadLn(N);
i:=1; While i<=N Do Begin
Write(’A[’,I,’]=’); ReadLn(A[I]);
Inc(i)
End;
{ citirea cu ciclul Repeat} Write(’numarul
de elemente:’);ReadLn(N);
i:=1;
Repeat
Write(’A[’,I,’]=’); ReadLn(A[I]); Inc(i)
Until i>N;
Analog nu putem afişa dintr-o dată toate
elementele tabloului printr-o instrucţiune {WriteLn(A)}. Parcurgem într-un
ciclu poziţiile elementelor i=1,2,…,N şi pentru fiecare valoare a lui i, se
afişează elementul de pe poziţia i, adică elementul A[i].
{
afişarea cu ciclul For} For
i:=1 To N Do Write(A[I], ’ ’);
{
afişarea cu ciclul While } i:=1; While i<=N Do Begin
Write(A[I],’ ’);
Inc(i)
End;
{
afişarea cu ciclul Repeat} i:=1; Repeat
Write(A[I],’ ’); Inc(i)
Until i>N;
Definirea tablourilor bidimensionale.
Un tablou bidimensional este un tabel de
elemente de acelaşi tip dispuse pe linii şi coloane. Un tablou bidimensional
poate fi privit ca o variabilă indexată care înglobează în ea toate elementele.
Fiecare element se află pe o anumită linie şi o anumită coloană. Elementul din
linia i şi coloana j al tabloului bidimensional A se notează: A[i,j].
Parcurgerea, citirea şi afişarea
elementelor unui tablou bidimensional.
Considerăm tabloul
A[1..N,1..M], unde N reprezintă numărul de linii, M- numărul de coloane.
Parcurgem într-un ciclu liniile tabloului bidimensional i=1,2,…,N şi pentru
fiecare linie i, parcurgem într-un alt ciclu coloanele acestuia j=1,2,…,M.
Pentru fiecare valoare a lui i şi j, “vizităm” elementul A[i,j] de pe linia i
şi coloana j.
Parcurgerea
unui tablou bidimensional: For
i:=1 To N Do
For j:=1 To M
Do <prelucrează A[i,j]>;
Citirea
unui tablou bidimensional: For i:=1 To N Do
For j:=1 To M Do Begin
Write(’A[’,I,’,’,J,’]=’);
ReadLn(A[i,j])
End;
Afişarea
unui tablou bidimensional: For i:=1 To N Do Begin
For j:=1 To M Do Write (A[i,j]:5);
WriteLn
End;
Algoritmul
de parcurgere a unui tablou pătrat în
raport cu diagonalele:
Considerăm
un tablou bidimensional cu N linii şi N coloane, în care notăm i-indicele de
linie şi j-indicele coloanei.
§ elementele diagonalei principale
sunt A[i,j] cu i=j;
§ elementele de deasupra diagonalei
principale sunt A[i,j] cu i<j;
§ elementele de sub diagonala
principală sunt A[i,j] cu i>j.
Pentru a “vizita” elementele de deasupra diagonalei
principale avem două posibilităţi:
1)
Parcurgem toate elementele în două
cicluri (liniile i de la 1 la N ,
coloanele j de la 1 la N )
şi pentru fiecare element A[i,j] testăm dacă este situat deasupra diagonalei
principale;
For i:=1 To N Do
For j:=1 To N Do
If
i<j Then <prelucrează A[i,j]>;
2)
“Vizităm” numai elementele aflate
deasupra diagonalei principale: parcurgem liniile i ale tabloului
(i=1,2,...,N-1), dar pentru fiecare linie i parcurgem numai coloanele j mai
mari decît i, adică j=i+1,...,N.
For i:=1
To N-1 Do
For j:=i+1 To N Do <prelucrează A[i,j]>;
Analog pentru
elementele aflate sub diagonala principală:
1)
Parcurgem toate elementele în două
cicluri (liniile i de la 1 la N ,
coloanele j de la 1 la N )
şi pentru fiecare element A[i,j] testăm dacă este situat sub diagonala
principală;
For i:=1 To N Do
For j:=1 To N Do
If
i>j Then <prelucrează A[i,j]>;
2)
“Vizităm” numai elementele aflate
sub diagonala principală: parcurgem liniile i ale tabloului (i=2,3,...,N), dar
pentru fiecare linie i parcurgem numai coloanele j mai mici decît i, adică
j=1,...,i-1.
For i:=2
To N Do
For j:=1 To i-1 Do <prelucrează A[i,j]>;
§elementele diagonalei secundare sunt A[i,j] cu i=N-j+1;
§elementele de deasupra diagonalei secundare sunt A[i,j] cu
i<N-j+1;
§elementele de sub diagonala secundară sunt A[i,j] cu
i>N-j+1.
Pentru a “vizita” elementele de deasupra diagonalei secundare
avem două posibilităţi:
1)
Parcurgem toate elementele în două
cicluri (liniile i de la 1 la N ,
coloanele j de la 1 la N )
şi pentru fiecare element A[i,j] testăm dacă este situat deasupra diagonalei
secundare;
For i:=1 To N Do
For j:=1 To N Do
If
i<N-j+1 Then <prelucrează A[i,j]>;
2)
“Vizităm” numai elementele aflate
deasupra diagonalei secundare: parcurgem liniile i ale tabloului (i=1,2,...,N-1),
dar pentru fiecare linie i parcurgem numai coloanele j mai mici decît N-i,
adică j=1,...,N-i.
For i:=1 To N-1 Do
For j:=1 To N-i Do <prelucrează A[i,j]>;
Procedăm analog
pentru elementele aflate sub diagonala secundară:
1)
Parcurgem toate elementele în două
cicluri (liniile i de la 1 la N ,
coloanele j de la 1 la N )
şi pentru fiecare element A[i,j] testăm dacă este situat sub diagonala
secundară;
For i:=1 To N Do
For j:=1 To N Do
If
i>N-j+1 Then <prelucrează A[i,j]>;
2)
“Vizităm” numai elementele aflate
sub diagonala secundară: parcurgem liniile i ale tabloului (i=2,3,...,N), dar
pentru fiecare linie i parcurgem numai coloanele j mai mari decît N-i+2, adică
j=N-i+2,...,N.
For i:=2 To N Do
For j:=N-i+2 To N Do <prelucrează A[i,j]>;
Niciun comentariu:
Trimiteți un comentariu