Sunteți pe pagina 1din 18

STRUCTURI DE DATE - Curs 1 1

CURS 1. - STRUCTURI DE DATE


Scop : prezentarea celor mai importante structuri de date ce
pot fi utilizate pentru modelarea datelor din aplicatii.
I. INTRODUCERE
1. Conceptul de structură de date

Orice algoritm primeşte date de intrare, le prelucrează şi obţine date de ieşire. În fiecare
caz, datele de intrare, datele intermediare - cele create în timpul prelucrării - şi datele de ieşire
sunt structurate (organizate) într-un anumit fel care corespunde intrării, necesităţilor de
prelucrare sau a celor de utilizare ulterioară.
Pentru a veni în sprijinul programatorilor, limbajele de programare evoluate (de exemplu
Pascal, C) pun la dispoziţia acestora posibilitatea organizării datelor în anumite "şabloane"
numite tipuri de date. Mai precis, prin tip de date se înţelege:
• o mulţime de valori;
• o regulă de codificare a acestora;
• o mulţime de operaţii definite pe mulţimea datelor.
La rândul lor, tipurile de date pot fi:
• simple - descriu date care apartin unor mulţimi care nu sunt rezultate ca produs
cartezian al altor mulţimi. Exemplu: integer.
• structurate -descriu date care apartin unor mulţimi rezultate ca produs
cartezian al altor mulţimi.
Exemple:
1. type rational=record
p,q:integer;
end
Prin tipul de mai sus se descrie structura unei variabile capabilă să reţina numere raţionale.
2. type vector-array [1..100] of real;

Fie B mulţimea valorilor care pot fi reţinute de tipul real. Atunci o variabilă de tip vector poate
reţine la un moment dat un element al mulţimii:
BxBx...xB
de n ori
Practica impune utilizarea unor structuri ale datelor de o mare varietate, care nu se
suprapun întotdeauna peste tipurile care pot fi descrise prin limbaj, de obicei obţinându-se
prin combinarea celor elementare .
2 Curs 1 - STRUCTURU DE DATE

 Prin structură de date vom înţelege un asamblu de date caracterizat prin relaţiile
existente între ele şi a operaţiilor care pot fi efectuate cu datele respective.
Vom numi nod o variabilă de un tip oarecare. De obicei, acest tip este structurat. După
caz, termenul nod poate fi înlocuit cu articol, înregistrare sau entitate.
În cele mai multe cazuri, "ansamblul de date" care alcătuieşte structura e alcătuit dintr-o
mulţime cu un număr variabil de noduri.

2. Clasificarea structurilor de date :


I. Structuri de date elementare :
- tablouri ( vectori, matrici, şiruri de caractere )
- înregistrare
- mulţime
- fişiere
II. Structuri de date dinamice :
- structura de tip listă ( listă simplu înlănţuită, dublu înlănţuită, circulară, stivă, coadă )
- structura de tip arbore: arbori binari, arbori binari de cautare, arbori oarecare.
III. Structuri de tip graf :
- grafuri neorientate
- arbori
- grafuri orientate
Observaţie :
Algoritmii de prelucrare a structurilor de date vor fi implementaţi şi prezentaţi în
limbajul Pascal.

II. Structuri de date elementare :


În cele mai multe situaţii reale, un program trebuie să lucreze cu foarte multe date.
Utilizând pentru aceste date numai tipuri simple, programul devine foarte greu de înţeles şi chiar
de scris. O dată complexă, care memorează mai mult decât o dată simplă se numeşte structură de
date. Principalele structuri de date elementare (tipuri structurate de date) ale limbajului Pascal
sunt (care au corespondent si alte limbaje de programare):
 Tipul de date tablou (ARRAY)

 Tipul de date sir de caractere (STRING)

 Tipul de date înregistrare (RECORD)

 Tipul de date mulţime (SET)

 Tipul de date fişier (FILE)


STRUCTURI DE DATE - Curs 1 3

1. Structura de tip tablou – se foloseşte pentru păstrarea mai multor date de acelaşi tip.
Un tablou este o mulţime finită şi ordonată de elemente de acelaşi tip căruia i se asociază un
nume. Un element al mulţimii este identificat prin intermediul numelui tabloului şi a valorii
unuia sau mai multor indici (tablourile putând fi unidimensionale sau multidimensionale) cu
valori în subdomenii ale tipurilor ordinale (integer, char, boolean).
Pentru fiecare tip de date tablou utilizat într-un program Pascal trebuie specificat
domeniul de valori pentru fiecare indice şi tipul elementelor tabloului (denumit şi tip de bază).
În general, o declaraţie de tip tablou are forma :
array [ lista_domenii_indici ] of tip_element
unde tip_element este tipul de bază iar lista_domenii_indici este o listă formată din elemente de
forma : valoare minimă .. valoare maximă sau numele unui tip ordinal. Prin tipul indicelui se
fixează implicit şi numărul componentelor tabloului.
Tablourile se pot clasifica în felul următor:
 Tablouri cu o singură dimensiune care se mai numesc şi vectori

 Tablouri cu două dimensiuni care se mai numesc şi matrici

 Tablouri cu mai multe dimensiuni

a) Tablouri cu o singură dimensiune

Se declară în felul următor:


type nume = array [tip indice] of Tip_element;
O astfel de descriere a tipului tablou poate să apară într-o declaraţie explicită de tip
(secţiunea TYPE). De exemplu declaraţia:
type vector = array [1..10] of REAL;
defineşte un tip tablou de 10 elemente de tip real, iar declaraţia:
var A : vector; ,
reprezintă declaraţia unei variabile de tipul vector care s-a definit mai sus. Limbajul Pascal
permite şi declaraţii de tipuri anonime, când declaraţia tipului tablou se face direct în secţiunea
VAR fără a mai atribui un nume tipului respectiv. De exemplu, declaraţia de mai sus se poate
face şi astfel:
var A : array [1..10] of REAL;
Elementele unei variabile de tip tablou sunt tratate ca şi variabile având tipul de
bază. Un element al unei variabile de tip tablou este identificat prin:
nume[lista_valori_indici] unde nume este numele variabilei de tip tablou iar lista_valori_indici
conţine câte o expresie pentru fiecare indice, având tipul compatibil cu cel al indicelui tabloului.
De exemplu, elementele tabloului A se pot identifica prin A[1], A[2], ..., A[10].
Ca indice se poate folosi orice expresie. Aceasta se evaluează în momentul selectării
elementului iar rezultatul trebuie să fie de tipul indicelui. Domeniul ales pentru indici nu poate fi
oricât de mare deoarece memoria sistemului de calcul este limitată. De exemplu, tipul indicelui
poate fi orice tip ordinal cu excepţia tipului integer şi word sau longint al căror domeniu de
valori este prea mare pentru a putea fi domeniul indicilor unui tablou.
4 Curs 1 - STRUCTURU DE DATE

Ex: -notele unui student la cele 6 obiecte (datele sunt de acelaşi tip )

7 10 9 10 4 10 tablou unidimensional

Note ( tablou )

Note[1] Note[2] Note[3] Note[4] Note[5] Note[6]


7 10 9 10 4 10
poziţie
Ex:a. Cum am defini o structură care să păstreze notele timp de un an ( 12 examene )?
TYPE Vector = ARRAY [1..12] OF Byte;
VAR Note : Vector;
b. Cum am defini o structură care să păstreze valorile reale inregistrate într-un proces.?
TYPE TVector = ARRAY [1..10000] OF Real;
VAR Valori: TVector;
Obs. In Pascal (si in alte limbaje de programare) trebuie avut grija sa nu depasim memoria
disponibila atunci cand declarăm tablouri. De exemplu, vectorul nu poate depasi 65535 de octeti
(adica un segment de date)
b) Tablouri cu mai multe dimensiuni
In practică sunt situatii în care multimea de valori pe care o prelucrăm poate fi
identificată prin doi sau mai mulţi indici. In acest caz putem folosi un tablou cu mai multe
dimensiuni, in care elementele sunt identificate prin 2 sau mai mulţi indici.
În Pascal, declararea unui tip tablou cu două dimensiuni (numit matrice) se face cu
construcţia.
var m : array[tip_indice_1,tip_indice_2] of tip_element;
iar accesul elementelor se face cu m[i,j];
Tabloul m fiind considerat o matrice, m[i,j] este elementul situat pe linia i şi coloana j.
Prin generalizare dacă în cazul tabloului m şi tip_element este tot un tablou se ajunge la
un tablou cu trei dimensiuni şi prin generalizare la un tablou cu n dimensiuni care se declară în
felul următor:
type Tab_cu_n_dim = array [tip_ind_1,tip_ind_2,. . .tip_ind_n] of tip_element;
Exemplu:
Ex: - doresc să păstrez notele pentru 3 studenţi
1 2 3 4 5 6 coloane

1 7 10 9 10 4 5
2 10 9 10 10 5 5
3 7 7 8 5 6 6 Note[2, 4]

linii linie/coloană

Note - tablou bidimensional


STRUCTURI DE DATE - Curs 1 5

Exemplu:
TYPE Tnote = ARRAY[1..30,1..12] OF Byte;
VAR Note : Tnote;
Ne interesează tehnicile de prelucrare cu această structură de tip tablou.
Prelucrarea ( operarea ) cu structura de tip tablou:
1. Tablouri unidimensionale ( vector ):
Presupunem că există structura :
TYPE Vector = ARRAY [1..100] OF Byte;
VAR X: Vector;
N: Byte;
Vom prezenta cele mai importante operaţii cu această structură. În practică, aceste operaţii se
combină pentru a rezolva cerinţele problemei :

a. Citirea vectorului ( tabloului):


PROCEDURE Citire (var X: Vector; var N : Byte);
VAR i : Byte;
BEGIN
Write(‘Numărul de componente :’);
Readln(n);
FOR i:=1 TO N DO
BEGIN
Write(‘ Daţi componenta ‘,i,’ :’);
Readln(X[i]);
END;
END;

b. Afişarea vectorului :

PROCEDURE Afişare ( X: Vector; N: Byte);


VAR i: Byte ;
BEGIN
Write(‘Vectorul este :’);
FOR i:=1 TO N DO
Write(X[i],’ ‘);
END;

c. Ordonarea vectorului :
c1. Metoda bulelor :
Ex: 7 3 5 9 2 - se iau primele 2 elemente, dacă nu sunt ordonate
crescător se inversează ; avem 5 elemente şi deci
3 7 5 9 2 5-1= 4 perechi de numere; în procedură vom avea

3 5 7 9 2 N elemente şi N-1 perechi ;

3 5 7 2 9
3 5 2 7 9
3 2 5 7 9
2 3 5 7 9
6 Curs 1 - STRUCTURU DE DATE

PROCEDURE OrdonareaBS (var X: Vector; N:Byte);


VAR k, i, Aux : Byte;
BEGIN
REPEAT
k:=0;
FOR i:=1 TO N-1 DO
IF X[i] > X[i+1] THEN
BEGIN
Aux := X[i] ;
X[i] := X[i+1] ;
X[i+1] := Aux ;
k:=1;
end;
UNTIL k=0;
END;

c2. Metoda aducerii minimului pe prima poziţie (selecţiei):


Ex: 7 3 5 9 2 - se determină minimul dintre cele cinci elemente
-minimul se inversează cu primul element
2 3 5 9 7 -vectorul format din patru elemente: 3,5,9,7 are min. 3,
2 3 5 9 7
2 3 5 9 7 - pentru vectorul cu 5 elemente am calculat 5-1=4
2 3 5 7 9 minime
Pentru un vector cu N elemente vom avea (N-1) minime.
PROCEDURE OrdonareMin (var X: Vector; N: Byte);
VAR i, j, Poz, Min: Byte;
BEGIN
FOR i:=1 TO N-1 DO
BEGIN
Min := X[i];
Poz := i;
FOR j:=i TO N DO
IF Min>X[ j] THEN
BEGIN
Min := X[ j];
Poz := j;
END;
X[Poz] := X[i];
X[i] := Min;
END;
END;

c3. Sortarea prin numărare: se ia fiecare element şi se numără câţi sunt mai mici decât el.

Ex: x= 7 3 5 9 2
y= 3 1 2 4 0 poziţia în vecror +1

sunt 3 numere în vector mai mici decât 7 ( 7 se află pe prima


poziţie ); numărul 3+1 va fi noua poziţie în vector a lui 7 ;
STRUCTURI DE DATE - Curs 1 7

z= 2 3 5 7 9

PROCEDURE OrdonareNum( var x:Vector; N: Byte );


VAR y, z : Vector;
i,j : Byte;
BEGIN
FOR i:= 1 TO N DO
y[i] := 0;
FOR i:= 1 TO N DO
FOR j:= i+1 TO N DO
IF x[i]<x[ j] THEN
y[ j]:= y[ j] +1
ELSE
y[i]:= y[i] +1;
FOR i:= 1 TO N DO
z[y[i] +1] := x[i];
FOR i:= 1 TO N DO
x[i] :=z[i];
END;

d. Contorizarea elementelor:

Ex: Să se afle numărul elementelor mai mici decât 5 ( sunt două ):

Note = 7 4 5 3 10

PROCEDURE Contorizare (x: Vector; N:Byte; var: Nr: Byte);


VAR i:Byte;
BEGIN
Nr := 0;
FOR i:=1 TO N DO
IF condiţie THEN
Nr := Nr+1;
END;

Condiţia pentru aflarea numărului de examene nepromovate Note[i] < 5.

e. Însumarea elementelor :

Ex: Să se afle media notelor unui student :


7 4 5 3 10
S= (7+4+5+3+10)/5 = 28/5 = 5.6

PROCEDURE Suma (x:Vector; N:Byte; var S:LongInt);


VAR i: Byte;
BEGIN
S:= 0;
FOR i:=1 TO N DO
S:= S + x[i];
END;
8 Curs 1 - STRUCTURU DE DATE

f. Determinarea minimului (maximului) din vector:

Ex: 7 4 5 3 10

Observaţie: se foloseşte o variabilă suplimentară care reţine Min .


Se ia - primul element 7, Min =7;
-al II-a element 4, se compară 4<7, inversăm , Min=4, se reţine acest minim;
- al III-a element 5, se compară 4<5, lăsăm Min=4;
-al IV-a element 3, se compară 3<4, inversăm, Min=3, se reţine acest minim;
-al V-a element 10, se compară 3<10, lăsăm Min=3;
Obs. Dacă nu se poate cunoaşte prima valoare pentru a o atribui variabilei min, se poate
iniţializa cu o valoare mare care nu face parte din vector.

PROCEDURE Minim( x:Vector;N: Byte; var: Min: Byte);


VAR i: Byte;
BEGIN
Min := x[1];
For I:=2 to n do
IF Min > x[i] then
Min := x[i];
END;

PROCEDURE Maxim (x:Vector;N: Byte; var: Max: Byte);


VAR i: Byte;
BEGIN
Max := x[1];
For I:=2 to n do
IF Max < x[i] then
Max := x[i];
END;

g. Căutarea unui element în vector:

PROCEDURE Căutare (x:Vector; N:Byte;y:Byte;var Găsit : boolean);


VAR i: Byte;
BEGIN
Găsit := False ;
FOR i:=1 TO N DO
IF x[i]= y THEN
Găsit := True;
END;

PROCEDURE Căutare1 (x:Vector; N:Byte;y:Byte;var Poz : Byte);


VAR i: Byte;
BEGIN
Poz:=0;
FOR i:=1 TO N DO
IF x[i]= y THEN
Poz:=I;
END;

Prelucrarea matricilor se face similar, cu deosebirea că vor fi necesare două instrucţiuni for
pentru a parcurge elementele (unul care parcurge liniile şi altul care parcurge coloanele)
STRUCTURI DE DATE - Curs 1 9

2.Tipul de date STRING (şir de caractere)

Programele lucrează foarte des cu denumiri de obiecte, de exeplu numele unei


persoane sau denumirea unui produs. Pentru astfel de situaţii s-a introdus tipul de date
string sau sir de caractere.
O secvenţă de caractere se numeşte “şir de caractere” şi reprezintă una dintre
principalele structuri de date ale limbajului Pascal. Se utilizează destul de frecvent deoarece în
mai multe programe apar date care se reprezintă prin şiruri de caractere, ca de exemplu: nume,
adrese, etc. Exemplu de şir de caractere:

E C U A Ţ I A N U A R E S O L U Ţ I I
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

Poziţia unui caracter într-un şir este numerotată de la 1 până la lungimea şirului (numărul
maxim de caractere din şir). În cazul exemplului poziţia caracterului ‘N’ este 9. După cum se
poate observa reprezentarea unui şir de caractere este similară cu reprezentarea unui tablou de
caractere.
array [1.. lungime_şir] of char;
Declararea unui şir de caractere se poate face în felul următor
type nume = string [lungime] (a)
sau:
type nume = string; (b)
În cazul (a) variabilele de acest tip pot conţine un număr de caractere de la 0 până la
lungime. În cazul (b) variabilele de acest tip pot conţine până la 255 de caractere.
Exemple:
type sir1 = string [20];
şir2 = string;
var nume : sir1;
x: sir2;
Variabila “nume” poate avea până la 20 de caractere, iar variabila “x” poate avea până la
255 caractere. Spre exemplu, se pot face următoarele atribuiri:
nume: = ‘POPESCU.IOAN’;
x : = ‘ARHITECTURA.CALCULATOARELOR’;
Variabila “nume” are lungimea 12, iar variabila “x” are lungimea 27.
Referirea la un element al unui şir de caractere se poate face utilizând o expresie cu
indice, ca la tipul ARRAY; de forma:
Nume_variabilă [poziţie caracter]

indice
Exemplu:
nume[4] = ‘E’
x[4] = ‘i’
10 Curs 1 - STRUCTURU DE DATE

În memoria internă, o variabilă de tip şir de caractere va fi reprezentată pe n+1 octeţi,


unde n este lungimea şirului. Octetul nume [0] va conţine lungimea reală a şirului la un moment
dat, iar în ceilalţi octeţi se vor memora caracterele care compun şirul.
Pentru variabila x din exemplul precedent x[0] = 23.

Citirea şi scrierea (afişarea) variabilelor de tip şir de caractere

La citirea unei variabile de tip şir de caractere se memorează caracterele tastate în


variabila citită până la apăsarea tastei ENTER sau până la lungimea declarată. În primul caz
lungimea şirului este egală cu numărul caracterelor tastate, fără a lua în calcul şi caracterele ce
compun tasta ENTER.
Exemplu: Presupunem că avem următoarea declaraţie de variabilă.
var s: string [11],
şi următoarea instrucţiune:
readln(s);
1) Se tastează şirul:
POPESCU ION Enter
În acest caz s va avea lungimea 11, adică lungimea din declaraţia de tip.

2) Se tastează şirul:
POPESCU Enter
În acest caz s va avea lungimea 7.
3) Se tastează:

POPESCU NICOLAE Enter


În acest caz s va avea lungimea 11 (din declaraţia de tip) şi va conţine caracterele:
‘POPESCU NIC’.
La scrierea unei variabile de tip şir de caractere se vor utiliza procedurile standard write
sau writeln şi se vor afişa pe ecran toate caracterele memorate în variabila respectivă.

Operaţii cu şiruri de caractere

Singura operaţie elementară care poate fi efectuată având operanţi de tip STRING este
concatenarea, al cărei operator se notează cu “+”. Dacă şirul obţinut prin concatenare depăşeşte
255 caractere, el este trunchiat la această lungime.
Exemplu: ‘abc’ + ‘xyz’ = ‘abcxyz’
Alte operaţii se pot efectua asupra şirurilor de caractere numai prin intermediul
unor funcţii sau proceduri.

Funcţii şi proceduri asupra şirurilor de caractere

1) Funcţia LENGTH(x) – are ca rezultat lungimea şirului de caractere x.


EXEMPLU:
LENGTH (‘POPESCU’) = 7

2) Funcţia COPY – se utilizează pentru a selecta un subşir dintr-un şir.


STRUCTURI DE DATE - Curs 1 11

Are următoarea sintaxă:


copy (şir, poziţie, lungime)
Funcţia returnează un subşir al şirului dat şir care începe dintr-o anumită poziţie şi are o
anumită lungime.
Exemple:
copy (‘POPESCU’,1,3) = ‘POP’
copy (‘PROGRAMAREA CALCULATOARELOR’,13,12) =‘CALCULATOARE’

3) Funcţia CONCAT – are ca scop concatenarea a 2 sau mai multe şiruri de caractere.
Sintaxa funcţiei:
concat (s1, s2,…)
Funcţia returnează un şir de caractere obţinut prin concatenarea şirurilor s1,s2,… Funcţia are acelaşi efect ca şi
operatorul +.

concat (s1,s2,…) = s1 + s2 +…

4) Funcţia POS – are ca efect localizarea unui subşir într-un şir dat.
Sintaxa funcţiei:
pos (subşir,şir)

Funcţia are ca rezultat poziţia în care se găseşte subşirul căutat în şirul dat.
Exemple:
pos (‘PROGRAM’, ‘LIMBAJE DE PROGRAMARE’) = 12
pos (‘POPA’, ‘POPESCU’) = 0

5) Procedura DELETE are ca rol ştergerea unui subşir dintr-un şir. Sintaxa procedurii
este:
delete (şir, poziţie, lungime)
Procedura are ca efect ştergerea din şirul dat şir, de pe o anumită poziţie, un anumit
număr precizat de caractere, lungime.
Exemple:
var s: string;
s: ‘LIMBAJE DE PROGRAMARE’
delete (s,9,13);
 s = ‘LIMBAJE’

6) Procedura INSERT are ca rol inserarea unui subşir într-un şir dat. Sintaxa procedurii
este:
insert (şir, subşir, poziţie);
Procedura are ca efect inserarea într-un şir dat, pe o anumită poziţie, a unui subşir.
Exemple:
var s: string;
s:= ‘CE FACI’
insert (s, ‘MAI ’, 4)
 s = ‘CE MAI FACI’
12 Curs 1 - STRUCTURU DE DATE

7) Procedura VAL are rolul de a converti un şir de caractere într-un număr. Sintaxa
procedurii este:
val (şir,x,COD)
Procedura are ca efect transformarea şirului de caractere şir în numărul “x”. În urma
apelului procedurii se mai furnizează şi un cod de eroare, prin variabila “COD”. Aceasta poate fi
0, atunci când transformarea se realizează corect, sau COD poate fi un număr >0 atunci când
COD indică poziţia erorii.
Exemple:
val(’14.35’,x,COD);
În urma apelului acestei proceduri se va obţine:
x = 14.35
COD = 0
deoarece transformarea s-a realizat corect. La apelul:

val (’14,35’,y,COD);
se va obţine:
y=0
COD = 3,
reprezentând poziţia caracterului ‘,’, care conduce la o eroare.

8) Procedura STR – are rolul de a transforma un număr într-un şir de caractere. Sintaxa
procedurii este:
str (număr, şir)
Procedura are ca efect transformarea numărului dat în şirul „şir”.
Exemplu:
str (123.345,s);
În urma apelului acestei proceduri se va obţine s=’123.345’

Compararea şirurilor de caractere

Pentru a compara între ele 2 şiruri de caractere se pot utiliza operatorii relaţionali
cunoscuţi <, <=,>,>=, <>.
Expresia şir1 = şir2, are valoarea TRUE dacă cele 2 şiruri au aceeaşi lungime şi
caracterele aflate în poziţii corespunzătoare sunt identice.
Expresia şir1<şir2 are valoarea TRUE dacă prin compararea caracterelor de la stânga la
dreapta, în prima poziţie în care cele 2 şiruri diferă, caracterul din şir1 este mai mic decât
caracterul din şir2.
Exemple:
‘POPESCU’ > ‘POPA’
‘POP’ < ‘POPA’
‘POPESCU’>’POP’

3. Tipul de date înregistrare (RECORD)


STRUCTURI DE DATE - Curs 1 13

În practică trebuie să lucrăm cu date diferite la un moment dat. De exemplu, datele


despre un student sunt de tipuri diferite: numele este string, varsta este byte, etc.
Este un tip de date care reuneşte mai multe date de tip diferit. Mai multe obiecte din
lumea înconjurătoare sunt caracterizate printr-o listă de atribute. Lista de atribute utilizată pentru
a descrie o clasă generală de obiecte formează tipul obiectului respectiv. Un obiect particular de
acest tip este definit prin atribuirea de valori concrete pentru fiecare dintre atributele sale.
De exemplu presupunem ca obiect o “carte”, pe care o vom descrie. Vom folosi pentru
această descriere cele mai importante atribute (proprietăţi, însuşiri) ale cărţii, ca de exemplu:
- titlul cărţii
- autorul
- anul apariţiei
- editura
- numărul de pagini
În limbajul Pascal o astfel de descriere se face utilizând tipul RECORD (înregistrare).
Într-o înregistrare fiecare atribut este numit câmp, iar o variabilă care se declară de acest
tip se numeşte variabilă înregistrare.
Definirea (declararea) unui tip înregistrare:
type nume = record
câmp_1: tip_1;
câmp_2: tip_2;
……………..
câmp_n: tip_n;
end;
unde: - “nume” este un identificator care reprezintă tipul înregistrare.
- câmp_1, câmp_2, …, câmp_n reprezintă identificatorii pentru numele câmpurilor
(atributelor) datei respective;
- tip_1, tip_2, …, tip_n reprezintă tipurile corespunzătoare câmpurilor şi pot fi orice tipuri predefinite sau definite de utilizatori,
simple sau structurate.

Exemple:
1) Pentru a defini un tip care să descrie o mulţime de obiecte “carte”, conform
exemplului anterior putem folosi următorul tip de date:
type carte = record
titlu: string [50];
autor: string [25];
an_ap: 1900..2000;
editura: string [30];
nr_pag: word;
end;

2) Pentru a defini un tip de date care descrie o dată calendaristică:


type data = record
zi: 1..31;
14 Curs 1 - STRUCTURU DE DATE

luna: 1..12;
an: 1900 .. 2000;
end;

3) Pentru a defini un tip de date care caracterizează o persoană:


type persoana = record
nume: string;
data_n: data;
adresa: string;
end;
Declararea unor variabile de acest tip se face astfel:

var c: carte;
p: persoana;
d : data;

Selectarea unui câmp dintr-o înregistrare se face utilizând o construcţie de forma:


nume_înregistrare. nume_câmp
Exemple:
c.titlu: = ‘Amintiri din copilărie’;
c.autor: = ‘Ion Creangă’;
c.an_ap: = 1983;
c.editura: = ‘Albatros’;
c.nr_pag: = 100;
sau, pentru o variabilă de tip persoană:
p.nume: = ‘Ionescu’;
p.data_n.zi: = 17;
p.data_n.luna: = 5;
p.data_n.an: = 1970;

Variabilele înregistrare în memoria calculatorului

O variabilă de tip înregistrare este reprezentată în memoria calculatorului utilizând o


secvenţă de locaţii de memorie pentru a memora fiecare câmp al înregistrării. De exemplu, o
variabilă p, de tip persoană având următoarele valori pentru câmpurile sale
p.nume: = ‘Ionescu Ana’;
p.data_n.zi: = 17;
p.data_n.luna: = ‘mai’;
p.data_n.an: = 1970;
p.adresa: = ‘Hunedoara’
ocupă în memoria calculatorului 24 octeţi consecutivi.
STRUCTURI DE DATE - Curs 1 15

Înregistrări cu structură variabilă

Se pot defini variabilele de tip înregistrare la care unele dintre câmpuri depind de o
informaţie deja prezentă în înregistrare. Astfel de tipuri se pot defini astfel:
type nume = record
câmp1: tip_1;
câmp2: tip_2;
……………..
case selector: tip_selector of
const_1:(câmp_i: tip_i; câmp_j; tip_j;…);
const_2:(câmp_k: tip_k;…);
……………..
end;

O astfel de înregistrare este compusă dintr-o parte fixă şi o parte variabilă. Partea fixă a
unei înregistrări trebuie pusă în mod obligatoriu la început. “Selector” este un câmp al
înregistrării în funcţie de valorile căruia înregistrarea are în continuare o structură variabilă.
Exemplu:
type masina= record
marca: string [20];
culoarea: string [15];
data_fab: data;
case provenienţa: char of
‘r’: (nr_inmatr: string [9]);
‘r’: (ţara: string; data_intrării: data; nr_provizoriu: string [10]);
end;

Instrucţiunea WITH

Se foloseşte pentru prescurtarea referii câmpurilor unei înregistrări. Sintaxa instrucţiunii


este:
with variabilă_înregistrare do instrucţiune
Instrucţiunea evită notaţiile lungi şi greoaie în care apar numele variabilelor
înregistrare şi numele câmpurilor.
Exemplu:
type data = record
An: 1900 .. 2000;
Luna: 1..12;
Zi: 1..31;
end;
var data_naşterii: data;
………….
16 Curs 1 - STRUCTURU DE DATE

data_naşterii.an: = 1999;
data_naşterii.luna: = 10;
data.naşterii.zi: = 16;

Aceste atribuiri se mai pot face utilizând construcţia:


with data_naşterii do
begin
An: = 1999;
Luna: = 10;
Zi: = 10;
end;

4. Tipul de date mulţime (SET)

Tipul de date mulţime (SET) desemnează o mulţime (în sens matematic) de elemente de
acelaşi tip, precum şi operaţii specifice de lucru cu mulţimi.
Fiind dat un tip ordinal, numit tip de bază, putem defini un tip mulţime (SET) ca fiind
mulţimea tuturor submulţimilor tipului de bază, inclusiv mulţimea vidă.
Valorile pe care le poate lua o variabilă de tip mulţime sunt chiar submulţimile
tipului de bază.

Observaţie. La versiunea Turbo Pascal pentru calculatoare personale tipul de bază poate
avea maximum 256 elemente. Alte limbaje nu dispun de acest tip de date (limbajul C).
Exemple de mulţimi:
{verde, negru, roşu, alb};
{1,3,9,20};
{’a’,’c’,’m’,’p’}.
Ordinea elementelor în cadrul unei mulţimi nu are importanţă. De asemenea, aceleaşi
elemente care apar o singură dată: {3,3,9,4,4,11};  {3,4,9,11}

Definirea unui tip de date mulţime se face astfel:


type nume = set of tip_de_bază;
Exemple:
type litere = set of ‘a’..’z’;
numere = set of byte;
sau
type examene = (mate, fizică, chimie, informatică, desen);
mult_examene = set of examene;
var promovate, nepromovate: mult_examene;
Valorile unui tip mulţime sunt de fapt submulţimile mulţimii definite de tipul de bază
specificat la declarare. Dacă n este numărul de valori ale tipului de bază, atunci o variabilă sau
constantă de tip mulţime va fi reprezentată în memorie pe n biţi într-o zonă de lungime [n/8]+1
STRUCTURI DE DATE - Curs 1 17

octeţi, fiecărui element din tipul de bază corespunzându-i în această zonă 1 bit. Bitul respectiv
va avea valoarea 1 dacă elementul corespunzător din tipul de bază aparţine mulţimii şi 0 în caz
contrar. Mulţimea vidă va fi reprezentată printr-un şir de bţi cu valoarea 0.
Exemplu:
Un tip de date cu elemente mulţime din domeniul 1..25 este definit prin declaraţia:
type M = set of 1..25;
Tipul de bază al acestei mulţimi are 25 elemente. O mulţime a acestui tip va fi
reprezentată în memorie pe [25/8]+1 = 4 octeţi adică pe 32 de biţi. Din aceşti 32 de biţi doar 25
vor fi utilizaţi.
Specificarea unei valori de tip mulţime se face scriind elementele mulţimii respective
între paranteze drepte, separate prin virgulă.
Exemple:

[] – mulţimea vidă
[‘a’, ‘c’, ‘0’, ‘9’, ‘$’] – o mulţime de tipul SET OF CHAR.
[1,4,5,78,123,234] – o mulţime de tipul SET OF BYTE

Operaţiile care se pot efectua cu date de tip mulţime sunt cele cunoscute din teoria
mulţimilor:
- reuniunea: AB : A+B - inegalitatea AB: A<>B
- intersecţia: AB: A*B - incluziunea AB: A<=B
- diferenţa: A\B: A-B - apartenenţa xA: x in A
- egalitatea A=B: A=B
În aceste relaţii A şi B sunt 2 mulţimi, iar x este un element de tipul de bază al mulţimii A. Două mulţimi pot opera cu ajutorul
operatorilor descrişi anterior dacă cele 2 mulţimi sunt de tipuri compatibile. Două tipuri mulţime sunt compatibile dacă ele au acelaşi tip de bază,
sau dacă tipurile de bază sunt ambele subdomenii ale aceluiaşi tip, sau dacă unul dintre tipurile de bază este subdomeniu al celuilalt.

CITIREA ŞI AFIŞAREA VARIABILELOR DE TIP MULŢIME

Operaţiile de citire şi scriere se pot efectua numai element cu element. Pentru citirea unei
variabile de tip mulţime se citesc pe rând elementele mulţimii respective şi apoi se reunesc cu
mulţimea respectivă. Aceasta se va iniţializa prealabil cu mulţimea vidă.
var m: set of tip_de_bază;
x: tip_de bază;
i,n: byte; {nr. elemente mulţime}
begin
write (‘nr. elemente mulţime:’);
readln (n);
m: = [ ]; {se iniţializează m cu mulţimea vidă }
for i:= 1 to n do
begin
read(x);
18 Curs 1 - STRUCTURU DE DATE

m:= m + [x];
end;
end.

Observaţie: Citirea elementelor mulţimii m din exemplul anterior poate fi efectuată


numai dacă x aparţine unui tip de dată ale cărui valori pot fi citite de la tastatură.
Pentru afişarea elementelor aceleaşi mulţimi m, se procedează astfel:

for x:= valoare_iniţială to valoare_finală do


if x in m then write (x);
Teme pentru laboratorul 1.
1. Se consideră notele unui student obţinute la cele n examene din timpul unui an universitar. Să
se determine media generală a studentului, numărul de examene nepromovate, care a fost
cea mai mare şi cea mai mică notă obţinută şi dacă acesta a obţinut note de 10 la examen.

2. În urma unor măsurători se obţin n valori reale. Să se determine care au fost valorile care s-
au încadrat în limitele normale (limitele normale se introduc sub forma unui interval [a,b]).
De asemenea, se va determina daca o anumită valoarea ( ce se introduce de la tastatură )
apare printre valorile măsurate. Se va calcula media valorilor măsurate, numărul de valori
care se apropie de medie cu o aproximaţie de 0.5. Se va afişa şi cea mai apropiată valoare
măsurată de medie.

3. Se consideră pentru fiecare din cei n studenţi ai unei grupe, notele obţinute la cele m
examene din timpul unui an universitar. Să se determine pentru fiecare student media sa
generală şi numărul de examene nepromovate. De asemenea, să se determine media generală
a grupei şi care a fost studentul cu cele mai multe examene nepromovate. Să se afişeze pentru
fiecare student mediile în ordine crescătoare.

4. Încercaţi rezolvarea aplicaţiei în condiţiile în care studentii au avut maxim m examene.

5. Un text a cărui lungime nu depăseşte 255 de caractere se introduce de la tastatură. Să se


determine numărul de cuvinte şi de propoziţii din text.

6. Se consideră două nume de studenţi introduse de la tastatură. Să se verifice dacă cele două
nume sunt egale :
- fără a face deosebire între literele mari şi literele mici.
- făcând deosebire între literele mari şi mici.

7. Pentru evidenţa studenţilor, la secretariatul facultăţii se reţin, pentru fiecare student,


următoarele date: număr matricol, nume, adresa, telefon, liceul absolvit, media bacalaureat.
Să se citească datele despre cei n studenţi ai unei grupe. Se va afişa o listă alfabetică cu
studenţii. De asemenea, se va afişa numele studentului care a avut cea mai mare medie la
bacalaureat. Pentru un alt nume, să se verifice dacă acesta face parte din această grupă.

8. Fie informaţiile despre mărfurile dintr-un magazin: denumire, cod, furnizor, data intrării,
cantitate, preţ unitar. Se cere:
- să se citească informaţiile despre cele n mărfuri din magazin.
- să se afişeze o listă cu denumirea şi valoarea fiecărei mărfi.
- să se afişeze o listă alfabetică cu mărfurile.
- să se afişeze valoarea mărfurilor din magazin

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