Sunteți pe pagina 1din 4

PCPL3 - CURSUL 1

Cursul îşi propune să asigure studenţilor cunoştinţe aprofun- constructori de tipuri şi joacă un rol esenţial în programare.
date privind proiectarea şi utilizarea structurilor de date şi Exemple de constructori sunt enumerările şi subdomeniile,
algorimilor, în contextul anumitor tehnici de programare. care definesc tipuri simple. Alţi constructori, foarte des
Pe importanţa domeniului nu trebuie insistat prea mult, dat folosiţi, sunt tablourile şi înregistrările. Ei produc tipuri
fiind că presiunea exercitată asupra industriei software-ului structurate, prin combinarea unor tipuri cunoscute.
este mai mare ca oricând şi având în vedere creşterea Noile tipuri construite pot avea nume sau pot fi anonime. În
dramatică a numărului de utilizatori, noile tipuri de aplicaţii general limbajele de programare au mecanisme prin care
şi noile modele de calcul, precum şi faptul că performanţa asociază nume diferitelor tipuri definite de utilizatori ( type,
este aspectul critic al succesului. typedef).
Sunt prezentate tipuri de date, inistându-se pe cele definite De asemeni, orice limbaj include:
de utilizator. De asemeni, sunt abordate structurile de date  Mecanismele de definire a tipurilor, deci de
(liste, arbori, grafuri) prin prisma tehnicilor de rezultate din precizare a structurii şi a tipurilor componente
necesitatea combinării procesărilor on-line, a încărcării şi a (aceste mecanisme sunt constructorii, menţionaţi
creşterii sprijinului decizional. anterior);
Cursul tratează aspectele legate, pe de o parte, de  Mecanismele de selecţie a valorii unei
cunoaşterea modalităţilor de rezolvare a problemelor cu care componente;
utilizatorul are de-a face, eventual a unor metode generale
 Definiţiile operaţiilor permise asupra valorilor
de rezolvare, aplicabile unor categorii largi de probleme, iar
(compuse) ale tipului definit.
pe de altă parte cunoaşterea unei metode sistematice de
În mod necesar, operaţiile permise asupra unei componente
trecere de la problemă la program, prin intermediul
sunt cele specifice tipului componentei.
algoritmilor specifici.
Un limbaj de programare îl oferă programatorului pentru
1. TIPURI DE DATE
definirea de tipuri noi. Sunt însă destule situaţii în care
În memoria calculatorului orice dată apare ca o succesiune
structurile pe care un limbaj le permite nu ajung. O
de biţi. Modul în care pentru astfel de succesiuni se asociază
problemă de clasificare se rezolvă mai uşor cu o structură
o valoare depinde de interpretarea ce i se dă. La nivelul
arborescentă, iar o problemă de optimizare a traseelor de
limbajului de programare o astfel de interpretare este
transport în comun se rezolvă mai natural pe o structură de
reprezentată de tipul datelor. Un tip de date este o mulţime
graf.
de valori şi un set de operaţii definit asupra acestora.
Limbajele de programare orientate pe obiecte rezolvă
Majoritatea limbajelor de programare oferă cel puţin
elegant aceste probleme, permiţând definirea de tipuri care
echivalentul unui tip întreg. Pentru acest tip valorile posibile
“imită” fidel caracteristicile şi comportarea obiectelor din
sunt cuprinse între două limite. Valorile concrete pentru
realitatea problemelor de rezolvat. Un pas important în
aceste limite pot să varieze de la o implementare la alta.
aceeaşi direcţie poate fi făcut si cu mijloacele mai modeste
Setul de operaţii considerat pentru tipul întreg conţine de
ale unui limbaj tradiţional. În acest sens, sunt importante
obicei operaţii aritmetice şi relaţionale.
aspecte:
La nivelul limbajului de programare datele apar ca variabile
 Cum putem reprezenta mai simplu legăturile dintre
sau constante. În cazul variabilelor tipul este fixat prin
componentele unei structuri;
declararea acestora:
 Cum putem asocia structurilor operaţii de acces şi de
Int x; /* în C*/
modificare a componentelor;
Pentru constante tipul rezultă din forma de scriere. De
 Cum putem conferi acestor operaţii o generalitate cât
exemplu 125 este o constantă de tip întreg, iar 3.14 e-2 o
mai mare;
constantă de tip real.
 Cum putem izola structura, cum o putem “încapsula”,
Orice limbaj de programare pune la dispoziţia
asigurând astfel atât protejarea sa faţă de restul
programatorului câteva tipuri de date predefinite ( standard).
programului, cât şi ascunderea amănuntelor de
De exemplu în C int, char, float, etc. Acestea sunt tipuri
implementare a structurii.
simple de date, care se referă la valori elementare. Totodată,
1.1. Tipuri de date definite de utilizator
limbajele de programare includ mecanismele necesare
Informaţia prelucrată în program este organizată în general
construiri unor tipuri noi, prin restrângeri sau combinări ale
în ansambluri de date de tipuri diferite, astfel încât tipurile
tipurilor deja definite. Aceste mecanisme se numesc
predefinite nu sunt suficiente pentru o reprezentare
1
PCPL3 - CURSUL 1
convenabilă. (Diversitatea aplicaţiilor programării, a 2. de regulă, numele tipului structură nu se omite,
fenomenelor şi mărimilor ce pot fi modelate cu ajutorul deoarece permite declararea ulterioară a unor variabile şi
sistemelor de calcul face practic imposibilă stabilirea parametrii cu sintaxa:
"apriori" a tuturor tipurilor de date care ar fi necesare unui struct identif_tip_ struct listă_identif_var_struct
proiect). Componentele unei structuri sunt numite generic membrii
Ca urmare, strategia adoptată de realizatorii unor limbaje de (câmpurile) structurii.
programare este următoarea: Identificatorii membrilor trebuie să fie unici în cadrul
 se pune la dispoziţia utilizatorului un nucleu de structurii.
tipuri de date primitive suficient de mic pentru a nu Exemplul 1:
încărca limbajul, dar având un grad mare de (A) struct adr {
generalitate (date întregi, reale, adrese, caractere, char nume[30], strada[20], loc[20];
etc.) int nr, bloc, ap;
 se oferă posibilitatea compunerii datelor, astfel încât long cod;
pornind de la primitivele limbajului, să se }adresa, lista [100].
construiască structuri de date oricât de complicate. (B) main ( )
Limbajul C oferă următoarele posibilităţi: {
 declaraţia typedef - asociază un nume unui tip. struct adr adresa_mea, alta_lista[10];
 structura - este o colecţie de obiecte de orice tip …………………………………….
referite cu un nume comun. }
 câmpul de biţi - este un membru al unei structuri Definiţia tipului adr este folosită în continuare pentru a
care are alocat un grup de biţi, în interiorul unui declara variabila adresa_mea şi tabloul altă_listă.
cuvânt de memorie. Iniţializarea unei variabile structură se face prin enumerarea
 uniunea - permite utilizarea în comun a unei zone valorilor membrilor, în ordinea în care apar în declaraţie.
de memorie de către mai multe obiecte de tipuri Pentru structura adr, se poate scrie:
diferite. Exemplul 2:
 enumerarea - este o listă de identificare cu valori struct adr V1 = { "Sorescu", "Saturn", "Braşov",
întregi, constante. 3,3,15,2200};
1.1.1. Structuri Observaţie: iniţializarea se poate face la declarare, deci
O declaraţie de structură precizează identificatorii şi tipurile {ex.1(A); ex.2}, caz în care în afara rezervării de memorie,
elementelor componente şi constituie o definire a unui tip de în zona de memorie alocată sunt valorile iniţiale şi nu cele
date nou. Acestui tip i se poate asocia un nume. reziduale.
Sinteza declaraţiei unui tip structură, în cazul general, este: Referirea unui membru al unei variabile structură se face:
Struct indentif_tip_struct { (a) direct;
tip_elem1 identif_elem1; (b) indirect.
tip_elem2 identif_elem2; (a) direct - folosind operatorul de selecţie (.) într-o expresie
………………………… cu valoare stânga care precizează numele variabilei şi al
tip_elemN identif_elemN; membrului.
} lista_identif_var_struct; Exemplul 3:
unde: adresa . cod = 2200
struct = cuvântul cheie pentru tipuri structură strcpy (adresa . loc, "Braşov");
identif_tip_struct = numele tipului de structură declarat Operatorul de atibuire admite ca operanzi variabile structură
tip_elemK = tipul elementului K de acelaşi tip, efectuând toate atribuirile membru cu
lista_identif_var_struct = lista cu numele variabilelor de membru. De exemplu, atribuirea copiază toate valorile din
tipul declarat, identif_tip_struct. variabila adresa în elementul 10 al tabloului de adrese
Observaţii: lista[].
1. pot să lipsească: Exemplul 4:
- fie numele tipului (structură anonimă), lista[10] = adresa;
- fie lista de variabile, (b) indirect - structurile sunt frecvent referite prin
dar trebuie să existe cel puţin una dintre specificaţii. intermediul unei variabile pointer (adresă a variabilei).
2
PCPL3 - CURSUL 1

Exemplul 5: Observaţii:
struct adr *padr.;  un membru al structurii poate fi de orice tip, chiar o altă
padr = & lista[5]; structură, dar nu tipul curent declarat.
(*padr).nume = "Ionescu Vasile";  transferul unui parametru de tip structură se poate face
Referirea unui element al unei structuri indicate de un prin valoare. Parametrul formal şi cel efectiv trebuie să
pointer, ca în exemplul anterior este posibilă, dar neuzuală. fie de acelaşi tip structură.
În C există un operator dedicat acestui scop, numit De multe ori se foloseşte însă transferul unui pointer către
operatorul de selecţie indirectă: '' (sau referinţă indirectă structură, chiar dacă în funcţie nu trebuie modificat
la membrul de structură). parametrul efectiv, deoarece se elimină operaţia
Exemplul 6: consumatoare de timp de copiere a valorii în variabila
padr  nume = "Ionescu Vasile" locală. Un membru al unei structuri poate fi transferat dacă
O structură poate fi referită atât ca left-value cât şi ca right- tipul său coincide (sau este compatibil) cu tipul parametrului
value. Operaţiile legale care se pot face cu structuri sunt formal corespunzător.
copierea şi atribuirea. Structurile nu pot fi comparate. Exemplul 11:
Exemplul 7: void func1 (adr adresa) // direct
struct complex { float re, im} void func2 (adr *padr) // printr-un pointer
struct complex z1, z2, *pz; Transmiterea structurilor prin valoare este indicată în două
………………………… situaţii:
z2.re = 1.5;  structura este foarte mică (aproximativ aceeaşi
z2.im = 2.5; dimensiune ca un pointer)
z1 = z2; \* atribuire *\  se doreşte garantarea faptului că funcţia apelată nu
pz = &z1; modifică structura transmisă.
1.1.2. Typedef Aplicaţii ale structurilor: Reprezentarea listelor - numeroase
O altă modalitate de declarare a unui tip structură este programe operează cu liste de diverse categorii.
folosirea specificatorului typedef. 1.1.3. Câmpuri de biţi
Exemplul 8: Limbajul C oferă posibilitatea de a structura datele la nivel
typedef int lungime; /* Declaraţia face cuvântul de bit. Se pot aloca unor câmpuri de structuri sau uniuni biţi
lungime sinonim cu int */ individuali sau grupuri de biţi dintr-un octet. În felul acesta
Exemplul 9: se definesc câmpuri de biţi care pot fi accesate fiecare,
typedef char* string; /* Declaraţie face cuvântul separat de restul octetului, pentru evaluare şi/sau modificare.
stâng sinonim cu pointer la char*/ Pentru aplicaţii de control al unor dispozitive fizice
Exemplul 10: (interfeţe), criptare, etc., care solicită structurarea interfeţei
typedef struct { dintr-o locaţie de memorie. Utilizarea câmpurilor de biţi
chart nume [30], strada [20], loc [20] simplifică substanţial redactarea programelor. De asemenea
int nr., bloc, ap; câmpurile de biţi se folosesc când spaţiul ocupat de date în
long cod; memorie este esenţial, permiţând împachetarea câtorva
}adr; obiecte într-un singur cuvânt de cod.
Avantaje: Câmpurile de biţi se pot declara ca membrii ai unei structuri,
1. se rezolvă problemele de portabilitate, tipurile de cu sintaxa:
date având dimensiuni dependente de maşină. struct identif_tip_structură {
2. furnizează o documentaţie mai bună pentru un tip_elem1 <identif_elem1>: lungime;
program deoarece un tip cu un nume sugestiv este tip_elem2 <identif_elem2>: lungime;
mai uşor de înţeles decât un pointer la o structură --------------------------------------------
complicată. tip_elemN <identif_elemN>: lungime;
3. declararea variabilelor se poate face mai comod, } lista_ identif_var_struct;
fără să mai fie necesară adăugarea cuvântului struct.

3
PCPL3 - CURSUL 1

Se remarcă unele restricţii pentru câmpurile de biţi: Se consideră exemplul mai general al structurii informaţiei
 tipul poate fi int, signed sau unsigned; transferate într-o comunicaţie serială sincronă dintre
 lungimea este o constantă întreagă cu valoarea în calculatoare, pe baza protocolului HDLC. În acest caz,
domeniul 0-15; blocurile de date transmise sunt completate cu anumite
 nu se poate evalua adresa unui câmp (deci operatorul informaţii de control, rezultând în final un "cadru" de date
& nu poate avea ca operand un câmp de biţi); organizat ca o secvenţă de biţi.
 nu se pot organiza tablouri de câmpuri de biţi. Structura din exemplul următor descrie un cadru de date
 definirea unui element câmp de biţi dintr-o structură se HDLC în reprezentare internă, utilizat de un program de
face ca orice alt tip de element, folosind operatorii de comunicaţie. Ea conţine adresa şi câmpul de control
selectare directă sau indirectă (punct şi săgeată). necesare protocolului şi de asemenea şi adresa blocului de
Observaţie: Numele câmpului poate să lipsească. În acest date.
caz, se face alocarea biţilor specificaţi de valoarea Exemplul 14:
"lungime", dar câmpul nu poate fi accesat. Pot fi alocaţi struct cadru_i {
astfel biţii care nu sunt utilizaţi dintr-un octet. unsigned char adresa; /*adresa pe 8 biţi */
Exemplul 12: unsigned c_i:1; /*câmp de control pe 8 biţi */
struct DATE { unsigned ns:3; /* contor transmisie N(S)*/
unsigned int zi: 5;
unsigned int luna: 4; unsigned pf:1; /* bit P/F */
unsigned int an: 11; unsigned nr:3; /* contor recepţie N(R)*/
} ieri, azi, mâine; unsigned lng; /* dimensiunea şi adresa blocului
Pentru cele trei câmpuri sunt necesari numai 20 de biţi. de date */
Unele compilatoare rezervă 24 biţi, altele 32 biţi. char *data};
Exemplul 13: Pentru câmpurile de tip int (signed int) valorile sunt
/* circuitul M088, registrul OR1, instrucţiunea 1*/ memorate în reprezentarea în complement faţă de doi,
struct Or1_ins1 { pentru lungimea specificată.
unsigned canal: 5; Câmpurile unsigned int conţin valoarea binară înscrisă.
unsigned linie: 3; La înscrierea unui câmp de biţi, programatorul trebuie să
}; urmărească respectarea domeniului de valori corespunzător
struct Or1_ins1 r1,*rp1; lungimii, astfel alocarea este alterată prin trunchiere.
r1. Canal = 5; Pentru un câmp de n biţi, domeniile se calculează cu
rp1->canal = 31; relaţiile:
Exemplul declară un tip structură care constă din câmpuri de  pentru (signed) int: -2 n-1 ≤ v ≤ 2 n-1 - 1
biţi organizaţi corespunzător specificaţiilor funcţionale  pentru unsigned int: 0 ≤ v ≤ 2 n-1
pentru un registru de 8 biţi dintr-un circuit programabil. Câmpurile de biţi se pot iniţializa la fel ca oricare alt
O structură poate îngloba câmpuri de biţi împreună cu membru al structurii.
variabile de alte tipuri.

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