Documente Academic
Documente Profesional
Documente Cultură
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.
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
Ex: -notele unui student la cele 6 obiecte (datele sunt de acelaşi tip )
7 10 9 10 4 10 tablou unidimensional
Note ( tablou )
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ă
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 :
b. Afişarea vectorului :
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 2 9
3 5 2 7 9
3 2 5 7 9
2 3 5 7 9
6 Curs 1 - STRUCTURU DE DATE
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
z= 2 3 5 7 9
d. Contorizarea elementelor:
Note = 7 4 5 3 10
e. Însumarea elementelor :
Ex: 7 4 5 3 10
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
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
2) Se tastează şirul:
POPESCU Enter
În acest caz s va avea lungimea 7.
3) Se tastează:
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.
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’
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’
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;
luna: 1..12;
an: 1900 .. 2000;
end;
var c: carte;
p: persoana;
d : data;
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
data_naşterii.an: = 1999;
data_naşterii.luna: = 10;
data.naşterii.zi: = 16;
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}
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: AB : A+B - inegalitatea AB: A<>B
- intersecţia: AB: A*B - incluziunea AB: A<=B
- diferenţa: A\B: A-B - apartenenţa xA: 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.
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.
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.
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.
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