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
(c
i
<c
j
) (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.
Programarea calculatoarelor 36
Accesul la elementele unui tablou este aleator. Pentru specificarea unei anumite
componente se folosesc indecsi.
type T= array[I]or T
o

unde: I reprezinta tipul indexului
T
o
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(T
o
))
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 rndul 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 rndul 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.:
Programarea calculatoarelor 38
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 T
o


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) = 2
card(To)

Pe structura multime se definesc urmatorii operatori elementari:
apartenenta
U reuniunea AUB = {x/ xA sau xB}
I intersectia AIB = {x/ xA si xB}
\ diferenta A\B = {x/ xA si xB}
diferenta simetrica AB = (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 T
o

Pentru caracterizarea unui fisier folosim simbolurile:
<> secventa vida
Programarea calculatoarelor 40
<xo> secventa cu 1 componenta
x = <x1, , xm>, y = <y1, , yn>
Se definesc operatorii:
1. first (x) x1
2. rest(x) <x2, , xm>
3. xy <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) x
S
= <> (n stnga ?)
x
D
= 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) x
S
= x
D
<first (x
D
)>
x
D
= rest(x
D
)
x = first (rest(x
D
))

Definitie:
eof (x) (x
D
== <>)

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 sfrsit)
Organizari ale datelor

41