luni, 16 martie 2020

clasa IX,X,16.03-20.03, Tema: Tipuri de date tablou (Array) (notiuni teoretice)


   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