Sunteți pe pagina 1din 7

Organizari ale datelor 35

4. Organizari ale datelor

Fiecare constanta, variabila, expresia sau functie are un anumit tip.


În orice limbaj de programare exista anumite tipuri constituante (elementare).
Pe baza lor se pot defini alte tipuri de date care sunt tipurile structurate.
Definim cardinalitatea unui tip ca fiind numarul de valori distincte ce
apartin unui tip dat T.
Fiecarui tip de data i se asociaza un set de operatori. Între un tip de data si
operatorii sai exista o relatie de dualitate.
Ex.: Tipuri primitive standard
Tip Operatori
Integer +, -, *, div
Real +, -, *, /
Boolean true, false, and, or, not, ==, !=, <, >, ≤, ≥
Char <, >, ≤, ≥, … (cod ASCII)

Un tip se defineste în pseudocod prin:


type T=(c1, c2, …, cn)
unde card(T)=n
sau type T=min..max
Exemplu:
type boolean = (false, true)
type culoare = (rosu, galben, albastru)
type structura = (tablou, înregistrare, multime, fisier)
type cifre = '0'..'9'
var c: culoare
c=rosu (c=1 în calculator)

Daca vom stabili între valorile unui tip o relatie de ordine de tipul
(ci<cj) ≡ (i<j),
atunci se pot defini operatrorii succ(x), pred(x).

4.1 Tablouri

Tabloul este o structura de date cu toate elementele de acelasi tip.


36 Programarea calculatoarelor

Accesul la elementele unui tablou este aleator. Pentru specificarea unei anumite
componente se folosesc indecsi.
type T= array[I]or To
unde: I – reprezinta tipul indexului
To – tipul de baza (tipul elementelor)

Exemplul 1:
type sir = array[0..9] of real
var x:Sir
Accesul la al i-lea element al tabloului x se face prin constructia x[i].

Exemplul 2:
x[0]=6.3;
x[2]=7.4;

Indexul unui tablou este de tip scalar. El poate fi calculat, deci în locul indexului
se poate utiliza o expresie.

Exemplul 3:
x[2i+1] (accesul elementelor de ordin par)

Teorema
Cardinalitatea unui tip structurat este produsul cardinalitatii elementelor sale.
Pentru tablouri aceasta devine
card T = (card(To))n
unde n=card(I)

Exemplu: Se da tabloul a si variabila scalara x. Sa se determine cel mai mic


indice al unui element din a, egal cu x.

Solutia1:
var a: array[0..N-1] of T; {N>0}
i=0;
while (a[i] != x) and (i<N) i=i+1; endw
if a[i] != x then "Nu exista un astfel de element în a"
Organizari ale datelor 37

Solutia 2 (Tehnica santinela):


var a : array[0..N] of T;
i=0; a[N]=x;
while (a[i] != x) i=i+1; endw
if i==N then "Nu exista un astfel de element"

Componentele tabloului pot fi la rândul lor date structurate:


Exemplu:
Matrice
type M=array[0..7] of Sir
Accesul la un element se face prin constructia
M[i][j], unde i este rândul si j coloana.
Descrierea se poate face si direct printr-o constructie de forma:
type M=array[0..7] of array [0..9] of real
sau mai simplu
type M=array[0..7,0..9] of real.

4.2 Înregistrari

Reuniunea elementelor de tipuri arbitrare în unul compus constituie


metoda cea mai generala de obtinere a tipurilor structurate.
În pseudocod, o înregistrare se descrie prin:
type T = record
S1 : T1;
S2 : T2;

Sn : Tn;
end
unde S1, S2, …, Sn se numesc selectori, iar T1, T2, …, Tn sunt tipurile
componentelor.
Avem:
card(T) = card(T1)*card(T2)*…*card(Tn)

Exemplu.:
38 Programarea calculatoarelor

type Complex = record


re : real;
im : real;
end

type Data_calendaristica = record


zi : 1..31;
luna : 1..12;
an : 1800..2000;

type Persoana = record


nume : array[20] of char;
prenume : array[20] of char;
data_nasterii : Data_calendaristica;
sex: (masculin, feminin);
stare_civila : (necasatorit, casatorit, divortat);
end

Accesul la un element Si al înregistrarii x de tipul T se face prin constructia: x.


Si.
Exemplu:
var z : Complex; p : Persoana;
z.re = 7.3;
z.im = 5.4;
p.data_nasterii.luna = 1;
p.nume[1]; {a doua litera a numelui}

Observatie:
Mai multe înregistrari de acelasi tip pot fi organizate sub forma unui tablou.

Exemplu:
a : array[0..N-1] of Persoana;
Accesul la componenta sex a celei de-a i-a persoane se face printr-o
constructie de forma:
a[i].sex.
Organizari ale datelor 39

Aplicatie:
Sa se numere persoanele feminine si necasatorite.
num = 0;
for i = 0; i < N; i = i+1;
if (a[i].sex == feminin) and (a[i].stare_civila == necasatorit) then
num = num+1;
endif
endf

4.3. Multime

O multime este definita prin:


type T = set of To

Exemplu:
type setint = set of 0..19;
type setchar = set of char;
var is : setint; is = [5, 7, 2, 19];
cs : setchar; cs = [':', 'A', '7', '/'];
card(T) = 2card(To)
Pe structura multime se definesc urmatorii operatori elementari:
∈ – apartenenta
U – reuniunea AUB = {x/ x∈A sau x∈B}
I – intersectia AIB = {x/ x∈A si x∈B}
\ – diferenta A\B = {x/ x∈A si x∉B}
∆ – diferenta simetrica A∆B = (A\B)U(B\A)

4.4. Fisierul secvential

Diferenta dintre fisierul secvential si tipurile de date anterioare este


faptul ca are o cardinalitate teoretic infinita.
Definirea: type T = file of To
Pentru caracterizarea unui fisier folosim simbolurile:
<> – secventa vida
40 Programarea calculatoarelor

<xo> – secventa cu 1 componenta


x = <x1, …, xm>, y = <y1, …, yn>
Se definesc operatorii:
1. first (x) ≡ x1
2. rest(x) ≡ <x2, …, xm>
3. x∧y ≡ <x1, …, xm, y1, …, yn>, concatenare
Avem: < first(x) ∧ rest(x)> ≡ x
Pentru lucru în fisier se utilizeaza o zona buffer (notata x↑), în care se
pastreaza o componenta a fisierului.
4. Initiere construire fisier:
rewrite (x) ⇒ x =<> (rebobinare banda)
5. Initiere examinare:
reset (x) ⇒ xS = <> (în stânga ?)
xD = x (în dreapta tot)
x↑ = first (x) (în buffer prima componenta)
6. Adaugarea unei componente la coada secventei.
put(x) ⇒ x= x∧<x↑>
7. Trecerea la examinarea secventei urmatoare:
get(x) ⇒ xS = xD ∧ <first (xD)>
xD = rest(xD)
x↑ = first (rest(xD))

Definitie:
eof (x) ≡ (xD == <>)

7. Citire elementului urmator din x în var. v.


read(x,v) ≡ v = x↑; get(x);
Observatie: Operatia se poate face cu conditia ca not eof (x).
8. Scriere variabilei v în fisierul x:
write(x,e) ≡ x↑ = v; put(x);
Observatie:
Operatia se poate face daca eof (x) (adaugare la sfârsit)
Organizari ale datelor 41

S-ar putea să vă placă și