Sunteți pe pagina 1din 75

ACADEMIA DE STUDII ECONOMICE BUCURETI

FACULTATEA DE CIBERNETIC, STATISTIC I INFORMATIC ECONOMICA


CATEDRA DE INFORMATIC ECONOMIC

Bazele programrii

Autori: Bogdan Ghilic-Micu, Marian Stoica, Marinela Mircea

Acest material are la baz lucrarea


Bazele programrii calculatoarelor. Teorie i aplicaii n C,
Ion Gh. Roca, Bogdan Ghilic-Micu, Ctlina Cocianu, Marian Stoica, Cristian Uscatu, Marinela
Mircea, Lorena Btgan, Ctlin Silvestru
Editura ASE, Bucureti, 2006, ISBN 973-594-591-6

Bucureti 2010

TITLUL CURSULUI: Bazele programrii


INTRODUCERE
Cursul de Bazele programrii se adreseaz studenilor nscrii la programul de studiu ID,
organizat de facultatea Cibernetic, Statistic i Informatic Economic i face parte din planul
de nvmnt aferent anului I, semestrul II. Pentru o bun nelegere a noiunilor teoretice i
practice prezentate n acest curs, este recomandat s se fi parcurs anterior disciplina Bazele
tehnologiei informaiei.
OBIECTIVELE PRINCIPALE ale acestui curs, vizeaz nsuirea de ctre studeni a
urmtoarelor elemente:
noiuni de baz n teoria programrii;
metodele de analiz a problemelor n vederea rezolvrii lor cu calculatorul;
logica elaborrii algoritmilor structurai i modularizai;
realizarea programelor n limbajul C.
Cursul Bazele programrii este structurat n patru uniti de nvare, corespunztoare
elementelor principale studiate. n cadrul procesului de instruire pot fi utilizate ca resurse
suplimentare materialele puse la dispoziie de bibliotecile Academiei de Studii Economice,
precum i laboratoarele catedrei de Informatic economic, cu o programare prealabil i atunci
cnd nu se desfoar ore.
EVALUAREA CUNOTINELOR, respectiv stabilirea notei finale, se va realiza astfel:
lucrare de control;
un referat despre operaiile de intrare/ieire efectuate cu tastatura/monitorul;
un proiect, care va conine minim 20 de programe n limbajul C, lucru cu masive de date,
nsoite de un dosar de prezentare.
Lucrarea va fi susinut n cadrul ultimei activiti asistate. Referatul i proiectul se susin numai
n timpul activitii didactice (activitilor asistate), conform calendarului disciplinei.
Stabilirea notei finale se va realiza astfel:
lucrarea de control constituie 50% din nota final;
referatul constituie 10% din nota final;
proiectul constituie 30% din nota final;
din oficiu se acord 10%.

Cuprins

1.

Algoritmi i scheme logice ..................................................................................................4


Obiectivele unitii de nvare 1................................................................................................. 4
1.1. Caracteristicile i reprezentarea algoritmilor........................................................................ 4
1.2. Descrierea structurilor fundamentale ................................................................................. 10
1.3. Structurarea i proiectarea algoritmilor .............................................................................. 13
Rspunsuri i comentarii la testele de autoevaluare .................................................................. 17
Bibliografia unitii de nvare................................................................................................. 17

2. Organizarea intern a datelor.....................................................................................................18


Obiectivele unitii de nvare 2............................................................................................... 18
2.1. Informaia, data i reprezentarea intern a datelor ............................................................. 18
2.2. Structuri de date.................................................................................................................. 27
Rspunsuri i comentarii la testele de autoevaluare .................................................................. 39
Bibliografia unitii de nvare................................................................................................. 39
3. Etapele rezolvrii problemelor cu calculatorul..........................................................................40
Obiectivele unitii de nvare 3............................................................................................... 40
3.1. Caracteristici generale ale PPAD ....................................................................................... 40
3.2. Fazele dezvoltrii programelor........................................................................................... 44
Rspunsuri i comentarii la testele de autoevaluare .................................................................. 46
Bibliografia unitii de nvare................................................................................................. 46
4. Caracteristicile limbajului C......................................................................................................47
Obiectivele unitii de nvare 4............................................................................................... 47
4.1 Elementele de baz ale limbajului C ................................................................................... 47
4.2 Tipurile de date n C ............................................................................................................ 51
4.3 Expresii................................................................................................................................ 60
4.4. Realizarea structurilor fundamentale de control................................................................. 68
Rspunsuri i comentarii la testele de autoevaluare .................................................................. 74
Bibliografia unitii de nvare................................................................................................. 75
Bibliografie....................................................................................................................................75

Bazele programrii

1. Algoritmi i scheme logice


Cuprins
Obiectivele unitii de nvare 1
1.1. Caracteristicile i reprezentarea algoritmilor
1.2. Descrierea structurilor fundamentale
1.3. Structurarea i proiectarea algoritmilor
Rspunsuri i comentarii la testele de autoevaluare
Bibliografia unitii de nvare

Obiectivele unitii de nvare 1


Dupa studiul acestei unitati de nvatare, studenii vor avea cunotine teoretice i abiliti practice
despre:
caracteristicile algoritmilor;
reprezentarea algoritmilor;
descrierea structurilor fundamentale;
structurarea algoritmilor;
proiectarea algoritmilor.

Durata medie a unitii de studiu individual - 8 ore

1.1. Caracteristicile i reprezentarea algoritmilor


Algoritmul desemneaz o mulime exhaustiv i univoc determinat de operaii, mpreun cu
succesiunea n care trebuie aplicate asupra datelor iniiale ale problemei, pentru a obine soluia.
Principalele caracteristici ale unui algoritm sunt:
Generalitate: un algoritm nu trebuie conceput pentru o problem particular, ci pentru o
clas general de probleme.
Exemplu:

Nu se va concepe un algoritm pentru rezolvarea ecuaiei particulare 5x2-2x=7, ci un algoritm pentru


rezolvarea ecuaiei de gradul al doilea cu o necunoscut ax2+bx+c=0, cu a,b,c,x, a0 sau, mai general,
pentru rezolvarea ecuaiei de forma ax2+bx+c=0, cu parametrii a,b,c,x.

Determinare (claritate): algoritmul trebuie s prevad modul de soluionare a tuturor


situaiilor care pot aprea n rezolvarea problemei respective, ntr-o manier fr ambiguiti sau
neclariti, lucru impus de caracterul de automat al calculatorului electronic.

Bazele programrii

Exemplu:

S se elaboreze algoritmul pentru rezolvarea ecuaiei: ax2 + bx + c = 0, a,b,c,x. Analiza arat c exist
patru situaii posibile care trebuie cuprinse n algoritm:
1. a 0, ecuaie de gradul II;
2. a = 0 i b 0, ecuaie de gradul I;
3. a = 0 i b = 0 i c 0, ecuaie imposibil;
4. a = 0 i b = 0 i c = 0, nedeterminare.
Rmne s fie rezolvate fiecare din aceste situaii sau unele din ele s fie grupate n funcie de cerine.

Finitudine: operaiile trebuie astfel concepute nct algoritmul s se termine ntr-un


numr finit de pai, cunoscut sau necunoscut.
Exemple:
Pentru nsumarea tuturor elementelor unui vector B, de dimensiune n, formula de recuren S = S +
bi se repet de n ori (numr cunoscut de pai);
La determinarea celui mai mare divizor comun (CMMDC) dintre dou numere ntregi (A i B) se
mparte A la B: A=BQ+R, apoi se continu mprirea mpritorului (B) la rest (R), pn cnd se obine un
rest nul, caz n care CMMDC este ultimul mpritor (numr necunoscut de pai).

Descrierea algoritmilor. Iterativitate i recursivitate


Iterativitatea este procesul prin care rezultatul este obinut ca urmare a execuiei repetate a
unui set de operaii, de fiecare dat cu alte valori de intrare. Numrul de iteraii poate fi cunoscut
sau necunoscut, dar determinabil pe parcursul execuiei. Indiferent de situaie, numrul de iteraii
trebuie s fie totdeauna finit. n cazul n care numrul de repetri nu este cunoscut iniial, oprirea
ciclrii se face combinnd instruciunile de calcul cu instruciunile de control. Condiiile finale ce
trebuie ndeplinite pentru terminarea ciclrii se bazeaz pe rezultatele calculelor pn la un moment
dat, de cele mai multe ori fiind corelate cu viteza de convergen a calculelor ctre o valoare stabil
i, implicit, cu gradul de aproximare impus unui rezultat.
Utilizarea iterativitii n descrierea algoritmilor este uneori o cale simplificatoare, alteori
singura alternativ de a preciza modul de desfurare a unui proces de calcul. n general, cnd
numrul de iteraii nu este cunoscut sau este variabil de la o execuie la alta, singura modalitate de
descriere a algoritmului presupune iterativitatea. Spre exemplu, ridicarea la ptrat a elementelor
unui vector cu 3 elemente se poate descrie prin urmtoarea succesiune de operaii:
V(1)=V(1) V(1)
V(2)=V(2) V(2)
V(3)=V(3) V(3)
Realizarea aceluiai lucru pentru un vector n-dimensional, cu n variind de la o execuie a
programului la alta, nu este posibil n aceast manier, deoarece un algoritm este corect dac are
precizai toi paii. Singura modalitate de realizare utilizeaz operaia V(I)=V(I) V(I), plasat ntrun ciclu variind dup I, de la 1 la o valoare final N, dat explicit de utilizator la fiecare execuie a
programului.
Recursivitatea este procesul iterativ prin care valoarea unei variabile se determin pe baza
uneia sau mai multora dintre propriile ei valori anterioare. Dup cum valoarea curent a variabilei
depinde de una sau mai multe valori anterioare, procesul este unirecursiv, respectiv multirecursiv.
Recursivitatea presupune definirea uneia sau mai multor formule de start (n funcie de
numrul valorilor anterioare de care depinde valoarea curent) i a unei formule recursive (de recuren). Recursivitatea apare i n cazuri dintre cele mai simple, cum ar fi numrarea, factorialul,
nsumarea sau nmulirea elementelor unui ir.

Bazele programrii

Exemple:
A numra nseamn a aduga o unitate la valoarea anterior calculat. Dac se noteaz v0 = 0
valoarea iniial, numrarea se desfoar dup urmtorul proces recursiv:
v1 = v0 + 1
v2 = v1 + 1
v3 = v2 + 1
........
vi = vi-1 + 1
........
vn = vn1+1
Valoarea care intereseaz este vn. n procesul descris anterior se disting:
v0 = 0
formula de start
vi = vi-1 + 1
formula recursiv, pentru i=1,n
Cnd valorile obinute prin numrare nu necesit pstrarea n memorie, nu sunt necesare mai multe
locaii, ci una singur, care va fi suprascris la fiecare iteraie:
formula de start
V=0
V=V+1
formula recursiv, pentru i=1,n

Utilizarea mai multor zone de memorie pentru calculele intermediare devine obligatorie n
situaia multirecursivitii. Practic, prin transferul dinamic al valorilor intermediare, sunt necesare
attea zone de memorie cte valori precedente sunt necesare calculului termenului curent.
Exemplu:
Algoritmul lui Euclid pentru determinarea celui mai mare divizor comun a dou numere A i B.

rk
r k +1 ,
rk +1

Restul curent se calculeaz pornind de la ultimul i penultimul rest, dup relaia: r k + 2 = r k -

cu r0 = A; r1 = B i k = 0,1,2,... Prin [ ] s-a notat partea ntreag a expresiei. Ultimul rest nenul reprezint
cel mai mare divizor comun. Dac se noteaz cu D variabila demprit, cu I variabila mpritor i cu R
restul, formulele de start devin: Da; Ib. Iterativ, se calculeaz restul RD- D I i se execut
I
transferurile: DI; IR. mpritorul devine noul demprit, iar ultimul rest obinut devine mpritor n
iteraia urmtoare a algoritmului. Procesul iterativ continu pn se obine restul zero. Ultimul rest nenul
reprezint cel mai mare divizor comun al numerelor A i B.

Teste de autoevaluare
1. Caracteristicile oricrui algoritm sunt: 1. Generalitate; 2. Complementaritate; 3. Claritate;
4. Finitudine; 5. Recursivitate; 6. Iterativitate.
a) toate; b) 1,3,4,5 i 6; c) 1,2,3 i 4; d) 1,3 i 4; e) 1,2,5 i 6.
2. Un algoritm recursiv este: a) un algoritm care se autoapeleaz ; b) un proces repetitiv
static; c) un proces repetitiv dinamic; d) un proces repetitiv prin care valoarea unei
variabile se determin pe baza a cel puin uneia dintre valorile ei anterioare; e) un
proces alternativ prin care valoarea unei variabile se determin pe baza a cel puin
uneia dintre valorile ei anterioare.

Bazele programrii

 Reprezentarea algoritmilor prin scheme logice


Practica programrii calculatoarelor dovedete c schema logic este forma cea mai utilizat
de reprezentare a algoritmilor. Ea se dovedete util, n special, n iniierea n programare, deoarece
ofer o vizualizare mai bun, o redare expresiv i sintetic, uor de urmrit, a algoritmilor. S
considerm un graf orientat n care arcele sunt etichetate cu anumite informaii formnd aa-zisele
blocuri. n graf sunt admise urmtoarele blocuri:
Blocul START este un arc etichetat cu cuvntul START, pentru care vrful iniial nu este
pus explicit n eviden, deoarece n el nu pot sosi arce:
START

Blocul STOP este un arc etichetat cu cuvntul STOP, pentru care vrful final nu este pus
explicit n eviden, deoarece din el nu pot pleca arce:
STOP

Blocul de citire este un arc etichetat cu informaia: citirea unor valori de pe suportul
extern i nscrierea lor n locaii de memorie corespunztoare unor variabile.
Citete
list-de-variabile

Blocul de scriere este un arc etichetat cu informaia: nscrierea pe supotul extern a


valorilor memorate n locaiile de memorie corespunztoare unor variabile:
Scrie
list-de-variabile

Blocul de atribuire este un arc etichetat cu informaia: evaluarea unei expresii e i


nscrierea (atribuirea) rezultatului n locaia de memorie corespunztoare unei variabile v:
v=e

sau

ve

sau

ev

Blocul de ramificare (selecie) este o mulime de n arce care pleac din acelai vrf, arce
etichetate cu predicatele C1, C2,...,Cn (predicat = condiie = expresie logic, care poate fi adevrat
(1) sau fals (0)), care satisfac relaiile:
C1 C2 ... Cn = 1; Ci Cj = 0, () i j; i,j= 1, n
Relaiile exprim faptul c unul i numai unul din aceste predicate poate fi satisfcut
(adevrat).
c1
c2

...

cn

Pentru cazul n=2 se poate scrie, echivalent:


c

Nu

Da

Definiie:
Se numete schem logic un graf orientat n care:
a) Exist un singur bloc START i un singur bloc STOP;
b) Orice arc este etichetat cu una din urmtoarele informaii: START sau STOP; o citire sau
o scriere; o atribuire; un predicat, n care caz extremitatea iniial a arcului este extremitatea iniial
a unui bloc de ramificaie;

Bazele programrii

c) Orice arc face parte din cel puin un drum care ncepe cu blocul START i se termin cu
blocul STOP.
n practic, schemele logice alctuite conform regulilor enunate anterior pot lua forme
foarte complicate, greu de urmrit, uneori chiar de cel care le-a conceput. De aceea s-a simit
nevoia ca n construcia schemelor logice s se foloseasc numai anumite configuraii (structuri) i
s se respecte reguli stricte, obinndu-se, astfel, scheme logice structurate.

Definiie:
Se numete subschem logic un graf orientat n care:
a) Exist un unic vrf iniial (n care nu sosesc arce) i un vrf final (din care nu pleac arce);
b) Oricare arc este etichetat cu una din urmtoarele informaii: START sau STOP; o citire sau
o scriere; o atribuire; un predicat, n care caz extremitatea iniial a arcului este extremitatea iniial
a unui bloc de ramificaie;
c) Dac subschema conine blocul START (STOP), atunci extremitatea iniial (final) a
blocului este chiar vrful iniial (final);
d) Orice arc face parte din cel puin un drum ce unete vrful iniial cu cel final.
n particular, o schem logic este o subschem logic n care vrful iniial este extremitatea
iniial a blocului START, iar vrful final este extremitatea final a blocului STOP.
Prin recuren, schema logic structurat (s.l.s.) se definete astfel:
(I) Blocurile START, STOP, de intrare/ieire i de atribuire sunt s.l.s.;
(II) Dac s1 i s2 sunt s.l.s., atunci i subschemele din figura 1.1. sunt s.l.s. (cu respectarea
condiiilor referitoare la START i STOP).
(III) Orice s.l.s. se obine plecnd de la (I) i aplicnd de un numr finit de ori regulile (II).

S1

S1

S2

Structura
secvenial

S2

Structura alternativ
IF-THEN-ELSE

c
S

Structura repetitiv
WHILE-DO

Fig. 1.1. Subscheme logice structurate

O schem logic structurat este o s.l.s. care este chiar o schem logic.
Se pune ntrebarea: se poate genera orice schem logic folosind numai formele impuse
schemelor logice structurate? Sau altfel spus, se poate transforma orice schem logic ntr-o
schem logic bine structurat? Rspunsul, afirmativ, este dat de teorema fundamental a
programrii structurate (teorema lui Bhm-Jacopini): orice schem logic este echivalent cu o
schem logic structurat. [Dodescu et al., 1987]
 Reprezentarea algoritmilor prin pseudocod
Descrierea algoritmilor cu ajutorul schemelor logice se dovedete, n unele cazuri, greoaie,
practica impunnd n ultima vreme descrierea lor printr-un text coerent, construit pe baza unor
reguli. O astfel de descriere se numete metalimbaj (pseudocod). Exist multe variante de
metalimbaje. Oricine poate crea un pseudocod propriu, perfect acceptabil, cu condiia ca el s
conin structurile de baz, suficiente pentru a descrie orice algoritm. Evident c i la pseudocoduri

Bazele programrii

se pune problema portabilitii, mai ales atunci cnd se lucreaz n echip. Cel mai avansat
pseudocod universal a fost propus n anii 60 de Niklaus Wirth, pseudocod care ulterior a devenit
limbajul de programare Pascal. [Roca et al., 1998] Se propune urmtorul pseudocod:
Cuvinte cheie. Sunt mnemonice ale instruciunilor, unele fiind scrise n limba englez,
pentru compatibilizare cu literatura de specialitate (de exemplu WHILE-DO, IF-THEN-ELSE).
Instruciuni. Instruciunile pot fi scrise liber, n sensul c o instruciune se poate scrie pe
mai multe rnduri, iar un rnd poate conine mai multe instruciuni (separate prin ";").
Instruciunile se mpart n declaraii (instruciuni neexecutabile) i instruciuni efective
(executabile).
O declaraie este format din cuvinte cheie (de exemplu NTREG, REAL, CARACTER
etc.), urmat de un ir de variabile separate prin ",", variabile pentru care se indic faptul c au tipul
ntreg, real, caracter etc. Masivele se declar prin tipul elementelor sale, urmat de o construcie
care desemneaz numrul maxim de elemente pe fiecare dimensiune, sub forma [d1][d2]...[dn].
Exemple:
NTREG a, b, c;
REAL vector[20];
NTREG matrice [10][15];

Instruciunile executabile ntr-un program scris n pseudocod pot fi:


Instruciunea de citire are forma: CITETE(list_de_variabile).
Exemple:

CITETE(A,B);
CITETE(xi);

Instruciunea de scriere are forma: SCRIE(list_de_variabile).


Exemple:
SCRIE(A,B);
SCRIE("VECTORUL ESTE =");
SCRIE(xi);

Instruciunea de atribuire are forma: v=e, unde v este variabil, e este expresie, ambele de
aceeai natur (numeric, logic sau caracter).
Instruciunile de ramificare (IF-THEN-ELSE, IF-THEN, CASE-OF) i cele repetitive
(WHILE-DO, DO-UNTIL, DO-FOR) sunt prezentate mpreun cu structurile fundamentale.
Observaii:
a) Instruciunile corespund configuraiilor acceptate ntr-o schem logic structurat, deci sunt
compatibile cu programarea structurat.
b) Instruciunile acestui pseudocod se pot extinde la lucrul cu fiiere.

Teste de autoevaluare

3. Blocurile dintr-o subschem logic sunt etichetate cu una din informaiile: 1)START;
2)citire; 3)scriere; 4)expresie aritmetic; 5)expresie logic; 6)expresie relaional; 7)sir de
caractere; 8)atribuire; 9)salt necondiionat; 10)STOP. a)oricare; b)1,2,3,5,6,8 sau 10;
c)1,2,3,4,8 sau 10; d)1,2,3,5,6,7,8 sau 10; e)1,2,3,4,6,8,9 sau 10
4. Reprezentarea prin arbori este permis numai pentru structurile: 1)BLOCK; 2)IF-THENELSE; 3)CASE-OF; 4)WHILE-DO; 5)DO-UNTIL; 6)DO-FOR. a) toate; b)1,2,3,4 i 5;
c)2,3,4,5 i 6; d)1,2 i 4; e)1,2 i 5.

Bazele programrii

10

1.2. Descrierea structurilor fundamentale


n prezentarea structurilor fundamentale se vor folosi, n paralel, urmtoarele reprezentri:
schem logic, arbore, pseudocod si exprimare analitic. n cele ce urmeaz, s1, s2,...,sn sunt s.l.s.
(respectiv iruri de instruciuni n pseudocod sau module structurate n schemele arbore).
Structura secvenial (liniar) este prezentat n figura 1.2. i se noteaz analitic cu:
BLOCK[2](S1,S2) sau BLOCK(S1,S2). Structura secvenial poate conine mai multe blocuri:
BLOCK[n](S1,S2...Sn)=BLOCK(BLOCK[n-1](S1,S2...Sn-1), Sn), cu n2.
Poate fi definit o structur secvenial cu un singur bloc: BLOCK[1](S1)=S1.
s.l.s.

arbore

pseudocod

BLOCK
S1;
S2;

S1

S2

S1

S2

Fig. 1.2. Structura secvenial


Structurile alternative sunt de mai multe tipuri:
s.l.s.
nu

S2

arbore
da

pseudocod

IF-THEN-ELSE

S1
C

S1

S2

IF C THEN
S1
ELSE
S2
ENDIF;

a) Structura IF-THEN-ELSE
s.l.s.
nu

arbore
da

pseudocod

IF-THEN
IF C THEN
S1
ENDIF;

S1
C

S1

b) Structura IF-THEN

Fig. 1.3. Structuri alternative

Structura IF-THEN-ELSE (selecia simpl) este prezentat n figura 1.3.a. i se noteaz


analitic cu IF-THEN-ELSE(c,S1,S2).
Structura IF-THEN (pseudoalternativ) este prezentat n figura 1.3.b i se noteaz analitic cu
IF-THEN(c,s). Structura IF-THEN este o form particular a structurii IF-THEN-ELSE, putndu-se
exprima astfel:

Bazele programrii

11

IF-THEN(c,s)=IF-THEN-ELSE(c,s,), unde este o s.l.s. vid.


Programarea structurat accept i structura IF-ELSE (cu s pe ramura fals), notat IF-ELSE(c,s), tot
ca form particular a structurii IF-THEN-ELSE:
IF-ELSE(c,s)=IF-THEN-ELSE(c, ,s)
Structurile IF-THEN i IF-ELSE se pot exprima (pot fi nlocuite n algoritm) una prin cealalt:
IF-THEN(c,s) = IF-ELSE( c ,s) i IF-ELSE(c,s) = IF-THEN( c ,s)
Structura CASE-OF (selecia multipl) este prezentat n figura 1.4 i se noteaz analitic cu
CASE-OF(i,s1,s2,...,sn,s), n cazul general i CASE-OF(i,s1,s2,...,sn), n cazul particular, unde i este o
variabil selector care poate lua valori n mulimea V={v1, v2, , vn}. V este o mulime discret,
finit i ordonat. Structura CASE-OF este echivalent cu structura IF-THEN-ELSE (demonstrai
acest lucru analitic, prin s.l.s. i prin structuri arborescente).
s.l.s.

i=1

S2

pseudocod

CASE-OF i

i1, 2, ..., n
i=n

i=2

S1

arbore

...

Sn

S1

S2

...

Sn

CASE-OF i
i=1: S1
i=2: S2
... ... ...
i=n: Sn
ELSE: S
ENDCASE;

a) Structura CASE-OF cazul general


s.l.s.

i=1

S2

pseudocod

CASE-OF i

i=n
i=n-1

i=2

S1

arbore

...

Sn-1

Sn

S1

S2

...

Sn-1

Sn

CASE-OF i
i=1: S1
i=2: S2
... ... ...
i=n-1: Sn-1
i=n: Sn
ENDCASE;

b) Structura CASE-OF cazul particular

Fig. 1.4. Structura CASE-OF


Structurile repetitive sunt de mai multe tipuri:
Structura repetitiv condiionat anterior este prezentat n figura 1.5.a. i se noteaz analitic
cu WHILE-DO(c,s).
Structura repetitiv condiionat posterior, este prezentat n figura 1.5.b. i se noteaz
analitic cu DO-UNTIL(c,s).
Structura repetitiv cu numrtor este prezentat n figura 1.5.c. i se noteaz analitic cu DOFOR(v,vi,vr,vf,s), unde v este o variabil contor (numrtor), iar vi, vf,vr sunt expresii cu rol de
valoare iniial, valoare final, respectiv valoare raie. Atunci cnd vr=1, raia se poate omite n
pseudocod.
Observaii:
1. Diferena esenial ntre WHILE-DO i DO-UNTIL cost n aceea c DO-UNTIL execut s cel
puin o dat, pe cnd WHILE-DO poate s nu execute pe s. Oricum, cele dou structuri se pot transforma
uor una n alta, astfel:
WHILE-DO(c,s)=IF-THEN(c,DO-UNTIL( c ,s))
DO-UNTIL(s,c)=BLOCK(s,WHILE-DO( c ,s))
2. Structura DO-FOR este un caz particular al structurii DO-UNTIL, putndu-se scrie:
DO-FOR(v,vi,vf,vr,s)=BLOCK(v=vi,WHILE-DO(vvf,BLOCK(s,v=v+vr)))

Bazele programrii

12
s.l.s.

arbore

pseudocod

WHILE-DO
C
nu

da
S

WHILE C DO
S
ENDWHILE;

a) Structura WHILE-DO
s.l.s.

arbore

pseudocod

DO-UNTIL
S

nu

da

b) Structura DO-UNTIL

s.l.s.

arbore

v=vi

vvf

DO-FOR
v=vi, vf, vr
da
S

nu

DO
S
UNTIL C;
ENDDO;

pseudocod

DO-FOR v=vi, vf, vr


S
ENDDO;

v=v+vr

c) Structura DO-FOR

Fig. 1.5. Structurile repetitive

Teste de autoevaluare

5.Structura DO-FOR(v,vi,vf,vr,s) este echivalent cu: a) BLOCK(v=vi, DOUNTIL(BLOCK(v=v+vr,s),v>vf)); b) BLOCK(v=vf, DO-UNTIL(BLOCK(s,v=vvr),v


vi)); c) BLOCK(v=vi, IF-THEN(v
vf, DO-UNTIL(BLOCK(s,v=v+vr),v>vf))); d)
BLOCK(v=vf, WHILE-DO(v>vi,BLOCK(s,v=v-vr))); e) BLOCK(v=vi, WHILEDO(v<vf,BLOCK (s,v=v+vr)));
6. Structura WHILE-DO(c,s) este echivalent cu: a) DO-UNTIL(s, c ); b)BLOCK(s,DOUNTIL(s, c )); c)IF-THEN(c,DO-UNTIL(s,c)); d)BLOCK(s,IF-THEN(c,s)); e)DOUNTIL(IF-THEN(c,s), c )

Bazele programrii

13

1.3. Structurarea i proiectarea algoritmilor


Un algoritm se consider structurat dac i numai dac conine structurile fundamentale
prezentate anterior. Deoarece fiecare structur are o singur intrare i o singur ieire, schema
logic are o singur intrare i o singur ieire.
Considerndu-se o familie D' de structuri fundamentale (de exemplu D'={BLOCK, IFTHEN-ELSE, IF-THEN, DO-UNTIL, WHILE-DO}), un algoritm se numete D'-structurat dac
este reprezentat numai prin structuri din D'. De remarcat faptul c orice algoritm structurat poate fi
realizat numai prin structurile de baz din familia D={BLOCK, IF-THEN-ELSE, WHILE-DO}.
Un algoritm P, structurat, este echivalent cu un algoritm pus sub una din urmtoarele forme:
P=BLOCK(s1,s2)
P=IF-THEN-ELSE(c,s1,s2)
P=WHILE-DO(c,s)
Dac schema logic prin care se ilustreaz algoritmul de rezolvare a unei probleme nu
conine numai structurile fundamentale, atunci ea este nestructurat.
Orice schem logic nestructurat se poate structura, conform urmtoarei teoreme de
structur: Fie S o schem logic nestructurat n care etichetele care sunt predicate formeaz o
mulime P, iar etichetele care nu sunt predicate formeaz mulimea A, a aciunilor. Se pot aduga
lui A i P alte aciuni, respectiv alte predicate, diferite de cele din S, astfel nct s se obin o
schem logic structurat echivalent cu S. Dac o schem logic nestructurat este prea complicat, se renun la structurare (care, prin adugare de noi aciuni i predicate, complic i mai mult
schema) i se reproiecteaz.
n practic s-au impus urmtoarele metode de structurare.
Metoda dublrii codurilor se folosete la structurarea alternativelor sau repetitivelor. Ea
const n dublarea, ori de cte ori este nevoie, a unui cod (a unei aciuni sau a unui predicat), astfel
nct s se obin numai structuri fundamentale.
Metoda introducerii unei variabile booleene se folosete pentru structurarea repetitivelor i
const n:
- se copiaz din vechea schem logic toate blocurile pn la intrarea n structura repetitiv
care nu este fundamental;
- se introduce variabila boolean, de exemplu VB (VB=0 sau VB=1);
- se alege structura repetitiv fundamental WHILE-DO sau DO-UNTIL, n care condiia se
refer la variabila boolean introdus, VB;
- n interiorul structurii repetitive alese, variabila booleean i schimb valoarea: VB=1
(sau VB=0) pe toate drumurile care duceau la ieirea din vechea structur repetitiv.
Erorile n algoritmi
Un algoritm este eficient i devine operaional n msura n care ntre resursele de calcul
utilizate (timp i memorie calculator) i precizia rezultatelor se stabilete un raport acceptabil.
Cu toat precizia oferit de calculatoarele electronice, calitatea rezultatelor este influenat
de muli ali factori. Soluia unei probleme depinde de datele iniiale, acestea fiind obinute n urma
unor observaii, msurtori sau pe baza altor calcule prealabile. Precizia instrumentelor cu care se
fac observaiile, condiiile n care au loc acestea, precizia calculelor necesare determinrii unor
parametri iniiali genereaz erori n datele iniiale. n general, pentru aceast clas de erori se
stabilesc limite de eroare.
O parte din parametrii utilizai n formulele de calcul nu au o valoare exprimabil printr-un
numr finit de zecimale (de exemplu 3 , , e etc). Erorile de aproximare a lor sunt cunoscute i

Bazele programrii

14

vor fi astfel alese nct s fie corelate cu precizia dorit pentru calculele n care intr aceti
parametri.
O alt clas important de erori o constituie erorile de rotunjire. Ele apar ca urmare a
limitrii numrului de zecimale cu care se poate reprezenta un numr n calculator. Aceste erori
depind de modul de reprezentare a numerelor n calculator, de sistemul de numeraie folosit n
calcule, precum i de conversiile dintr-un sistem de numeraie n altul.
La rezolvarea, mai ales numeric, a unei probleme se folosete o metod matematic. De
multe ori, fenomenul modelat este supus unor condiii simplificatoare, n funcie de acestea alegnd
una sau alta din metodele de rezolvare existente. Alegerea metodei poate introduce aa numitele
erori de metod. Erorile introduse prin prezena n calculator a unor funcii crora n analiza
matematic le corespund serii infinite se numesc erori reziduale. Ele se explic prin imposibilitatea
calculrii unei serii infinite ntr-un numr finit de pai ai algoritmului.
Dac x este valoarea exact i x* o valoare aproximativ a lui x, obinut ca urmare a
prezenei unor erori din clasele menionate anterior, se disting urmtoarele situaii:
x* > x
x* este o aproximare a lui x prin adaos;
x* realizeaz o aproximare prin lips.
x* < x
Diferena x * = x - x * reprezint eroarea, iar cnd nu intereseaz sensul ei se calculeaz
x * = x x * , care poart numele de eroare absolut.
Erorile pot fi acceptate sau respinse, nu numai n funcie de mrimea lor, ci i n funcie de
x x*
mrimea valorilor crora li se asociaz. n acest scop se calculeaz raportul rx * =
care
x*
desemneaz eroarea relativ.
n cazul operaiilor de adunare i scdere, eroarea absolut nu depete suma erorilor
absolute a celor dou numere care se adun algebric.
*
*
x* y* = (x y) - ( x y ) = x* y* , pentru eroarea absolut;
*
x * y*
x * y , pentru eroarea relativ.
*
=
rx * * ry * *
rx y
*
*
x y
x y
x y
De reinut c la scderea a dou numere apropiate ca valoare, eroarea relativ i pierde din
acuratee datorit numitorului raportului care tinde spre zero. Relaiile funcioneaz i pentru n>2
numere. n cazul produsului a mai multor numere aproximative i nenule, eroarea relativ nu
depete suma erorilor relative ale numerelor:
*
*
* *
*
* *
*
x*. y* - (xy - x y ) = ( x + x*) ( y + y*) - x y = x y* + y x* + x* y*
*

* *

x*. y*
* *
x .y
n care, logaritmnd (valorile absolute permind acest lucru, iar x* i y* pentru simplificare au
*
acelai semn) i folosind formula de aproximare ln x - ln x * d ln x * = x* , rezult c
x
*
*
y x* - x y*
, r ( x )* | r x* | + | r y* | , ceea ce
r x* y* r x* + r y* . n cazul operaiei de mprire ( x )*
y
y
( y* ) 2
nseamn c eroarea relativ a ctului nu excede suma erorilor relative ale dempritului i
mpritorului. Erorile n cazul unor expresii calculabile prin operaiile elementare pot fi aproximate
folosind limita maxim a erorilor fiecrui termen n parte.
r x*. y* =

Bazele programrii

15

Teste de autoevaluare

7. Un algoritm structurat este echivalent cu un algoritm pus sub una din formele:
1)BLOCK(s1,s2); 2)IF-THEN-ELSE(c,s1,s2); 3)IF-THEN(c,s); 4)CASE-OF(i,s1,s2,...,sn,s);
5)WHILE-DO(c,s); 6)DO-UNTIL(s,c); 7)DO-FOR(v,vi,vf,vr,s). a)1,2,3,4,5,6,7; b) 1,2,3,5,6;
c) 1,2,5,6,7; d) 1,2,5; e) 1,2,6.
8. Teorema de structur stabilete c: a) orice schem logic este echivalent cu o schem
logic structurat; b) orice schem logic poate fi pus sub una din
formele:BLOCK(s1,s2); IF-THEN-ELSE(c,s1,s2); WHILE-DO(c,s); c) corectitudinea
unei scheme logice structurate se verific prin examinarea fiecrui nod din arborescena
sa; d) o schem logic structurat poate fi descompus n structurile privilegiate

Proiectarea algoritmilor
Conceptele principale ce s-au cristalizat n domeniul programrii structurate sunt:
proiectarea top-down, proiectarea modular, proiectarea structurat. Cele trei tipuri de proiectri
nu se exclud unul pe altul, ci se intercoreleaz pentru desfurarea unei activiti organizate i
disciplinate, concretizat n obinerea unor produse program care s reflecte clar ierarhizarea
prelucrrilor i care s faciliteze testarea i documentarea lor.
Proiectarea top-down presupune descompunerea, de la general la particular, a problemei
date n subprobleme sau funcii de prelucrat, conducnd la realizarea algoritmului n mai multe faze
succesive, fiecare faz fiind o detaliere a fazei anterioare pn cnd algoritmul este suficient de
rafinat (detaliat) pentru a fi codificat. Apar astfel, n diferite faze succesive, algoritmi din ce n ce
mai detaliai. n urma descompunerii se obine o structur liniar sau arborescent.
Proiectarea top-down este nsoit de codificare (scriere a programelor) top-down i testare
top-down. Codificarea top-down presupune, n principal, posibilitatea scrierii unui modul nainte de
a se proiecta modulele de nivel inferior (superior), iar testarea top-down const n realizarea ei de
sus n jos: se pornete cu modulul rdcin i cu unu sau mai multe module de ordin imediat
inferior, se continu cu ataarea unui alt nivel inferior etc., pn cnd s-au inclus n testare
modulele ultimului nivel. Testarea top-down poate lua n considerare, la un moment dat, numai
legturile unui modul cu module de pe nivelul inferior, fr testare propriu-zis a acestora din urm.
Proiectarea modularizat presupune descompunerea problemelor n pri numite
module, astfel nct fiecare din acestea s ndeplineasc anumite funcii bine definite.
Descompunerea se poate face n mai multe faze (la mai multe niveluri) prin metoda top-down.
Criteriile de descompunere n module depind, n mare msur, de experiena proiectanilor
(programatorilor).
Ele se refer, n principal, la: omogenizarea funciilor; utilizarea diverselor structuri de date;
separarea funciilor de intrare/ieire de funciile de prelucrare; utilizarea unor module deja
existente; posibilitile echipei n sarcina creia intr realizarea modulelor; utilizarea eficient a
resurselor calculatorului (periferice, timp, memorie intern) etc.
Proiectarea modularizat presupune, pe lng identificarea modulelor i a relaiilor dintre
ele, i precizarea modului i ordinii n care modulele sunt puse n lucru. Din punct de vedere al
funciilor pe care le conin, se disting: module de prelucrare (operaionale) care conin funcii de
prelucrare (operaii propriu-zise), module de comand (monitor) care apeleaz (activeaz) alte
module i module mixte, care conin att funcii de prelucrare ct i de comand. n stabilirea
ordinei de punere n lucru a modulelor, arborele se parcurge n preordine. Dup stabilirea
modulelor, acestea se abordeaz algoritmic, independent unul fa de altul.

Bazele programrii

16

Proiectarea structurat a algoritmilor const dintr-o mulime de restricii i reguli de


elaborare care foreaz proiectantul (programatorul) s urmeze o form strns de reprezentare i
codificare. ntr-un sens mai larg, programarea structurat - incluznd aici i elaborarea algoritmilor
- este modalitatea de ordonare a activitii mentale desfurat n scopul obinerii de programe
(algoritmi) constituite din structuri fundamentale cu un grad de structurare ct mai mare i n
condiiile minimizrii efortului de programare, dar obinerii unui produs de cea mai bun calitate.
Verificarea i analiza corectitudinii algoritmilor
n procesul de elaborare a algoritmilor se pot strecura formulri imprecise sau eronate, ceea
ce determin obinerea unor rezultate incomplete sau eronate. Verificarea corectitudinii ar nsemna
verificarea faptului c pentru orice set de date, algoritmul elaborat furnizeaz rezultate corecte,
lucru imposibil de realizat n practic. Exist ncercri, cu valoare teoretic, de a elabora o
metodologie de verificare a corectitudinii algoritmului. n practic se recomand urmtoarele
verificri ale corectitudinii algoritmilor simpli:
1. ncheierea algoritmului dup un numr finit de pai (n principal, modul de construire a
ciclrilor);
2. modul n care au fost construite seleciile, astfel nct variantele s fie corect definite n
algoritm;
3. asigurarea valorilor (prin introducerea din exterior sau iniializare n algoritm) pentru
toate variabilele referite (utilizate) n operaii.
Dac cele trei tipuri de verificri au condus la concluzia de corectitudine, se procedeaz la
un test de birou care presupune parcurgerea atent, operaie cu operaie, a algoritmului, pentru
seturi de date, de obicei cazuri limit.
Analiza algoritmilor (studiul eficienei lor) const, n principal, n:
I) Determinarea necesarului de memorie;
II) Determinarea timpului necesar execuiei algoritmului. Deoarece, pentru seturi diferite de
date, timpii de execuie vor fi diferii, timpul necesar execuiei algoritmului poate nsemna timpul n
cazul cel mai defavorabil sau timpul mediu, rezultat ca raport ntre suma timpului necesar pentru
toate seturile de date considerate i numrul acestor seturi.
III) Determinarea optimalitii algoritmului, care este, n general, o problem dificil, n
care important este criteriul dup care se judec algoritmul: (I) sau (II). Cu toate progresele
tehnologice din ultimul timp (calculatoare rapide, cu memorii mari), necesarul de memorie i
timpul UC rmn resurse importante care trebuie bine utilizate.

Test de autoevaluare
9. Care tipurile de proiectri cristalizate n domeniul programrii structurate?

Bazele programrii

17

Rspunsuri i comentarii la testele de autoevaluare

1:d); 2:d); 3:b); 4:a); 5:c); 6:e); 7:d); 8:a); 9. Tipurile de proiectri care s-au
cristalizat n domeniul programrii structurate sunt: proiectarea top-down, proiectarea

modular, proiectarea structurat.

Rezumat
n cadrul acestei uniti de nvare au fost studiate urmtoarele aspecte n ceea ce privete
algoritmii i schemele logice:
cunotine teoretice privind caracteristicile i descrierea algoritmilor;
modaliti de reprezentare a algoritmilor sub form de scheme logice i pseudocod;
reprezentarea structurilor fundamentale sub form de schem logic, arbore, pseudocod
i exprimare analitic;
proiectarea, verificarea i analiza algoritmilor.
Dup ncheierea acestei uniti de nvare, studenii au cunotine i abiliti de rezolvare a
problemelor (n special lucrul cu masive), prin reprezentarea acestora sub form de algoritmi
structurai.

Bibliografia unitii de nvare


1. I. Gh. Roca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, M. Mircea, L. Btgan, C. Silvestru,
Bazele programrii calculatoarelor. Teorie i aplicaii n C, Ed. ASE, Bucureti, 2006, ISBN 973-594-5916
2. I. Gh. Roca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, Programarea calculatoarelor. tiina
nvrii unui limbaj de programare, Teorie i aplicaii, Ed. ASE, 2003

3. Roca I. Gh., Apostol C., Ghilic-Micu B., Roca V., Programare sistematic n Pascal, Ed.
Didactic i Pedagogic, Bucureti 1998, ISBN 973-30-3341-3

Bazele programrii

18

2. Organizarea intern a datelor


Cuprins
Obiectivele unitii de nvare 2
2.1. Informaia, data i reprezentarea intern a datelor
2.2. Structuri de date
Rspunsuri i comentarii la testele de autoevaluare
Bibliografia unitii de nvare

Obiectivele unitii de nvare 2


Dupa studiul acestei unitati de nvatare, studenii vor avea cunotine teoretice i abiliti practice
despre:
informaii, date, cunotine;
reprezentarea intern a datelor;
structuri statice de date;
structuri dinamice de date.

Durata medie a unitii de studiu individual - 8 ore

2.1. Informaia, data i reprezentarea intern a datelor


Informaia este un concept de maxim generalitate, care poate fi definit prin raportarea la
conceptele de materie i energie. Fondatorul ciberneticii, Norbert Wiener1, consider informaia
ca a treia form de manifestare a realitii obiective, apreciind c ea nu este nici materie, nici
energie, ci pur i simplu informaie. Se poate remarca faptul c definiia anterioar este dat n
sens negativ.
Pentru a ncerca o definiie afirmativ, se cuvine mai nti s se fac distincie ntre dou
maniere de a aborda conceptul pus n discuie: n general, ca semnele care circul pe diferite
canale ntre elementele lumii reale, cu forme specifice de receptare la diferitele niveluri de
manifestare a materiei vii; n particular, cnd elementul receptor este omul, ca fiin superioar pe
scara biologic. n acest ultim sens, informaia trebuie considerat n raport cu procesul de
cunoatere i cu modul de reflectare a rezultatelor sale n contiina fiinei umane. n literatura de
specialitate sunt identificate urmtoarele trsturi definitorii ale informaiei:
semn cu semnificaie: este obligatoriu ca un mesaj s fie construit ntr-o limb (limbaj) cunoscut
de receptor;
noutate: exist mesaje care, dei sunt redactate ntr-o limb cunoscut, nu conin nimic nou
pentru receptor, pierzndu-se calitatea de informaie;
1

Norbert Wiener Cybernetics or Control and Communication in the Animal and the Machine, Herman
and Cie, Paris, The MIT Press, Cambridge (Mass), Wiley and Sons, New York (1948), ediia a doua
revzuit i adugit (dou capitole noi), The MIT Press, Cambridge (Mass), Wiley and Sons, New York,
1961

Bazele programrii

19

utilitate: n raport cu interesele receptorului, este posibil ca un mesaj cu caracter de noutate s fie
inutil pentru activitatea sa, pierzndu-i, de asemenea, calitatea de informaie.
Corespunztor, se identific urmtoarele niveluri la care se consider informaia: sintactic, semantic i
pragmatic.

Nivelul sintactic este asociat sistemului de semne i regulilor utilizate pentru a le reuni n
construcii sintactice folosite pentru reprezentarea informaiei n procesul de culegere,
transmitere, nregistrare i prelucrare. Acestui nivel i corespunde conceptul de dat, care,
folosind notaia formal BNF (Backus-Nour Form), poate fi definit astfel:
<dat>: : = <identificator> <atribute> <valoare>.
Regulile de sintax care formeaz mulimea produciilor pot fi specificate n mai multe moduri,
dintre care se remarc notaia formal BNF (Backus Normal Form) i diagramele de sintax. n notaia
BNF, regulile sintactice (metadefiniiile) au forma:
<parte-stnga> ::= parte-dreapta
unde <parte-stnga> desemneaz metavariabila (variabila neterminal) care se definete, ::= este un
metasimbol avnd sensul de este prin definiie, iar parte-dreapta reprezint definiia metavariabilei.
n cadrul definiiei (parte-dreapta) se ntlnesc urmtoarele elemente:
<metavariabila>, categorie folosit n definirea altei categorii sintactice;
metaconstanta, element al alfabetului terminal;
care separ alternativele n definiie;
[ ] care indic o construcie opional;
{ } care indic posibilitatea repetrii construciei.
Alternativele se constituie prin juxtapunerea de metavariabile i/sau metaconstante.

Noiunea de dat va conine pe cea de valoare, dar presupune, n plus, o form de


reprezentare i manipulare, adic un sistem de reguli de transformare avnd ca scop s se
obin date noi pornind de la cele existente. Pe lng distincia ntre conceptele de dat i
valoare se constat, de asemenea, diferena ntre informaie i dat, ca ntre un obiect i
modelul su. Se mai spune c data este o reprezentare digital (discret) a unei anumite
cantiti de informaie. n concluzie, conceptele de informaie i dat pot fi utilizate ca
sinonime numai n msura n care acceptm s identificm un obiect cu modelul su.
La nivelul semantic, informaia poate fi caracterizat ca semnificaie a datelor. Sensul
informaiei la acest nivel este dat de corespondena ntre o dat i obiectul real sau situaia
reprezentat prin aceast dat.
Nivelul pragmatic este cel mai concret nivel de abordare a informaiei, fiind singurul care
consider informaia n raport cu scopurile receptorului. Pornind de la scopurile receptorului pot
fi definite caracteristici ca utilitatea sau importana informaiei. Nivelul pragmatic permite
reflectarea cea mai fidel a procesului de cunoatere, a crui nelegere complet impune
utilizarea conceptului de cunotin.
Procesul de cunoatere se realizeaz n timp, prin acumularea progresiv de informaii
asupra unui obiect sau a unui sistem. La un moment dat, cunotinele reprezint totalitatea
informaiilor deinute de un observator asupra unui obiect sau sistem. Acest ansamblu de
informaii se numete tezaur de cunotine i se folosete ca termen de referin pentru a evalua
rezultatele oricrui proces de informare, ca parte a procesului general de cunoatere.
La limit, rezultatele unui proces de informare pot conduce la una din urmtoarele situaii:
la o extrem, este posibil ca rezultatul s fie nul, dac informaia aparine deja
tezaurului receptorului, adic ea a devenit o cunotin;
la cealalt extrem, variaia potenial a tezaurului receptorului este maxim dac
intersecia ntre coninutul tezaurului i acela al unui mesaj este vid.

Bazele programrii

20

Referitor la al doilea caz, se constat, ns, c este obligatorie existena unei intersecii
nevide ntre cele dou mulimi, numit redundan, astfel nct recepia i nelegerea
mesajului s aib loc.
n final putem sintetiza o serie de concluzii clarificatoare a problematicii puse n
discuie.
O informaie este un mesaj susceptibil de a aduce o cunotin i poate fi generat numai de
sisteme cu numr n finit de stri (n 2). Modelul de reprezentare a informaiei, formula scris,
reprezint o dat. Deosebirea dintre informaie i dat este echivalent cu deosebirea dintre obiect i
modelul su. Sub aspect semantic, informaia poate fi caracterizat ca semnificaie a datelor.
Calculatoarele actuale prelucreaz date pe baza crora se obin rezultate (tot date) care, prin
interpretare uman, capt un sens, devenind informaii.
C.E. Shannon a introdus noiunea de cantitate de informaie, care se poate defini astfel: fie
un experiment X, avnd un numr finit de evenimente elementare independente x1,x2,...,xn, care se
realizeaz cu probabilitile p1,p2,...,pn: X = x1 x2 ... xn . Dac X reprezint un sistem complet de
p p ... p
1 2
n

evenimente: 0pk1, pentru orice k{1,2,...,n} (1) i

= 1 (2), atunci cantitatea de informaie

k =1

(entropia) se msoar dup relaia:


n

H(p1 , p 2 , ..., p n ) = - p k log 2 p k

(3)

k =1

Cantitatea de informaie se exprim, cel mai adesea, n bii. Bitul poate fi definit ca
informaia furnizat de un sistem cu dou stri echiprobabile:
x1 x 2

X =
(4)
1/2 1/2
Aplicnd formula (3), se obine:
n
H(p1, p 2 ,..., p n ) = p k log 2 p k = (1/2)log 2 (1/2) (1/2)log 2 (1/2) == 1/2 + 1/2 = 1 bit
k =1

Prin dat se desemneaz un model de reprezentare a informaiei accesibil unui anumit


procesor (om, unitate central, program etc.), model cu care se poate opera pentru a obine noi
informaii despre fenomenele, procesele i obiectele lumii reale.
n notaie BNF, semnificaia cuvintelor de definire este urmtoarea.
Identificatorul este un nume care se asociaz datei, pentru a o distinge de alte date i a o
putea referi n procesele de prelucrare (referire prin nume).
Valoarea datei se poate preciza prin enumerare sau printr-o proprietate comun. Ea poate fi
numr ntreg, real, complex, logic, ir de caractere etc. Data care pstreaz aceeai valoare pe tot
parcursul prelucrrii este denumit constant. n caz contrar, data se numete variabil. Pentru
datele constante se folosete, n general, drept identificator chiar valoarea, adic o astfel de dat se
autoidentific prin forma textual a valorii, ceea ce justific denumirea de literal. n unele limbaje
de programare, ntre care i C, exist i posibilitatea definirii unor constante simbolice, crora li se
asociaz un identificator propriu.
Atributele precizeaz proprieti ale datei i ele determin modul n care aceasta va fi tratat
n procesul de prelucrare. Dintre atributele care se pot asocia unei date, cel mai important este tipul.
El precizeaz mulimea valorilor pe care le poate avea o dat, precum i mulimea de operaii care
se pot efectua cu elementele mulimii de valori ale datei. Pe lng tip, unei date i se pot asocia i
alte atribute, ca: precizia reprezentrii interne, cadrarea valorilor n zona afectat, modul de alocare
a memoriei pe parcursul prelucrrii (static, dinamic), valoarea iniial etc.

Bazele programrii

21

Reprezentarea intern a datelor


Data este elementar (scalar) dac apare ca o entitate indivizibil, att n raport cu
informaia pe care o reprezint, ct i n raport cu procesorul care o prelucreaz. O dat scalar
poate fi privit la nivelul unui procesor uman (nivel logic), respectiv la nivelul calculatorului, ca
procesor (nivel fizic). La nivel fizic, unei date i corespunde o zon de memorie de o anumit
mrime, situat la o anumit adres, n care sunt memorate, n timp i ntr-o form specific,
valorile acesteia.
Datele din memoria intern pot fi clasificate n trei mari categorii.
Datele alfanumerice se reprezint n cod ASCII extins, cte un caracter pe octet. Cele
256 de caractere codificabile ASCII se mpart n afiabile i neafiabile. Caracterele afiabile sunt
literele (mari i mici) ale alfabetului englez, cifrele, o serie de caractere speciale (+,*,/ etc.),
spaiul, o serie de semne grafice (, , ,, ), o serie de caractere greceti (,, etc.) etc.
Caracterele neafiabile se utilizeaz, de regul, pentru controlul transmisiei i imprimrii (Line
Feed, Carriage Return, Form Feed, Bell, Tab etc.). Cnd aceste caractere sunt folosite n alt
context dect cel de control, li se pot asocia simboluri grafice nestandardizate, cum ar fi: ,,
, , , , , .
Datele numerice se reprezint intern n virgul fix i virgul mobil. UCP are
dispozitiv fizic specializat n efectuarea operaiilor n virgul fix. Calculul n virgul mobil
poate fi realizat cnd microcalculatorul are coprocesor matematic 80x87 sau cnd limbajele de
programare dispun de biblioteci specializate pentru emularea software a operaiilor n aceast
aritmetic.
Datele logice se reprezint intern n virgul fix pe un octet, prin convenie asociinduse 1 pentru valoarea adevrat i 0 pentru fals.
Se face, de asemenea, meniunea c unele limbaje de programare lucreaz i cu un alt tip
de reprezentare intern a datelor numerice, numit reprezentare zecimal.

Reprezentarea n virgul fix


Reprezentarea n virgul fix se aplic numai numerelor ntregi i se realizeaz pe zone de
memorie standard (un cuvnt sau dou cuvinte) sau pe octei. Ea poate fi algebric sau aritmetic.
Macheta de reprezentare pe un cuvnt este prezentat n figura 2.1, unde:
s
15 14

M
a) Virgul fix algebric

N
15 14

b) Virgul fix aritmetic

Fig. 2.1. Reprezentarea n virgul fix


s este bitul de semn (s-a adoptat convenia ca semnul "+" s fie reprezentat prin valoarea
binar 0 iar semnul "" prin valoarea binar 1);
M este o valoare exprimat n binar, n cod direct pentru numere pozitive i n cod

Bazele programrii

22

complementar, pentru numere negative.


N este reprezentat n cod direct. Reprezentarea aritmetic se aplic numai numerelor
pozitive, bitul de semn fiind folosit ca bit de cifr.
Codul complementar se obine astfel:
- se reprezint valoarea absolut a numrului n binar (cod direct). Fie aceasta N2;
- se realizeaz complementul fa de unu (cod invers) al lui N2. Complementul fa de unu
se obine prin inversarea fiecrui bit (0 n 1 i 1 n 0), inclusiv a bitului de semn. Fie numrul
obinut N2*;
- se adun un unu la numrul reprezentat n cod invers (N2*) i astfel se obine
complementul fa de doi al lui N2.
Exemple:
Numrul 24 se reprezint astfel:
Se exprim 24 n cod direct:

0
15

0
14

...

...

0
6

0
5

1
4

1
3

0
2

0
1

0
0

1
6

1
5

0
4

0
3

1
2

1
1

1
0

0
2

0
1

0
0

Se realizeaz complementul fa de unu:

1
15

1
14

...

...

sau, exprimat n octal: 177747


Se adun unu la numrul reprezentat n complement fa de unu:

1
15

1
14

...

...

1
6

1
5

0
4

1
3

sau, exprimat n octal: 177750.

Pentru determinarea complementului fa de doi se poate proceda, astfel: din biii


numrului exprimat n cod direct se formeaz dou grupe: grupa din dreapta cuprinde toate
zerourile din dreapta ultimului bit cu valoarea 1 precum i ultimul bit 1; grupa din stnga
cuprinde biii rmai; se complementeaz fa de 1 grupa din stnga, lsndu-se nemodificat
grupa din dreapta.

Exemple:
Pentru simplificare se consider un cuvnt format din patru bii:
Complementul fa de 2 pentru 0110:
01
10
stnga
dreapta
Rezultat:
10
10
Complementul fa de 2 pentru 1101:
110
1
stnga
dreapta
Rezultat:
001
1

- numr pozitiv (+6)


- numr negativ ( 6)
- numr negativ (3)
- numr pozitiv (+3)

Considerndu-se o zon de memorie de n bii, valoarea care poate fi reprezentat algebric


aparine mulimii [2n1, 2n11] iar valoarea care poate fi reprezentat aritmetic aparine mulimii
[0, 2n1].

Bazele programrii

23

Reprezentarea n virgul mobil


Exist mai multe tipuri de reprezentare virgul mobil. Dintre acestea, cel mai frecvent
utilizat este standardul internaional IEEE (Institute for Electrical and Electronics Engineers).
Conform acestui standard, datele se memoreaz pe 32 de bii (simpl precizie) sau pe 64 de bii
(dubl precizie), dup machetele prezentate n figura 2.2.
semn
1 bit

caracteristic
8 (11) bii

fracie
23 (52) bii

Fig. 2.2. Reprezentarea virgul mobil simpl (dubl) precizie


Ambele machete presupun c numrul de reprezentat are urmtoarea exprimare binar
sub form tiinific: m=(1)s 1,fracie 2exponent, unde s este valoarea bitului de semn (1 pentru
mantis negativ i 0 pentru mantis pozitiv) iar fracie este partea fracionar a mantisei.
Mantisa este normalizat i are ntotdeauna forma 1,fracie, ceea ce nseamn c ea are
valori n intervalul [1,2). Pentru ca mantisa s fie adus la aceast form se modific n mod
corespunztor exponentul numrului m. De exemplu, fie m=101,0111. Scrierea lui m normalizat
este m=1,010111*22. Deoarece partea ntreag a mantisei este ntotdeauna 1, aceasta nu se
reprezint intern. Fracia se reprezint intern sub forma semn-mrime (nu n cod complementar).
Pentru a nu se utiliza doi bii de semn (unul pentru mantis i altul pentru exponent),
convenia IEEE a introdus n ablon nlocuirea exponentului cu o caracteristic. Aceasta este o
valoare n exces fa de 127 pentru simpl precizie (exponent+127) sau 1023 pentru dubl
precizie (exponent+1023):

Exemplu:
S se reprezinte n simpl precizie numrul 75,375.
75,375 = 1001011,011(2) = 1,001011011*26
s=1
mantisa = 1,001011011(2)
fracia = 001011011(2)
caracteristica = 6 + 127 = 133 = 10000101(2)
Reprezentarea intern: 1
10000101 00101101100000000000000

Caracteristica are urmtoarele valori normale:


0 < caracteristic < 255
pentru simpl precizie
0 < caracteristic < 2047
pentru dubl precizie.
Cnd caracteristica are valoarea zero, numrul reprezentat intern (m) este zero. Cnd
caracteristica este 255 (respectiv 2047) se consider depire virgul mobil. Caracteristicile
reprezentrilor interne virgul mobil simpl i dubl precizie sunt prezentate n tabelul 2.1.

Tabelul 2.1. Caracteristicile datelor reprezentate virgul mobil


Caracteristici
Numr bii pentru
reprezentare
caracteristic
Numr bii pentru

Tip reprezentare
Simpl precizie
Dubl precizie
8

11

23

52

Bazele programrii

24

Tip reprezentare
Simpl precizie
Dubl precizie

Caracteristici
reprezentare fracie
Valoarea minim
caracteristic
Valoarea maxim
caracteristic
Eroare maxim fracie
Cel mai mic numr
pozitiv
Cel mai mare numr
pozitiv
Domeniu de
reprezentare

254

2047

2-24 10-7

2-24 10-7

21-127 10-38

21-1023 10-307

22254-127 1038

222047-1023 10307

[1038 , 1038]

[10307 , 10307]

Prelucrarea datelor i instruciunilor de ctre unitatea central


Pentru nelegerea modului n care datele i instruciunile sunt prelucrate de unitatea
central, se consider c memoria conine, din punctul de vedere al programatorului, date (D) i
instruciuni (I), n succesiunea de cuvinte ilustrat n figura 2.3.
D1 D2 D3
I1
I2
D4 D5
I3
D6
I4
Adrese: 4700 4702 4704 4706 4710 4712 4714 4716 4720 4722 4726
Adresa de start

Fig. 2.3. Model de memorie


Aa dup cum s-a artat, instruciunile sunt prelucrate de UCC. ncrcarea instruciunilor
n UCC se realizeaz automat. Pentru a lansa un program n execuie, UCC trebuie s "cunoasc"
adresa primei instruciuni de executat (adresa de start). Acesta este motivul pentru care n unele
limbaje de programare este obligatorie etichetarea primei instruciuni executabile. n exemplul
din figura 1.9. se presupune c adresa de start a programului este 47068. Aceast adres este
ncrcat n contorul de adrese (un registru special numit program counter - PC).
n UCC este ncrcat ntotdeauna instruciunea aflat la adresa precizat de PC. Registrul
PC este incrementat automat, fiind astfel pregtit s adreseze urmtoarea instruciune. Deci, dup
ce se execut instruciunea I1, coninutul lui PC devine 47108. Se ncarc n UCC instruciunea I2.
Dup execuia acesteia, PC va conine adresa 47128. Dei la aceast adres este memorat o dat,
ea este ncrcat n UCC i, prin urmare, este tratat ca instruciune. Se pot ivi urmtoarele
situaii:
- coninutul lui D4, printr-o ntmplare, coincide cu o instruciune a unitii centrale, caz n
care este executat ca atare i coninutul lui PC este autoincrementat;
- coninutul lui D4 nu coincide cu nici o instruciune acceptat de unitatea central, caz n
care programul este abandonat (terminare anormal).
Prin acest exemplu s-a artat cum data este tratat de calculator ca instruciune. Deci, prin
actualizarea contorului de adrese dup execuia fiecrei instruciuni, se asigur nlnuirea
normal a instruciunilor din program (derularea programului n secven). Cum se poate proceda

Bazele programrii

25

atunci cnd nu se face parcurgerea n secven i este nevoie s se sar peste cteva cuvinte de
memorie pentru a ajunge la instruciunea dorit? Programatorul are la dispoziie instruciunile de
salt, prin folosirea crora se asigur ntreruperea secvenei normale de program, prin ncrcarea
forat n PC a adresei la care se gsete instruciunea de executat.
Se presupune c instruciunea I2 este: SALT LA 47168. Dup ce se execut instruciunea
I1, contorul de locaii devine 47108. Se execut, n secven, instruciunea I2 care pune contorul
de adrese pe valoarea 47168 (fiind o instruciune de salt).
Prin urmare, n UCC se ncarc instruciunea I3 .a.m.d. n exemplul anterior s-a
considerat c toate instruciunile au lungimea de un cuvnt. n secvena logic a programului,
ultima instruciune trebuie s fie de tip STOP.
Dup extragerea instruciunii din memorie (prima etap n prelucrarea unei instruciuni)
se execut urmtoarele etape: calculul adresei operandului; efectuarea operaiei propriu-zise,
precizat de instruciune.
n cadrul fiecrei etape se execut un anumit numr de faze. Indiferent de modul de
realizare a fazelor (prin macroinstruciuni sau prin funciuni cablate), principial, modul de
prelucrare a unei instruciuni este asemntor. Se consider c n UCC se gsete instruciune I3:
ADUNA (4704) cu (4712) care adun coninutul de la adresa 47048 cu coninutul de la adresa
47128 iar rezultatul se depune la adresa celui de-al doilea operand. Pentru a nelege modul cum
se execut aceast instruciune se presupune c UAL este format din dou registre (sumatoare),
n care se realizeaz calcule. Instruciunea I3 poate fi descompus n urmtorii pai (figura 2.4.):
- preia coninutul operandului surs de la adresa 47048 (D3) ntr-un sumator;
- preia coninutul operandului destinaie de la adresa 47128 (D4) n al doilea sumator;
- efectueaz calculul ntre cele dou sumatoare, cu rezultatul n S1;
- depune coninutul sumatorului S1 n memorie la adresa 47128.
n mod similar se pot interpreta i alte operaii de calcul. Toate operaiile realizate asupra
datelor se efectueaz n unitatea aritmetico-logic. Aceast afirmaie este valabil i n cazul
uneia din cele mai simple operaii: MUTA (47148) IN (47008), care se descompune astfel:
- preia operandul surs de la adresa 47148 (D5) n sumatorul S1;
- depune coninutul sumatorului S1 n memorie la adresa 47008 (D1 se pierde, depunnduse peste el D5).
Ce se va ntmpla n cazul instruciunii ADUNA (47008) cu (47108)? Rspuns: coninutul
de la adresa 47108 (I2) este tratat ca dat.
D1
4700

D2

4702

4704

D3
4706

I1

I2

4710

4712

D4
4714

D5

I3

4716

D6
4720

4722

I4
4726




S1

PC

4716

 +
adun (4704) cu (4712)

S2
UAL

(I3)

UCC

Fig. 2.4. Prelucrarea unei instruciuni


Prin acest exemplu s-a vzut cum instruciunea este tratat ca dat i, mai mult, cum un
program i poate modifica instruciunile proprii. Nu toate limbajele de programare ofer
posibilitatea intercalrii n memorie a datelor i instruciunilor. De fapt, aceast intercalare nici nu

Bazele programrii

26

este recomandat, avnd n vedere gestionarea greoaie a tipurilor de informaii: date i


instruciuni.
Instruciunile pot adresa operanzii direct sau indirect. La adresarea indirect (figura 2.5),
instruciunea memoreaz adresa unei zone care stocheaz adresa operandului.
Instruciune
Adres

Pointer
Adres operand

Operand

Fig. 2.5. Adresarea indirect


Se spune c zona de memorie care stocheaz adresa operandului este de tip pointer. Toate
limbajele de programare accept adresarea direct a operanzilor. Unele dintre ele accept lucrul
cu pointeri (adresare indirect). n acest caz, programatorul trebuie ca, nainte de adresare, s
ncarce n zona de tip pointer adresa operandului.

Operaii de intrare/ieire
Operaiile de intrare/ieire realizeaz citirea - introducerea datelor n memorie - i
scrierea - extragerea datelor din memorie. Deoarece datele pot fi prelucrate doar dac se gsesc
n memoria intern, apare ca necesar operaia de citire prin care se transfer datele furnizate de
utilizator. Cum toate operaiile i depun rezultatul n memoria intern, punerea lor la dispoziia
utilizatorilor necesit operaia de scriere. Elementele care definesc o instruciune de I/E sunt:
- de unde (unde) sunt introduse/extrase datele;
- care este structura extern a datelor (formatul extern);
- care este adresa memoriei n/din care se introduc/extrag datele.
Reprezentarea numerelor pe suporturile externe la care are acces n mod direct operatorul
uman trebuie s fie ASCII. Modul de realizare a corespondenei dintre un numr reprezentat
ASCII pe un suport extern i acelai numr reprezentat intern virgul fix sau virgul mobil este
prezentat schematic n figura 2.6.
Fie aA. Aplicaia f este o codificare bijectiv a mulimii A ntr-o mulime de coduri
reprezentabile pe un suport intern (de exemplu, o codificare n virgul fix sau n virgul mobil).
Fiecare numr din A se reprezint pe un suport extern sub forma unui ir de caractere (caracterele
aparin unei mulimi K). Imaginea pe suportul extern a unui numr aA nu este, n general, unic
(de exemplu a=13,9 poate fi reprezentat n mai multe feluri: +13.9; 139; +139 etc.). Se noteaz cu
Ia mulimea imaginilor pe suportul extern de intrare pentru elementul aA. n figura 1.11 s-a
presupus c imaginea numrului aA pe suportul extern de intrare este irul de caractere a1, a2, ...
, an.
Aplicaia este o codificare standard a mulimii K de caractere (ASCII). irul c1,c2...cn
rezult din irul a1, a2,...an prin aplicarea funciei fiecrui caracter ai, i=1,2,...n. Se noteaz cu Ca
mulimea irurilor de coduri care se obine din elementele lui Ia prin aplicarea funciei , n modul
descris anterior.

Bazele programrii

27
a

a1

a2

...

an

Suport extern
de intrare

f
c1

c2

cn

Suport intern

f(a)

-1

c1*

-1
a*

1*

c 2*

cn*

-3

-2

a2 *

...

an*

Suport extern
de ieire

Fig. 2.6. Corespondena ntre reprezentarea extern i intern a datelor


Pentru orice aA se definete funcia :{Ca | aA } {f(a) | aA} dat de (Ca)=f(a).
Alegerea funciei depinde de f i de mulimea {Ia | aA }. Se observ, deci, c funcia f se
realizeaz n calculator prin intermediul funciilor i . Aceste funcii sunt realizate pe baza
unor instruciuni precizate de programator. Analog se poate analiza funcia de decodificare (f -1).

Teste de autoevaluare

1. O dat reprezentat VF algebric pe 2o are valoarea maxim: a) 216; b) 216-1; c) 215-1;


d) 215; e) 216+1.
2. Numrul n zecimal a crui reprezentare intern n VF algebric este 10001111 este:
a) 143; b) 15; c) 143; d) 113; e) 113.
3. Operaia de scriere desemneaz: a) afiarea datelor pe monitor; b) scrierea datelor
pe supori magnetici; c) transferul datelor ntre zone de memorie principal; d)
transferul datelor din memoria principal pe supori externi; e) transferul
datelor n buffer.

2.2. Structuri de date


n afara datelor scalare, n aplicaiile practice se utilizeaz colecii de date. ntre elementele
unei colecii de date pot fi identificate sau, eventual, pot fi introduse relaii care s determine pe
mulimea respectiv o anumit structur, adic un mod de ordonare, astfel nct s se faciliteze
prelucrarea. O colecie de date pe care s-a definit un mecanism de selectare a elementelor
(componentelor), constituie o structur de date. Ea este o entitate de sine stttoare,
individualizabil prin nume, ale crei componente i menin proprietile (tipul). Selectarea
componentelor unei structuri se poate realiza folosind identificatorii asociai acestora (accesul prin
nume) sau prin poziia pe care o ocupa n structur, n conformitate cu ordinea specificat.
Dup modul de selectare a componentelor, se disting: structuri cu acces direct, la care o
component poate fi selectat fr a ine seama de celelalte componente; structuri cu acces

Bazele programrii

28

secvenial, la care localizarea unei componente se face printr-un proces de parcurgere a mai multor
componente, conform cu ordinea acestora (traversare).
Dup tipul componentelor, structurile de date pot fi mprite n omogene, cnd
componentele sunt de acelai tip i neomogene, cnd componentele sunt de tipuri diferite.
Componentele unei structuri de date pot s fie date elementare (scalare) sau s fie ele
nsele structuri de date. Dac o structur de date se compune din (sau se poate descompune n)
structuri de acelai tip, se spune c structura respectiv de date este recursiv.
Structurile de date se pot regsi n memoria intern (structuri interne) sau pe un purttor
extern (band magnetic, disc magnetic, dischet etc.), caz n care se numesc structuri externe
(fiiere).
Dac n reprezentarea structurii de date pe suportul de memorie se nregistreaz,
mpreun cu componentele acesteia, i date care materializeaz relaiile de ordonare, se spune c
aceasta este o structur explicit (altfel, este implicit), iar datele suplimentare, de obicei adrese, se
numesc referine sau pointeri. Necesitatea acestor date suplimentare apare n cazul reprezentrii
dispersate a structurilor de date, n care componentele nu ocup zone adiacente pe suportul de
memorare. Reprezentarea componentelor n zone adiacente corespunde structurilor dense. Toate
structurile de date care au aceeai organizare i sunt supuse acelorai operaii formeaz un anumit
tip de structur de date, extinznd noiunea de tip de dat i asupra mulimilor ordonate de date.
n funcie de modul de alocare a zonelor de memorie se disting date de tip static sau
dinamic. Pentru datele de tip static sunt alocate zone de memorie bine definite, n momentul
compilrii. Pentru datele de tip dinamic, zonele de memorie sunt alocate n momentul execuiei, n
funcie de necesiti, fiind posibil chiar eliberarea memoriei ocupate de unele date. Tipul dinamic
corespunde tipului referin (pointer).
Structuri statice de date
Pe lng datele elementare (scalare), fie ele constante sau variabile, frecvent este necesar
introducerea n memoria intern a unor colecii de date ntre elementele crora exist anumite
relaii. Practica programrii a impus, ca structuri de date frecvent utilizate, masivul (tabloul) i
articolul. Aceste structuri i dovedesc utilitatea n aproape toate aplicaiile practice, ceea ce explic
implementarea lor - cu unele diferene i particulariti - n majoritatea limbajelor de programare.

Masivul este o structur de date omogen, cu una, dou sau mai multe dimensiuni.
Pentru masivele uni, bi i tridimensionale se utilizeaz denumirile de vector, matrice, respectiv
plane de matrice. Structura este cu acces direct, referirea unui element fiind realizat printr-o
construcie sintactic numit variabil indexat, format din numele masivului i un numr de
expresii indiciale (indici) corespunznd dimensiunilor acestuia.
Diversele limbaje de programare implementeaz structura de masiv n modaliti diferite.
Limbajul C, care face obiectul acestei lucrri, le implementeaz necontiguu, bazndu-se pe
adresarea prin pointeri.
Articolul este o structur de date eterogen, de tip arborescent (figura 2.2.).
Componentele structurii arborescente, numite cmpuri, sunt individualizate prin nume. Relaia de
ordine ierarhic dintre cmpuri se precizeaz fie prin numere de nivel, fie prin incluziuni de articole
n articole.
Articolul este o structur cu acces direct, adic fiecare cmp (elementar sau grupat) poate fi
referit direct prin numele su, fr a face referiri la celelalte elemente din structura nregistrrii.
Articolul este o structur recursiv, deoarece datele de grup din interiorul ei corespunznd unor

Bazele programrii

29

subarbori, conserv aceleai proprieti ca i structura n ansamblul su. Una din principalele
utilizri ale acestei structuri de date apare n legtur cu fiierele.
Elementele din structura nregistrrii sunt:
cmpuri elementare corespunznd nodurilor terminale de pe fiecare ramur a arborelui (n
exemplul din figura 2.7: MARCA, NUME, ZI, LUNA, AN, OCUPATIE, SECTIE, ATELIER,
ECHIPA);
cmpuri grupate (date de grup), corespunznd nodurilor neterminale (DATA
INCADRARII, LOCMUNCA) i, n ultim instan, chiar rdcinii (PERSOANA).
NIVEL
.1

PERSOANA

MARCA

NUME

ZI

DATA NCADR.

LUNA

AN

OCUPAIE

SECTIE

LOC DE MUNCA

ATELIER

.2

ECHIPA .3

Fig.2.7. Exemplu de articol


Descrierea unei structuri de tip articol se face prin parcurgerea arborelui n preordine, astfel:
se parcurge arborele de sus n jos i de la stnga la dreapta, cu condiia descrierii complete a
fiecrui subarbore.

Structurile dinamice de date


Pentru anumite clase de probleme structurile statice de date nu numai c nu sunt suficiente dar se
dovedesc chiar imposibil de folosit datorit limitrilor la care sunt supuse. n primul rnd, spaiul de
memorie aferent unor astfel de date se definete i se rezerv n momentul compilrii programului (rezervare
static), la o dimensiune maxim (cuprinztoare). Spaiul nu poate fi disponibilizat i nici mprit cu alte
date, chiar dac nu este n ntregime utilizat n anumite momente ale execuiei programului. n al doilea rnd,
componentele structurilor statice ocup locuri prestabilite n spaiul rezervat, determinate de relaia de
ordonare specific fiecrei structuri. n al treilea rnd, limbajele de programare definesc operaiile admise cu
valorile componentelor, potrivit tipului de baz al structurii, astfel nct numrul maxim i ordinea
componentelor structurii nu pot fi modificate.

2.4.1. Grafuri
Un graf (sau un graf neorientat) este o structur G = (V,E), unde V este o mulime nevid
iar E este o submulime (posibil vid) a mulimii perechilor neordonate cu componente distincte
din V. Obiectele mulimii V se numesc vrfuri, iar obiectele mulimii E se numesc muchii. Dac
e=(u,v) E se spune c muchia e are ca extremiti u i v (este determinat de vrfurile u i v).
Graful G=(V,E) este finit dac V este o mulime finit. n continuare vor fi considerate n
exclusivitate grafurile finite, chiar dac acest lucru nu va fi precizat n mod explicit.
Fie grafurile Gi=(Vi,Ei), i=1,2. G2 este un subgraf al grafului G1 dac V2 V1 i
E 2 E 1 . Dac G2 este un subgraf al lui G1, G2 este un graf parial al lui G1 dac V2=V1.
Un graf orientat (digraf) este o structur D=(V,E), unde V este o mulime nevid de
obiecte numite convenional vrfuri, iar E este o mulime (posibil vid) de perechi ordonate cu
componente elemente distincte din V. Convenional, elementele mulimii E sunt numite arce sau
muchii ordonate. Terminologia utilizat relativ la digrafuri este similar celei corespunztoare
grafurilor.

Bazele programrii

30

Se numete graf ponderat o structur (V,E,W), unde G=(V,E) este un graf, iar W o
funcie, W : E (0, ) . Funcia W este numit pondere i asociaz fiecrei muchii a grafului un
cost/ctig al parcurgerii ei.
Fie G=(V,E) un graf, u,vV. Secvena de vrfuri : u0, u1,..,un este un u-v drum dac
u0=u, un=v, uiui+1E pentru i[0,n]. Lungimea drumului, notat l() este egal cu n.
Convenional, se numete drum trivial, un drum cu l()=0.
Cea mai simpl reprezentare a unui graf este cea intuitiv, grafic: fiecare vrf este figurat
printr-un punct, respectiv muchiile sunt reprezentate prin segmente de dreapt orientate (n cazul
digrafurilor) sau nu i etichetate (n cazul grafurilor ponderate) sau nu, avnd ca extremiti
punctele corespunztoare vrfurilor care le determin.
Exemple:
1

1. Fie G = (V, E) un graf cu V = {1, 2,


3, 4, 5}, E = {(1,2),(1,3),(2,5),(3,5)}.
O posibil reprezentare grafic este:

Dei acest mod de reprezentare este foarte comod i sugestiv n special n cazul grafurilor
cu numr mic de vrfuri, pentru prelucrri cu ajutorul calculatorului sunt necesare reprezentri
prin intermediul structurilor de date.
O modalitate de reprezentare este cea prin matrice de adiacen. Dac G=(V,E) este un
graf (sau digraf) cu V = n , atunci matricea de adiacen A Mnxn({0,1}) are componentele

1, dac ( v i , v j ) E
a ij =
, unde vi, vj reprezint cel de-al i-lea, respectiv cel de-al j-lea nod din V.
0, altfel
Se observ c n cazul unui graf neorientat matricea de adiacen este simetric
() i, j = 1, n , a ij = a ji (perechile de vrfuri care caracterizeaz muchiile sunt neordonate, deci dac
uv E, atunci i vu E), n timp ce, n cazul unui digraf, este posibil ca (vi , v j ) E , (v j , vi ) E ,
deci aij aji.
n cazul grafurilor ponderate, reprezentarea matriceal este asemntoare celei prezentate
anterior. Matricea ponderilor unui graf ponderat G=(V,E,W), V = n , WMnxn((0, )) are
componentele:
W(v i , v j ), dac (v i , v j ) E
w i, j =
,
, altfel
unde vi, vj reprezint cel de-al i-lea, respectiv cel de-al j-lea nod din V, =0 dac ponderea are
semnificaia de ctig, respectiv = dac are semnificaia de pierdere, n cazul n care se
dorete reprezentarea costurilor ca ponderi ale grafului.
Una dintre cele mai importante proprieti ale grafurilor o constituie posibilitatea de
accesare, prin intermediul unei secvene de muchii (arce), a oricrui vrf al grafului plecnd
dintr-un vrf dat, proprietate cunoscut sub numele de conexitate sau conexiune.
Fie : u0, u1,..,un un drum n graful G=(V,E). este un drum nchis dac u0=un. n caz
contrar, se numete drum deschis. Drumul este elementar dac oricare dou vrfuri din

Bazele programrii

31

sunt distincte, cu excepia, eventual, a extremitilor. Drumul este proces dac, pentru orice
0 i j n 1 , uiui+1 ujuj+1. Orice drum elementar este un proces.
Exemplu:
3. Pentru graful G, 1: v1, v2, v3, v2,
v5, v3, v4 este un v1-v4 drum care nu
este proces; 2: v1, v2, v5, v1, v3, v4
este un v1-v4 proces care nu este
drum elementar; 3: v1, v3, v4 este un
v1-v4 drum elementar.

v2

G:
v4

v5

v3

v1

Fie : u0,u1,..,un un drum n graful G=(V,E). : v0,v1,..,vm este un subdrum al lui dac
este un drum i pentru orice j, 0 j m , exist i, 0 i n astfel nct ui=vj. Orice drum cu
lungime cel puin 1 conine cel puin un drum elementar cu aceleai extremiti. ntr-adevr, dac
: u0,u1,..,un nu este elementar, atunci exist 0 i < j n i i 0 sau j n astfel nct ui=uj.
u j u j+1 ...u n , dac i = 0
'
este de asemenea un u0-un drum.
Atunci drumul : u 0 u 1 ...u i , dac j = 0
u u ...u u ...u , dac i 0, j n
0 1 i j+1 n
Aplicnd n continuare eliminarea duplicatelor vrfurilor n modul descris, rezult n final un u0un drum elementar.

Exemplu:
v2

4. n graful

v1

v6

v7

v4
v5

v3

v8

v10

v9

dac : v1, v2, v4, v5, v3, v1, v2, v5, v6, v7, v8, v9, v5, v9, v8, v10, atunci 1: v1, v2, v5, v9, v8, v10 , 2: v1, v2, v4,
v5, v9, v8, v10 sunt v1-v10 subdrumuri elementare.

Fie G=(V,E) un graf, V = n . Dac A este matricea de adiacen asociat grafului atunci,
pentru orice p1, a ij( p ) este numrul vi-vj drumurilor distincte de lungime p din graful G, unde

A p = (aij( p ) ) .
Fie Mn({0,1)} mulimea matricelor de dimensiuni nxn, componentele fiind elemente din
mulimea {0,1}. Pe Mn({0,1)}se definesc operaiile binare, notate i , astfel: pentru orice
A=(aij), B=(bij) din Mn({0,1)}, A B=(cij), A B=(dij), unde 1 i, j n , cij=max{aij, bij} i
dij=max{min{aik, bkj}, 1 k n }. Dac A=(aij) Mn({0,1)}, se noteaz { A k = (a (ijk ) ); k 1}
secvena de matrice definit prin:
(1)
k
( k 1)
A = A, A = A A , () k 2 .
Dac A este matricea de adiacen a unui graf G=(V,E), atunci pentru fiecare k,
1 k n 1,
(k)
1, dac exist drum de lungime k de la i la j
.
a ij =
0, altfel

Bazele programrii

32
(1)

( n 1)

( 2)

Matricea M = A A K A se numete matricea existenei drumurilor n graful


G. Semnificaia componentelor matricei M este:
0, dac nu exist un v i v j drum n G
.
()1 i, j n, m ij =
1, altfel

Exemplu:
1

5. Pentru graful:

1
A=
1

1 1 1
1 0

0 0 0
2
0 1
, A =

0 0 1
1 1

0 1 0
1 1

1 1
1 1

1 1
3
1 0
, A =

1 1
1 1

1 1
1 1

1 1
1

1 1
1
, M=

1 1
1

1 1
1

1 1 1

1 1 1
1 1 1

1 1 1

Calculul matricei existenei drumurilor permite verificarea dac un graf dat este conex.
Un graf este conex dac i numai dac toate componentele matricei M sunt egale cu 1.
Fie G=(V,E) un graf netrivial, u,vV i un u-v drum n G. se numete proces dac
toate muchiile drumului sunt distincte. Drumul este trivial dac : u,u. Drumul este un
circuit dac este un proces netrivial nchis. Circuitul : v1,v2,.,vn,v1 cu n3 este un ciclu al
grafului dac, pentru orice i, j, cu 1 i, j n , i j , rezult vivj. Orice ciclu este un drum
elementar nchis. Graful G este aciclic dac nu exist cicluri n G.
ntr-un digraf D noiunile de proces, circuit, ciclu sunt definite ca i n cazul
grafurilor.

Exemple:
6. n graful

1: v1, v2, v3, v6, v5 este un proces;

v1

2: v1, v2, v3, v6, v5, v3, v4, v1 este


un circuit i nu este ciclu;

v2

v4

3: v1, v3, v5, v4, v1 este un ciclu.

v3
v5

v6

2.4.2. Arbori
n clasa grafurilor conexe, structurile cele mai simple, dar care apar cel mai frecvent n
aplicaii sunt cele arborescente. Graful G este arbore dac G este aciclic i conex. Fie G=(V,E)
graf arbore. Subgraful H=(V1,E1) al lui G este un subarbore al lui G dac H este graf arbore.
Exemple:
3
1

Graful

este arbore, deoarece pentru orice pereche


de vrfuri i,j, 1 i,j 6, ij, exist un i-j
drum i graful nu conine cicluri.

Bazele programrii

33

Verificarea proprietii unui graf de a fi arbore poate fi efectuat pe baza unor algoritmi
care s verifice calitile de conexitate i aciclicitate. Aceeai verificare poate fi realizat i pe
baza proprietilor care urmeaz.
Proprietatea 1: Un graf G=(V,E), cu V = n , E = m este graf arbore dac i numai dac G este
aciclic i n=m+1. Cu alte cuvinte, problema verificrii dac un graf este arbore revine la
verificarea aciclicitii grafului i a relaiei existente ntre numrul vrfurilor i numrul
muchiilor grafului.
Proprietatea 2: Un graf G=(V,E), cu V = n , E = m este graf arbore dac i numai dac G este
conex i n=m+1.
Not: Fie G=(V,E) un graf. Urmtoarele afirmaii sunt echivalente:
1. G este graf arbore
2. G este graf conex minimal (oricare ar fi eE, prin eliminarea muchiei e graful
rezultat nu este conex)
3. G este graf aciclic maximal (prin adugarea unei noi muchii n graf rezult cel
puin un ciclu).
Un graf orientat D=(V,E) cu proprietatea c pentru orice u, v V dac uvE, atunci
vu E se numete graf asimetric. Digraful D este simetric dac () u, v V, uvE, dac i numai
dac vuE.
Fie D=(V,E) digraf netrivial. Graful G=(V,E), unde E={uv | uvE sau vuE} se
numete graf suport al digrafului D.
Un arbore orientat este un arbore direcionat cu rdcin. Deoarece un arbore orientat este un caz
particular de digraf, pentru reprezentarea lui poate fi utilizat oricare din modalitile de
reprezentare a grafurilor. n plus exist i posibilitatea obinerii unor reprezentri mai eficiente
pentru acest tip de graf. Una dintre modaliti este reprezentarea FIU-FRATE, care const n
numerotarea convenional a vrfurilor grafului i n reinerea, pentru fiecare vrf i al arborelui, a
urmtoarelor informaii:
FIU(i), care reprezint numrul ataat primului descendent al vrfului i;
FRATE(i), care reprezint numrul ataat vrfului descendent al tatlui vrfului i i care
urmeaz imediat lui i;
INF(i), care reprezint informaia ataat vrfului i (de obicei valoarea i).
Pentru reprezentarea arborelui se reine rdcina i numrul nodurilor. Absena fiului,
respectiv a fratelui unui vrf este marcat printr-o valoare diferit de numerele ataate
vrfurilor (de obicei valoarea 0).
Exemplu:
Urmtorul arbore orientat este reprezentat astfel:
N=15 (numrul de noduri ale arborelui);
R=1(rdcina); FIU=(2,5,7,9,0,10,0,0,13,0,0,0,
0,0,0), fiul lui 1 este 2, iar vrful 9 are fiul
13; FRATE=(0,3,4,0,6,0,8,0,0,11,12,0,14,15, 0),
vrful 1 nu are frate, iar vrful 14 are fratele 15.

2
5

3
6

10

11 12

4
8

9
13

14 15

O parcurgere revine la aplicarea sistematic a unei reguli de vizitare a vrfurilor grafului.


Cele mai uzuale reguli de parcurgere a arborilor orientai sunt prezentate n continuare.
A. Parcurgerea n A-preordine presupune iniial vrful curent ca fiind rdcina arborelui. Se
viziteaz vrful curent i sunt identificai descendenii lui. Se aplic aceeai regul de vizitare
pentru arborii avnd ca rdcini descendenii vrfului curent, arborii fiind vizitai n ordinea dat
de numerele ataate vrfurilor rdcin corespunztoare.

Bazele programrii

34

B. Parcurgerea A-postordine difer de parcurgerea n A-preordine numai prin faptul c rdcina


fiecrui arbore este vizitat dup ce au fost vizitate toate celelalte vrfuri ale arborelui.
Not: Parcurgerile n A-preordine i A-postordine sunt variante de parcurgeri n
adncime, n cazul ambelor metode fiind prioritare vrfurile aflate la distan maxim fa
de rdcina arborelui iniial.
C. Parcurgerea pe niveluri. Un vrf v al unui arbore orientat cu rdcin r se afl pe nivelul i al
arborelui, dac distana de la vrf la rdcin (lungimea r-v drumului) este egal cu i. Rdcina
arborelui este de nivel 0. Parcurgerea pe niveluri a unui arbore orientat const n vizitarea
vrfurilor sale n ordinea cresctoare a distanelor fa de rdcin.
Un arbore binar este un arbore orientat cu proprietatea c orice vrf v are maxim doi
descendeni (od(v)2). n cazul od(v)=2, cei doi descendeni sunt desemnai ca descendent stng
(fiu stnga), respectiv descendent drept (fiu dreapta). Pentru vrfurile cu od(v)=1, unicul
descendent este specificat fie ca fiu stnga, fie ca fiu dreapta.
Se numete nod terminal (frunz) orice vrf v al arborelui cu od(v)=0. Nodul v este
neterminal dac od(v)>0. Reprezentarea unui arbore binar poate fi realizat prin reinerea, pentru
fiecare nod, a legturilor ctre descendenii lui, absena unui descendent putnd fi reprezentat
prin valoarea nul (nil).

identificator nod

legtur fiu stnga

legtur fiu
dreapta

Datorit particularitii lor, arborii binari ofer posibilitatea aplicrii de noi metode de
parcurgere (pe lng cele aplicabile pentru arborii generali): parcurgerile n preordine (RSD),
inordine (SRD) i postordine (SDR). Regula de vizitare pentru aceste tipuri de parcurgere
revine la parcurgerea subarborilor stng i drept corespunztori vrfului curent, care la
momentul iniial este chiar rdcina arborelui. Diferena ntre aceste trei tipuri de parcurgere
este dat de momentul n care devine vizitat fiecare vrf al arborelui. n parcurgerea RSD
(rdcin-subarbore stng-subarbore drept), fiecare vrf al arborelui este vizitat n momentul
n care devine vrf curent. n parcurgerea SRD (subarbore stng-rdcin-subarbore drept),
vizitarea vrfului este efectuat dup ce a fost parcurs subarborele stng. n parcurgerea SDR
(subarbore stng-subarbore drept-rdcin) vizitarea fiecrui vrf este efectuat dup ce au
fost parcuri subarborii afereni lui.

Exemplu:
Pentru arborele de la exemplul anterior, secvenele de vrfuri rezultate prin aplicarea parcurgerilor
RSD, SRD, SDR sunt:
preordine: 1,2,4,7,5,3,6,8,9
inordine: 4,7,2,5,1,8,6,9,3
postordine: 7,4,5,2,8,9,6,3,1.

2.4.3. Liste
Lista este o structur dinamic de date format din mai multe noduri. Un nod este o
structur de date care conine dou pri distincte: o parte de informaie util (memorat n nodul
respectiv) i o parte de informaie de legtur (folosit pentru a identifica n memorie urmtorul
nod din list).

Bazele programrii

35

Grafurile pot fi reprezentate prin intermediul listelor, permind utilizarea economic a


spaiului de memorare i, n anumite cazuri, implementri mai eficiente pentru anumite clase de
algoritmi. Vrfurile grafului se memoreaz ntr-o list, fiecare celul a listei avnd o legtur
ctre lista vecinilor acelui vrf (vrfurile din graf adiacente cu vrful corespunztor acelei celule
i indicat ca informaie util).
n cele ce urmeaz se consider un spaiu oarecare de memorie adresabil. Se noteaz
mulimea referinelor din acest spaiu cu P i se adug la ea o valoare referin special, notat
nil. Se noteaz cu D mulimea informaiilor care vor fi coninute de nodurile unei liste. n aceste
condiii, un nod poate fi desemnat prin perechea (di,pi) cu di D i pi P.
O mulime L a = {(d i , s i ) d i D,s i P} este o list simplu nlnuit (sau asimetric)
dac pe La s-a definit o structur liniar i s1=nil, iar si (i>1) este referin spre succesorul direct
al lui di. Pentru reprezentarea unei liste asimetrice, informaiile de legtur (pointerii) vor fi
marcate prin sgeat, iar nil prin legtur la pmnt (figura 2.8.a).
dn

dn-1

d1

d2

a)

C
dn

dn-1

d2

d1

b)

Fig. 2.8. Liste simplu (a) i dublu (b) nlnuite


O mulime L s = {(p i , d i , s i ) d i D,p i , s i P} este o list dublu nlnuit (sau simetric)
dac pe Ls s-a definit att o structur liniar direct, ct i inversa sa i s1=pn=nil, iar si, i 1 i
pi, i n sunt referine spre succesorii direci n ordinea specific (figura 2.3.b).
n cazul listelor dublu nlnuite, un nod cuprinde dou referine, fiind posibil
cunoaterea att a predecesorului, ct i a succesorului imediat. Se remarc, din definiie, c
nodurile unei liste pot aprea dispersate n spaiul de memorare, iar referinele creeaz
mecanismul care le leag. De aici deriv i atributul de nlnuit, care o deosebete de cazul
particular, denumit list dens. La o list dens nodurile sunt dispuse adiacent n spaiul de
memorare i informaiile de legtur, adic referinele, devin de prisos (ca n cazul vectorilor).
Pentru listele nlnuite, nodurile pot fi plasate n memoria calculatorului n zone diferite,
informaia de legtur din fiecare nod asigurnd regsirea nodului urmtor (pentru liste
asimetrice) respectiv a nodului urmtor i succesor (pentru liste simetrice). Pentru a putea lucra
cu aceste liste este nevoie s se cunoasc o singur informaie: adresa primului nod din list,
numit n continuare capul listei. n acest sens se asociaz listei o referin C, care conine fie
adresa acestui nod, fie nil, dac lista este vid. Spunem c o list este complet identificat dac se
cunoate adresa primului nod al su i structura unui nod.
Asupra unei liste se pot realiza o multitudine de operaii: traversare, cutare nod,
numrare noduri etc. Sunt ns tipice operaiile de inserare (adugare) i tergere de noduri,
deoarece dau nsui caracterul dinamic al acestor structuri. Prin inserri i tergeri o list crete
i descrete n timp (ca numr de noduri), solicitnd spaiu pentru noile componente i

Bazele programrii

36

elibernd spaiul ocupat de componentele terse. Astfel, structura i numrul de noduri ale listei
sufer o permanent schimbare.
1. Traversarea. Localizarea unui nod prin traversare este o operaie de cutare. Scopul este
de a gsi un nod care s conin n partea de informaie util anumite date. Operaia de cutare se
poate ncheia cu succes, adic cu localizarea unui astfel de nod sau fr succes, n cazul n care
lista este vid sau nu exist un nod care conine informaiile cerute.
2. Inserarea. Inserarea unui nod ntr-o list nlnuit se poate realiza cu verificarea
existenei anterioare a nodului n list, caz n care nu se mai face inserarea, sau fr nici un fel de
verificare, caz n care se procedeaz direct la inserare (se permit noduri duplicate). n ambele
cazuri inserarea se poate face n mai multe locuri: la nceputul listei, la sfritul listei, dup sau
naintea unui anumit nod identificat printr-o cheie.
 Inserarea unui nod la nceputul listei. Pentru inserarea ntr-o list simetric este necesar
crearea legturilor ntre noduri n ambele sensuri. Singura diferen fa de inserarea ntr-o list
asimetric este nscrierea informaiei despre nodul precedent. Deoarece inserarea are loc la
nceputul listei, nu va exista un nod precedent, deci informaia respectiv va primi valoarea nil.
Primul nod din lista iniial va avea acum ca precedent nodul nou creat p (figura 2.9). Se observ
c ntotdeauna se modific capul listei, nodul inserat devenind noul cap al listei.
cap

2
a)

1
p
cap

b)

1
p

Fig. 2.9. Inserarea la nceputul listelor asimetrice (a) i simetrice (b)


 Inserarea unui nod la sfritul listei. Pentru adugarea unui nod la sfritul listei se
creeaz nti un nod nou cu informaia util care trebuie inserat. Deoarece va fi ultimul nod n
list, nu exist un nod urmtor deci informaia de legtur spre nodul urmtor va avea valoarea
nil.
Dac lista este vid atunci capul listei ia ca valoare adresa noului nod creat (va fi singurul
nod din list). n caz contrar trebuie parcurs lista pentru a ajunge la ultimul nod, informaia de
legtur din acesta primind ca valoare adresa noului nod creat. n cazul unei liste simetrice
trebuie creat i legtura n sens invers (figura 2.10).

Bazele programrii

37
cap

a)
p
cap

b)
p

Fig. 2.10. Inserarea la sfritul listelor asimetrice (a) i simetrice (b)


 Inserarea dup un anumit nod al listei. Prima operaie necesar inserrii este localizarea
nodului dup care se face inserarea. Acesta poate fi localizat n mai multe feluri: n mod exact,
prin furnizarea unei chei a crei valoare trebuie s se regseasc n informaia util a nodului
cutat, sau relativ, prin stabilirea unei condiii care trebuie s fie ndeplinit de nod. n continuare
vom considera cazul cutrii dup cheie. Dac nu se gsete nici un nod care s corespund
criteriului de cutare (cazul cutrii cu eec) sunt posibile mai multe decizii: nu se insereaz noul
nod, se insereaz la nceputul listei sau se insereaz la sfritul listei. Inserarea nseamn
ruperea unei legturi ntre dou noduri i crearea unor noi legturi astfel ca noul nod s se
interpun n list ntre cele dou noduri a cror legtur a fost rupt, conform figurii 2.11.
p

r
2

3
q

q
a)

b)

Fig. 2.11. Inserare n list asimetric (a) i simetric (b)


3. tergerea. La fel ca i inserarea, tergerea se realizeaz mai eficient i mai uor din punct
de vedere algoritmic dac ea privete nodul cap de list, deoarece se reduce, n principiu, la
actualizarea referinei de cap. Dac trebuie ters un nod interior listei, atunci tergerea propriuzis trebuie precedat de o cutare dup coninutul informaional al nodurilor. Dac listele simplu
nlnuite pot fi traversate ntr-un singur sens, n momentul n care s-a localizat nodul p de ters
nu se mai cunoate precedentul su q care, pentru eliminarea nodului p, trebuie s fie legat de
succesorul acestuia (figura 2.12.a). Datorit acestei situaii, este necesar introducerea unei
referine suplimentare q care, n procesul de traversare, s fie n urma lui p cu un nod. De aceea,
p se numete referin de urmrire. Iniial, cnd p=nil, se atribuie aceeai valoare lui q. Se
precede atribuirea de valoare pentru p care schimb nodul curent, de atribuirea q=p.

Bazele programrii

38
1
q
p

a) Liste asimetrice
2

1
b) Liste simetrice

Fig. 2.12. tergere n liste nlnuite


2.4.4. Stive i cozi
Stivele i cozile sunt liste particulare din punctul de vedere al operaiilor de tergere i
inserare ale nodurilor din list.
 Stiva (stack) este o list asimetric (figura 2.13.a) la care operaiile de inserare, tergere
i citire a informaiilor se fac numai n capul listei (top). Stivele se mai numesc i liste LIFO
(Last-In-First-Out - ultimul intrat, primul ieit), avnd n vedere c orice acces se poate face
numai la ultimul nod inserat. Acesta poate fi citit, ters sau n faa lui se poate insera un nou nod
care devine cap de stiv. Un astfel de comportament este bine sugerat de modul n care se gareaz
i se scot vagoanele ntr-o linie moart (nchis) sau de modul n care se pot stivui i utiliza
scndurile ntr-un depozit etc. Stiva este o structur frecvent folosit n gestionarea dinamic a
spaiului de memorie i reprezint un mecanism curent n procesul transferului de parametri ntre
un apelator i un subprogram etc.
 Coada (queue) este o list asimetric la care operaia de inserare se face la un capt,
denumit spatele cozii, iar tergerea i citirea se fac de la cellalt capt, denumit faa cozii (figura
2.13.b). Coada este denumit i list FIFO (First-In-First-Out - primul intrat, primul ieit) avnd
n vedere c numai nodul din fa poate fi citit sau ters, adic primul nod al listei.
Comportamentul unei astfel de structuri este de fapt un model abstract al cozilor ntlnite n
diferite situaii: cozi de persoane, cozi de automobile etc.
inserare
citire
tergere

dn

dn-1

a)
stiva

FA
citire
tergere

dn
F

d1

d2

dn-1

d2

b)
coad

SPATE
d1

inserare

Fig. 2.13. Stiv i coad


n timp ce pentru a trata corect o stiv este suficient o referin spre top, pentru coad
trebuie meninute dou referine: una pentru faa (f) i alta pentru spatele cozii (s). O coad este
vid atunci cnd f=s=nil.

Bazele programrii

39

Teste de autoevaluare

4. Structura de date se definete ca: a) o colecie de date pe care s-a definit un


mecanism de selectare a componentelor; b) o colecie de date la care o
component este independent de celelalte; c) o colecie de date compus din
subcolecii de acelai tip; d) o colecie de date compus din subcolecii de tipuri
diferite; e) o colecie recursiv de date.
5. Masivul este o structur: a) recursiv; b) omogen cu acces secvenial; c) omogen
cu acces direct; d) eterogen cu acces secvenial; e) eterogen cu acces direct.
6. Articolul este o structur: a) dinamic; b) omogen cu acces secvenial; c) omogen
cu acces direct; d) eterogen cu acces secvenial; e) eterogen cu acces direct.
7. Stiva este o list la care: a) inserarea i tergerea se fac la capul listei i citirea se
face la baza listei; b) inserarea, tergerea i citirea se fac la capul listei; c)
inserarea, tergerea i citirea se fac la baza listei; d) inserarea se face la capul
listei, iar tergerea i citirea se fac la baza listei; e) inserarea i tergerea se fac la
baza listei i citirea se face la capul listei.

Rspunsuri i comentarii la testele de autoevaluare


1:c); 2:d); 3:d); 4:a); 5:c); 6:e); 7:b).

Rezumat
n cadrul acestei uniti de nvare au fost studiate urmtoarele aspecte n ceea ce privete datele
i structurile de date:
cunotine teoretice privind conceptele de informaie, dat, cunotin;
modaliti de reprezentare intern a datelor;
structuri statice i dinamice de date.
Dup ncheierea acestei uniti de nvare, studenii au cunotine i abiliti de reprezentare a
datelor i a structurilor de date.

Bibliografia unitii de nvare


1. I. Gh. Roca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, M. Mircea, L. Btgan, C. Silvestru,
Bazele programrii calculatoarelor. Teorie i aplicaii n C, Ed. ASE, Bucureti, 2006, ISBN 973-594-5916
2. I. Gh. Roca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, Programarea calculatoarelor. tiina
nvrii unui limbaj de programare, Teorie i aplicaii, Ed. ASE, 2003

Bazele programrii

40

3. Etapele rezolvrii problemelor cu calculatorul


Cuprins
Obiectivele unitii de nvare 3
3.1. Caracteristici generale ale PPAD
3.2. Fazele dezvoltrii programelor
Rspunsuri i comentarii la testele de autoevaluare
Bibliografia unitii de nvare

Obiectivele unitii de nvare 3


Dupa studiul acestei unitati de nvatare, studenii vor avea cunotine teoretice i abiliti practice
despre:
caracteristici generale ale PPAD;
organizarea procesului de rezolvare a PPAD;
fazele dezvoltrii programelor.

Durata medie a unitii de studiu individual - 2 ore

3.1. Caracteristici generale ale PPAD


Probleme de prelucrare automat a datelor (PPAD) este o denumire generic pentru
aplicaiile practice ale informaticii n economie sau n alte domenii de activitate. Avnd n vedere
marea diversitate a PPAD, n cele ce urmeaz se propune o structurare pe clase a acestora i se
analizeaz tipurile de soluii ntre care se poate alege n procesul de informatizare. Aplicaiile
informatice acoper un evantai foarte larg de situaii, ale crui extreme pot fi caracterizate astfel:
a) existena unui volum relativ redus de date de intrare i de ieire, dublat de calcule
laborioase (aplicaii tehnico-inginereti, care conduc la soluii bazate pe aproximri succesive,
exprimate matematic prin ecuaii algebrice i transcendente, sisteme de ecuaii liniare, ecuaii
difereniale, integrale, adic, ntr-o formulare global, aplicaii bazate pe metode de calcul
numeric);
b) existena unui volum mare de date de intrare i de ieire, asociat uzual cu calcule de
complexitate redus (evidena materialelor, evidena personalului i calculul salariilor, evidena
mijloacelor fixe, urmrirea realizrii produciei, a contractelor de aprovizionare/desfacere etc.,
adic, n general, aplicaii de gestiune economic).
ntre aceste extreme exist, evident, o diversitate de aplicaii, dintre care unele presupun
att volume mari de date, ct i modele economico-matematice bazate pe calcule laborioase:
gestiunea stocurilor, programarea produciei, probleme de transport, croire, alocare a resurselor
etc. n contextul prezentului capitol se consider suficient i relevant doar investigarea
caracteristicilor celor dou mari clase de aplicaii evideniate, realizat succint n cele ce urmeaz.
PPAD din categoria a) permit, n general, soluii simple de organizare a datelor care,
frecvent, se reduc la preluarea integral n memoria intern a calculatorului, cu constituirea lor n

Bazele programrii

41

structuri de tip masiv (vectori, matrice, plane de matrice etc.). n cazul unor volume mai mari de
date se poate folosi i memoria extern, vzut ca o prelungire a celei interne, cu organizarea
datelor n fiiere (uzual, fiiere relative). n majoritatea cazurilor, chiar cnd datele sunt
organizate n fiiere, nu se ajunge la pstrarea lor pe perioade mari de timp, adic nu apare
necesitatea actualizrii datelor (adugri, modificri, tergeri). Singura problem n accesul la
datele organizate n fiiere o reprezint trecerea de la memorarea liniar a elementelor n fiier, la
caracterul lor de elemente ale unor masive (tablouri) cu dou sau mai multe dimensiuni.
Pe exemplul matricelor, alegnd liniarizarea pe linii (ordinea lexicografic), n cazul unei
matrice Amxn, poziia n fiierul relativ a unui element ai,j poate fi determinat printr-un calcul
simplu, folosind funcia rang r(i,j)=n(i-1)+j, i m, jn. Aceast tehnic se poate folosi la
memorarea datelor n fiier (crearea i popularea fiierului), permind chiar furnizarea
elementelor ntr-o ordine oarecare, cu condiia precizrii coordonatelor. La regsirea elementelor
masivului (consultarea fiierului), pornind de la poziia n fiier, pot fi determinate coordonatele
elementului, astfel:
- dac r modulo j = 0,
atunci i=[r/n] i j=n;
- dac r modulo j <> 0,
atunci i=[r/n]+1 i j=r modulo n.
n concluzie, la aceast clas de PPAD atenia principal se deplaseaz ctre algoritmul
de calcul, bazat, uzual, pe aproximri succesive, ce pot conduce la apariia unor tipuri specifice
de erori (erori de trunchiere i erori de rotunjire), care uneori se compenseaz, dar frecvent se
cumuleaz (se propag) pe parcursul prelucrrii, afectnd corectitudinea rezultatului final.
Datorit volumelor mari de date, la problemele din categoria b) accentul principal cade
pe organizarea i ntreinerea coleciilor de date memorate pe purttori externi. La limit, se poate
alege ntre dou soluii: organizarea datelor n fiiere (secveniale, relative sau indexate) sau
organizarea datelor n baze de date (cu structuri ierarhice, de tip reea sau relaionale).
Indiferent de nivelul de organizare ales, tehnologia de prelucrare conduce la lanuri
(sisteme) de programe, n general de dou tipuri: programe de creare i actualizare (ntreinere) a
coleciilor de date; programe de consultare (interogare), pentru satisfacerea cererilor de
informare. n algoritmi, principalele tipuri de operaii sunt cele de prelucrare a coleciilor de date
organizate pe purttori externi: citire, scriere, rescriere, tergere, precum i cele de verificare a
corectitudinii datelor (operaii de validare). Complexitatea calculelor este redus, adesea
nedepind nivelul celor patru operaii aritmetice.
n general, n rezolvarea PPAD se poate distinge ntre urmtoarele variante de soluii:
soluii proprii; utilizarea pachetelor de programe aplicative; soluii mixte. Alegerea ntre cele trei
variante depinde de mai muli factori, dintre care o importan aparte are aria (dimensiunile)
problemei: un domeniu de activitate strict delimitat (aplicaie informatic), respectiv ansamblul
activitilor unui organism economico-social (sistem informatic).
n general, soluiile proprii sunt posibile pentru orice PPAD. Din perspectiva costurilor
implicate de diversele faze ale realizrii unei soluii informatice, aceast variant este, frecvent,
cea mai neeconomic. Totui, adesea aceasta este singura variant accesibil, dup cum se poate
constata i din prezentarea urmtoarelor cazuri:
- la nivel de aplicaie informatic, atunci cnd domeniul de activitate are o serie de
particulariti care nu permit utilizarea unor eventuale pachete de programe aplicative i, evident,
cnd nu exist asemenea pachete de programe pentru domeniul respectiv;
- la nivel de sistem informatic, datorit marii diversiti a organismelor economicosociale, atunci cnd nu se poate pune problema unor soluii tip, cu posibilitatea ca unele
subsisteme (aplicaii) s fie realizate prin soluii mixte.
Utilizarea unor pachete de programe aplicative este posibil pentru activitile cu un
anumit grad de generalitate, care se regsesc n forme identice (sau cu diferene nesemnificative)

Bazele programrii

42

la mai multe organisme economico-sociale. Printre acestea pot fi menionate aplicaiile bazate pe
modele de programare liniar, gestiunea stocurilor, optimizarea transporturilor, optimizarea
croirii, gestiunea financiar-contabil etc.
Adoptarea unei asemenea soluii elimin costurile de proiectare i realizare a aplicaiilor
(sistemelor) informatice, dar poate conduce la unele necesiti de adaptare a sistemului
informaional propriu, n funcie de datele de intrare i modul de organizare a acestora, impuse
pachetelor de programe. Pe un plan mai general, n aceast categorie pot fi incluse i produse
care, fr a furniza direct soluii, simplific substanial efortul de realizare a lor, pentru domenii
specifice. De exemplu, pentru prelucrri de serii de date statistice, ca i pentru orice alte date ce
se organizeaz n tabele, pot fi utilizate produsele din categoria spread-sheet (foaie de calcul),
cum este EXCEL.
Soluiile mixte presupun ncadrarea n soluii proprii a unor pachete de programe
aplicative, destinate unora dintre aplicaiile unui sistem informatic. Aceast variant reduce, de
asemenea, costurile de realizare, dar necesit elaborarea unor interfee ntre intrrile/ieirile
pachetelor de programe i celelalte componente ale sistemului(aplicaiei) pentru care se
elaboreaz soluii proprii.
Realizarea sistemelor (aplicaiilor) informatice este un proces complex, structurat n mai
multe etape, cu obiective specifice. n modul de realizare a acestor etape, n resursele implicate i
n durata lor total vor exista o serie de diferene, impuse, pe de o parte, de varianta de soluie
aleas i, pe de alt parte, de nivelul de abordare (aplicaie, sistem informatic). Cu aceste
observaii, ntr-o abordare schematic, redus la enumerarea i prezentarea obiectivelor
principale, etapele de realizare a sistemelor informatice sunt urmtoarele:
studiul i analiza sistemului informaional actual, care are ca obiectiv principal
formularea cerinelor i a restriciilor pentru sistemul informatic (caietul de sarcini);
proiectarea de ansamblu, care presupune elaborarea modelului de ansamblu al
sistemului informatic i planificarea realizrii sale pe pri componente (subsisteme, aplicaii);
proiectarea de detaliu, care are ca obiective elaborarea modelului de detaliu al
sistemului informatic i stabilirea soluiilor tehnice de realizare (corespunztor, se face distincie
ntre proiectarea logic de detaliu i proiectarea fizic de detaliu);
elaborarea programelor, n care se realizeaz, conform prioritilor stabilite n etapa
anterioar i pe baza documentaiilor reunite n proiectul logic de detaliu i proiectul tehnic de
detaliu, programele incluse n fluxurile tehnologice specifice diverselor tipuri de prelucrri;
implementarea i exploatarea sistemului, care presupune darea n funciune a
sistemului i utilizarea curent a acestuia.
Pe baza diferenierilor evideniate, n cele ce urmeaz se abordeaz numai cazul unor
aplicaii informatice de mai mic amploare, pentru care se menine n continuare denumirea de
PPAD.

Organizarea procesului de rezolvare a PPAD


Dup complexitatea problemelor abordate n vederea rezolvrii cu calculatorul electronic,
din perspectiva programelor ce vor fi elaborate, soluiile proprii pot conduce la una din
urmtoarele situaii: sisteme de programe realizate la nivelul unor aplicaii informatice, abordate
independent sau ca parte a unor sisteme informatice; unul sau cteva programe, n cazul unor
probleme de amploare redus.
n primul caz, realizarea programelor este doar una dintre etapele procesului de studiu,
analiz, proiectare i implementare a sistemelor sau aplicaiilor informatice. Depinznd de tipul
aplicaiei, acurateea i generalitatea abordrii, este posibil ca soluiile de acest tip s evolueze
ctre realizarea unor pachete de programe aplicative. n al doilea caz, se ajunge frecvent la

Bazele programrii

43

realizarea tuturor etapelor, de la punerea problemei pn la rezolvarea ei, de ctre o singur


persoan. n general, pot fi abordate n aceast variant unele probleme tehnico-tiinifice, care
nu conduc la cerine deosebite privind volumul i organizarea datelor i sunt, uzual, probleme
relativ independente.
Exist, de asemenea, unele probleme economico-sociale sau administrative n care,
datorit numrului mic de informaii utilizate, modificrilor reduse, precum i cerinelor simple
de prelucrare s nu fie necesare soluii complexe, bazate pe realizarea unor sisteme de programe.
Etapele de rezolvare a PPAD sunt:
Formularea problemei. n aceast etap se precizeaz rezultatele care trebuie s se
obin i forma lor de prezentare, datele de intrare i modul lor de organizare, precum i
transformrile i prelucrrile care se aplic asupra datelor de intrare pentru a se obine rezultatele.
Formularea clar, corect i complet a problemei reprezint o cerin important pentru
finalizarea cu bune rezultate a activitii de proiectare i realizare a programelor. n cazul
aplicaiilor de mai mari dimensiuni, a cror rezolvare se abordeaz de ctre o echip de analizproiectare-programare, formularea problemei poate fi primit de programator de la analistulproiectant, sub forma unor specificaii de problem.
Formalizarea matematic i alegerea metodei numerice. n aceast etap se exprim
matematic toate transformrile i prelucrrile la care sunt supuse datele de intrare pentru a se
obine rezultatele, se pun n eviden condiiile iniiale i restriciile referitoare la soluie. La
alegerea metodei numerice de rezolvare trebuie analizate cu atenie stabilitatea i convergena
metodei, tipul, mrimea i propagarea erorilor, precizia rezultatelor. De asemenea, este necesar s
se estimeze necesarul de memorie, timpul de prelucrare, deoarece unele dintre metode nu pot fi
aplicate tocmai datorit solicitrii acestor resurse peste limitele admisibile. Se recomand ca n
etapa formalizrii matematice s se stabileasc i ordinea de efectuare a prelucrrilor, s se rein
informaiile care sunt necesare urmtoarei etape (variaia indicilor, momentul introducerii sau
extragerii datelor, iniializarea variabilelor i masivelor etc.). Este necesar precizarea c aceast
etap este cu deosebire important n cazul problemelor tehnico-inginereti sau economice bazate
pe folosirea modelelor matematice.
Elaborarea (proiectarea) algoritmilor. Este o etap complex care presupune analiza
riguroas a problemei i a formalizrii ei matematice. Una dintre metodele uzuale de elaborare a
algoritmilor este proiectarea structurat, ale crei reguli se vor aplica, de asemenea, n faza de
scriere a programelor. Uzual, aceast etap se ncheie cu reprezentarea algoritmului ntr-o
anumit form (schem logic structurat, pseudocod etc.), simplificnd substanial eforturile
depuse n etapele de scriere, testare i definitivare a programelor. n acelai sens, este foarte
important faza testrii algoritmilor.
Stabilirea resurselor. Pe baza analizei algoritmilor se precizeaz, pentru ntregul
algoritm i pe module, echipamentele periferice necesare, n ce limbaj urmeaz s fie scris fiecare
modul, care sunt seturile de date ce vor fi folosite la testare, se aproximeaz necesarul de
memorie intern, se stabilete dac este necesar segmentarea programului pentru reacoperire etc.
Scrierea programelor. Pe baza algoritmului elaborat se realizeaz codificarea
modulelor, eventual n paralel dac se lucreaz n echip. Scrierea programului trebuie s se fac
respectnd strict algoritmul (eventual se pot face modificri i detalieri ale acestuia) urmrinduse, n acelai timp, optimizarea utilizrii resurselor calculatorului (timp unitate central, memorie
intern i echipamente periferice). n cazul programelor interactive este necesar realizarea unor
interfee prietenoase, care s lanseze solicitri clare, precise i complete.
Testarea i definitivarea programelor. Programul scris ntr-un limbaj surs va fi
compilat i consolidat. n procesul compilrii programele sunt testate sintactic, iar n procesul
consolidrii (editrii de legturi) se valideaz utilizarea resursei memorie, modul n care au fost

Bazele programrii

44

apelate, implicit sau explicit, procedurile utilizatorului sau ale sistemului, modul n care au fost
concepute operaiile de intrare/ieire sau, n general, cum au fost gestionate resursele de
intrare/ieire etc.
Dup parcurgerea acestor faze programul se testeaz n execuie, pe baza unor seturi
stabilite de date de control. n aceast faz programul se consider corect dac rezultatele
obinute sunt cele scontate (pentru datele de test, programatorii trebuie s determine dinainte
rezultatele - valorile i forma lor de prezentare). Se mai face meniunea c, ntr-un lan de
programe dintr-un sistem, trebuie testat ntreg lanul, n intercorelrile lui interne. Programele
considerate corecte se memoreaz pe medii magnetice, eventual constituite n biblioteci.
Definitivarea documentaiei programelor. Dei mai puin spectaculoas, chiar
birocratic, aceast etap este obligatorie pentru exploatarea, dezvoltarea i adaptarea
programelor, mai ales dac fac parte dintr-un sistem. Documentarea corect a programului face
posibil, de asemenea, folosirea lui de ctre ali utilizatori. S-a artat c, pe msura desfurrii
precedentelor etape, s-au realizat unele documente necesare exploatrii corecte a programelor.
Acestea se completeaz, redacteaz i ordoneaz, constituindu-se ntr-un dosar de prezentare i
exploatare, care cuprinde:
descrierea problemei (rezultate, date de intrare, procesul de prelucrare, formalizarea
matematic i modelul matematic, precizia algoritmului etc.);
descrierea resurselor necesare i a restriciilor de utilizare;
organigrama modulelor;
schemele logice structurate (sau alte forme de reprezentare a algoritmului) pentru
fiecare modul;
modul de apel al procedurilor i funciilor i structura datelor i parametrilor care se
transfer ntre apelator i apelat;instruciuni de utilizare (procedura de punere n lucru, lista i
forma ntrebrilor i rspunsurilor n conversaia cu utilizatorii, lista programelor care trebuie
executate n amonte etc.);
exemple de utilizare.
Exploatarea curent. Dup punerea la punct, programele intr n utilizare, fiind
urmrite n vederea depistrii unor erori care nu au putut fi sesizate anterior. Aceast faz asigur
meninerea n funciune i dezvoltarea programelor, proces care se poate continua pe tot parcursul
utilizrii lor.

Test de autoevaluare

1. ntr-o abordare schematic, enumerai etapele de realizare a sistemelor informatice.

3.2. Fazele dezvoltrii programelor


Utilizarea calculatoarelor necesit elaborarea programelor pe baza crora se obin
rezultate dorite, prin aplicarea unui algoritm asupra datelor de intrare. Un program reprezint o
mulime ordonat de instruciuni, asociat unui algoritm de rezolvare a problemei, care comand
operaiile de prelucrare a datelor. Instruciunea reprezint exprimarea ntr-o form riguroas conform regulilor de sintax ale unui limbaj artificial (limbaj de programare) a unei operaii i
precizeaz funcia i adresele operanzilor. Prin limbaj de programare se nelege o mulime de

Bazele programrii

45

cuvinte (dicionar) mpreun cu regulile de utilizare a lor (gramatic). Regulile de utilizare sunt
de sintax (form) i de semantic (sens).
Editare

Program surs

Compilare
Program
asamblare

Listing
surs
Program obiect

Biblioteci
utilizator

Harta alocrii
memoriei

Link-editare

Biblioteci
standard

Program obiect
executabil

Lansare
n execuie

Fig. 3.1. Etapele dezvoltrii unui program


Unitatea central a unui calculator recunoate un singur limbaj, numit limbaj main (sau
limbaj cod obiect executabil). Scrierea programelor ntr-un astfel de limbaj este greoaie i
ineficient. El este apropiat de main, necesit coduri numerice pentru operaii i adrese absolute
pentru operanzi.
n practic, utilizatorii folosesc limbaje evoluate (universale, algoritmice) apropiate de
factorul uman, cum ar fi FORTRAN, COBOL, BASIC, C, PASCAL etc. Programele scrise ntrun astfel de limbaj se numesc programe surs, care din punct de vedere al utilizatorului sunt
fiiere de tip text, create prin editare specific limbajului sau de utilizare general. Transformarea
programelor surs n programe obiect executabile se realizeaz, de obicei, n mai multe faze
(figura 3.1).
Compilarea este operaia de traducere a programului surs n program cod obiect. Ea este
realizat de componenta software numit compilator. Lucrul cu un anumit limbaj evoluat
presupune existena compilatorului pentru acel limbaj. n funcie de posibilitile compilatorului,
n urma compilrii se mai pot obine fiierul cu listingul programului surs i fiierul cu
programul surs tradus n limbaj de asamblare. Unele limbaje, printre care i C, impun ca
programele s fie supuse unei prelucrri anterioare, numit preprocesare.
Editarea de legturi (link-editarea) este operaia de transformare a programului cod
obiect, rezultat din compilare n program cod obiect executabil. Ea este realizat de componenta
software numit link-editor. Link-editorul ncorporeaz n programul obiect att module

Bazele programrii

46

executabile din biblioteca specific limbajului, invocate (apelate) implicit sau explicit de
programul surs al utilizatorului, ct i module executabile din bibliotecile realizate de utilizator.
Programul obiect executabil se lanseaz n execuie cu comenzi ale sistemului de operare.

Test de autoevaluare

2. Fazele dezvoltrii programelor sunt: 1) editare; 2) verificare sintax; 3) compilare; 4)


editare legturi; 5) lansare n execuie; 6) testare. a) toate; b) 1,2,3,4 i 5; c) 1,3,4,5 i 6; d)
1,2,3 i 4; e) 1,3,4 i 5.

Rspunsuri i comentarii la testele de autoevaluare


1. ntr-o abordare schematic, etapele de realizare a sistemelor informatice sunt
urmtoarele:
studiul i analiza sistemului informaional actual;
proiectarea de ansamblu;
proiectarea de detaliu;
elaborarea programelor;
implementarea i exploatarea sistemului.
2:e).

Rezumat
n cadrul acestei uniti de nvare au fost studiate urmtoarele aspecte n ceea ce privete datele
i structurile de date:
caracteristici generale ale PPAD;
organizarea procesului de rezolvare a PPAD;
fazele dezvoltrii programelor.
Dup ncheierea acestei uniti de nvare, studenii au cunotine i abiliti de organizare a
procesului de rezolvare a problemelor i a etapelor de dezvoltare a programelor.

Bibliografia unitii de nvare


1. I. Gh. Roca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, M. Mircea, L. Btgan, C. Silvestru,
Bazele programrii calculatoarelor. Teorie i aplicaii n C, Ed. ASE, Bucureti, 2006, ISBN 973-594-5916

Bazele programrii

47

4. Caracteristicile limbajului C
Cuprins
Obiectivele unitii de nvare 4
4.1 Elementele de baz ale limbajului C
4.2 Tipurile de date n C
4.3 Expresii
4.4. Realizarea structurilor fundamentale de control
Rspunsuri i comentarii la testele de autoevaluare
Bibliografia unitii de nvare

Obiectivele unitii de nvare 4


Dup studiul acestei unitati de nvatare, studenii vor avea cunotine teoretice i abiliti practice
despre:
elementele de baz ale limbajului C;
tipuri de date n C;
expresii;
realizarea structurilor fundamentale de control.

Durata medie a unitii de studiu individual - 10 ore

4.1 Elementele de baz ale limbajului C


Principalele construcii sintactice ale limbajului C, ntr-o ordine relativ a procesului de
agregare sunt:
- identificatorii, care sunt denumirile (adresele simbolice) pe baza crora sunt referite n
program datele, tipurile, funciile, fiierele etc.;
- comentariile, care sunt texte prezente n programul surs, dar ignorate de compilator;
- expresiile, care sunt construcii formate din operanzi (date numerice, logice, de tip caracter
etc.) i operatori (aritmetici, relaionali, logici etc.) i a cror evaluare produce o valoare de un
anumit tip;
- declaraiile, care sunt construcii pentru definirea i descrierea datelor (constante i/sau
variabile, date scalare i/sau structuri de date etc.);
- instruciunile, pentru descrierea aciunilor realizate asupra datelor;
- funciile, care pe baza unor date de intrare furnizeaz unul sau mai multe rezultate de
ieire;
- programul, reprezentnd construcia sintactic de cel mai nalt nivel, care poate face
obiectul prelucrrii i execuiei de un sistem de calcul.

Bazele programrii

48

Identificatorii sunt denumiri asociate entitilor referite n program. Ele sunt


succesiuni de litere (mici i/sau mari, din alfabetul latin), cifre zecimale (de la 0 la 9) i _
(liniua de subliniere). Primul caracter trebuie s fie o liter sau liniua de subliniere. Nu se
recomand ns ca primul caracter s fie _ pentru a nu se face confuzii nedorite cu
identificatorii rezervai folosii de diferite compilatoare. Literele mari nu sunt identice cu cele
mici (C face parte din categoria limbajelor case sensitive).
Exemple:
a, x, X, abc, Abc, x1, x_1, alfa, pret_unitar, student, _, _a, ____.
CodProdus nu are aceeai semnificaie cu codprodus.

La scrierea identificatorilor se utilizeaz frecvent literele mici, dar pentru denumirile


compuse se recomand ca fiecare cuvnt s nceap cu liter mare, pentru creterea lizibilitii
programului surs.

Exemple:
PretUnitar, MatrUnitate, SumaElemVector,MedAritmPond.

Lungimea unui identificator variaz de la un singur caracter pn la oricte, dar se iau n


considerare numai primele 32. Dac doi identificatori au primele 32 de caractere identice, atunci
ei vor fi considerai identici de compilator. Unele compilatoare permit modificarea acestei limite
de lungime.
Anumii identificatori sunt predefinii n limbaj, au destinaie impus i nu pot fi utilizai
n alte moduri sau scop dect cele pentru care au fost definii. Acetia sunt numii cuvinte
rezervate (sau cuvinte cheie) i vor fi introduse pe msur ce sunt prezentate construciile
sintactice ale limbajului.

Exemple:
for, do, if, else, char, long, float, while, return etc.
const, enum, signed, void etc. (din ANSI C);
_AL, _AX, _DX, _BX, _FLAGS (din Turbo C).

(din K&R C);

Comentariile sunt secvene de text compuse din orice caractere admise n setul
limbajului, care au format liber i care nu se compileaz. n general, comentariile sunt necesare
pentru explicaii suplimentare ale programatorului, n vederea nelegerii ulterioare a logicii sale.
Comentariile sunt delimitate de perechile de caractere /* i */ i se pot ntinde pe mai multe linii
surs.
Orice caracter aflat ntre delimitatori este ignorat de compilator. Nu se admit comentarii
imbricate (incluse unul n altul). La compilatoarele C++ a fost adugat posibilitatea de a scrie
comentarii pe o singur linie surs. nceputul unui astfel de comentariu este marcat de perechea //
iar sfritul su este marcat de sfritul liniei (nu exist marcator special). Orice caracter aflat
dup // este ignorat, pn la trecerea pe o nou linie surs.
Instruciunile sunt construcii sintactice ale limbajului, terminate de caracterul ;
(punct i virgul). Ele indic operaiile (aciunile) care se aplic datelor n vederea obinerii
rezultatelor scontate prin algoritm. Instruciunile pot fi clasificate n: simple, structurate,
compuse.
Funciile sunt entiti (subprograme) care pot fi proiectate i realizate independent,
dar care nu se execut dect mpreun cu o alt entitate de program, numit apelatoare. Conceptul
a fost definit de realizatorii limbajului Fortran i s-a impus n practica programrii din

Bazele programrii

49

urmtoarele motive: evitarea scrierii repetate n program a unor secvene de instruciuni aplicate
de mai multe ori pe seturi diferite de date; creterea eficienei activitii de programare prin
crearea unor biblioteci de subprograme des utilizate, care pentru fiecare din aplicaiile concrete
doar se apeleaz, fr s fie proiectate i realizate de fiecare dat; necesitatea modularizrii
problemelor cu grad nalt de complexitate.
Funcia are un nume i un tip. Ea se definete printr-un antet i un corp (bloc) astfel:
antet
{
corp
}

Antetul are forma:


tip nume(lista_parametrilor_formali)

unde:
tip poate fi un tip simplu de dat. Dac lipsete, este considerat tipul implicit (int pentru
unele compilatoare, void pentru altele);
nume este un identificator care reprezint numele funciei;
lista-parametrilor-formali conine parametrii formali sub forma:
[tip1 identificator1[,tip2 identificator[,tip3 identificator ]]]

Parametrii sunt separai prin virgul. La limit, lista poate fi vid. Pentru fiecare
parametru trebuie specificat tipul, chiar dac mai muli parametri snt de acelai tip.
Funciile returneaz o valoare prin nume, dar pot returna valori i prin parametri. Unele
funcii (de exemplu, cele care citesc sau scriu date) execut servicii i apoi returneaz, prin
nume, valori care pot sau nu s fie utilizate n apelator. Funciilor care nu trebuie s ntoarc
valori prin nume li se poate asocia tipul void (care, la unele compilatoare, este implicit).
Corpul este o instruciune compus: conine declaraiile locale i instruciunile executabile
care implementeaz algoritmul. Corpul funciei se execut pn la executarea ultimei instruciuni
sau pn la executarea instruciunii return. Forma ei general este:
return(expresie); sau
return expresie; sau
return;

Prima i a doua form snt folosite n cazul funciilor care returneaz o valoarea prin
numele lor. Prin executarea acestei instruciuni se evalueaz expresia, valoarea sa este atribuit
funciei i se ncheie execuia funciei. A treia form este folosit n cazul funciilor care nu
returneaz nici o valoare prin numele lor (poate chiar s lipseasc). Dac este prezent, efectul ei
este ncheierea execuiei funciei. Tipul expresiei din instruciunea return trebuie s coincid cu
tipul funciei.
Apelul funciilor se face prin referirea lor ca operanzi n expresii, sub forma:
nume(lista_parametrilor_reali)

La apel, parametrii reali se pun n coresponden cu cei formali, de la stnga la dreapta.


Pentru o corect utilizare a datelor, tipurile parametrilor reali trebuie s fie aceleai ca ale celor
formali corespunztori.

Programul este construcia sintactic de cel mai nalt nivel. El codific algoritmul, fiind
constituit din declarri i instruciuni executabile. Dat fiind faptul c limbajul C este puternic
orientat spre funcii, programul principal este el nsui o funcie (care poate avea parametri i
poate ntoarce un rezultat de tip ntreg): main (cuvnt rezervat). La modul general, un program
este o niruire de funcii i declaraii, printre care trebuie s existe o funcie denumit main,

Bazele programrii

50

lansat n execuie la rularea programului. Pentru funcia main sunt permise mai multe forme ale
antetului:
main()
int main()
void main()
main(void)
void main(void)
int main(void)

Orice program este format dintr-o parte de declaraii (format din instruciuni
neexecutabile, cu rol doar n faza de compilare) i o parte executabil (format din instruciuni
executabile). Unele limbaje impun o separare clar a acestora (de exemplu Pascal, COBOL,
FORTRAN), n care partea de declaraii precede partea executabil. Alte limbaje (de exemplu C,
C++) sunt mai flexibile, permind ca declaraiile s alterneze cu instruciunile executabile,
pstrnd ns regula c orice entitate referit trebuie definit anterior. Pentru a evita confuziile se
recomand ca declaraiile s fie reunite la nceputul blocului de instruciuni pentru care sunt
vizibile.

Directivele de preprocesare. naintea compilrii, n C se desfoar etapa de


preprocesare, n cadrul creia se efectueaz substituiri asupra textului surs scris de programator.
Prin preprocesare se rezolv cerinele compilrii condiionate, se asigur inserarea unor fiiere n
textul surs i se expandeaz macrodefiniiile. Preprocesarea este controlat prin directive, a cror
sintax (n format BNF) este:
<directiva>::=#<cuvant_rezervat>[<parametri>]
Directiva #include este folosit pentru includerea de fiiere cu text surs ntr-un program i
are urmtoarea sintax:
#include<specificator_de_fisier>

sau
#includespecificator_de_fisier

Prima form caut fiierul specificat ntre fiierele standard ale limbajului, folosindu-se
calea descris n mediul de programare. A doua form caut fiierul specificat n calea curent (de
obicei este folosit pentru a include fiiere scrise de utilizator). Dac fiierul cutat nu este gsit se
produce o eroare de compilare. Dac fiierul este gsit, coninutul lui este inserat n program, n
locul directivei care l-a invocat, aceasta fiind tears (la limit poate fi considerat o substituire de
text).
Pentru ca textul inclus s fie vizibil din tot programul, se recomand ca directivele #include
s fie scrise la nceputul programului. Un text inclus poate s conin la rndul lui directive care
determin noi includeri de text. Textul inclus va fi compilat ca parte component a programului.
Pentru a putea utiliza funciile care realizeaz operaiile de intrare/ieire trebuie inclus
fiierul stdio.h.

Exemplu: #include<stdio.h>
Directiva #define este folosit pentru a substitui unele secvene de caractere cu altele i
are forma general:
#define sir1 sir2

Bazele programrii

51

unde att sir1 ct i sir2 sunt iruri de caractere. La preprocesare, se terge directiva din program
i se nlocuiete secvena de caractere sir1 cu secvena de caractere sir2 peste tot unde apare n
programul surs. Secvena sir1 este denumit nume iar sir2 este denumit descriere. Nu se face
nlocuirea dac sir1 apare n interiorul unui literal de tip ir de caractere sau n interiorul unui
comentariu. sir2 poate s fie descris pe mai multe rnduri, dac la sfritul fiecrui rnd (n afar
de ultimul) se scrie caracterul \ (backslash). Rolul acestuia va fi discutat n alt capitol. sir2 poate
s conin iruri de caractere pentru care au fost definite anterior. Acestea vor fi substituite
conform definiiilor lor.
Substituirea poate fi dezactivat din punctul n care apare directiva #undef pn la
sfritul programului sau pn la redefinirea lui sir1. Directiva are forma general:
#undef sir1

ntre cele mai frecvente utilizri ale directivei #define sunt definirea de constante
simbolice (literali crora li se asociaz identificatori) i definirea de macrodefiniii (necesare
simplificrii scrierii).
Din punct de vedere al textului surs, un macro se folosete la fel ca orice funcie: se
apeleaz prin numele simbolic urmat de lista parametrilor reali. Din punct de vedere al compilrii
exist o diferen fundamental: macro-urile sunt tratate la preprocesare. Preprocesorul terge
din textul surs apelul macro-ului i l nlocuiete chiar cu secvena de definire. Parametrii
formali ai macro-ului sunt nlocuii cu parametrii reali, prin substituire de text (corespondena se
face conform regulilor de punere n coresponden a parametrilor reali cu cei formali: unu-la-unu,
de la stnga la dreapta).

Test de autoevaluare
1. Specificai cum va arta secvena de cod urmtoare, dup preprocesare:
#define N 10
#define M 10
#define MAX (M+N)
#define DIM(a,b) (a)*(b)
char v[N],v1[10+DIM(5+M,6)];
char v1[10*MAX];
char m[M][N];

4.2 Tipurile de date n C


Limbajul ofer posibiliti multiple n declararea i utilizarea tipurilor de date. n general,
tipurile de date se clasific n statice i dinamice, mprite la rndul lor n simple i structurate.
Tipurile de date admise de limbajul C sunt prezentate n tabelul 4.1.

Tabelul 4.1. Clasificarea tipurilor de date n C


Dup modul de
alocare a memoriei

Dup numrul de
valori memorate

Statice
Simple

Tipuri existente
ntregi
Reale
Caracter

Bazele programrii

52

Structurate

Dinamice

Simple

Masiv
Articol
Fiier
Pointer
Referin

4.2.1. Tipurile simple de date


n limbajul C exist o serie de tipuri simple de date predefinite (tabelul 4.2), a cror
lungime poate s difere de la un sistem de calcul la altul i de la o implementare la alta
(standardul C este mai elastic dect altele). De exemplu, pentru tipul char este definit lungimea
1 sau cel mult lungimea tipului int.
 Tabelul 4.2. Tipuri simple de date n C

unsigned char

Lungime
(octe
i)
1

[signed] char

unsigned [int]
[signed] [int]
unsigned long
[signed] long
[int]

2
2
4

0..255 (0..28-1)
-128..127 (-27..271)
0..65535
-32768..32767
0..232-1

-231..231-1

Grup
a de
dat

ntreg

Real

Tipul

float

double

long double

10

Domeniu de
valori

3.4*10..3.4*1038
1.7*10-308..
1.7*10308
3.4*104932
..3.4*104932
38

Mod de reprezentare
Codul ASCII al caracterului.
Poate fi prelucrat ca un caracter
sau ca un ntreg cu/fr semn.
Virgul fix aritmetic
Virgul fix algebric
Virgul fix aritmetic
Virgul fix algebric
Virgul mobil simpl precizie
Virgul mobil dubl precizie
Virgul mobil extra precizie

Variabilele
Datele variabile i modific valoarea pe parcursul execuiei programului. De aceea, ele se
asociaz unor zone de memorie. Identificatorii acestora se declar i apoi se refer n operaii.
Operaiile afecteaz coninutul zonelor de memorie, care este interpretat ca fiind de un anumit tip.
Declararea variabilelor se realizeaz prin list de identificatori (separai prin virgul) pentru care
se specific tipul.
tip lista_variabile;

Declararea se poate face oriunde n program, cu urmtoarea condiie: variabilele trebuie


declarate nainte de a fi folosite (referite). Domeniul de valabilitate este limitat la blocul n care sa fcut declaraia.

Exemple:
unsigned x,y,z;

Bazele programrii

53

float a,b,c;
char k;

Variabilele pot fi iniializate la momentul compilrii, dac se utilizeaz urmtoarea


declaraie:
tip nume_variabila=valoare;

Exemple:
int dim_vector=100;
dim_vector=50; /*nu este eroare*/

Definirea de noi tipuri de date. Utilizatorul poate defini noi tipuri de date sau poate
atribui un alt nume unui tip predefinit sau definit anterior. n acest scop se folosete cuvntul
rezervat typedef, astfel:
typedef descriere_tip nume_utilizator;
Exemple:
typedef int INTREG;
typedef float REAL;

Particularitile unor tipuri simple de date. Tipul caracter memoreaz caractere ale
codului ASCII, reprezentate pe un octet. Variabilele de tip caracter pot fi utilizate i ca valori
numerice (modul de utilizare se alege automat, n funcie de expresia din care face parte
operandul respectiv).
Valoarea numeric folosit depinde de modul de declarare a caracterului: cu sau fr
semn. Pentru caracterele cu coduri mai mici dect 128 nu se sesizeaz nici o diferen (se obine
aceeai valoare i pentru interpretarea ca virgul fix aritmetic i pentru interpretarea ca virgul
fix algebric). Pentru caracterele cu coduri mai mari de 127, valoarea obinut este diferit.

Exemple:
Declararea i utilizarea variabilelor de tip caracter.
unsigned char a,b;

a=100;/* corect */
b=Q;/* corect */
b=81; /* corect, echivalent cu precedentul */

4.2.2. Constantele
Datele constante sunt predefinite la momentul scrierii programului iar valoarea lor este
generat la momentul compilrii. Datele constante pot fi literali (constante propriu-zise), care se
autoidentific prin valoare, sau constante simbolice, care sunt identificatori (denumiri) asociai
altor constante (literali sau constante simbolice definite anterior). n C literalii sunt ntregi, reali,
caracter i ir de caractere.
Literalii ntregi sunt reprezentai intern n virgul fix. Ei pot fi exprimai n bazele de
numeraie 10 (forma implicit), 8 (folosind prefixul 0 zero) sau 16 (folosind prefixul 0x sau
0X). n funcie de mrimea lor, se asociaz implicit un tip ntreg (i implicit un mod de
reprezentare). Se ncearc ntotdeauna nti reprezentarea pe 16 bii, conform tipului int; dac nu
este posibil, atunci se folosete reprezentarea pe 32 de bii, conform tipului long.
Dac se dorete forarea reprezentrii pe 32 de bii (pentru o valoare din domeniul tipului
int), se adaug sufixul l sau L. Pentru a fora tipul fr semn (unsigned int sau unsigned long) se
folosete sufixul u sau U. Cele dou sufixe se pot folosi mpreun, n orice ordine.

Bazele programrii

54

Literalii reali sunt reprezentai intern n virgul mobil. Ei se pot exprima sub form
matematic (ntreg.fracie) sau tiinific (ntreg.fracieEexponent). Semnul + poate lipsi
(este implicit), iar e este echivalent, ca valoare, cu E. Din exprimare poate s lipseasc fie partea
fracionar, fie partea ntreag, fie partea ntreag i exponentul (inclusiv litera e).
Literalii reali se reprezint intern pe 64 de bii (tipul double). Pentru a fora reprezentarea
n simple precizie (tipul float) se adaug sufixul f sau F. Pentru a fora reprezentarea pe 80 de bii
(tipul long double) se folosete sufixul l sau L. Cele dou sufixe nu se pot folosi mpreun.
Literalii caracter se reprezint intern prin codul ASCII al caracterului respectiv, pe
un octet. Exprimarea extern depinde de caracterul respectiv. Literalii de tip caracter pot
participa n expresii cu valoarea lor numeric, aa cum s-a artat anterior.
Exprimarea extern a unui caracter direct imprimabil (existent pe tastatur, cu coduri
ASCII cuprinse ntre 32 i 127) se face prin caracterul respectiv inclus ntre apostrofuri. Excepie
fac caracterele cu semnificaie special n C: (apostrof), " (ghilimele) i \ (backslash), care se
exprim printr-o succesiune de dou caractere, fiind precedate de caracterul \.

Exemple: B, b, 7, (spaiu), *, \\ (caracterul backslash, cod ASCII 92), \ (caracterul apostrof,


cod ASCII 39), \ (caracterul ghilimele, cod ASCII 34).
Reprezentarea folosind caracterul backslash este numit secven escape. Secvenele
escape sunt folosite i pentru a reprezenta caracterele de control (coduri ASCII ntre 0 i 31).
Pentru a reprezenta caracterele grafice ale codului ASCII extins (coduri ntre 128 i 255) se pot
folosi numai secvenele escape construite astfel: \ddd, unde d este o cifr din sistemul de
numeraie octal (07). Construcia ddd este considerat implicit ca fiind codul ASCII al
caracterului, reprezentat n baza 8. Nu este nevoie ca ea s fie precedat de un zero
nesemnificativ. Aceast construcie poate fi folosit pentru a reprezenta orice caracter al setului
ASCII.

Exemple: \a i \7 reprezint caracterul BEL, \b i \10 reprezint caracterul BS, \ i \42


reprezint caracterul ghilimele, \377 reprezint caracterul cu codul ASCII 255.
La iniializarea unei variabile de tip caracter se poate folosi oricare din variantele de
reprezentare descrise anterior sau orice valoare numeric (ntreag sau real). n acest ultim caz,
din reprezentarea intern a literalului numeric se iau n considerare primii 8 bii care sunt
interpretai ca un cod ASCII, obinndu-se valoarea care se atribuie.
Literalii de tip ir de caractere. Un literal de tip ir de caractere este un ir de zero
sau mai multe caractere, delimitate prin ghilimele (ghilimelele nu fac parte din ir). Pentru a
reprezenta diferite caractere, n interiorul irului se pot folosi secvene escape. Un literal de tip
ir de caractere poate fi scris pe mai multe rnduri. Pentru a semnala c un literal continu pe
rndul urmtor se scrie caracterul \ la sfritul rndului curent.
Un ir de caractere este reprezentat intern prin codurile ASCII ale caracterelor, cte unul
pe fiecare octet, la sfrit adugndu-se caracterul nul (cod ASCII 0 \0). Caracterul nul nu
poate s fac parte dintr-un ir, el avnd rolul de terminator de ir. n reprezentarea intern, un ir
de caractere ocup cu un octet mai mult dect numrul de caractere din componena sa.

Exemple: literalul
"Acesta este un literal \"sir de caractere\" \
scris pe doua randuri."

reprezint irul Acesta este un literal "sir de caractere" scris pe doua randuri.

Bazele programrii

55

- ir de lungime 1 (caracterul spaiu)


- irul de lungime 0 (irul vid)

""
""

Constantele simbolice sunt literali crora li se asociaz identificatori. n limbajul C


constantele simbolice se construiesc folosind directiva:
#define nume_constanta valoare

Utilizarea constantelor simbolice n cadrul programelor are urmtoarele avantaje:


- literalii primesc nume sugestive, mai uor de reinut i de utilizat, mai ales dac sunt formai
dintr-un numr mare de cifre;
- pentru rularea succesiv a programului cu valori diferite ale unui literal utilizat des este
suficient modificarea valorii constantei simbolice n definire (referirile nefiind modificate).

Exemple:
#define pi 3.141592653589
#define raspuns "D"

Constantele obiect sunt variabile iniializate la declarare, pentru care se rezerv


memorie, dar coninutul lor nu poate fi modificat pe parcursul execuiei programului. Ele se
declar folosind modificatorul const:
const tip nume_constanta=valoare;

Exemplu:
const int dim_vector=10;

Dac se ncearc o atribuire (de exemplu dim_vector=7) se genereaz eroare.

4.2.3. Tipurile structurate de date


Tipurile structurate au la baz mulimi (colecii) de date de tipuri simple sau structurate,
constituite dup anumite reguli ierarhice i de dependen bine stabilite. Nici o dat structurat nu
poate ocupa n memorie mai mult de 65520 de octei (lungimea unui segment de memorie).
Tipul masiv
Tipul masiv este structurat i desemneaz o mulime finit de elemente omogene constituit
ca un tablou cu una, dou sau mai multe dimensiuni. Mulimea are un singur identificator i ofer
posibilitatea referirii elementelor n acces direct prin poziie, determinat printr-un numr de
expresii indiciale corespunznd dimensiunilor masivului. Masivul se declar folosind o construcie
de forma:
tip nume[dim1][dim2][dimn];

unde tip este tipul comun elementelor masivului, iar dim1, dim2, , dimn sunt expresii constante
(evaluate la compilare), care indic numrul de elemente de pe fiecare dimensiune. Se accept
oricte dimensiuni, cu condiia ca structura n ansamblul ei s nu depeasc zona de memorie
maxim permis pentru structurile de date.

Exemple:
int x[10]; /* vector cu 10 componente intregi*/
float a[10][20]; /* matrice cu 10 linii si 20 coloane
de elemente reale */

La declararea masivelor se poate face i iniializarea lexicografic a acestora, astfel


(pentru masiv bidimensional):
tip nume[dim1][dim2]=

Bazele programrii

56
{{lista_const1}{lista_const2}{lista_constn}};

Exemple:
int b[10]={2,3,0,5,6,7,3,6,8,5};
/* vectorul contine valorile 2 3 0 5 6 7 3 6 8 5*/
float a[5][3]={{1,2,3},{1,2,3},{1,2,3}};
/* matricea contine valorile 1 2 3 1 2 3 1 2 3 0 0 0 0 0 0*/

Masivul poate fi referit global prin numele su. Elementele unui masiv se refer direct,
prin numele masivului urmat de indicele (indicii) corespunztori. Indicii sunt expresii incluse ntre
paranteze drepte (se mai numesc i variabile indexate): [indice]. Pentru fiecare dimensiune a
masivului trebuie s existe cte o referire de indice. Indicele de pe fiecare dimensiune are valoarea
minim 0 i valoarea maxim egal cu dimensiunea din declarare minus o unitate. Compilatorul
nu verific corectitudinea indicilor (n sensul de depire a dimensiunilor masivului la referirea
elementelor).
Tipul articol
Articolul este o structur de date eterogen, cu acces direct la elementele sale, ntre care
exist o relaie de ordine ierarhic. Articolul poate fi reprezentat sub form de arbore, ale crui
noduri sunt asociate componentelor structurii. Componentele de pe ultimul nivel sunt scalare i se
numesc date elementare sau cmpuri. Datele de pe celelalte niveluri, denumite date de grup, se
constituie prin agregarea datelor de pe nivelurile inferioare. Data de grup de cel mai nalt nivel
(rdcina arborelui) corespunde articolului n ansamblu. Conceptual, datele de grup de pe diverse
niveluri au aceleai proprieti ca i articolul, ceea ce permite ca aceast structur s fie construit
recursiv, prin descompunerea n structuri cu aceleai proprieti (figura 4.1).
Declararea mpreun a tipului articol i a variabilelor de acest tip se realizeaz conform
sintaxei:
struct tip_articol{lista_campuri} var1,var2,,varn;

unde tip_articol este identificatorul asociat tipului articol, iar var1, var2,, varn sunt
identificatorii asociai variabilelor de tipul articol declarat.
Parametrii declaraiei pot lipsi (dar nu toi deodat). Dac lipsesc parametrii var1,
var2,, varn, atunci tip_articol trebuie s fie prezent, fiind numai o declarare explicit de tip
nou, utilizabil ulterior la alte declarri. Dac lipsete tip_articol, atunci trebuie s fie prezent
lista de variabile (nevid), caz n care este vorba de o declarare de variabile de tip articol, fr
ns a declara i un tip utilizator nou. n continuare, tip_articol este un tip nou de date, iar var1,
var2,, varn sunt variabile de tipul tip_articol. Variabilele pot fi declarate i ca masive, ale cror
elemente sunt de tip articol: var1[dim1][dim2][dimn].

Bazele programrii

57
DATA
ZI

dat de grup (articol)

LUNA

AN

date elementare

a)
dat de grup (articol)

PERSOANA

dat de grup (articol)


NUME

ADRESA

DATA NATERII

date elementare

ZI

LUNA

AN

b)

Fig. 4.1. Exemple de structuri de articole


O variabil de tip articol poate fi declarat i ulterior definirii tipului:
struct tip_articol var1;

Descrierea constituie o definire implicit de un nou tip de dat. Este posibil definirea
explicit a unui nou tip de dat, adugnd cuvntul rezervat typedef n faa declarrii (n acest caz
nu mai pot fi declarate simultan i variabile).
Lista_campuri este o niruire de declaraii de cmpuri separate prin punct i virgul,
asemntoare declaraiilor de variabile, de forma tip_camp nume_camp. Cmpurile unei structuri
pot fi variabile simple, masive sau alte articole. Lista cmpurilor nu poate fi vid.

Exemplu: pentru exemplele din figura 6.1, declararea poate fi realizat prin definire recursiv,

astfel:

struct tip_data {
unsigned zi;
char luna[3];
int an; };
struct persoana {
char nume[30];
char adresa[50];
struct tip_data data_nasterii;
} angajat;

Dac nu ar fi existat declaraia tipului articol tip_data, atunci tipul persoana putea fi scris astfel:
struct persoana {
char nume[30];
char adresa[50];
struct {
unsigned zi;
char luna[3];
int an;
} data_nasterii;
} angajat;

Variabilele de tip articol se reprezint intern ca succesiuni de cmpuri elementare, cu


reprezentarea intern i lungimea fizic specifice tipurilor lor. Lungimea zonei de memorie
rezervat pentru variabila de tip articol rezult din nsumarea lungimilor cmpurilor. Aceasta nu
poate depi 65520 octei (ca orice variabil de tip structurat). Pentru structura unui articol i
dovedete utilitatea operatorul sizeof, care asigur determinarea lungimii zonei de memorie
asociate unei variabile sau unui tip de date.

Exemplu:

Bazele programrii

58

Considernd declaraiile anterioare, expresia sizeof(data_nasterii) are valoarea 8, iar sizeof(angajat) are valoarea
90.

Datele de tip articol pot fi referite n dou moduri: global sau pe componente. Referirea
global este permis numai n operaia de atribuire, cu condiia ca ambele variabile (surs i
destinaie) s fie articole de acelai tip.
Referirea pe componente (prin numele lor) este o reflectare a faptului c articolul este o
structur cu acces direct. Referirea unor componente de tip articol din structura altui articol este
posibil numai n operaia de atribuire, n condiiile precizate anterior la referirea global. n cele
ce urmeaz se are n vedere numai referirea componentelor de tip dat elementar, situate pe
ultimul nivel al structurii.
Referirea cmpurilor unei structuri se face prin calificare, folosind operatorul . (punct). n
referirea prin calificare, asigurarea identificrii unice a cmpurilor se realizeaz prin asocierea
numelui acestora cu numele articolului care le conine. Construcia rmne la aceast form n
cazul n care structura are numai dou niveluri: articolul i cmpurile elementare ale acestuia.
n articolele cu structur recursiv se realizeaz calificarea progresiv cu articolele de pe
nivelurile superioare, primul calificator fiind numele articolului rdcin. n lanul de calificri,
numele articolului rdcin este nume de variabil, celelalte fiind nume de cmpuri ale
articolului. Dac anumite componente sunt structuri de date de alte tipuri (de exemplu masive sau
iruri de caractere), n referirea elementelor lor se aplic, pe lng calificare, regulile specifice
acestor structuri.

Exemplu:
Referirea prin calificare a cmpurilor articolului angajat de tipul persoana (vezi exemplele anterioare) se
realizeaz astfel:

angajat.nume;
angajat.adresa;
angajat.data_nasterii.zi;
angajat.data_nasterii.luna;
angajat.data_nasterii.an
n aceste referiri, angajat este identificatorul variabilei articol, celelalte elemente sunt identificatori de
cmpuri. Construciile angajat.nume i angajat.adresa corespund referirii globale a cmpurilor respective, care
sunt iruri de caractere. Pentru a referi, de exemplu, primul caracter din ir, se scrie: angajat.nume[0].

Exemplu:
#include <stdio.h>
void main()
{
struct persoana {
char nume[40];
char adresa[30];
struct {
int zi, luna, an;} datan;
};
//Initializarea articolului din exemplul 1:
struct persoana p={"Popescu Ion", "Bucuresti, Magheru 14", 2, 4, 1960};
//sau cu evidentierea structurii data nasterii:
struct persoana p1={"Popescu Ion", "Bucuresti, Magheru 14", {2, 4, 1960}};
printf("\n%i",p1.datan.an);

n activitatea de programare pot fi ntlnite aplicaii care reclam utilizarea articolelor cu


structur variabil. La iniializarea cmpurilor unui astfel de articol, constanta de tip articol se
asociaz unei singure structuri, deoarece zona de memorie rezervat pentru articol este unic.
Pentru acest tip de articol, limbajul pune la dispoziia utilizatorilor tipul predefinit reuniune
(union), care se comport ca i tipul struct cu o singur diferen: la un moment dat al execuiei

Bazele programrii

59

programului, n zona de memorie rezervat articolului nu este memorat dect unul dintre
cmpurile acestuia.
Declararea tipului reuniune se realizeaz astfel:
union nume_tip { tip_camp1 camp1;
tip_camp2 camp2;
................
tip_campn campn;};

Lungimea zonei de memorie rezervate pentru o variabil de tip reuniune va fi egal cu


maximul dintre lungimile cmpurilor componente. Gestiunea coninutului respectivei zone de
memorie va trebui realizat de ctre programator.
Lucrul cu iruri de caractere
irurile de caractere se reprezint convenional ca masive unidimensionale (vectori) cu
elemente de tipul char. Totui exist o diferen semnificativ ntre un vector de numere i un
vector de caractere. Vectorul de caractere (irurile de caractere) se reprezint intern printr-o
succesiune de octei n care sunt memorate codurile ASCII ale caracterelor irului. Ultimul octet
conine caracterul NULL (cod ASCII 0 sau ASCIIZ), cu rol de marcator de sfrit al irului.
Marcatorul de sfrit de ir este gestionat automat de ctre sistem. Astfel, pentru memorarea unui
ir de n caractere sunt necesari n+1 octei. Marcatorul de sfrit nu face parte din ir i este tratat
ca atare de funciile care lucreaz cu iruri de caractere.

Exemplu:
1. char s[10]="Limbajul C";
0
L

1
i

2
m

3
b

4
a

5
j

6
u

7
l

9
C

10
0x00

Pentru prelucrarea irurilor de caractere, limbajul C pune la dispoziia utilizatorului o serie de funcii
specifice, definite n biblioteca standard string.h. Limbajul C dispune i de alte funcii care lucreaz cu iruri
de caractere (funcii de conversie), definite n biblioteca standard stdlib.h: atof (care necesit i includerea
bibliotecii standard math.h), atoi, atol, itoa, ltoa. De asemenea, n biblioteca stdio.h exist definite funcii de
intrare/ieire pentru irurile de caractere.

Teste de autoevaluare

Bazele programrii

60

2. . Se presupune un articol cu urmtoarea structur:


Cod
magazin

Vnzri lunare
Luna 1
Luna 2

Luna 12
ntreg
real
real
real

2
4
4
4

Scriei modul de declarare a articolului i lungimea sa n numr de octei. Exemplificai referirea


cmpurilor.
3. Se presupune un articol cu urmtoarea structur:
forma de nvmnt
data
naterii

nume

char[40]

z
i

l
u
n
a

an de
studiu

a
n

int

zi

id

bursa

valoare

loc de
munc

char

float

char[30]

data
angajrii
z
i

l
u
n

a
n

Specificai cum se realizeaz declararea i iniializarea cmpurilor unui student la zi pentru structura
articolului prezentat.

4.3 Expresii
Asupra datelor pot fi aplicai operatori din diverse clase, rezultnd construcii sintactice
numite expresii. n forma lor cea mai general, expresiile sunt alctuite din operanzi i operatori.
Evaluarea expresiilor produce ca rezultat o valoare de un anumit tip. n metalimbajul BNF expresia
poate fi definit astfel:

<expresie>::=<operand>|<operator_unar><expresie>|
<expresie><operator_binar><expresie>
Prima variant din definiie corespunde celei mai simple forme de expresie, redus la o
variabil sau o constant de un anumit tip. A doua i a treia variant, prin aplicare repetat, conduc
la recursivitate n construirea expresiilor, proces evideniat n exemplul urmtor:

a + ({
b ) {c + 15
{
{
expresie expresie expresie expresie
14243
expresie
14
4
42444
3
expresie
1444424444
3
expresie

Ordinea de aplicare a operatorilor din expresii poate fi, total sau parial, impus prin
folosirea parantezelor. Acestea sunt evaluate cu prioritate, iar dac sunt mai multe niveluri de
paranteze, evaluarea se realizeaz din interior spre exterior. n absena parantezelor, respectiv n
interiorul acestora, evaluarea se realizeaz n funcie de ordinul de preceden a operatorilor.

4.3.1 Operanzi i operatori

Bazele programrii

61

Un operand poate fi una din urmtoarele construcii:


o constant simbolic;
un literal;
o variabil simpl;
numele unui masiv;
numele unui tip de dat;
numele unei funcii;
referirea unui element de masiv;
referirea unui cmp de articol;
apelul unei funcii;
o expresie.
Din ultima posibilitate rezult c expresia este o construcie recursiv. Un operand are un
tip i o valoare. Valoarea se determin fie la compilare fie la execuie. Nu pot fi operanzi irurile
de caractere.
Operatorii se clasific dup diferite criterii, precum numrul operanzilor asupra crora se
aplic i tipul de operaie pe care o realizeaz. Majoritatea operatorilor sunt unari sau binari.
Limbajul utilizeaz i un operator ternar (care se aplic asupra a trei operanzi). Dup tipul
operaiei realizate, operatorii sunt aritmetici, logici, relaionali etc.
ntr-o expresie apar, de obicei, operatori din aceeai clas, dar pot fi i din clase diferite.
Se pot scrie expresii complexe care s conin operatori din toate clasele. La evaluarea acestor
expresii se ine cont de prioritile operatorilor (numite i clase de preceden), de asociativitatea
lor i regula conversiilor implicite.
Atunci cnd un operator binar se aplic la doi operanzi de tipuri diferite, nainte de a
efectua operaia, cei doi operanzi sunt adui la un tip comun. n general, operandul de tip inferior
se convertete ctre tipul operandului de tip superior. n primul rnd se convertesc operanzii de
tip char ctre tipul int. Dac operatorul se aplic la doi operanzi cu acelai tip nu se face nici o
conversie, rezultatul avnd acelai tip cu cei doi operanzi. Dac valoarea lui depete domeniul
asociat tipului de dat, rezultatul este eronat (eroarea de depire de domeniu). Dac operatorul se
aplic la operanzi de tipuri diferite, conversia se face astfel:
1. dac un operand este de tipul long double, cellalt se convertete la acest tip, iar
rezultatul va fi de tip long double;
2. dac un operand este de tip double, cellalt se convertete la acest tip, iar rezultatul va fi
de tip double;
3. dac un operand este de tip float, atunci cellalt se convertete la acest tip, iar rezultatul
va fi de tip float;
4. dac un operand este de tip unsigned long, atunci cellalt se convertete la acest tip, iar
rezultatul va fi de tip unsigned long;
5. dac un operand este de tip long, atunci cellalt se convertete la acest tip, iar rezultatul
va fi de tip long;
6. dac unul din operanzi este de tip unsigned iar cellalt de tip int acesta se convertete la
tipul unsigned, iar rezultatul va fi de tip unsigned.
Regula se aplic pe rnd fiecrui operator din cadrul unei expresii, obinnd n final tipul
expresiei.

4.3.2. Operatorii de atribuire


Atribuirea este o expresie cu forma general: v=expresie

Bazele programrii

62

unde v este o variabil simpl, un element de masiv, un cmp al unui articol sau o expresie n
urma evalurii creia se obine o adres. Entitatea care se poate afla n stnga operatorului de
atribuire se numete left value.
Pentru a se putea efectua atribuirea, tipul expresiei i tipul entitii din stnga operatorului
de atribuire trebuie s fie compatibile. Dac sunt incompatibile se produce eroare la compilare
(deoarece compilatorul nu poate insera n codul obiect apelurile pentru operaiile de conversie).
Efectele atribuirii constau n:
evaluarea expresiei din dreapta operatorului de atribuire, cu determinarea unei valori i
a unui tip;
memorarea valorii expresiei din dreapta n variabila din stnga;
ntreaga expresie de atribuire are valoarea i tipul variabilei din stnga.
n practica programrii, se utilizeaz frecvent expresiile de forma v = v op (expresie)
(de exemplu a=a+b-c). Se observ redundana de exprimare prn specificarea variabilei v att n
membrul stng ct i n cel drept. Pentru eliminarea acestei redundane, s-au introdus operatorii
combinai, cu forma general
op=

unde op este un operator binar, aritmetic sau logic pe bii (/, %, *, -, +, <<, >>, &, ^, |). O expresie de
forma
v op= expresie

este echivalent cu
v = v op (expresie)

Exemple:
Expresia a=a+b-c este echivalent cu a+=b-c.
Expresia i*=5 este echivalent i=i*5.

4.3.3. Operatorii aritmetici


n ordinea prioritii lor, operatorii aritmetici sunt:
i. operatori unari +, -, ++, -ii. operatori binari multiplicativi *, /, %
iii. operatori binari aditivi +, Operaiile efectuate de aceti operatori sunt descrise n tabelul 4.3.

Tabelul 4.3. Operatorii aritmetici

Semnificaie operaie
Schimbare semn
Pstrare semn (nici un efect, nu este
folosit)
Decrementare (post sau pre)
Incrementare (post sau pre)
Adunare
Scdere
nmulire
mprire
mprire ntreag (ctul)

Operator
+
-++
+
*
/
/

Bazele programrii

63

mprire ntreag (restul)

Observaie: Cu excepia operatorului %, care admite numai operanzi ntregi, ceilali admit toate
tipurile numerice.
Operatorii ++ i -- au efect diferit, depinznd de poziia fa de operand, astfel:
a. dac apar naintea operandului, valoarea acestuia este modificat nainte de a fi utilizat la
evaluarea expresiei din care face parte: ++var (preincrementare) sau --var (predecrementare);
b. dac apar dup operand, valoarea acestuia este folosit la evaluarea expresiei din care face
parte, apoi este modificat: var++ (postincrementare) sau var-- (postdecrementare).
Incrementare/decrementarea au ca efect modificarea valorii operandului cu o unitate.
Semnificaia unei uniti depinde de tipul operandului asupra cruia se aplic. Pentru operanzi
numerici, o unitate nseamn unu.
Operatorul % are ca rol obinerea restului unei mpriri ntregi. Operatorul / are efect
diferit, n funcie de tipul operanzilor:
a. dac cel puin un operand este de tip real, se execut mprire real;
b. dac ambii operanzi sunt ntregi, se execut mprire ntreag i se obine ctul.
Calculul ctului i restului unei mpriri ntregi se poate realiza i prin intermediul
funciei div. Rezultatul funciei are tipul div_t, definit n biblioteca stdlib.h astfel:
typedef struct {long int quot; //ct
long int rem; //rest
} div_t;

Exemplu:
Determinarea ctului (cat) i restului (rest) mpririi numrului m la numrul n se realizeaz astfel:
div_t x;
int m,n,cat,rest;
x=div(m,n);
cat=x.quot;
rest=x.rem;

4.3.4. Operatorii logici i relaionali


Expresiile logice sunt cele care, n urma evalurii produc, n interpretarea programatorului,
valorile adevrat sau fals. Astfel de valori sunt produse de dou categorii de operatori: operatori
logici propriu-zii i operatori relaionali.

Operatorii logici sunt prezentai n tabelul 4.4. (n ordinea prioritii) iar operatorii relaionali n
tabelul 4.5.

Tabelul 4.4. Operatorii logici


Semnificaie operaie
Operator
Negare
!
i logic
&&
Sau logic
||
Sau exclusiv logic
Nu exist
n limbajul C nu exist tipul de dat logic. Operanzii asupra crora se aplic operatorii
logici sunt convertii n valori numerice i interpretai conform conveniei: adevrat pentru
valoare nenul i fals pentru zero. Rezultatul unei operaii logice este de tip int, conform
conveniei: pentru adevrat valoarea 1 iar pentru fals valoarea 0.

Bazele programrii

64

La evaluarea expresiilor logice se aplic principiul evalurii pariale: dac expresia este de
tip aditiv (operanzi legai prin operatorul sau), n momentul n care s-a stabilit c un operand are
valoarea adevrat toat expresia va fi adevrat i nu se mai evalueaz restul operanzilor.
Asemntor, pentru o expresie multiplicativ (operanzi legai prin operatorul i), dac un operand
are valoarea fals, expresia are valoarea fals i nu se mai evalueaz restul operanzilor.
Operaia sau exclusiv ntre doi operanzi a i b se efectueaz cu expresia !a&&b||!b&&a,
conform tabelului urmtor:
a

!a

!b

!a&&b

!b&&a

!a&&b||!b&&a

0
0
0

0
0
0

1
0
0

1
0
1

0
0
0

0
0
1

0
0
1

Operatorii relaionali sunt prezentai n tabelul 4.5. Operatorii relaionali au acelai nivel de
prioritate.
Rezultatul unei operaii relaionale este de tip int, conform conveniei: pentru adevrat valoarea 1,
iar pentru fals valoarea 0.
Pentru a nu se grei la evaluarea unor expresii complexe, este indicat s se fac raionamentul
bazat pe logica boolean (cu valori de adevrat i fals).
Tabelul 4.5. Operatorii relaionali
Semnificaie operaie
Operator
Mai mare
>
Mai mare sau egal
>=
Mai mic
<
Mai mic sau egal
<=
Egal
==
Diferit
!=

4.3.7. Operatorii la nivel de bit


Limbajul permite operaii pe bii, ai cror operatori sunt prezentai n tabelul 4.6.
Tabelul 4.6. Operaii pe bii
Semnificaie operaie
Operator
i logic pe bii
&
Sau logic pe bii
|
Sau exclusiv logic pe bii
^
Negare (complement fa de 1)
~
Deplasare la dreapta
>>
Deplasare la stnga
<<

Bazele programrii

65

Operanzii pot fi de orice tip ntreg. Dac este nevoie, operanzii sunt extini la reprezentare pe 16
bii. Execuia are loc bit cu bit. Pentru o pereche de bii (x,y), valorile posibile rezultate n urma
aplicrii operatorilor logici la nivel de bit sunt prezentate n tabelul 4.7.
Tabelul 4.7 Rezultatele operaiilor logice pe bii
x
y
x&y
x|y
x^y
~x
0
0
0
0
0
1
0
1
0
1
1
1
1
0
0
1
1
0
1
1
1
1
0
0
Tot n categoria operaiilor la nivel de bit se ncadreaz i deplasrile binare la stnga sau
la dreapta a coninutului unei variabile ntregi:
operand<<numr_poziii i operand>>numr_poziii

Exemplu:
1. Urmtoarea secven afieaz, n ordine invers, biii unui octet (dat de tip char).
char c;
scanf("%d",&c);
for(int i=0;i<8;i++,c=c>>1)
printf("%d",c&1);

4.3.6. Operatorul virgul (,)


Operatorul virgul este specific limbajului C. Pe lng rolul de separator ntr-o list, virgula este
considerat i operator ntr-o secven de forma:
expresie_1, expresie_2, ..., expresie_n

Operatorul virgul (,) induce evaluarea succesiv a expresiilor, de la stnga la dreapta,


ntreaga secven fiind tratat ca o expresie creia i se atribuie n final valoarea i tipul
corespunztoare ultimei expresii evaluate (expresie_n). Operatorul se utilizeaz acolo unde este
legal s apar o expresie n program i se dorete realizarea unui calcul complex, exprimat prin
mai multe expresii.

Exemple:
int a=10, b=3, c, d;
d=(c=a+b, b+=c, a/2);

Valorile variabilelor dup evaluarea expresiei sunt: a=10, c=13, b=16, d=5 (ctul mpririi lui 10 la 2).

4.3.7. Operatorul de conversie explicit


Limbajul ofer posibilitatea conversiei explicite a tipului unei expresii ctre un tip dorit de
utilizator (dar compatibil). Expresia de conversie are forma general:
(tip)operand

Se observ c operatorul nu are un simbol explicit. El este format din numele unui tip de
dat inclus ntre paranteze. Construcia este numit expresie cast (conversia explicit se numete
typecast). Trebuie reinut c nu se schimb efectiv tipul operandului, doar se folosete n expresie
valoarea operandului convertit la un alt tip. Operaia de conversie de tip nu are efect permanent.

Exemplu:
int a=7;
float b=(float)a;

Bazele programrii

66

Dup execuia secvenei, a are valoarea 7 (nu 7.0) nefiind afectat n nici un fel de operaia de conversie
de tip, iar b are valoarea 7.0 (obinut prin conversia valorii lui a ctre tipul float).

4.3.8. Operatorul dimensiune


Operatorul dimensiune este folosit pentru a afla dimensiunea n octei a spaiului de memorie
ocupat de o variabil de sau definit de un tip. Operatorul are mnemonica sizeof i poate fi folosit
n una din formele:
sizeof var sau sizeof(var)sau sizeof(tip)
unde tip este numele unui tip de dat iar var poate fi numele unei variabile simple, numele unui
masiv, numele unui articol, un element al unui masiv sau un cmp al unui articol.
n primele dou forme, rezultatul va fi numrul de octei alocai entitii respective. Pentru
ultima form, rezultatul este numrul de octei pe care i va ocupa o variabil de tipul tip.
4.3.9. Operatorii paranteze
Parantezele au rolul de a include o expresie sau lista de parametri ai funciilor. Prin includerea
subexpresiilor ntre paranteze se modific ordinea de evaluare a unei expresii. Asupra unei
expresii ntre paranteze nu se pot aplica orice operatori (de exemplu nu se pot aplica operatorii de
incrementare sau decrementare).
La apelul unei funcii, parantezele rotunde () sunt numite operatori de apel de funcie,
ele delimitnd lista parametrilor reali. Parantezele ptrate [] au rolul de a include expresii care
reprezint indici pentru accesarea elementelor unui masiv. Ele se numesc operatori de indexare.
4.3.10. Operatorul condiional
Operatorul condiional este singurul care are trei operanzi i este specific limbajului C. Forma
general este:
expresie_1?expresie_2:expresie_3

unde expresie_1, expresie_2 i expresie_3 sunt expresii. Operatorul condiional are simbolul ?:.
Cele dou caractere care compun simbolul apar intercalate ntre cei trei operanzi, conform formei
generale. Construcia se numete expresie condiional. Valoarea i tipul acestei expresii sunt
identice cu cele ale expresie_2 (dac expresie_1 este adevrat) sau cu cele ale expresie_3 (dac
expresie_1 este fals).

4.3.11. Ali operatori


Din categoria operatorilor limbajului fac parte i urmtorii:
a. operatorul de calificare, cu simbolul . (caracterul punct), folosit pentru a accesa un cmp
al unui articol;
b. operatorul de calificare (cu simbolul ->) folosit pentru a accesa un cmp atunci cnd se
tie adresa unei structuri;
c. operatorul de refereniere (cu simbolul &) folosit pentru a extrage adresa unei variabile;
d. operatorul de refereniere (cu simbolul *) folosit pentru a defini un pointer;
e. operatorul de derefereniere (cu simbolul *) folosit pentru a extrage valoarea de la o
anumit adres.
Ultimii patru operatori sunt specifici lucrului cu adrese (care nu face obiectul prezentei
lucrri).
4.3.12. Evaluarea expresiilor
Expresiile sunt evaluate pe baza urmtoarelor reguli:
- Precedena: determin ordinea de efectuare a operaiilor ntr-o expresie n care intervin
mai muli operatori (gradul de prioritate);

Bazele programrii

67

- Asociativitatea: indic ordinea de efectuare a operaiilor n cazul unui set de operatori cu


aceeai preceden;
- Regulile de conversie de tip: asigur stabilirea unui tip comun pentru ambii operanzi,
pentru fiecare operaie care solicit acest lucru i n care tipurile difer.
Asociativitatea i precedena operatorilor (ncepnd cu prioritatea maxim) sunt redate n
tabelul 4.8.
n concluzie, expresiile care pot fi construite n limbajul C se ncadreaz n urmtoarele
categorii: expresii de atribuire, expresii aritmetice, expresii logice, expresii relaionale.

Tabelul 4.8. Precedena operatorilor


Operatori

Asociativitate

() [] . ->

de la stnga la dreapta

+-&*
(unari) ++ -(tip) sizeof !
~

de la dreapta la stnga

Grad de
prioritate
maxim

* (binar) / %
+ - (binari)
<< >>
< <= > >=
== !=
& (binar)

de la stnga la dreapta

^
|
&&
||
?:
= <<= >>=
+= -= *= /=
%= &= ^= |=
,

de la dreapta la stnga
de la stnga la dreapta

Teste de autoevaluare

4. Specificai care va fi valoarea variabilei c.


int a=7,b=9,c;
c=(a>b)?a:b;

5. Scriei secvenele echivalente pentru urmtoarele exemple:


y=x++;
y=--x;

minim

Bazele programrii

68

4.4. Realizarea structurilor fundamentale de control


4.4.1. Tipurile de instruciuni
Instruciunile unui program C se grupeaz ntr-un bloc delimitat de o pereche de acolade {}.
Instruciunile se ncheie cu caracterul ; (punct i virgul), care este terminator de instruciune i
este obligatoriu pentru a marca sfritul fiecreia.
Un program trebuie s execute cel puin o instruciune, chiar dac, la limit, aceasta este
vid. n limbajul C, un program se regsete sub forma unei funcii rdcin, care, la limit, poate
avea un corp vid:
void main() {}

Dup modul de realizare a construciilor sintactice i al numrului de aciuni descrise, se


disting instruciuni simple i structurate. De asemenea, pot fi create blocuri de instruciuni executabile, denumite instruciuni compuse.
O instruciune compus este o secven de instruciuni (simple, structurate sau compuse)
delimitat de perechea de acolade {}. Ea implementeaz natural structura secvenial din
programarea structurat. Mulimea instruciunilor executabile ale unui program este, la limit, o
instruciune compus. Orice instruciune (simpl sau structurat) poate fi transformat n
instruciune compus.
O instruciune este simpl dac descrie o singur aciune, unic determinat i care nu
provoac condiionri. Din categoria instruciunilor simple fac parte, de exemplu: instruciunea
vid, instruciunea de evaluare a unei expresii, goto, break, continue, return.
Instruciunile structurate sunt construcii care conin alte instruciuni (simple, compuse
sau structurate) care vor fi executate alternativ sau repetitiv. Corespunztor, prin instruciunile
structurate se codific structurile fundamentale alternative sau repetitive din algoritm.
Pe lng instruciunile care implementeaz conceptele programrii structurate, C conine
i instruciuni care contravin acestora, datorit orientrii limbajului spre compactarea textului
surs i spre neconformism n stilul de programare impus de autori.

4.4.2. Instruciunile simple


Instruciunea vid descrie aciunea vid. n C nu are o mnemonic explicit, fiind dedus din
contextul unor construcii sintactice. Ea se folosete acolo unde trebuie s apar o instruciune,
dar care nu trebuie s execute nimic. Situaia este ntlnit de obicei n cazul instruciunilor
structurate.
Exemple:
if (c==1) ; else c=2;

instruciune vid
instruciuni vide

if (c==1) ; else ;

{;}

instruciune vid

Instruciunea de tip expresie evalueaz o expresie care, n cele mai dese cazuri, este de atribuire
sau de apel al unei funcii (vezi i capitolul Operatori i expresii). Instruciunea de tip expresie se
obine scriind terminatorul de instruciune dup o expresie (acolo unde este legal s apar o
instruciune n program). Forma general este:
expresie;

4.4.3. Instruciunea compus

Bazele programrii

69

Instruciunea compus este o succesiunea de instruciuni i declaraii, cuprinse ntre o pereche de


acolade. Se prefer ca declaraiile s fie plasate naintea instruciunilor. Forma general este:
{declaratii
instructiuni}

Declaraiile sunt valabile n interiorul instruciunii compuse. Instruciunea compus se


utilizeaz acolo unde este nevoie s se execute mai multe aciuni, dar sintaxa impune prezena
unei singure instruciuni: mai multe instruciuni sunt transformate ntr-o singur instruciune
(compus). Situaia este ntlnit n cadrul instruciunilor if, while, do, for, care precizeaz, n
sintaxa lor o singur instruciune.

4.4.4. Instruciunile structurate


n continuare, prin instruciune se nelege o instruciune simpl, compus sau structurat.
Realizarea structurilor alternative
a) Structura alternativ simpl (figura 4.2) permite realizarea unei ramificri logice binare, n
funcie de valoarea unei condiii (expresie cu rezultat logic). Instruciunea care realizeaz aceast
structur este if :
if(expresie)instruciune_1;
[else instruciune_2];

fals

Instruciune 2

condiie

adevrat

Instruciune 1

Fig. 4.2. Structura alternativ simpl


Expresia poate fi de orice tip. Dac valoarea expresiei este diferit de zero (valoare
asociat din punct de vedere logic cu adevrat) se execut instruciune_1; n caz contrar se
execut instruciune_2 sau se iese din structur (cnd construcia else lipsete, caz n care
instruciunea if realizeaz structura pseudoalternativ).

Exemple:
1)

if(a>b) a=c;

else a=b;
2. Rezolvarea ecuaiei de gradul I, ax+b=0:

a ? printf("Solutia este %10.5f",(float)-b/a) : b ? printf("Ecuatia nu are solutii") : printf("Solutii: orice x real");

b) Structura alternativ multipl permite alegerea unei aciuni dintr-un grup, n funcie de
valorile pe care le poate lua un selector (figura 9.2). n limbajul C structura se simuleaz cu
instruciunea switch, a crei sintax este:
switch(expresie)
{case c_1: instruciuni_1;
case c_2: instruciuni_2;

case c_n: instruciuni_n;


[default: instruciuni;]}

Bazele programrii

70

unde: expresie este de tip ntreg; c_1, c_2, , c_n sunt expresii constante, de tip int, unice (o
valoare nu poate s apar de dou sau mai multe ori); instruciuni_1, instruciuni_2, ...,
instruciuni_n, instruciuni sunt simple, compuse sau structurate. Dac pe o ramur sunt mai
multe instruciuni, nu este nevoie s fie incluse ntre acolade (s fie instruciune compus).
Instruciunea switch evalueaz expresia dintre paranteze, dup care caut n lista de
expresii constanta cu valoarea obinut. Dac este gsit, se execut instruciunile asociate valorii
respective i, secvenial, toate instruciunile care urmeaz, pn la terminarea structurii de
selecie. Dac valoarea cutat nu este gsit n list i ramura default este prezent, se execut
instruciunile asociate acesteia. Dac ramura default lipsete nu se execut nimic. Pentru a limita
aciunea strict la execuia instruciunilor asociate unei valori, trebuie inclus instruciunea break,
care determin ieirea din structura switch.
Pentru a simula structura din figura 4.3 se scrie:
switch(expresie)
{case c_1: instruciuni_1; break;
case c_2: instruciuni_2; break;

case c_n: instruciuni_n; break;


[default: instruciuni;]}

selector
selector = v1
selector = v2
instruciune 1

instruciune 2

selector = vn

instruciune n

altfel
instruciune

Fig. 4.3. Structura alternativ multipl


Realizarea structurilor repetitive
a) Structura repetitiv condiionat anterior este implementat prin instruciunea while cu forma
general:
while (expresie) instruciune;

Instruciunea while se execut astfel: se evalueaz expresia i dac este diferit de zero
(adevrat) se execut instruciunea (simpl, compus sau structurat), apoi se reia procesul pn
cnd la evaluarea expresiei se obine valoarea zero. n acest moment se ncheie execuia
instruciunii while. Pentru a asigura ieirea din ciclu, instruciunea trebuie s modifice valoarea
expresiei.
Dac la prima evaluare a expresiei se obine valoarea zero, atunci nu se execut nimic.
Instruciunea while implementeaz natural structura corespunztoare din teoria programrii
structurate. Mecanismul de execuie este redat n figura 4.4.

Bazele programrii

71

expresie
=0
(fals)

0 (adevrat)
instruciune

Fig. 4.4. Mecanismul de execuie a instruciunii while


Exemple:
1. while (a>b)
a=a+1;

2. i=0;
while (i<n)
{printf("\n %4.2f",v[i]);
i=i+1;}

b) Structura repetitiv condiionat posterior este implementat (cu unele deosebiri fa


de teoria programrii structurate), prin intermediul instruciunii do-while. Forma general este:
do instruciune

while (expresie);

Instruciunea do-while se execut astfel: se execut instruciune apoi se evalueaz


expresia; dac expresia este nenul (adevrat), se repet procesul, altfel se ncheie execuia.
Mecanismul de execuie este redat n figura 4.5. Se observ c instruciunea do-while se abate de
la teoria programrii structurate, realiznd repetiia pe condiia adevrat, n timp ce structura
fundamental o realizeaz pe condiia fals.

instruciune

0 (adevrat)
expresie
= 0 (fals)

Fig. 4.5. Mecanismul de execuie a instruciunii do-while


Instruciunea do-while este echivalent cu secvena:
instruciune;
while(expresie) instruciune;

Exemple:
1. do a=a+1; while (a<=100);
2. #include <stdio.h>
main()
{ unsigned i;
i=1;
do
{
printf("+");
printf("-");
i++;}
while(i<=80);}

Bazele programrii

72

c) Structura repetitiv cu numrtor nu este implementat n C. Ea poate fi simulat prin


instruciunea for, care, datorit facilitilor deosebite pe care le ofer, poate fi considerat ca o
instruciune repetitiv cu totul particular, nedefinit n teoria programrii structurate. Ea este mai
apropiat de structura while-do. Instruciunea for din C are urmtoarea form general:
for(expresie_1; expresie_2; expresie_3)instruciune;

Instruciunea for se execut astfel: se evalueaz expresie_1; se evalueaz expresie_2 i


dac este nul (fals), se ncheie execuia lui for, altfel se execut instruciune apoi se evalueaz
expresie_3. Se revine la evaluarea lui expresie_2 .a.m.d. Instruciunea for realizeaz structura
repetitiv din figura 4.6 i poate fi nlocuit cu secvena:
expresie1;
while (expresie2)
{ instruciune;
expresie3;}

expresie 1
expresie 2
=0 (fals)

0 (adevrat)
instruciune
expresie 3

Fig. 4.6. Mecanismul de execuie a instruciunii for


Pentru a simula structura repetitiv cu numrtor (do-for) se folosesc forme particulare
pentru cele trei expresii:
expresie_1 va fi expresia de iniializare: contor=valoare iniial;
expresie_2 controleaz terminarea ciclului: contor<valoare final;
expresie_3 realizeaz avansul contorului: contor=contor+pas.

Exemplu:
/*citirea elementelor unui vector*/
#include <stdio.h>
void main()
{ float v[20];
int n,i;
printf("\n Nr. de elemente:");
scanf("%i",&n);
for(i=0;i<n;i++)
{ printf("\n v[%i]=",i+1);
scanf("%f",&v[i]);}
}

4.4.5. Instruciunile de salt necondiionat i ieire forat din structuri


Instruciunile de salt necondiionat i ieire forat din structuri contravin principiilor programrii
structurate, dar pot fi utilizate n msura n care, n aplicaii complexe, uureaz munca
programatorului.
Prin instruciunea continue, care se poate folosi numai n interiorul unei structuri
repetitive, se abandoneaz iteraia curent i se trece la urmtoarea. Forma ei este:
continue;

Bazele programrii

73

Instruciunea are urmtoarele efecte:


n interiorul instruciunilor while i do-while: se abandoneaz iteraia curent i se trece la
evaluarea expresiei care controleaz terminarea buclei.
n interiorul instruciunii for: se abandoneaz iteraia curent i se trece la evaluarea
parametrului expresie_3.
Instruciunea break este folosit numai n interiorul unei instruciuni structurate i are
ca efect terminarea imediat a execuiei instruciunii respective.
Instruciunea goto realizeaz salt necondiionat i este monit din primele limbaje de
programare, care nu foloseau principiile programrii structurate. Forma general este:
goto etichet;

O etichet este un identificator urmat de caracterul : (dou puncte), dup care urmeaz o
instruciune. Rolul unei etichete este de a defini un punct de salt, ctre care se poate face trimitere
prin instruciunea goto. Etichetele au valabilitate local, n corpul funciei n care sunt definite.
Din acest motiv, nu se poate face salt din corpul unei funcii la o instruciune aflat n alt
funcie.

Test de autoevaluare
6. Care din urmtoarele secvene nu realizeaz suma a n elemente ale unui vector:
a) s=0; for(i=0; i<n; i++) s+=x[i]; b) s=0; for(i=n-1; i>=0; i--) s+=x[i]; c) s=0; i=0; while
(i<n) {s+=x[i]; i++;} ; d) s=0; i=n-1; while (i>0) {s+=x[i]; i--;} ; e) s=0; i=0; do { s+=x[i];
i++; } while(i<n);
7. Secvena: for(i=0; i<n-1; i++) {z=x[i]; p=i; for(j=i+1; j<n;
j++) if(x[j]<z) {z=x[j]; p=j; }
a=x[i]; x[i]=z; x[p]=a; }
realizeaz:
a) minimul dintr-un vector cu reinerea poziiei primei apariii; b) minimul dintr-un
vector cu reinerea poziiei ultimei apariii; c) sortarea unui vector prin metoda bulelor;
d) sortarea unui vector prin metoda seleciei; e) cutarea unei valori date ntr-un vector.
8. Triunghiul de sub diagonala secundar (inclusiv diagonala) unei matrice ptrate se poate
parcurge numai cu secvenele: 1. for(i=0; i<n; i++) for(j=n-i-1; j<n; j++) ...; 2.
for(i=0; i<n; i++) for(j=n-1; j>=n-i-1; j--) ...; 3. for(i=n-1; i>=0; i--)
for(j=n-i-1; j<n; j++) ...; 4. for(i=n-1; i>=0; i--) for(j=n-1; j>=n-i-1; j-) ...; 5. for(j=0; j<n; j++) for(i=n-j-1; i<n; i++) ...; 6. for(j=0; j<n; j++)
for(i=n-1; i>=n-j-1; i--) ...; 7. for(j=n-1; j>=0; j--) for(i=n-j-1; i<n;
i++) ...; 8. for(j=n-1; j>=0; j--) for(i=n-1; i>=n-j-1; i--) do ....

a) 1,2,5 i 6; b) 3,4,7 i 8; c) 1,2,3 i 4; d) 5,6,7 i 8; e) toate.


9. Urmtoarele secvene descriu algoritmi recursivi: 1) s=0; for(i=n-1; i>=0; i--)
s+=x[i]; 2) for(i=0; i<n; i++) y[i]=x[i]; 3) nr=0; i=0; while(i<n) {if(x[i]>0)
nr+=1; i++; }; 4) for(i=0; i<n; i++) z[i]=x[i]*y[i]; 5) i=0; z=0; do
{z+=x[i]*y[i]; i++;} while(i<n); 6) s=1; for(i=0; i<n; i++) s*=i;

a) toate; b) 1,3,5 i 6; c) 2,4 i 6; d) 3 i 5; e) niciunul.

Bazele programrii

Rspunsuri i comentarii la testele de autoevaluare

1. Dup preprocesare, secvena de cod va deveni:


char v[10],v1[10+(5+10)*(6)];
char v1[10*(10+10)];
char m[10][10];
2. Articolul se declar astfel:
struct magazin {int cod_magazin;
float vanzari_lunare[12];
}articol;
Articolul are 50 de octei, iar referirea cmpurilor se realizeaz astfel:
articol.cod_magazin; articol.vanzari_lunare[i], cu i=0,1,,11.
#include <stdio.h>
void main()
{ struct magazin {
int cod_magazin;
float vanzari_lunare[12];
};
//Initializarea articolului;
struct magazin gigel_srl={200, 1,2,3,4,5,6,7,8,9,10,11,12};
//sau cu evidentierea structurii de masiv:
struct magazin gigel_srl1={200, {1,2,3,4,5,6,7,8,9,10,11,12}};
printf("\n%6.2f",gigel_srl1.vanzari_lunare[10]);
3. Declararea i iniializarea cmpurilor unui student la zi pentru structura
prezentat se realizeaz astfel:
#include <stdio.h>
void main()
{ //Declararea articolului cu structura variabila:
struct articol { char nume[40];
struct { int zi, luna, an;} datan;
int an_st; char forma_inv;
union { struct {char bursa; float valoare;}zi;
struct {char loc_m[30];
struct {int zi, luna, an;}data_ang;
}id; } parte_vb; };
//Initializarea campurilor unui student la zi:
struct articol a={"Popescu Felix",{4,1,1974},1,'Z',{'D',250.5}};
printf("\nData nasterii: %i.%i.%i, Forma de inv.: %c, Val. bursa: %6.2f",
a.datan.zi, a.datan.luna, a.datan.an, a.forma_inv, a.parte_vb.zi.valoare); }
4. Variabila c primete valoarea maxim dintre a i b, anume 9.
5. y=x++; este echivalent cu secvena y=x; x=x+1;
y=--x; este echivalent cu secvena x=x-1; y=x;
6:d); 7:d); 8:e); 9:b).

74

Bazele programrii

75

Bibliografia unitii de nvare


1. I. Gh. Roca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, M. Mircea, L. Btgan, C. Silvestru,
Bazele programrii calculatoarelor. Teorie i aplicaii n C, Ed. ASE, Bucureti, 2006, ISBN 973-594-5916
2. I. Gh. Roca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, Programarea calculatoarelor. tiina
nvrii unui limbaj de programare, Teorie i aplicaii, Ed. ASE, 2003
3. Ion Smeureanu, Marian Drdal, Programarea n limbajul C/C++, Ed. CISON, Bucureti 2004, ISBN
973-99725-7-8

Bibliografie
1. I. Gh. Roca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, M. Mircea, L. Btgan, C. Silvestru,
Bazele programrii calculatoarelor. Teorie i aplicaii n C, Ed. ASE, Bucureti, 2006, ISBN 973-594-5916
2. I. Gh. Roca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, Programarea calculatoarelor. tiina
nvrii unui limbaj de programare, Teorie i aplicaii, Ed. ASE, 2003
3. Ion Smeureanu, Marian Drdal, Programarea n limbajul C/C++, Ed. CISON, Bucureti 2004, ISBN
973-99725-7-8

4. Roca Gh. I., Ghilic-Micu B., Stoica M., Cocianu C., Uscatu C., Programarea calculatoarelor.
tiina nvrii unui limbaj de programare. Teorie i aplicaii, Ed. ASE, Bucureti 2003, ISBN
973-594-243-7

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