Sunteți pe pagina 1din 75

ACADEMIA DE STUDII ECONOMICE BUCURE TI

FACULTATEA DE CIBERNETIC , STATISTIC I INFORMATIC ECONOMICA


CATEDRA DE INFORMATIC ECONOMIC

Bazele program rii

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

Acest material are la baz lucrarea


Bazele program rii calculatoarelor. Teorie i aplica ii în C,
Ion Gh. Ro ca, Bogdan Ghilic-Micu, C t lina Cocianu, Marian Stoica, Cristian Uscatu, Marinela
Mircea, Lorena B t gan, C t lin Silvestru
Editura ASE, Bucure ti, 2006, ISBN 973-594-591-6

Bucure ti 2010
TITLUL CURSULUI: Bazele program rii

INTRODUCERE
Cursul de Bazele program rii se adreseaz studen ilor înscri i la programul de studiu ID,
organizat de facultatea Cibernetic , Statistic i Informatic Economic i face parte din planul
de înv mânt aferent anului I, semestrul II. Pentru o bun în elegere a no iunilor teoretice i
practice prezentate în acest curs, este recomandat s se fi parcurs anterior disciplina Bazele
tehnologiei informa iei.

OBIECTIVELE PRINCIPALE ale acestui curs, vizeaz însu irea de c tre studen i a
urm toarelor elemente:
• no iuni de baz în teoria program rii;
• metodele de analiz a problemelor în vederea rezolv rii lor cu calculatorul;
• logica elabor rii algoritmilor structura i i modulariza i;
• realizarea programelor în limbajul C.

Cursul Bazele program rii este structurat în patru unit i de înv are, corespunz toare
elementelor principale studiate. În cadrul procesului de instruire pot fi utilizate ca resurse
suplimentare materialele puse la dispozi ie de bibliotecile Academiei de Studii Economice,
precum i laboratoarele catedrei de Informatic economic , cu o programare prealabil i atunci
când nu se desf oar ore.

EVALUAREA CUNO TIN ELOR, respectiv stabilirea notei finale, se va realiza astfel:
• lucrare de control;
• un referat despre opera iile de intrare/ie ire efectuate cu tastatura/monitorul;
• un proiect, care va con ine minim 20 de programe în limbajul C, lucru cu masive de date,
înso ite de un dosar de prezentare.
Lucrarea va fi sus inut în cadrul ultimei activit i asistate. Referatul i proiectul se sus in numai
în timpul activit ii didactice (activit ilor 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 unit ii de înv are 1................................................................................................. 4
1.1. Caracteristicile i reprezentarea algoritmilor........................................................................ 4
1.2. Descrierea structurilor fundamentale ................................................................................. 10
1.3. Structurarea i proiectarea algoritmilor .............................................................................. 13
R spunsuri i comentarii la testele de autoevaluare .................................................................. 17
Bibliografia unit ii de înv are................................................................................................. 17

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


Obiectivele unit ii de înv are 2............................................................................................... 18
2.1. Informa ia, data i reprezentarea intern a datelor ............................................................. 18
2.2. Structuri de date.................................................................................................................. 27
R spunsuri i comentarii la testele de autoevaluare .................................................................. 39
Bibliografia unit ii de înv are................................................................................................. 39

3. Etapele rezolv rii problemelor cu calculatorul..........................................................................40


Obiectivele unit ii de înv are 3............................................................................................... 40
3.1. Caracteristici generale ale PPAD ....................................................................................... 40
3.2. Fazele dezvolt rii programelor........................................................................................... 44
R spunsuri i comentarii la testele de autoevaluare .................................................................. 46
Bibliografia unit ii de înv are................................................................................................. 46

4. Caracteristicile limbajului C......................................................................................................47


Obiectivele unit ii de înv are 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
R spunsuri i comentarii la testele de autoevaluare .................................................................. 74
Bibliografia unit ii de înv are................................................................................................. 75

Bibliografie....................................................................................................................................75
Bazele program rii 4

1. Algoritmi i scheme logice

Cuprins
Obiectivele unit ii de înv are 1
1.1. Caracteristicile i reprezentarea algoritmilor
1.2. Descrierea structurilor fundamentale
1.3. Structurarea i proiectarea algoritmilor
R spunsuri i comentarii la testele de autoevaluare
Bibliografia unit ii de înv are

Obiectivele unit ii de înv are 1


Dupa studiul acestei unitati de învatare, studen ii vor avea cuno tin e teoretice i abilit i practice
despre:
caracteristicile algoritmilor;
reprezentarea algoritmilor;
descrierea structurilor fundamentale;
structurarea algoritmilor;
proiectarea algoritmilor.

Durata medie a unit ii de studiu individual - 8 ore

1.1. Caracteristicile i reprezentarea algoritmilor

Algoritmul desemneaz o mul ime exhaustiv i univoc determinat de opera ii, împreun cu
succesiunea în care trebuie aplicate asupra datelor ini iale ale problemei, pentru a ob ine solu ia.

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 ecua iei particulare 5x2-2x=7, ci un algoritm pentru
rezolvarea ecua iei de gradul al doilea cu o necunoscut ax2+bx+c=0, cu a,b,c,x∈ℜ, a 0 sau, mai general,
pentru rezolvarea ecua iei de forma ax2+bx+c=0, cu parametrii a,b,c,x∈ℜ.

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


situa iilor care pot ap rea în rezolvarea problemei respective, într-o manier f r ambiguit i sau
neclarit i, lucru impus de caracterul de automat al calculatorului electronic.
Bazele program rii 5

Exemplu:
S se elaboreze algoritmul pentru rezolvarea ecua iei: ax2 + bx + c = 0, a,b,c,x∈ℜ. Analiza arat c exist
patru situa ii posibile care trebuie cuprinse în algoritm:
1. a 0, ecua ie de gradul II;
2. a = 0 i b 0, ecua ie de gradul I;
3. a = 0 i b = 0 i c 0, ecua ie imposibil ;
4. a = 0 i b = 0 i c = 0, nedeterminare.
R mâne s fie rezolvate fiecare din aceste situa ii sau unele din ele s fie grupate în func ie de cerin e.

Finitudine: opera iile trebuie astfel concepute încât algoritmul s se termine într-un
num r finit de pa i, 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 (num r cunoscut de pa i);
La determinarea celui mai mare divizor comun (CMMDC) dintre dou numere întregi (A i B) se
împarte A la B: A=B·Q+R, apoi se continu împ r irea împ r itorului (B) la rest (R), pân când se ob ine un
rest nul, caz în care CMMDC este ultimul împ r itor (num r necunoscut de pa i).

Descrierea algoritmilor. Iterativitate i recursivitate

Iterativitatea este procesul prin care rezultatul este ob inut ca urmare a execu iei repetate a
unui set de opera ii, de fiecare dat cu alte valori de intrare. Num rul de itera ii poate fi cunoscut
sau necunoscut, dar determinabil pe parcursul execu iei. Indiferent de situa ie, num rul de itera ii
trebuie s fie totdeauna finit. În cazul în care num rul de repet ri nu este cunoscut ini ial, oprirea
cicl rii se face combinând instruc iunile de calcul cu instruc iunile de control. Condi iile finale ce
trebuie îndeplinite pentru terminarea cicl rii se bazeaz pe rezultatele calculelor pân la un moment
dat, de cele mai multe ori fiind corelate cu viteza de convergen a calculelor c tre o valoare stabil
i, implicit, cu gradul de aproximare impus unui rezultat.
Utilizarea iterativit ii în descrierea algoritmilor este uneori o cale simplificatoare, alteori
singura alternativ de a preciza modul de desf urare a unui proces de calcul. În general, când
num rul de itera ii nu este cunoscut sau este variabil de la o execu ie la alta, singura modalitate de
descriere a algoritmului presupune iterativitatea. Spre exemplu, ridicarea la p trat a elementelor
unui vector cu 3 elemente se poate descrie prin urm toarea succesiune de opera ii:
V(1)=V(1) · V(1)
V(2)=V(2) · V(2)
V(3)=V(3) · V(3)
Realizarea aceluia i lucru pentru un vector n-dimensional, cu n variind de la o execu ie a
programului la alta, nu este posibil în aceast manier , deoarece un algoritm este corect dac are
preciza i to i pa ii. Singura modalitate de realizare utilizeaz opera ia V(I)=V(I) · V(I), plasat într-
un ciclu variind dup I, de la 1 la o valoare final N, dat explicit de utilizator la fiecare execu ie 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 func ie de
num rul valorilor anterioare de care depinde valoarea curent ) i a unei formule recursive (de recu-
ren ). Recursivitatea apare i în cazuri dintre cele mai simple, cum ar fi num rarea, factorialul,
însumarea sau înmul irea elementelor unui ir.
Bazele program rii 6

Exemple:
A num ra înseamn a ad uga o unitate la valoarea anterior calculat . Dac se noteaz v0 = 0
valoarea ini ial , num rarea se desf oar dup urm torul proces recursiv:
v1 = v0 + 1
v2 = v1 + 1
v3 = v2 + 1
........
vi = vi-1 + 1
........
vn = vn 1+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
Când valorile ob inute prin num rare nu necesit p strarea în memorie, nu sunt necesare mai multe
loca ii, ci una singur , care va fi suprascris la fiecare itera ie:
V=0 formula de start
V=V+1 formula recursiv , pentru i=1,n

Utilizarea mai multor zone de memorie pentru calculele intermediare devine obligatorie în
situa ia multirecursivit ii. Practic, prin transferul dinamic al valorilor intermediare, sunt necesare
atâtea zone de memorie câte valori precedente sunt necesare calculului termenului curent.
Exemplu:
Algoritmul lui Euclid pentru determinarea celui mai mare divizor comun a dou numere A i B.

Restul curent se calculeaz pornind de la ultimul i penultimul rest, dup rela ia: r k + 2 = r k -
rk ⋅ r k +1 ,
rk +1
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 deîmp r it, cu I variabila împ r itor i cu R
restul, formulele de start devin: D←a; I←b. Iterativ, se calculeaz restul R←D- D ⋅ I i se execut
I
transferurile: D←I; I←R. Împ r itorul devine noul deîmp r it, iar ultimul rest ob inut devine împ r itor în
itera ia urm toare a algoritmului. Procesul iterativ continu pân se ob ine restul zero. Ultimul rest nenul
reprezint cel mai mare divizor comun al numerelor A i B.

Teste de autoevaluare

1. Caracteristicile oric rui 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 pu in uneia dintre valorile ei anterioare; e) un
proces alternativ prin care valoarea unei variabile se determin pe baza a cel pu in
uneia dintre valorile ei anterioare.
Bazele program rii 7

Reprezentarea algoritmilor prin scheme logice


Practica program rii calculatoarelor dovede te c schema logic este forma cea mai utilizat
de reprezentare a algoritmilor. Ea se dovede te util , în special, în ini ierea în programare, deoarece
ofer o „vizualizare” mai bun , o redare expresiv i sintetic , u or de urm rit, a algoritmilor. S
consider m un graf orientat în care arcele sunt etichetate cu anumite informa ii formând a a-zisele
blocuri. În graf sunt admise urm toarele blocuri:
Blocul START este un arc etichetat cu cuvântul START, pentru care vârful ini ial nu este
pus explicit în eviden , deoarece în el nu pot sosi arce:
START
Blocul STOP este un arc etichetat cu cuvântul STOP, pentru care vârful final nu este pus
explicit în eviden , deoarece din el nu pot pleca arce:
STOP
Blocul de citire este un arc etichetat cu informa ia: citirea unor valori de pe suportul
extern i înscrierea lor în loca ii de memorie corespunz toare unor variabile.
Cite te
list -de-variabile

Blocul de scriere este un arc etichetat cu informa ia: înscrierea pe supotul extern a
valorilor memorate în loca iile de memorie corespunz toare unor variabile:
Scrie
list -de-variabile

Blocul de atribuire este un arc etichetat cu informa ia: evaluarea unei expresii e i
înscrierea (atribuirea) rezultatului în loca ia de memorie corespunz toare unei variabile v:
v=e sau v←e sau e→v
Blocul de ramificare (selec ie) este o mul ime de n arce care pleac din acela i vârf, arce
etichetate cu predicatele C1, C2,...,Cn (predicat = condi ie = expresie logic , care poate fi adev rat
(1) sau fals (0)), care satisfac rela iile:
C1 ∨ C2 ∨ ... ∨ Cn = 1; Ci ∧ Cj = 0, (∀) i j; i,j= 1, n
Rela iile exprim faptul c unul i numai unul din aceste predicate poate fi satisf cut
(adev rat).

c1 cn
...
c2

Pentru cazul n=2 se poate scrie, echivalent:

c Nu Da
c c

Defini ie:
Se nume te 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 urm toarele informa ii: START sau STOP; o citire sau
o scriere; o atribuire; un predicat, în care caz extremitatea ini ial a arcului este extremitatea ini ial
a unui bloc de ramifica ie;
Bazele program rii 8

c) Orice arc face parte din cel pu in un drum care începe cu blocul START i se termin cu
blocul STOP.
În practic , schemele logice alc tuite conform regulilor enun ate anterior pot lua forme
foarte complicate, greu de urm rit, uneori chiar de cel care le-a conceput. De aceea s-a sim it
nevoia ca în construc ia schemelor logice s se foloseasc numai anumite configura ii (structuri) i
s se respecte reguli stricte, ob inându-se, astfel, scheme logice structurate.

Defini ie:
Se nume te subschem logic un graf orientat în care:
a) Exist un unic vârf ini ial (în care nu sosesc arce) i un vârf final (din care nu pleac arce);
b) Oricare arc este etichetat cu una din urm toarele informa ii: START sau STOP; o citire sau
o scriere; o atribuire; un predicat, în care caz extremitatea ini ial a arcului este extremitatea ini ial
a unui bloc de ramifica ie;
c) Dac subschema con ine blocul START (STOP), atunci extremitatea ini ial (final ) a
blocului este chiar vârful ini ial (final);
d) Orice arc face parte din cel pu in un drum ce une te vârful ini ial cu cel final.
În particular, o schem logic este o subschem logic în care vârful ini ial este extremitatea
ini ial a blocului START, iar vârful final este extremitatea final a blocului STOP.
Prin recuren , schema logic structurat (s.l.s.) se define te astfel:
(I) Blocurile START, STOP, de intrare/ie ire 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
condi iilor referitoare la START i STOP).
(III) Orice s.l.s. se ob ine plecând de la (I) i aplicând de un num r finit de ori regulile (II).

S1
c c c c

S1 S2
S2 S

Structura Structura alternativ Structura repetitiv


secven ial IF-THEN-ELSE 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 ? R spunsul, afirmativ, este dat de teorema fundamental a
program rii structurate (teorema lui Böhm-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 dovede te, în unele cazuri, greoaie,
practica impunând în ultima vreme descrierea lor printr-un text coerent, construit pe baza unor
reguli. O astfel de descriere se nume te metalimbaj (pseudocod). Exist multe variante de
metalimbaje. Oricine poate crea un pseudocod propriu, perfect acceptabil, cu condi ia ca el s
con in structurile de baz , suficiente pentru a descrie orice algoritm. Evident c i la pseudocoduri
Bazele program rii 9

se pune problema „portabilit ii”, mai ales atunci când 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. [Ro ca et al., 1998] Se propune urm torul pseudocod:
Cuvinte cheie. Sunt mnemonice ale instruc iunilor, unele fiind scrise în limba englez ,
pentru compatibilizare cu literatura de specialitate (de exemplu WHILE-DO, IF-THEN-ELSE).
Instruc iuni. Instruc iunile pot fi scrise liber, în sensul c o instruc iune se poate scrie pe
mai multe rânduri, iar un rând poate con ine mai multe instruc iuni (separate prin ";").
Instruc iunile se împart în declara ii (instruc iuni neexecutabile) i instruc iuni efective
(executabile).
O declara ie 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 construc ie
care desemneaz num rul maxim de elemente pe fiecare dimensiune, sub forma [d1][d2]...[dn].
Exemple:
ÎNTREG a, b, c;
REAL vector[20];
ÎNTREG matrice [10][15];

Instruc iunile executabile într-un program scris în pseudocod pot fi:


Instruc iunea de citire are forma: CITE TE(list _de_variabile).
Exemple:
CITE TE(A,B);
CITE TE(xi);

Instruc iunea de scriere are forma: SCRIE(list _de_variabile).


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

Instruc iunea de atribuire are forma: v=e, unde v este variabil , e este expresie, ambele de
aceea i natur (numeric , logic sau caracter).
Instruc iunile de ramificare (IF-THEN-ELSE, IF-THEN, CASE-OF) i cele repetitive
(WHILE-DO, DO-UNTIL, DO-FOR) sunt prezentate împreun cu structurile fundamentale.
Observa ii:
a) Instruc iunile corespund configura iilor acceptate într-o schem logic structurat , deci sunt
compatibile cu programarea structurat .
b) Instruc iunile acestui pseudocod se pot extinde la lucrul cu fi iere.

Teste de autoevaluare
3. Blocurile dintr-o subschem logic sunt etichetate cu una din informa iile: 1)START;
2)citire; 3)scriere; 4)expresie aritmetic ; 5)expresie logic ; 6)expresie rela ional ; 7)sir de
caractere; 8)atribuire; 9)salt necondi ionat; 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-THEN-
ELSE; 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 program rii 10

1.2. Descrierea structurilor fundamentale

În prezentarea structurilor fundamentale se vor folosi, în paralel, urm toarele reprezent ri:
schem logic , arbore, pseudocod si exprimare analitic . În cele ce urmeaz , s1, s2,...,sn sunt s.l.s.
(respectiv iruri de instruc iuni în pseudocod sau module structurate în schemele arbore).
Structura secven ial (liniar ) este prezentat în figura 1.2. i se noteaz analitic cu:
BLOCK[2](S1,S2) sau BLOCK(S1,S2). Structura secven ial poate con ine mai multe blocuri:
BLOCK[n](S1,S2...Sn)=BLOCK(BLOCK[n-1](S1,S2...Sn-1), Sn), cu n≥2.
Poate fi definit o structur secven ial cu un singur bloc: BLOCK[1](S1)=S1.

s.l.s. arbore pseudocod

BLOCK
S1 S1;
S2;

S2 S1 S2

Fig. 1.2. Structura secven ial


Structurile alternative sunt de mai multe tipuri:

s.l.s. arbore pseudocod

nu da IF-THEN-ELSE
C IF C THEN
S1
ELSE
S2 S1 S2
C S1 S2 ENDIF;

a) Structura IF-THEN-ELSE

s.l.s. arbore pseudocod

nu da IF-THEN
C
IF C THEN
S1
S1 ENDIF;
C S1

b) Structura IF-THEN

Fig. 1.3. Structuri alternative

Structura IF-THEN-ELSE (selec ia 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, putându-se
exprima astfel:
Bazele program rii 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 (selec ia 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 mul imea V={v1, v2, …, vn}. V este o mul ime discret ,
finit i ordonat . Structura CASE-OF este echivalent cu structura IF-THEN-ELSE (demonstra i
acest lucru analitic, prin s.l.s. i prin structuri arborescente).
s.l.s. arbore pseudocod

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

a) Structura CASE-OF – cazul general

s.l.s. arbore pseudocod

i CASE-OF i CASE-OF i
i=1 i=n
i=1: S1
i=2 i=n-1 i=2: S2
... ... ...
S1 S2 ... Sn-1 Sn S1 S2 ... Sn-1 Sn 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 condi ionat anterior este prezentat în figura 1.5.a. i se noteaz analitic
cu WHILE-DO(c,s).
Structura repetitiv condi ionat posterior, este prezentat în figura 1.5.b. i se noteaz
analitic cu DO-UNTIL(c,s).
Structura repetitiv cu num r tor este prezentat în figura 1.5.c. i se noteaz analitic cu DO-
FOR(v,vi,vr,vf,s), unde v este o variabil contor (num r tor), iar vi, vf,vr sunt expresii cu rol de
valoare ini ial , valoare final , respectiv valoare ra ie. Atunci când vr=1, ra ia se poate omite în
pseudocod.

Observa ii:
1. Diferen a esen ial între WHILE-DO i DO-UNTIL cost în aceea c DO-UNTIL execut s cel
pu in o dat , pe când WHILE-DO poate s nu execute pe s. Oricum, cele dou structuri se pot transforma
u or 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, putându-se scrie:
DO-FOR(v,vi,vf,vr,s)=BLOCK(v=vi,WHILE-DO(v vf,BLOCK(s,v=v+vr)))
Bazele program rii 12

s.l.s. arbore pseudocod

WHILE-DO
C da WHILE C DO
S
nu S ENDWHILE;
C S

a) Structura WHILE-DO

s.l.s. arbore pseudocod

DO-UNTIL
S
DO
S
nu UNTIL C;
C S C ENDDO;
da
b) Structura DO-UNTIL

s.l.s. arbore pseudocod

v=vi
DO-FOR
v=vi, vf, vr DO-FOR v=vi, vf, vr
S
da ENDDO;
v vf
S S
nu
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, DO-


UNTIL(BLOCK(v=v+vr,s),v>vf)); b) BLOCK(v=vf, DO-UNTIL(BLOCK(s,v=v-
≤vi)); c) BLOCK(v=vi, IF-THEN(v≤
vr),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, WHILE-
DO(v<vf,BLOCK (s,v=v+vr)));
6. Structura WHILE-DO(c,s) este echivalent cu: a) DO-UNTIL(s, c ); b)BLOCK(s,DO-
UNTIL(s, c )); c)IF-THEN(c,DO-UNTIL(s,c)); d)BLOCK(s,IF-THEN(c,s)); e)DO-
UNTIL(IF-THEN(c,s), c )
Bazele program rii 13

1.3. Structurarea i proiectarea algoritmilor


Un algoritm se consider structurat dac i numai dac con ine structurile fundamentale
prezentate anterior. Deoarece fiecare structur are o singur intrare i o singur ie ire, schema
logic are o singur intrare i o singur ie ire.
Considerându-se o familie D' de structuri fundamentale (de exemplu D'={BLOCK, IF-
THEN-ELSE, IF-THEN, DO-UNTIL, WHILE-DO}), un algoritm se nume te 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 urm toarele 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
con ine numai structurile fundamentale, atunci ea este nestructurat .
Orice schem logic nestructurat se poate structura, conform urm toarei teoreme de
structur : Fie S o schem logic nestructurat în care etichetele care sunt predicate formeaz o
mul ime P, iar etichetele care nu sunt predicate formeaz mul imea A, a ac iunilor. Se pot ad uga
lui A i P alte ac iuni, respectiv alte predicate, diferite de cele din S, astfel încât s se ob in o
schem logic structurat echivalent cu S. Dac o schem logic nestructurat este prea complica-
t , se renun la structurare (care, prin ad ugare de noi ac iuni i predicate, complic i mai mult
schema) i se reproiecteaz .
În practic s-au impus urm toarele metode de structurare.
Metoda dubl rii codurilor se folose te la structurarea alternativelor sau repetitivelor. Ea
const în dublarea, ori de câte ori este nevoie, a unui cod (a unei ac iuni sau a unui predicat), astfel
încât s se ob in numai structuri fundamentale.
Metoda introducerii unei variabile booleene se folose te pentru structurarea repetitivelor i
const în:
- se copiaz din vechea schem logic toate blocurile pân 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 condi ia 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 ie irea din vechea structur repetitiv .

Erorile în algoritmi
Un algoritm este eficient i devine opera ional în m sura în care între resursele de calcul
utilizate (timp i memorie calculator) i precizia rezultatelor se stabile te un raport acceptabil.
Cu toat precizia oferit de calculatoarele electronice, calitatea rezultatelor este influen at
de mul i al i factori. Solu ia unei probleme depinde de datele ini iale, acestea fiind ob inute în urma
unor observa ii, m sur tori sau pe baza altor calcule prealabile. Precizia instrumentelor cu care se
fac observa iile, condi iile în care au loc acestea, precizia calculelor necesare determin rii unor
parametri ini iali genereaz erori în datele ini iale. În general, pentru aceast clas de erori se
stabilesc limite de eroare.
O parte din parametrii utiliza i în formulele de calcul nu au o valoare exprimabil printr-un
num r finit de zecimale (de exemplu 3 , π, e etc). Erorile de aproximare a lor sunt cunoscute i
Bazele program rii 14

vor fi astfel alese încât s fie corelate cu precizia dorit pentru calculele în care intr ace ti
parametri.
O alt clas important de erori o constituie erorile de rotunjire. Ele apar ca urmare a
limit rii num rului de zecimale cu care se poate reprezenta un num r în calculator. Aceste erori
depind de modul de reprezentare a numerelor în calculator, de sistemul de numera ie folosit în
calcule, precum i de conversiile dintr-un sistem de numera ie în altul.
La rezolvarea, mai ales numeric , a unei probleme se folose te o metod matematic . De
multe ori, fenomenul modelat este supus unor condi ii simplificatoare, în func ie de acestea alegând
una sau alta din metodele de rezolvare existente. Alegerea metodei poate introduce a a numitele
erori de metod . Erorile introduse prin prezen a în calculator a unor func ii c rora în analiza
matematic le corespund serii infinite se numesc erori reziduale. Ele se explic prin imposibilitatea
calcul rii unei serii infinite într-un num r finit de pa i ai algoritmului.

Dac x este valoarea exact i x* o valoare aproximativ a lui x, ob inut ca urmare a


prezen ei unor erori din clasele men ionate anterior, se disting urm toarele situa ii:
x* > x x* este o aproximare a lui x prin adaos;
x* < x x* realizeaz o aproximare prin lips .
Diferen a x * = x - x * reprezint eroarea, iar când nu intereseaz sensul ei se calculeaz
x*
= x − x * , care poart numele de eroare absolut .
Erorile pot fi acceptate sau respinse, nu numai în func ie de m rimea lor, ci i în func ie de
x − x*
m rimea valorilor c rora li se asociaz . În acest scop se calculeaz raportul rx * = care
x*
desemneaz eroarea relativ .
În cazul opera iilor de adunare i sc dere, eroarea absolut nu dep e te suma erorilor
absolute a celor dou numere care se adun algebric.
x* ± y = (x ± y) - ( x ± y ) = x* ± y , pentru eroarea absolut ;
* *
* *

± y*
x*
* *
x ± * y , pentru eroarea relativ .
rx y*± * = = rx * * ry * *
*

x ±y
*
x ±y x ±y
*

De re inut c la sc derea a dou numere apropiate ca valoare, eroarea relativ î i pierde din
acurate e datorit numitorului raportului care tinde spre zero. Rela iile func ioneaz i pentru n>2
numere. În cazul produsului a mai multor numere aproximative i nenule, eroarea relativ nu
dep e te suma erorilor relative ale numerelor:
x*. y - (xy - x y ) = ( x + x*) ⋅ ( y + y ) - x y = x
* * * * * * * *
* *
y* + y x* + x* y*

*
x*. y
r x*. y* = * *
x .y
în care, logaritmând (valorile absolute permi ând acest lucru, iar x* i y* pentru simplificare au
acela i semn) i folosind formula de aproximare ln x - ln x * ≈ d ln x * = x*
*
, rezult c
x
*
y x* - x* y*
r x* y* ≤ r x* + r y* . În cazul opera iei de împ r ire x
( )* ≈ , r ( x )* ≤ | r x* | + | r y* | , ceea ce
* 2
(y )
y y

înseamn c eroarea relativ a câtului nu excede suma erorilor relative ale deîmp r itului i
împ r itorului. Erorile în cazul unor expresii calculabile prin opera iile elementare pot fi aproximate
folosind limita maxim a erorilor fiec rui termen în parte.
Bazele program rii 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 stabile te 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 fiec rui nod din arborescen a
sa; d) o schem logic structurat poate fi descompus în structurile privilegiate

Proiectarea algoritmilor
Conceptele principale ce s-au cristalizat în domeniul program rii structurate sunt:
proiectarea top-down, proiectarea modular , proiectarea structurat . Cele trei tipuri de proiect ri
nu se exclud unul pe altul, ci se intercoreleaz pentru desf urarea unei activit i organizate i
disciplinate, concretizat în ob inerea unor produse program care s reflecte clar ierarhizarea
prelucr rilor i care s faciliteze testarea i documentarea lor.
Proiectarea top-down presupune descompunerea, de la general la particular, a problemei
date în subprobleme sau func ii de prelucrat, conducând la realizarea algoritmului în mai multe faze
succesive, fiecare faz fiind o detaliere a fazei anterioare pân când algoritmul este suficient de
rafinat (detaliat) pentru a fi codificat. Apar astfel, în diferite faze succesive, algoritmi din ce în ce
mai detalia i. În urma descompunerii se ob ine o structur liniar sau arborescent .
Proiectarea top-down este înso it 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 porne te cu modulul r d cin i cu unu sau mai multe module de ordin imediat
inferior, se continu cu ata area unui alt nivel inferior etc., pân când s-au inclus în testare
modulele ultimului nivel. Testarea top-down poate lua în considerare, la un moment dat, numai
leg turile unui modul cu module de pe nivelul inferior, f r testare propriu-zis a acestora din urm .
Proiectarea modularizat presupune descompunerea problemelor în p r i numite
module, astfel încât fiecare din acestea s îndeplineasc anumite func ii 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 m sur , de experien a proiectan ilor
(programatorilor).
Ele se refer , în principal, la: omogenizarea func iilor; utilizarea diverselor structuri de date;
separarea func iilor de intrare/ie ire de func iile de prelucrare; utilizarea unor module deja
existente; posibilit ile echipei în sarcina c reia intr realizarea modulelor; utilizarea eficient a
resurselor calculatorului (periferice, timp, memorie intern ) etc.
Proiectarea modularizat presupune, pe lâng identificarea modulelor i a rela iilor dintre
ele, i precizarea modului i ordinii în care modulele sunt puse în lucru. Din punct de vedere al
func iilor pe care le con in, se disting: module de prelucrare (opera ionale) care con in func ii de
prelucrare (opera ii propriu-zise), module de comand (monitor) care apeleaz (activeaz ) alte
module i module mixte, care con in atât func ii de prelucrare cât 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 program rii 16

Proiectarea structurat a algoritmilor const dintr-o mul ime de restric ii i reguli de


elaborare care for eaz proiectantul (programatorul) s urmeze o form strâns de reprezentare i
codificare. Într-un sens mai larg, programarea structurat - incluzând aici i elaborarea algoritmilor
- este modalitatea de ordonare a activit ii mentale desf urat în scopul ob inerii de programe
(algoritmi) constituite din structuri fundamentale cu un grad de structurare cât mai mare i în
condi iile minimiz rii efortului de programare, dar ob inerii unui produs de cea mai bun calitate.

Verificarea i analiza corectitudinii algoritmilor


În procesul de elaborare a algoritmilor se pot strecura formul ri imprecise sau eronate, ceea
ce determin ob inerea 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 încerc ri, cu valoare teoretic , de a elabora o
metodologie de verificare a corectitudinii algoritmului. În practic se recomand urm toarele
verific ri ale corectitudinii algoritmilor simpli:
1. încheierea algoritmului dup un num r finit de pa i (în principal, modul de construire a
cicl rilor);
2. modul în care au fost construite selec iile, astfel încât variantele s fie corect definite în
algoritm;
3. asigurarea valorilor (prin introducerea din exterior sau ini ializare în algoritm) pentru
toate variabilele referite (utilizate) în opera ii.
Dac cele trei tipuri de verific ri au condus la concluzia de corectitudine, se procedeaz la
un test de birou care presupune parcurgerea atent , opera ie cu opera ie, a algoritmului, pentru
seturi de date, de obicei cazuri limit .

Analiza algoritmilor (studiul eficien ei lor) const , în principal, în:


I) Determinarea necesarului de memorie;
II) Determinarea timpului necesar execu iei algoritmului. Deoarece, pentru seturi diferite de
date, timpii de execu ie vor fi diferi i, timpul necesar execu iei 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 num rul acestor seturi.
III) Determinarea optimalit ii 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 r mân resurse importante care trebuie bine utilizate.

Test de autoevaluare

9. Care tipurile de proiect ri cristalizate în domeniul program rii structurate?


Bazele program rii 17

R spunsuri 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 proiect ri care s-au
cristalizat în domeniul program rii structurate sunt: proiectarea top-down, proiectarea
modular , proiectarea structurat .

Rezumat
În cadrul acestei unit i de înv are au fost studiate urm toarele aspecte în ceea ce prive te
algoritmii i schemele logice:
cuno tin e teoretice privind caracteristicile i descrierea algoritmilor;
modalit i 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 unit i de înv are, studen ii au cuno tin e i abilit i de rezolvare a
problemelor (în special lucrul cu masive), prin reprezentarea acestora sub form de algoritmi
structura i.

Bibliografia unit ii de înv are


1. I. Gh. Ro ca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, M. Mircea, L. B t gan, C. Silvestru,
Bazele program rii calculatoarelor. Teorie i aplica ii în C, Ed. ASE, Bucure ti, 2006, ISBN 973-594-591-
6
2. I. Gh. Ro ca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, Programarea calculatoarelor. tiin a
înv rii unui limbaj de programare, Teorie i aplica ii, Ed. ASE, 2003
3. Ro ca I. Gh., Apostol C., Ghilic-Micu B., Ro ca V., Programare sistematic în Pascal, Ed.
Didactic i Pedagogic , Bucure ti 1998, ISBN 973-30-3341-3
Bazele program rii 18

2. Organizarea intern a datelor

Cuprins
Obiectivele unit ii de înv are 2
2.1. Informa ia, data i reprezentarea intern a datelor
2.2. Structuri de date
R spunsuri i comentarii la testele de autoevaluare
Bibliografia unit ii de înv are

Obiectivele unit ii de înv are 2


Dupa studiul acestei unitati de învatare, studen ii vor avea cuno tin e teoretice i abilit i practice
despre:
informa ii, date, cuno tin e;
reprezentarea intern a datelor;
structuri statice de date;
structuri dinamice de date.

Durata medie a unit ii de studiu individual - 8 ore

2.1. Informa ia, data i reprezentarea intern a datelor

Informa ia este un concept de maxim generalitate, care poate fi definit prin raportarea la
conceptele de materie i energie. Fondatorul ciberneticii, Norbert Wiener1, consider informa ia
ca a treia form de manifestare a realit ii obiective, apreciind c ea nu este nici materie, nici
energie, ci pur i simplu informa ie. Se poate remarca faptul c defini ia anterioar este dat în
sens negativ.
Pentru a încerca o defini ie afirmativ , se cuvine mai întâi s se fac distinc ie între dou
maniere de a aborda conceptul pus în discu ie: î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, când elementul receptor este omul, ca fiin superioar pe
scara biologic . În acest ultim sens, informa ia trebuie considerat în raport cu procesul de
cunoa tere i cu modul de reflectare a rezultatelor sale în con tiin a fiin ei umane. În literatura de
specialitate sunt identificate urm toarele tr s turi definitorii ale informa iei:
semn cu semnifica ie: este obligatoriu ca un mesaj s fie construit într-o limb (limbaj) cunoscut
de receptor;
noutate: exist mesaje care, de i sunt redactate într-o limb cunoscut , nu con in nimic nou
pentru receptor, pierzându-se calitatea de informa ie;

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), edi ia a doua
rev zuit i ad ugit (dou capitole noi), The MIT Press, Cambridge (Mass), Wiley and Sons, New York,
1961
Bazele program rii 19

utilitate: în raport cu interesele receptorului, este posibil ca un mesaj cu caracter de noutate s fie
inutil pentru activitatea sa, pierzându- i, de asemenea, calitatea de informa ie.
Corespunz tor, se identific urm toarele niveluri la care se consider informa ia: sintactic, semantic i
pragmatic.
Nivelul sintactic este asociat sistemului de semne i regulilor utilizate pentru a le reuni în
construc ii sintactice folosite pentru reprezentarea informa iei în procesul de culegere,
transmitere, înregistrare i prelucrare. Acestui nivel îi corespunde conceptul de dat , care,
folosind nota ia formal BNF (Backus-Nour Form), poate fi definit astfel:
<dat >: : = <identificator> <atribute> <valoare>.

Regulile de sintax care formeaz mul imea produc iilor pot fi specificate în mai multe moduri,
dintre care se remarc nota ia formal BNF (Backus Normal Form) i diagramele de sintax . În nota ia
BNF, regulile sintactice (metadefini iile) au forma:
<parte-stânga> ::= parte-dreapta
unde <parte-stânga> desemneaz metavariabila (variabila neterminal ) care se define te, ::= este un
metasimbol având sensul de „este prin defini ie”, iar parte-dreapta reprezint defini ia metavariabilei.
În cadrul defini iei (parte-dreapta) se întâlnesc urm toarele elemente:
<metavariabila>, categorie folosit în definirea altei categorii sintactice;
metaconstanta, element al alfabetului terminal;
 care separ alternativele în defini ie;
[ ] care indic o construc ie op ional ;
{ } care indic posibilitatea repet rii construc iei.
Alternativele se constituie prin juxtapunerea de metavariabile i/sau metaconstante.

No iunea de dat va con ine pe cea de valoare, dar presupune, în plus, o form de
reprezentare i manipulare, adic un sistem de reguli de transformare având ca scop s se
ob in date noi pornind de la cele existente. Pe lâng distinc ia între conceptele de dat i
valoare se constat , de asemenea, diferen a între informa ie i dat , ca între un obiect i
modelul s u. Se mai spune c data este o reprezentare digital (discret ) a unei anumite
cantit i de informa ie. În concluzie, conceptele de informa ie i dat pot fi utilizate ca
sinonime numai în m sura în care accept m s identific m un obiect cu modelul s u.
La nivelul semantic, informa ia poate fi caracterizat ca semnifica ie a datelor. Sensul
informa iei la acest nivel este dat de coresponden a între o dat i obiectul real sau situa ia
reprezentat prin aceast dat .
Nivelul pragmatic este cel mai concret nivel de abordare a informa iei, fiind singurul care
consider informa ia în raport cu scopurile receptorului. Pornind de la scopurile receptorului pot
fi definite caracteristici ca utilitatea sau importan a informa iei. Nivelul pragmatic permite
reflectarea cea mai fidel a procesului de cunoa tere, a c rui în elegere complet impune
utilizarea conceptului de cuno tin .
Procesul de cunoa tere se realizeaz în timp, prin acumularea progresiv de informa ii
asupra unui obiect sau a unui sistem. La un moment dat, cuno tin ele reprezint totalitatea
informa iilor de inute de un observator asupra unui obiect sau sistem. Acest ansamblu de
informa ii se nume te tezaur de cuno tin e i se folose te ca termen de referin pentru a evalua
rezultatele oric rui proces de informare, ca parte a procesului general de cunoa tere.
La limit , rezultatele unui proces de informare pot conduce la una din urm toarele situa ii:
la o extrem , este posibil ca rezultatul s fie nul, dac informa ia apar ine deja
tezaurului receptorului, adic ea a devenit o cuno tin ;
la cealalt extrem , varia ia poten ial a tezaurului receptorului este maxim dac
intersec ia între con inutul tezaurului i acela al unui mesaj este vid .
Bazele program rii 20

Referitor la al doilea caz, se constat , îns , c este obligatorie existen a unei intersec ii
nevide între cele dou mul imi, numit redundan , astfel încât recep ia i în elegerea
mesajului s aib loc.
În final putem sintetiza o serie de concluzii clarificatoare a problematicii puse în
discu ie.
O informa ie este un mesaj susceptibil de a aduce o cuno tin i poate fi generat numai de
sisteme cu num r n finit de st ri (n ≥ 2). Modelul de reprezentare a informa iei, „formula scris ”,
reprezint o dat . Deosebirea dintre informa ie i dat este echivalent cu deosebirea dintre obiect i
modelul s u. Sub aspect semantic, informa ia poate fi caracterizat ca semnifica ie a datelor.
Calculatoarele actuale prelucreaz date pe baza c rora se ob in rezultate (tot date) care, prin
interpretare uman , cap t un sens, devenind informa ii.
C.E. Shannon a introdus no iunea de cantitate de informa ie, care se poate defini astfel: fie
un experiment X, având un num r finit de evenimente elementare independente x1,x2,...,xn, care se
realizeaz cu probabilit ile p1,p2,...,pn: X = x1 x2 ... xn . Dac X reprezint un sistem complet de
p1 p2 ... pn
n
evenimente: 0≤pk≤1, pentru orice k∈{1,2,...,n} (1) i p k = 1 (2), atunci cantitatea de informa ie
k =1
(entropia) se m soar dup rela ia:
n
H(p1 , p 2 , ..., p n ) = - p k ⋅ log 2 p k (3)
k =1
Cantitatea de informa ie se exprim , cel mai adesea, în bi i. Bitul poate fi definit ca
informa ia furnizat de un sistem cu dou st ri echiprobabile:
x1 x 2
X= (4)
1/2 1/2
Aplicând formula (3), se ob ine:
n
H(p1, p 2 ,..., p n ) = − p ⋅ log 2 p k = −(1/2)log 2 (1/2) − (1/2)log 2 (1/2) == 1/2 + 1/2 = 1 bit
k =1 k
Prin dat se desemneaz un model de reprezentare a informa iei accesibil unui anumit
procesor (om, unitate central , program etc.), model cu care se poate opera pentru a ob ine noi
informa ii despre fenomenele, procesele i obiectele lumii reale.
În nota ie BNF, semnifica ia cuvintelor de definire este urm toarea.
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
num r întreg, real, complex, logic, ir de caractere etc. Data care p streaz aceea i valoare pe tot
parcursul prelucr rii este denumit constant . În caz contrar, data se nume te variabil . Pentru
datele constante se folose te, î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, c rora li se
asociaz un identificator propriu.
Atributele precizeaz propriet i 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 mul imea valorilor pe care le poate avea o dat , precum i mul imea de opera ii care
se pot efectua cu elementele mul imii de valori ale datei. Pe lâng tip, unei date i se pot asocia i
alte atribute, ca: precizia reprezent rii interne, cadrarea valorilor în zona afectat , modul de alocare
a memoriei pe parcursul prelucr rii (static, dinamic), valoarea ini ial etc.
Bazele program rii 21

Reprezentarea intern a datelor

Data este elementar (scalar ) dac apare ca o entitate indivizibil , atât în raport cu
informa ia pe care o reprezint , cât 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
m rime, 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, câte un caracter pe octet. Cele
256 de caractere codificabile ASCII se împart în afi abile i neafi abile. Caracterele afi abile sunt
literele (mari i mici) ale alfabetului englez, cifrele, o serie de caractere speciale (+,*,/ etc.),
spa iul, o serie de semne grafice ( , ±, , , ), o serie de caractere grece ti ( ,ß, etc.) etc.
Caracterele neafi abile se utilizeaz , de regul , pentru controlul transmisiei i imprim rii (Line
Feed, Carriage Return, Form Feed, Bell, Tab etc.). Când aceste caractere sunt folosite în alt
context decât 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 opera iilor în virgul fix . Calculul în virgul mobil
poate fi realizat când microcalculatorul are coprocesor matematic 80x87 sau când limbajele de
programare dispun de biblioteci specializate pentru emularea software a opera iilor în aceast
aritmetic .
Datele logice se reprezint intern în virgul fix pe un octet, prin conven ie asociindu-
se 1 pentru valoarea adev rat i 0 pentru fals.
Se face, de asemenea, men iunea 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 cuvânt sau dou cuvinte) sau pe octe i. Ea poate fi algebric sau aritmetic .
Macheta de reprezentare pe un cuvânt este prezentat în figura 2.1, unde:

s M

15 14 2 1 0
a) Virgul fix algebric

15 14 2 1 0
b) Virgul fix aritmetic

Fig. 2.1. Reprezentarea în virgul fix

s este bitul de semn (s-a adoptat conven ia 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 program rii 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 ob ine astfel:
- se reprezint valoarea absolut a num rului în binar (cod direct). Fie aceasta N2;
- se realizeaz complementul fa de unu (cod invers) al lui N2. Complementul fa de unu
se ob ine prin inversarea fiec rui bit (0 în 1 i 1 în 0), inclusiv a bitului de semn. Fie num rul
ob inut N2*;
- se adun un unu la num rul reprezentat în cod invers (N2*) i astfel se ob ine
complementul fa de doi al lui N2.
Exemple:

Num rul –24 se reprezint astfel:


Se exprim 24 în cod direct:
0 0 ... ... 0 0 1 1 0 0 0
15 14 6 5 4 3 2 1 0

Se realizeaz complementul fa de unu:


1 1 ... ... 1 1 0 0 1 1 1
15 14 6 5 4 3 2 1 0
sau, exprimat în octal: 177747

Se adun unu la num rul reprezentat în complement fa de unu:


1 1 ... ... 1 1 0 1 0 0 0
15 14 6 5 4 3 2 1 0
sau, exprimat în octal: 177750.
Pentru determinarea complementului fa de doi se poate proceda, astfel: din bi ii
num rului 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 stânga
cuprinde bi ii r ma i; se complementeaz fa de 1 grupa din stânga, l sându-se nemodificat
grupa din dreapta.
Exemple:
Pentru simplificare se consider un cuvânt format din patru bi i:

Complementul fa de 2 pentru 0110:


01 10 - num r pozitiv (+6)
stânga dreapta
Rezultat: 10 10 - num r negativ (– 6)

Complementul fa de 2 pentru 1101:


110 1 - num r negativ (–3)
stânga dreapta
Rezultat: 001 1 - num r pozitiv (+3)

Considerându-se o zon de memorie de n bi i, valoarea care poate fi reprezentat algebric


apar ine mul imii [–2n–1, 2n–1–1] iar valoarea care poate fi reprezentat aritmetic apar ine mul imii
[0, 2n–1].
Bazele program rii 23

Reprezentarea în virgul mobil


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

semn caracteristic frac ie


1 bit 8 (11) bi i 23 (52) bi i

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

Ambele machete presupun c num rul de reprezentat are urm toarea exprimare binar
sub form tiin ific : m=(–1)s · 1,frac ie · 2exponent, unde s este valoarea bitului de semn (1 pentru
mantis negativ i 0 pentru mantis pozitiv ) iar frac ie este partea frac ionar a mantisei.
Mantisa este normalizat i are întotdeauna forma 1,frac ie, ceea ce înseamn c ea are
valori în intervalul [1,2). Pentru ca mantisa s fie adus la aceast form se modific în mod
corespunz tor exponentul num rului 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. Frac ia se reprezint intern sub forma semn-m rime (nu în cod complementar).
Pentru a nu se utiliza doi bi i de semn (unul pentru mantis i altul pentru exponent),
conven ia 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 num rul –75,375.
–75,375 = –1001011,011(2) = –1,001011011*26
s=1
mantisa = 1,001011011(2)
frac ia = 001011011(2)
caracteristica = 6 + 127 = 133 = 10000101(2)
Reprezentarea intern : 1 10000101 00101101100000000000000

Caracteristica are urm toarele valori normale:


0 < caracteristic < 255 pentru simpl precizie
0 < caracteristic < 2047 pentru dubl precizie.
Când caracteristica are valoarea zero, num rul reprezentat intern (m) este zero. Când
caracteristica este 255 (respectiv 2047) se consider dep ire virgul mobil . Caracteristicile
reprezent rilor interne virgul mobil simpl i dubl precizie sunt prezentate în tabelul 2.1.

Tabelul 2.1. Caracteristicile datelor reprezentate virgul mobil


Tip reprezentare
Caracteristici
Simpl precizie Dubl precizie
Num r bi i pentru
reprezentare 8 11
caracteristic
Num r bi i pentru 23 52
Bazele program rii 24

Tip reprezentare
Caracteristici
Simpl precizie Dubl precizie
reprezentare frac ie
Valoarea minim
1 1
caracteristic
Valoarea maxim
254 2047
caracteristic
Eroare maxim frac ie 2-24 10-7 2-24 10-7
Cel mai mic num r
21-127 10-38 21-1023 10-307
pozitiv
Cel mai mare num r
2·2254-127 1038 2·22047-1023 10307
pozitiv
Domeniu de
[–1038 , 1038] [–10307 , 10307]
reprezentare

Prelucrarea datelor i instruc iunilor de c tre unitatea central


Pentru în elegerea modului în care datele i instruc iunile sunt prelucrate de unitatea
central , se consider c memoria con ine, din punctul de vedere al programatorului, date (D) i
instruc iuni (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

A a dup cum s-a ar tat, instruc iunile sunt prelucrate de UCC. Înc rcarea instruc iunilor
în UCC se realizeaz automat. Pentru a lansa un program în execu ie, UCC trebuie s "cunoasc "
adresa primei instruc iuni de executat (adresa de start). Acesta este motivul pentru care în unele
limbaje de programare este obligatorie etichetarea primei instruc iuni executabile. În exemplul
din figura 1.9. se presupune c adresa de start a programului este 47068. Aceast adres este
înc rcat în contorul de adrese (un registru special numit program counter - PC).
În UCC este înc rcat întotdeauna instruc iunea aflat la adresa precizat de PC. Registrul
PC este incrementat automat, fiind astfel preg tit s adreseze urm toarea instruc iune. Deci, dup
ce se execut instruc iunea I1, con inutul lui PC devine 47108. Se încarc în UCC instruc iunea I2.
Dup execu ia acesteia, PC va con ine adresa 47128. De i la aceast adres este memorat o dat ,
ea este înc rcat în UCC i, prin urmare, este tratat ca instruc iune. Se pot ivi urm toarele
situa ii:
- con inutul lui D4, printr-o întâmplare, coincide cu o instruc iune a unit ii centrale, caz în
care este executat ca atare i con inutul lui PC este autoincrementat;
- con inutul lui D4 nu coincide cu nici o instruc iune acceptat de unitatea central , caz în
care programul este abandonat (terminare anormal ).
Prin acest exemplu s-a ar tat cum data este tratat de calculator ca instruc iune. Deci, prin
actualizarea contorului de adrese dup execu ia fiec rei instruc iuni, se asigur înl n uirea
normal a instruc iunilor din program (derularea programului în secven ). Cum se poate proceda
Bazele program rii 25

atunci când nu se face parcurgerea în secven i este nevoie s se sar peste câteva cuvinte de
memorie pentru a ajunge la instruc iunea dorit ? Programatorul are la dispozi ie instruc iunile de
salt, prin folosirea c rora se asigur întreruperea secven ei normale de program, prin înc rcarea
for at în PC a adresei la care se g se te instruc iunea de executat.
Se presupune c instruc iunea I2 este: SALT LA 47168. Dup ce se execut instruc iunea
I1, contorul de loca ii devine 47108. Se execut , în secven , instruc iunea I2 care pune contorul
de adrese pe valoarea 47168 (fiind o instruc iune de salt).
Prin urmare, în UCC se încarc instruc iunea I3 .a.m.d. În exemplul anterior s-a
considerat c toate instruc iunile au lungimea de un cuvânt. În secven a logic a programului,
ultima instruc iune trebuie s fie de tip STOP.
Dup extragerea instruc iunii din memorie (prima etap în prelucrarea unei instruc iuni)
se execut urm toarele etape: calculul adresei operandului; efectuarea opera iei propriu-zise,
precizat de instruc iune.
În cadrul fiec rei etape se execut un anumit num r de faze. Indiferent de modul de
realizare a fazelor (prin macroinstruc iuni sau prin func iuni cablate), principial, modul de
prelucrare a unei instruc iuni este asem n tor. Se consider c în UCC se g se te instruc iune I3:
ADUNA (4704) cu (4712) care adun con inutul de la adresa 47048 cu con inutul de la adresa
47128 iar rezultatul se depune la adresa celui de-al doilea operand. Pentru a în elege modul cum
se execut aceast instruc iune se presupune c UAL este format din dou registre (sumatoare),
în care se realizeaz calcule. Instruc iunea I3 poate fi descompus în urm torii pa i (figura 2.4.):
- preia con inutul operandului surs de la adresa 47048 (D3) într-un sumator;
- preia con inutul operandului destina ie de la adresa 47128 (D4) în al doilea sumator;
- efectueaz calculul între cele dou sumatoare, cu rezultatul în S1;
- depune con inutul sumatorului S1 în memorie la adresa 47128.
În mod similar se pot interpreta i alte opera ii de calcul. Toate opera iile realizate asupra
datelor se efectueaz în unitatea aritmetico-logic . Aceast afirma ie este valabil i în cazul
uneia din cele mai simple opera ii: MUTA (47148) IN (47008), care se descompune astfel:
- preia operandul surs de la adresa 47148 (D5) în sumatorul S1;
- depune con inutul sumatorului S1 în memorie la adresa 47008 (D1 se pierde, depunându-
se peste el D5).
Ce se va întâmpla în cazul instruc iunii ADUNA (47008) cu (47108)? R spuns: con inutul
de la adresa 47108 (I2) este tratat ca dat .

D1 D2 D3 I1 I2 D4 D5 I3 D6 I4
4700 4702 4704 4706 4710 4712 4714 4716 4720 4722 4726

S1 PC 4716

+
S2 adun (4704) cu (4712) (I3)

UAL UCC

Fig. 2.4. Prelucrarea unei instruc iuni

Prin acest exemplu s-a v zut cum instruc iunea este tratat ca dat i, mai mult, cum un
program î i poate modifica instruc iunile proprii. Nu toate limbajele de programare ofer
posibilitatea intercal rii în memorie a datelor i instruc iunilor. De fapt, aceast intercalare nici nu
Bazele program rii 26

este recomandat , având în vedere gestionarea greoaie a tipurilor de informa ii: date i
instruc iuni.
Instruc iunile pot adresa operanzii direct sau indirect. La adresarea indirect (figura 2.5),
instruc iunea memoreaz adresa unei zone care stocheaz adresa operandului.

Instruc iune Pointer


Adres 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.

Opera ii de intrare/ie ire


Opera iile de intrare/ie ire realizeaz citirea - introducerea datelor în memorie - i
scrierea - extragerea datelor din memorie. Deoarece datele pot fi prelucrate doar dac se g sesc
în memoria intern , apare ca necesar opera ia de citire prin care se transfer datele furnizate de
utilizator. Cum toate opera iile î i depun rezultatul în memoria intern , punerea lor la dispozi ia
utilizatorilor necesit opera ia de scriere. Elementele care definesc o instruc iune 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 coresponden ei dintre un num r reprezentat
ASCII pe un suport extern i acela i num r reprezentat intern virgul fix sau virgul mobil este
prezentat schematic în figura 2.6.
Fie a∈A⊆ℜ. Aplica ia f este o codificare bijectiv a mul imii A într-o mul ime de coduri
reprezentabile pe un suport intern (de exemplu, o codificare în virgul fix sau în virgul mobil ).
Fiecare num r din A se reprezint pe un suport extern sub forma unui ir de caractere (caracterele
apar in unei mul imi K). Imaginea pe suportul extern a unui num r a∈A 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 mul imea imaginilor pe suportul extern de intrare pentru elementul a∈A. În figura 1.11 s-a
presupus c imaginea num rului a∈A pe suportul extern de intrare este irul de caractere a1, a2, ...
, an.
Aplica ia este o codificare standard a mul imii K de caractere (ASCII). irul c1,c2...cn
rezult din irul a1, a2,...an prin aplicarea func iei fiec rui caracter ai, i=1,2,...n. Se noteaz cu Ca
mul imea irurilor de coduri care se ob ine din elementele lui Ia prin aplicarea func iei , în modul
descris anterior.
Bazele program rii 27

Suport extern
a a1 a2 ... an
de intrare

c1 c2 cn

f(a) Suport intern


*

f -1 c1* c 2* cn*

-1 -2 -3

a Suport extern
a* 1* a2 * ... an*
de ie ire

Fig. 2.6. Coresponden a între reprezentarea extern i intern a datelor

Pentru orice a∈A se define te func ia :{Ca | a∈A } → {f(a) | a∈A} dat de (Ca)=f(a).
Alegerea func iei depinde de f i de mul imea {Ia | a∈A }. Se observ , deci, c func ia f se
realizeaz în calculator prin intermediul func iilor i . Aceste func ii sunt realizate pe baza
unor instruc iuni precizate de programator. Analog se poate analiza func ia 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. Num rul în zecimal a c rui reprezentare intern în VF algebric este 10001111 este:
a) 143; b) –15; c) –143; d) –113; e) 113.
3. Opera ia de scriere desemneaz : a) afi area datelor pe monitor; b) scrierea datelor
pe supor i magnetici; c) transferul datelor între zone de memorie principal ; d)
transferul datelor din memoria principal pe supor i externi; e) transferul
datelor în buffer.

2.2. Structuri de date

În afara datelor scalare, în aplica iile practice se utilizeaz colec ii de date. Între elementele
unei colec ii de date pot fi identificate sau, eventual, pot fi introduse rela ii care s determine pe
mul imea respectiv o anumit structur , adic un mod de ordonare, astfel încât s se faciliteze
prelucrarea. O colec ie 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 st t toare,
individualizabil prin nume, ale c rei componente î i men in propriet ile (tipul). Selectarea
componentelor unei structuri se poate realiza folosind identificatorii asocia i acestora (accesul prin
nume) sau prin pozi ia 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 f r a ine seama de celelalte componente; structuri cu acces
Bazele program rii 28

secven ial, 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 împ r ite în omogene, când
componentele sunt de acela i tip i neomogene, când 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 acela i tip, se spune c structura respectiv de date este recursiv .
Structurile de date se pot reg si în memoria intern (structuri interne) sau pe un purt tor
extern (band magnetic , disc magnetic, dischet etc.), caz în care se numesc structuri externe
(fi iere).
Dac în reprezentarea structurii de date pe suportul de memorie se înregistreaz ,
împreun cu componentele acesteia, i date care materializeaz rela iile de ordonare, se spune c
aceasta este o structur explicit (altfel, este implicit ), iar datele suplimentare, de obicei adrese, se
numesc referin e sau pointeri. Necesitatea acestor date suplimentare apare în cazul reprezent rii
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 aceea i organizare i sunt supuse acelora i opera ii formeaz un anumit
tip de structur de date, extinzând no iunea de tip de dat i asupra mul imilor ordonate de date.
În func ie 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
compil rii. Pentru datele de tip dinamic, zonele de memorie sunt alocate în momentul execu iei, în
func ie de necesit i, fiind posibil chiar eliberarea memoriei ocupate de unele date. Tipul dinamic
corespunde tipului referin (pointer).

Structuri statice de date


Pe lâng datele elementare (scalare), fie ele constante sau variabile, frecvent este necesar
introducerea în memoria intern a unor colec ii de date între elementele c rora exist anumite
rela ii. Practica program rii a impus, ca structuri de date frecvent utilizate, masivul (tabloul) i
articolul. Aceste structuri î i dovedesc utilitatea în aproape toate aplica iile practice, ceea ce explic
implementarea lor - cu unele diferen e i particularit i - î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
construc ie sintactic numit variabil indexat , format din numele masivului i un num r de
expresii indiciale (indici) corespunzând dimensiunilor acestuia.
Diversele limbaje de programare implementeaz structura de masiv în modalit i diferite.
Limbajul C, care face obiectul acestei lucr ri, le implementeaz necontiguu, bazându-se pe
adresarea prin pointeri.

Articolul este o structur de date eterogen , de tip arborescent (figura 2.2.).


Componentele structurii arborescente, numite câmpuri, sunt individualizate prin nume. Rela ia de
ordine ierarhic dintre câmpuri se precizeaz fie prin numere de nivel, fie prin incluziuni de articole
în articole.
Articolul este o structur cu acces direct, adic fiecare câmp (elementar sau grupat) poate fi
referit direct prin numele s u, f r a face referiri la celelalte elemente din structura înregistr rii.
Articolul este o structur recursiv , deoarece datele de grup din interiorul ei corespunzând unor
Bazele program rii 29

subarbori, conserv acelea i propriet i ca i structura în ansamblul s u. Una din principalele


utiliz ri ale acestei structuri de date apare în leg tur cu fi ierele.
Elementele din structura înregistr rii sunt:
• câmpuri elementare corespunzând nodurilor terminale de pe fiecare ramur a arborelui (în
exemplul din figura 2.7: MARCA, NUME, ZI, LUNA, AN, OCUPATIE, SECTIE, ATELIER,
ECHIPA);
• câmpuri grupate (date de grup), corespunzând nodurilor neterminale (DATA–
INCADRARII, LOC–MUNCA) i, în ultim instan , chiar r d cinii (PERSOANA).
NIVEL
PERSOANA ………………………………….…1

MARCA NUME DATA ÎNCADR. OCUPA IE LOC DE MUNCA .…2

ZI LUNA AN SECTIE ATELIER 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 stânga la dreapta, cu condi ia descrierii complete a
fiec rui 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 limit rilor la care sunt supuse. În primul rând, spa iul de
memorie aferent unor astfel de date se define te i se rezerv în momentul compil rii programului (rezervare
static ), la o dimensiune maxim (cuprinz toare). Spa iul nu poate fi disponibilizat i nici împ r it cu alte
date, chiar dac nu este în întregime utilizat în anumite momente ale execu iei programului. În al doilea rând,
componentele structurilor statice ocup locuri prestabilite în spa iul rezervat, determinate de rela ia de
ordonare specific fiec rei structuri. În al treilea rând, limbajele de programare definesc opera iile admise cu
valorile componentelor, potrivit tipului de baz al structurii, astfel încât num rul 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 mul ime nevid
iar E este o submul ime (posibil vid ) a mul imii perechilor neordonate cu componente distincte
din V. Obiectele mul imii V se numesc vârfuri, iar obiectele mul imii E se numesc muchii. Dac
e=(u,v) ∈ E se spune c muchia e are ca extremit i u i v (este determinat de vârfurile u i v).
Graful G=(V,E) este finit dac V este o mul ime 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 par ial al lui G1 dac V2=V1.
Un graf orientat (digraf) este o structur D=(V,E), unde V este o mul ime nevid de
obiecte numite conven ional vârfuri, iar E este o mul ime (posibil vid ) de perechi ordonate cu
componente elemente distincte din V. Conven ional, elementele mul imii E sunt numite arce sau
muchii ordonate. Terminologia utilizat relativ la digrafuri este similar celei corespunz toare
grafurilor.
Bazele program rii 30

Se nume te graf ponderat o structur (V,E,W), unde G=(V,E) este un graf, iar W o
func ie, W : E → (0, ∞ ) . Func ia W este numit pondere i asociaz fiec rei muchii a grafului un
cost/câ tig al parcurgerii ei.
Fie G=(V,E) un graf, u,v∈V. Secven a de vârfuri Γ: u0, u1,..,un este un u-v drum dac
u0=u, un=v, uiui+1∈E pentru i∈[0,n]. Lungimea drumului, notat l(Γ) este egal cu n.
Conven ional, se nume te drum trivial, un drum Γ cu l(Γ)=0.
Cea mai simpl reprezentare a unui graf este cea intuitiv , grafic : fiecare vârf 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, având ca extremit i
punctele corespunz toare vârfurilor care le determin .
Exemple:
1

4
1. Fie G = (V, E) un graf cu V = {1, 2, 2
3, 4, 5}, E = {(1,2),(1,3),(2,5),(3,5)}.
O posibil reprezentare grafic este:

3 5

De i acest mod de reprezentare este foarte comod i sugestiv în special în cazul grafurilor
cu num r mic de vârfuri, pentru prelucr ri cu ajutorul calculatorului sunt necesare reprezent ri
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 vârfuri 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 asem n toare celei prezentate
anterior. Matricea ponderilor unui graf ponderat G=(V,E,W), V = n , W∈Mnxn((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
semnifica ia de câ tig, respectiv α = ∞ dac are semnifica ia de pierdere, în cazul în care se
dore te reprezentarea costurilor ca ponderi ale grafului.
Una dintre cele mai importante propriet i ale grafurilor o constituie posibilitatea de
accesare, prin intermediul unei secven e de muchii (arce), a oric rui vârf al grafului plecând
dintr-un vârf 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 nume te drum deschis. Drumul Γ este elementar dac oricare dou vârfuri din Γ
Bazele program rii 31

sunt distincte, cu excep ia, eventual, a extremit ilor. 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, v2

v5, v3, v4 este un v1-v4 drum care nu


este proces; Γ2: v1, v2, v5, v1, v3, v4 G:
v5 v4
este un v1-v4 proces care nu este
drum elementar; Γ3: v1, v3, v4 este un
v1-v4 drum elementar. v1 v3

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 încât ui=vj. Orice drum cu
lungime cel pu in 1 con ine cel pu in un drum elementar cu acelea i extremit i. Într-adev r, dac
Γ: u0,u1,..,un nu este elementar, atunci exist 0 ≤ i < j ≤ n i i ≠ 0 sau j ≠ n astfel încât ui=uj.
u j u j+1 ...u n , dac i = 0
Atunci drumul Γ ' : u 0 u 1 ...u i , dac j = 0 este de asemenea un u0-un drum.
u 0 u 1 ...u i u j+1 ...u n , dac i ≠ 0, j ≠ n
Aplicând în continuare eliminarea duplicatelor vârfurilor în modul descris, rezult în final un u0-
un drum elementar.
Exemplu:
v2 v6 v7

v1 v4
4. În graful v5 v8 v10

v3 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,
( p)
pentru orice p≥1, a ij este num rul vi-vj drumurilor distincte de lungime p din graful G, unde
A = (a ) .
p ( p)
ij

Fie Mn({0,1)} mul imea matricelor de dimensiuni nxn, componentele fiind elemente din
mul imea {0,1}. Pe Mn({0,1)}se definesc opera iile 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 ij( k ) ); k ≥ 1}
secven a de matrice definit prin:
(1) ( k −1)
A = A, A = A ⊗ A , (∀) k ≥ 2 .
k

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 program rii 32

(1) ( 2) ( n −1)
Matricea M = A ⊕ A ⊕ ⊕ A se nume te matricea existen ei drumurilor în graful
G. Semnifica ia 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

2
5. Pentru graful: 4

0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
1 0 0 0 2 0 1 1 1 3 1 0 1 1 1 1 1 1
A= , A = , A = , M=
1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1

Calculul matricei existen ei 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,v∈V i Γ un u-v drum în G. Γ se nume te 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 n≥3 este un ciclu al
grafului dac , pentru orice i, j, cu 1 ≤ i, j ≤ n , i ≠ j , rezult vi≠vj. Orice ciclu este un drum
elementar închis. Graful G este aciclic dac nu exist cicluri în G.
Într-un digraf D no iunile de proces, circuit, ciclu sunt definite ca i în cazul
grafurilor.

Exemple:
6. În graful
v1 Γ 1: v1, v2, v3, v6, v5 este un proces;
v4 v2 Γ 2: v1, v2, v3, v6, v5, v3, v4, v1 este
un circuit i nu este ciclu;
Γ 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
aplica ii 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
este arbore, deoarece pentru orice pereche
Graful 4 2 5 de vârfuri i,j, 1 ≤ i,j ≤ 6, i j, exist un i-j
drum i graful nu con ine cicluri.
6
Bazele program rii 33

Verificarea propriet ii unui graf de a fi arbore poate fi efectuat pe baza unor algoritmi
care s verifice calit ile de conexitate i aciclicitate. Aceea i verificare poate fi realizat i pe
baza propriet ilor 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 verific rii dac un graf este arbore revine la
verificarea aciclicit ii grafului i a rela iei existente între num rul vârfurilor i num rul
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. Urm toarele afirma ii sunt echivalente:
1. G este graf arbore
2. G este graf conex minimal (oricare ar fi e∈E, prin eliminarea muchiei e graful
rezultat nu este conex)
3. G este graf aciclic maximal (prin ad ugarea unei noi muchii în graf rezult cel
pu in un ciclu).
Un graf orientat D=(V,E) cu proprietatea c pentru orice u, v ∈ V dac uv∈E, atunci
vu ∉ E se nume te graf asimetric. Digraful D este simetric dac (∀) u, v ∈ V, uv∈E, dac i numai
dac vu∈E.
Fie D=(V,E) digraf netrivial. Graful G=(V,E’), unde E’={uv | uv∈E sau vu∈E} se
nume te graf suport al digrafului D.
Un arbore orientat este un arbore direc ionat cu r d cin . Deoarece un arbore orientat este un caz
particular de digraf, pentru reprezentarea lui poate fi utilizat oricare din modalit ile de
reprezentare a grafurilor. În plus exist i posibilitatea ob inerii unor reprezent ri mai eficiente
pentru acest tip de graf. Una dintre modalit i este reprezentarea FIU-FRATE, care const în
numerotarea conven ional a vârfurilor grafului i în re inerea, pentru fiecare vârf i al arborelui, a
urm toarelor informa ii:
FIU(i), care reprezint num rul ata at primului descendent al vârfului i;
FRATE(i), care reprezint num rul ata at vârfului descendent al tat lui vârfului i i care
urmeaz imediat lui i;
INF(i), care reprezint informa ia ata at vârfului i (de obicei valoarea i).
Pentru reprezentarea arborelui se re ine r d cina i num rul nodurilor. Absen a “fiului”,
respectiv a “fratelui” unui vârf este marcat printr-o valoare diferit de numerele ata ate
vârfurilor (de obicei valoarea 0).
Exemplu:
1
Urm torul arbore orientat este reprezentat astfel:
N=15 (num rul de noduri ale arborelui);
2
R=1(r d cina); FIU=(2,5,7,9,0,10,0,0,13,0,0,0, 3 4

0,0,0), “fiul” lui 1 este 2, iar vârful 9 are “fiul” 5 6 7 8 9

13; FRATE=(0,3,4,0,6,0,8,0,0,11,12,0,14,15, 0), 10 11 12 13 14 15


vârful 1 nu are frate, iar vârful 14 are fratele 15.

O parcurgere revine la aplicarea sistematic a unei reguli de vizitare a vârfurilor grafului.


Cele mai uzuale reguli de parcurgere a arborilor orienta i sunt prezentate în continuare.
A. Parcurgerea în A-preordine presupune ini ial vârful curent ca fiind r d cina arborelui. Se
viziteaz vârful curent i sunt identifica i descenden ii lui. Se aplic aceea i regul de vizitare
pentru arborii având ca r d cini descenden ii vârfului curent, arborii fiind vizita i în ordinea dat
de numerele ata ate vârfurilor r d cin corespunz toare.
Bazele program rii 34

B. Parcurgerea A-postordine difer de parcurgerea în A-preordine numai prin faptul c r d cina


fiec rui arbore este vizitat dup ce au fost vizitate toate celelalte vârfuri ale arborelui.
Not : Parcurgerile în A-preordine i A-postordine sunt variante de parcurgeri în
adâncime, în cazul ambelor metode fiind prioritare vârfurile aflate la distan maxim fa
de r d cina arborelui ini ial.
C. Parcurgerea pe niveluri. Un vârf v al unui arbore orientat cu r d cin r se afl pe nivelul i al
arborelui, dac distan a de la vârf la r d cin (lungimea r-v drumului) este egal cu i. R d cina
arborelui este de nivel 0. Parcurgerea pe niveluri a unui arbore orientat const în vizitarea
vârfurilor sale în ordinea cresc toare a distan elor fa de r d cin .

Un arbore binar este un arbore orientat cu proprietatea c orice vârf v are maxim doi
descenden i (od(v)≤2). În cazul od(v)=2, cei doi descenden i sunt desemna i ca descendent stâng
(fiu stânga), respectiv descendent drept (fiu dreapta). Pentru vârfurile cu od(v)=1, unicul
descendent este specificat fie ca fiu stânga, fie ca fiu dreapta.
Se nume te nod terminal (frunz ) orice vârf v al arborelui cu od(v)=0. Nodul v este
neterminal dac od(v)>0. Reprezentarea unui arbore binar poate fi realizat prin re inerea, pentru
fiecare nod, a leg turilor c tre descenden ii lui, absen a unui descendent putând fi reprezentat
prin valoarea nul (nil).

leg tur fiu


identificator nod leg tur fiu stânga
dreapta

Datorit particularit ii lor, arborii binari ofer posibilitatea aplic rii de noi metode de
parcurgere (pe lâng 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 stâng i drept corespunz tori vârfului curent, care la
momentul ini ial este chiar r d cina arborelui. Diferen a între aceste trei tipuri de parcurgere
este dat de momentul în care devine vizitat fiecare vârf al arborelui. În parcurgerea RSD
(r d cin -subarbore stâng-subarbore drept), fiecare vârf al arborelui este vizitat în momentul
în care devine vârf curent. În parcurgerea SRD (subarbore stâng-r d cin -subarbore drept),
vizitarea vârfului este efectuat dup ce a fost parcurs subarborele stâng. În parcurgerea SDR
(subarbore stâng-subarbore drept-r d cin ) vizitarea fiec rui vârf este efectuat dup ce au
fost parcur i subarborii aferen i lui.

Exemplu:
Pentru arborele de la exemplul anterior, secven ele de vârfuri 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 con ine dou p r i distincte: o parte de informa ie util (memorat în nodul
respectiv) i o parte de informa ie de leg tur (folosit pentru a identifica în memorie urm torul
nod din list ).
Bazele program rii 35

Grafurile pot fi reprezentate prin intermediul listelor, permi ând utilizarea economic a
spa iului de memorare i, în anumite cazuri, implement ri mai eficiente pentru anumite clase de
algoritmi. Vârfurile grafului se memoreaz într-o list , fiecare celul a listei având o leg tur
c tre lista vecinilor acelui vârf (vârfurile din graf adiacente cu vârful corespunz tor acelei celule
i indicat ca informa ie util ).
În cele ce urmeaz se consider un spa iu oarecare de memorie adresabil . Se noteaz
mul imea referin elor din acest spa iu cu P i se ad ug la ea o valoare referin special , notat
nil. Se noteaz cu D mul imea informa iilor care vor fi con inute de nodurile unei liste. În aceste
condi ii, un nod poate fi desemnat prin perechea (di,pi) cu di ∉ D i pi ∉ P.

O mul ime L a = {(d i , s i ) d i ∈ D,s i ∈ P} este o list simplu înl n uit (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, informa iile de leg tur (pointerii) vor fi
marcate prin s geat , iar nil prin leg tur la p mânt (figura 2.8.a).
dn dn-1 … d2 d1

C a)

C B

dn dn-1 … d2 d1
b)

Fig. 2.8. Liste simplu (a) i dublu (b) înl n uite

O mul ime L s = {(p i , d i , s i ) d i ∈ D,p i , s i ∈ P} este o list dublu înl n uit (sau simetric )
dac pe Ls s-a definit atât o structur liniar direct , cât i inversa sa i s1=pn=nil, iar si, i ≠ 1 i
pi, i ≠ n sunt referin e spre succesorii direc i în ordinea specific (figura 2.3.b).
În cazul listelor dublu înl n uite, un nod cuprinde dou referin e, fiind posibil
cunoa terea atât a predecesorului, cât i a succesorului imediat. Se remarc , din defini ie, c
nodurile unei liste pot ap rea dispersate în spa iul de memorare, iar referin ele creeaz
mecanismul care le leag . De aici deriv i atributul de înl n uit , care o deosebe te de cazul
particular, denumit list dens . La o list dens nodurile sunt dispuse adiacent în spa iul de
memorare i informa iile de leg tur , adic referin ele, devin de prisos (ca în cazul vectorilor).
Pentru listele înl n uite, nodurile pot fi plasate în memoria calculatorului în zone diferite,
informa ia de leg tur din fiecare nod asigurând reg sirea nodului urm tor (pentru liste
asimetrice) respectiv a nodului urm tor i succesor (pentru liste simetrice). Pentru a putea lucra
cu aceste liste este nevoie s se cunoasc o singur informa ie: adresa primului nod din list ,
numit în continuare capul listei. În acest sens se asociaz listei o referin C, care con ine fie
adresa acestui nod, fie nil, dac lista este vid . Spunem c o list este complet identificat dac se
cunoa te adresa primului nod al s u i structura unui nod.
Asupra unei liste se pot realiza o multitudine de opera ii: traversare, c utare nod,
num rare noduri etc. Sunt îns tipice opera iile de inserare (ad ugare) i tergere de noduri,
deoarece dau însu i caracterul dinamic al acestor structuri. Prin inser ri i tergeri o list „cre te”
i „descre te” în timp (ca num r de noduri), solicitând spa iu pentru noile componente i
Bazele program rii 36

eliberând spa iul ocupat de componentele terse. Astfel, structura i num rul de noduri ale listei
sufer o permanent schimbare.
1. Traversarea. Localizarea unui nod prin traversare este o opera ie de c utare. Scopul este
de a g si un nod care s con in în partea de informa ie util anumite date. Opera ia de c utare se
poate încheia cu succes, adic cu localizarea unui astfel de nod sau f r succes, în cazul în care
lista este vid sau nu exist un nod care con ine informa iile cerute.
2. Inserarea. Inserarea unui nod într-o list înl n uit se poate realiza cu verificarea
existen ei anterioare a nodului în list , caz în care nu se mai face inserarea, sau f r 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 sfâr itul 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 leg turilor între noduri în ambele sensuri. Singura diferen fa de inserarea într-o list
asimetric este înscrierea informa iei despre nodul precedent. Deoarece inserarea are loc la
începutul listei, nu va exista un nod precedent, deci informa ia respectiv va primi valoarea nil.
Primul nod din lista ini ial 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

3
2

1 a)
p

cap

4 2
2 b)
1
p

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

Inserarea unui nod la sfâr itul listei. Pentru ad ugarea unui nod la sfâr itul listei se
creeaz întâi un nod nou cu informa ia util care trebuie inserat . Deoarece va fi ultimul nod în
list , nu exist un nod urm tor deci informa ia de leg tur spre nodul urm tor 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, informa ia de
leg tur din acesta primind ca valoare adresa noului nod creat. În cazul unei liste simetrice
trebuie creat i leg tura în sens invers (figura 2.10).
Bazele program rii 37

cap

a)
p

cap

b)
p

Fig. 2.10. Inserarea la sfâr itul listelor asimetrice (a) i simetrice (b)
Inserarea dup un anumit nod al listei. Prima opera ie necesar inser rii este localizarea
nodului dup care se face inserarea. Acesta poate fi localizat în mai multe feluri: în mod exact,
prin furnizarea unei chei a c rei valoare trebuie s se reg seasc în informa ia util a nodului
c utat, sau relativ, prin stabilirea unei condi ii care trebuie s fie îndeplinit de nod. În continuare
vom considera cazul c ut rii dup cheie. Dac nu se g se te nici un nod care s corespund
criteriului de c utare (cazul c ut rii cu e ec) sunt posibile mai multe decizii: nu se insereaz noul
nod, se insereaz la începutul listei sau se insereaz la sfâr itul listei. Inserarea înseamn
„ruperea” unei leg turi între dou noduri i crearea unor noi leg turi astfel ca noul nod s se
interpun în list între cele dou noduri a c ror leg tur a fost „rupt ”, conform figurii 2.11.

r p r p

2 1 2 4
3 1
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 u or din punct
de vedere algoritmic dac ea prive te nodul cap de list , deoarece se reduce, în principiu, la
actualizarea referin ei de cap. Dac trebuie ters un nod interior listei, atunci tergerea propriu-
zis trebuie precedat de o c utare dup con inutul informa ional al nodurilor. Dac listele simplu
înl n uite pot fi traversate într-un singur sens, în momentul în care s-a localizat nodul p de ters
nu se mai cunoa te precedentul s u q care, pentru eliminarea nodului p, trebuie s fie legat de
succesorul acestuia (figura 2.12.a). Datorit acestei situa ii, este necesar introducerea unei
referin e suplimentare q care, în procesul de traversare, s fie în urma lui p cu un nod. De aceea,
p se nume te referin de urm rire. Ini ial, când p=nil, se atribuie aceea i valoare lui q. Se
precede atribuirea de valoare pentru p care schimb nodul curent, de atribuirea q=p.
Bazele program rii 38

1
q

f p

a) Liste asimetrice

q 2 r
p

1
b) Liste simetrice

Fig. 2.12. tergere în liste înl n uite

2.4.4. Stive i cozi


Stivele i cozile sunt liste particulare din punctul de vedere al opera iilor de tergere i
inserare ale nodurilor din list .
Stiva (stack) este o list asimetric (figura 2.13.a) la care opera iile de inserare, tergere
i citire a informa iilor se fac numai în capul listei (top). Stivele se mai numesc i liste LIFO
(Last-In-First-Out - ultimul intrat, primul ie it), având în vedere c orice acces se poate face
numai la ultimul nod inserat. Acesta poate fi citit, ters sau în fa a 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
scândurile într-un depozit etc. Stiva este o structur frecvent folosit în gestionarea dinamic a
spa iului 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 opera ia de inserare se face la un cap t,
denumit spatele cozii, iar tergerea i citirea se fac de la cel lalt cap t, denumit fa a cozii (figura
2.13.b). Coada este denumit i list FIFO (First-In-First-Out - primul intrat, primul ie it) având
î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 întâlnite în
diferite situa ii: cozi de persoane, cozi de automobile etc.

inserare
citire dn dn-1 … d2 d1
tergere

C a)
stiva
FA SPATE
citire dn dn-1 … d2 d1 inserare
tergere

b) S
F coad

Fig. 2.13. Stiv i coad

În timp ce pentru a trata corect o stiv este suficient o referin spre top, pentru coad
trebuie men inute dou referin e: una pentru fa a (f) i alta pentru spatele cozii (s). O coad este
vid atunci când f=s=nil.
Bazele program rii 39

Teste de autoevaluare

4. Structura de date se define te ca: a) o colec ie de date pe care s-a definit un


mecanism de selectare a componentelor; b) o colec ie de date la care o
component este independent de celelalte; c) o colec ie de date compus din
subcolec ii de acela i tip; d) o colec ie de date compus din subcolec ii de tipuri
diferite; e) o colec ie recursiv de date.
5. Masivul este o structur : a) recursiv ; b) omogen cu acces secven ial; c) omogen
cu acces direct; d) eterogen cu acces secven ial; e) eterogen cu acces direct.
6. Articolul este o structur : a) dinamic ; b) omogen cu acces secven ial; c) omogen
cu acces direct; d) eterogen cu acces secven ial; 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.

R spunsuri i comentarii la testele de autoevaluare

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

Rezumat
În cadrul acestei unit i de înv are au fost studiate urm toarele aspecte în ceea ce prive te datele
i structurile de date:
cuno tin e teoretice privind conceptele de informa ie, dat , cuno tin ;
modalit i de reprezentare intern a datelor;
structuri statice i dinamice de date.
Dup încheierea acestei unit i de înv are, studen ii au cuno tin e i abilit i de reprezentare a
datelor i a structurilor de date.

Bibliografia unit ii de înv are


1. I. Gh. Ro ca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, M. Mircea, L. B t gan, C. Silvestru,
Bazele program rii calculatoarelor. Teorie i aplica ii în C, Ed. ASE, Bucure ti, 2006, ISBN 973-594-591-
6
2. I. Gh. Ro ca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, Programarea calculatoarelor. tiin a
înv rii unui limbaj de programare, Teorie i aplica ii, Ed. ASE, 2003
Bazele program rii 40

3. Etapele rezolv rii problemelor cu calculatorul

Cuprins
Obiectivele unit ii de înv are 3
3.1. Caracteristici generale ale PPAD
3.2. Fazele dezvolt rii programelor
R spunsuri i comentarii la testele de autoevaluare
Bibliografia unit ii de înv are

Obiectivele unit ii de înv are 3


Dupa studiul acestei unitati de învatare, studen ii vor avea cuno tin e teoretice i abilit i practice
despre:
caracteristici generale ale PPAD;
organizarea procesului de rezolvare a PPAD;
fazele dezvolt rii programelor.

Durata medie a unit ii de studiu individual - 2 ore

3.1. Caracteristici generale ale PPAD

„Probleme de prelucrare automat a datelor” (PPAD) este o denumire generic pentru


aplica iile practice ale informaticii în economie sau în alte domenii de activitate. Având în vedere
marea diversitate a PPAD, în cele ce urmeaz se propune o structurare pe clase a acestora i se
analizeaz tipurile de solu ii între care se poate alege în procesul de informatizare. Aplica iile
informatice acoper un evantai foarte larg de situa ii, ale c rui extreme pot fi caracterizate astfel:
a) existen a unui volum relativ redus de date de intrare i de ie ire, dublat de calcule
laborioase (aplica ii tehnico-inginere ti, care conduc la solu ii bazate pe aproxim ri succesive,
exprimate matematic prin ecua ii algebrice i transcendente, sisteme de ecua ii liniare, ecua ii
diferen iale, integrale, adic , într-o formulare global , aplica ii bazate pe metode de calcul
numeric);
b) existen a unui volum mare de date de intrare i de ie ire, asociat uzual cu calcule de
complexitate redus (eviden a materialelor, eviden a personalului i calculul salariilor, eviden a
mijloacelor fixe, urm rirea realiz rii produc iei, a contractelor de aprovizionare/desfacere etc.,
adic , în general, aplica ii de gestiune economic ).
Între aceste extreme exist , evident, o diversitate de aplica ii, dintre care unele presupun
atât volume mari de date, cât i modele economico-matematice bazate pe calcule laborioase:
gestiunea stocurilor, programarea produc iei, 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 aplica ii eviden iate, realizat succint în cele ce urmeaz .
PPAD din categoria a) permit, în general, solu ii simple de organizare a datelor care,
frecvent, se reduc la preluarea integral în memoria intern a calculatorului, cu constituirea lor în
Bazele program rii 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 , v zut ca o prelungire a celei interne, cu organizarea
datelor în fi iere (uzual, fi iere relative). În majoritatea cazurilor, chiar când datele sunt
organizate în fi iere, nu se ajunge la p strarea lor pe perioade mari de timp, adic nu apare
necesitatea actualiz rii datelor (ad ug ri, modific ri, tergeri). Singura problem în accesul la
datele organizate în fi iere o reprezint trecerea de la memorarea liniar a elementelor în fi ier, la
caracterul lor de elemente ale unor masive (tablouri) cu dou sau mai multe dimensiuni.
Pe exemplul matricelor, alegând liniarizarea pe linii (ordinea lexicografic ), în cazul unei
matrice Amxn, pozi ia în fi ierul relativ a unui element ai,j poate fi determinat printr-un calcul
simplu, folosind func ia rang r(i,j)=n(i-1)+j, i m, j n. Aceast tehnic se poate folosi la
memorarea datelor în fi ier (crearea i popularea fi ierului), permi ând chiar furnizarea
elementelor într-o ordine oarecare, cu condi ia preciz rii coordonatelor. La reg sirea elementelor
masivului (consultarea fi ierului), pornind de la pozi ia în fi ier, 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 aten ia principal se deplaseaz c tre algoritmul
de calcul, bazat, uzual, pe aproxim ri succesive, ce pot conduce la apari ia unor tipuri specifice
de erori (erori de trunchiere i erori de rotunjire), care uneori se compenseaz , dar frecvent se
cumuleaz (se propag ) pe parcursul prelucr rii, afectând corectitudinea rezultatului final.
Datorit volumelor mari de date, la problemele din categoria b) accentul principal cade
pe organizarea i între inerea colec iilor de date memorate pe purt tori externi. La limit , se poate
alege între dou solu ii: organizarea datelor în fi iere (secven iale, relative sau indexate) sau
organizarea datelor în baze de date (cu structuri ierarhice, de tip re ea sau rela ionale).
Indiferent de nivelul de organizare ales, tehnologia de prelucrare conduce la lan uri
(sisteme) de programe, în general de dou tipuri: programe de creare i actualizare (între inere) a
colec iilor de date; programe de consultare (interogare), pentru satisfacerea cererilor de
informare. În algoritmi, principalele tipuri de opera ii sunt cele de prelucrare a colec iilor de date
organizate pe purt tori externi: citire, scriere, rescriere, tergere, precum i cele de verificare a
corectitudinii datelor (opera ii de validare). Complexitatea calculelor este redus , adesea
nedep ind nivelul celor patru opera ii aritmetice.
În general, în rezolvarea PPAD se poate distinge între urm toarele variante de solu ii:
solu ii proprii; utilizarea pachetelor de programe aplicative; solu ii mixte. Alegerea între cele trei
variante depinde de mai mul i factori, dintre care o importan aparte are aria (dimensiunile)
problemei: un domeniu de activitate strict delimitat (aplica ie informatic ), respectiv ansamblul
activit ilor unui organism economico-social (sistem informatic).
În general, solu iile proprii sunt posibile pentru orice PPAD. Din perspectiva costurilor
implicate de diversele faze ale realiz rii unei solu ii informatice, aceast variant este, frecvent,
cea mai neeconomic . Totu i, adesea aceasta este singura variant accesibil , dup cum se poate
constata i din prezentarea urm toarelor cazuri:
- la nivel de aplica ie informatic , atunci când domeniul de activitate are o serie de
particularit i care nu permit utilizarea unor eventuale pachete de programe aplicative i, evident,
când nu exist asemenea pachete de programe pentru domeniul respectiv;
- la nivel de sistem informatic, datorit marii diversit i a organismelor economico-
sociale, atunci când nu se poate pune problema unor solu ii tip, cu posibilitatea ca unele
subsisteme (aplica ii) s fie realizate prin solu ii mixte.
Utilizarea unor pachete de programe aplicative este posibil pentru activit ile cu un
anumit grad de generalitate, care se reg sesc în forme identice (sau cu diferen e nesemnificative)
Bazele program rii 42

la mai multe organisme economico-sociale. Printre acestea pot fi men ionate aplica iile bazate pe
modele de programare liniar , gestiunea stocurilor, optimizarea transporturilor, optimizarea
croirii, gestiunea financiar-contabil etc.
Adoptarea unei asemenea solu ii elimin costurile de proiectare i realizare a aplica iilor
(sistemelor) informatice, dar poate conduce la unele necesit i de adaptare a sistemului
informa ional propriu, în func ie 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, f r a furniza direct solu ii, simplific substan ial efortul de realizare a lor, pentru domenii
specifice. De exemplu, pentru prelucr ri 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.
Solu iile mixte presupun încadrarea în solu ii proprii a unor pachete de programe
aplicative, destinate unora dintre aplica iile unui sistem informatic. Aceast variant reduce, de
asemenea, costurile de realizare, dar necesit elaborarea unor interfe e între intr rile/ie irile
pachetelor de programe i celelalte componente ale sistemului(aplica iei) pentru care se
elaboreaz solu ii proprii.
Realizarea sistemelor (aplica iilor) 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 diferen e, impuse, pe de o parte, de varianta de solu ie
aleas i, pe de alt parte, de nivelul de abordare (aplica ie, sistem informatic). Cu aceste
observa ii, într-o abordare schematic , redus la enumerarea i prezentarea obiectivelor
principale, etapele de realizare a sistemelor informatice sunt urm toarele:
studiul i analiza sistemului informa ional actual, care are ca obiectiv principal
formularea cerin elor i a restric iilor pentru sistemul informatic (caietul de sarcini);
proiectarea de ansamblu, care presupune elaborarea modelului de ansamblu al
sistemului informatic i planificarea realiz rii sale pe p r i componente (subsisteme, aplica ii);
proiectarea de detaliu, care are ca obiective elaborarea modelului de detaliu al
sistemului informatic i stabilirea solu iilor tehnice de realizare (corespunz tor, se face distinc ie
între proiectarea logic de detaliu i proiectarea fizic de detaliu);
elaborarea programelor, în care se realizeaz , conform priorit ilor stabilite în etapa
anterioar i pe baza documenta iilor reunite în proiectul logic de detaliu i proiectul tehnic de
detaliu, programele incluse în fluxurile tehnologice specifice diverselor tipuri de prelucr ri;
implementarea i exploatarea sistemului, care presupune darea în func iune a
sistemului i utilizarea curent a acestuia.
Pe baza diferen ierilor eviden iate, în cele ce urmeaz se abordeaz numai cazul unor
aplica ii informatice de mai mic amploare, pentru care se men ine în continuare denumirea de
PPAD.

Organizarea procesului de rezolvare a PPAD


Dup complexitatea problemelor abordate în vederea rezolv rii cu calculatorul electronic,
din perspectiva programelor ce vor fi elaborate, solu iile proprii pot conduce la una din
urm toarele situa ii: sisteme de programe realizate la nivelul unor aplica ii informatice, abordate
independent sau ca parte a unor sisteme informatice; unul sau câteva 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 aplica iilor informatice. Depinzând de tipul
aplica iei, acurate ea i generalitatea abord rii, este posibil ca solu iile de acest tip s evolueze
c tre realizarea unor pachete de programe aplicative. În al doilea caz, se ajunge frecvent la
Bazele program rii 43

realizarea tuturor etapelor, de la punerea problemei pân la rezolvarea ei, de c tre o singur
persoan . În general, pot fi abordate în aceast variant unele probleme tehnico- tiin ifice, care
nu conduc la cerin e deosebite privind volumul i organizarea datelor i sunt, uzual, probleme
relativ independente.
Exist , de asemenea, unele probleme economico-sociale sau administrative în care,
datorit num rului mic de informa ii utilizate, modific rilor reduse, precum i cerin elor simple
de prelucrare s nu fie necesare solu ii 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
ob in i forma lor de prezentare, datele de intrare i modul lor de organizare, precum i
transform rile i prelucr rile care se aplic asupra datelor de intrare pentru a se ob ine rezultatele.
Formularea clar , corect i complet a problemei reprezint o cerin important pentru
finalizarea cu bune rezultate a activit ii de proiectare i realizare a programelor. În cazul
aplica iilor de mai mari dimensiuni, a c ror rezolvare se abordeaz de c tre o echip de analiz -
proiectare-programare, formularea problemei poate fi primit de programator de la analistul-
proiectant, sub forma unor specifica ii de problem .
Formalizarea matematic i alegerea metodei numerice. În aceast etap se exprim
matematic toate transform rile i prelucr rile la care sunt supuse datele de intrare pentru a se
ob ine rezultatele, se pun în eviden condi iile ini iale i restric iile referitoare la solu ie. La
alegerea metodei numerice de rezolvare trebuie analizate cu aten ie stabilitatea i convergen a
metodei, tipul, m rimea 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 solicit rii acestor resurse peste limitele admisibile. Se recomand ca în
etapa formaliz rii matematice s se stabileasc i ordinea de efectuare a prelucr rilor, s se re in
informa iile care sunt necesare urm toarei etape (varia ia indicilor, momentul introducerii sau
extragerii datelor, ini ializarea variabilelor i masivelor etc.). Este necesar precizarea c aceast
etap este cu deosebire important în cazul problemelor tehnico-inginere ti sau economice bazate
pe folosirea modelelor matematice.
Elaborarea (proiectarea) algoritmilor. Este o etap complex care presupune analiza
riguroas a problemei i a formaliz rii ei matematice. Una dintre metodele uzuale de elaborare a
algoritmilor este proiectarea structurat , ale c rei 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.), simplificând substan ial eforturile
depuse în etapele de scriere, testare i definitivare a programelor. În acela i sens, este foarte
important faza test rii 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 stabile te 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
respectând strict algoritmul (eventual se pot face modific ri i detalieri ale acestuia) urm rindu-
se, în acela i timp, optimizarea utiliz rii resurselor calculatorului (timp unitate central , memorie
intern i echipamente periferice). În cazul programelor interactive este necesar realizarea unor
interfe e prietenoase, care s lanseze solicit ri clare, precise i complete.
Testarea i definitivarea programelor. Programul scris într-un limbaj surs va fi
compilat i consolidat. În procesul compil rii programele sunt testate sintactic, iar în procesul
consolid rii (edit rii de leg turi) se valideaz utilizarea resursei memorie, modul în care au fost
Bazele program rii 44

apelate, implicit sau explicit, procedurile utilizatorului sau ale sistemului, modul în care au fost
concepute opera iile de intrare/ie ire sau, în general, cum au fost gestionate resursele de
intrare/ie ire etc.
Dup parcurgerea acestor faze programul se testeaz în execu ie, pe baza unor seturi
stabilite de date de control. În aceast faz programul se consider corect dac rezultatele
ob inute sunt cele scontate (pentru datele de test, programatorii trebuie s determine dinainte
rezultatele - valorile i forma lor de prezentare). Se mai face men iunea c , într-un lan de
programe dintr-un sistem, trebuie testat întreg lan ul, în intercorel rile lui interne. Programele
considerate corecte se memoreaz pe medii magnetice, eventual constituite în biblioteci.
Definitivarea documenta iei programelor. De i mai pu in 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 c tre al i utilizatori. S-a ar tat c , pe m sura desf ur rii
precedentelor etape, s-au realizat unele documente necesare exploat rii 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 restric iilor de utilizare;
organigrama modulelor;
schemele logice structurate (sau alte forme de reprezentare a algoritmului) pentru
fiecare modul;
modul de apel al procedurilor i func iilor i structura datelor i parametrilor care se
transfer între apelator i apelat;instruc iuni de utilizare (procedura de punere în lucru, lista i
forma întreb rilor i r spunsurilor în conversa ia cu utilizatorii, lista programelor care trebuie
executate în amonte etc.);
exemple de utilizare.
Exploatarea curent . Dup punerea la punct, programele intr în utilizare, fiind
urm rite în vederea depist rii unor erori care nu au putut fi sesizate anterior. Aceast faz asigur
men inerea în func iune i dezvoltarea programelor, proces care se poate continua pe tot parcursul
utiliz rii lor.

Test de autoevaluare

1. Într-o abordare schematic , enumera i etapele de realizare a sistemelor informatice.

3.2. Fazele dezvolt rii programelor

Utilizarea calculatoarelor necesit elaborarea programelor pe baza c rora se ob in


rezultate dorite, prin aplicarea unui algoritm asupra datelor de intrare. Un program reprezint o
mul ime ordonat de instruc iuni, asociat unui algoritm de rezolvare a problemei, care comand
opera iile de prelucrare a datelor. Instruc iunea reprezint exprimarea într-o form riguroas -
conform regulilor de sintax ale unui limbaj artificial (limbaj de programare) a unei opera ii i
precizeaz func ia i adresele operanzilor. Prin limbaj de programare se în elege o mul ime de
Bazele program rii 45

cuvinte (dic ionar) împreun cu regulile de utilizare a lor (gramatic ). Regulile de utilizare sunt
de sintax (form ) i de semantic (sens).

Editare

Program surs

Compilare

Program
Listing asamblare
surs

Program obiect

Biblioteci Link-editare Biblioteci


utilizator standard

Harta aloc rii Program obiect


memoriei executabil

Lansare
în execu ie

Fig. 3.1. Etapele dezvolt rii unui program


Unitatea central a unui calculator recunoa te un singur limbaj, numit limbaj ma in (sau
limbaj cod obiect executabil). Scrierea programelor într-un astfel de limbaj este greoaie i
ineficient . El este apropiat de ma in , necesit coduri numerice pentru opera ii 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 într-
un astfel de limbaj se numesc programe surs , care din punct de vedere al utilizatorului sunt
fi iere 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 opera ia de traducere a programului surs în program cod obiect. Ea este
realizat de componenta software numit compilator. Lucrul cu un anumit limbaj evoluat
presupune existen a compilatorului pentru acel limbaj. În func ie de posibilit ile compilatorului,
în urma compil rii se mai pot ob ine fi ierul cu listingul programului surs i fi ierul cu
programul surs tradus în limbaj de asamblare. Unele limbaje, printre care i C, impun ca
programele s fie supuse unei prelucr ri anterioare, numit preprocesare.
Editarea de leg turi (link-editarea) este opera ia 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 atât module
Bazele program rii 46

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

Test de autoevaluare

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


editare leg turi; 5) lansare în execu ie; 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.

R spunsuri i comentarii la testele de autoevaluare

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


urm toarele:
studiul i analiza sistemului informa ional actual;
proiectarea de ansamblu;
proiectarea de detaliu;
elaborarea programelor;
implementarea i exploatarea sistemului.
2:e).

Rezumat
În cadrul acestei unit i de înv are au fost studiate urm toarele aspecte în ceea ce prive te datele
i structurile de date:
caracteristici generale ale PPAD;
organizarea procesului de rezolvare a PPAD;
fazele dezvolt rii programelor.
Dup încheierea acestei unit i de înv are, studen ii au cuno tin e i abilit i de organizare a
procesului de rezolvare a problemelor i a etapelor de dezvoltare a programelor.

Bibliografia unit ii de înv are


1. I. Gh. Ro ca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, M. Mircea, L. B t gan, C. Silvestru,
Bazele program rii calculatoarelor. Teorie i aplica ii în C, Ed. ASE, Bucure ti, 2006, ISBN 973-594-591-
6
Bazele program rii 47

4. Caracteristicile limbajului C

Cuprins
Obiectivele unit ii de înv are 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
R spunsuri i comentarii la testele de autoevaluare
Bibliografia unit ii de înv are

Obiectivele unit ii de înv are 4


Dup studiul acestei unitati de învatare, studen ii vor avea cuno tin e teoretice i abilit i practice
despre:
elementele de baz ale limbajului C;
tipuri de date în C;
expresii;
realizarea structurilor fundamentale de control.

Durata medie a unit ii de studiu individual - 10 ore

4.1 Elementele de baz ale limbajului C

Principalele construc ii sintactice ale limbajului C, într-o ordine relativ a procesului de


agregare sunt:
- identificatorii, care sunt denumirile (adresele simbolice) pe baza c rora sunt referite în
program datele, tipurile, func iile, fi ierele etc.;
- comentariile, care sunt texte prezente în programul surs , dar ignorate de compilator;
- expresiile, care sunt construc ii formate din operanzi (date numerice, logice, de tip caracter
etc.) i operatori (aritmetici, rela ionali, logici etc.) i a c ror evaluare produce o valoare de un
anumit tip;
- declara iile, care sunt construc ii pentru definirea i descrierea datelor (constante i/sau
variabile, date scalare i/sau structuri de date etc.);
- instruc iunile, pentru descrierea ac iunilor realizate asupra datelor;
- func iile, care pe baza unor date de intrare furnizeaz unul sau mai multe rezultate de
ie ire;
- programul, reprezentând construc ia sintactic de cel mai înalt nivel, care poate face
obiectul prelucr rii i execu iei de un sistem de calcul.
Bazele program rii 48

Identificatorii sunt denumiri asociate entit ilor referite în program. Ele sunt
succesiuni de litere (mici i/sau mari, din alfabetul latin), cifre zecimale (de la 0 la 9) i _
(liniu a de subliniere). Primul caracter trebuie s fie o liter sau liniu a de subliniere. Nu se
recomand îns ca primul caracter s fie „ _” pentru a nu se face confuzii nedorite cu
identificatorii rezerva i folosi i 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 aceea i semnifica ie cu codprodus.

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


compuse se recomand ca fiecare cuvânt s înceap cu liter mare, pentru cre terea lizibilit ii
programului surs .
Exemple:
PretUnitar, MatrUnitate, SumaElemVector,MedAritmPond.

Lungimea unui identificator variaz de la un singur caracter pân la oricâte, dar se iau în
considerare numai primele 32. Dac doi identificatori au primele 32 de caractere identice, atunci
ei vor fi considera i identici de compilator. Unele compilatoare permit modificarea acestei limite
de lungime.
Anumi i identificatori sunt predefini i în limbaj, au destina ie impus i nu pot fi utiliza i
în alte moduri sau scop decât cele pentru care au fost defini i. Ace tia sunt numi i cuvinte
rezervate (sau cuvinte cheie) i vor fi introduse pe m sur ce sunt prezentate construc iile
sintactice ale limbajului.
Exemple:
for, do, if, else, char, long, float, while, return etc. (din K&R C);
const, enum, signed, void etc. (din ANSI C);
_AL, _AX, _DX, _BX, _FLAGS (din Turbo C).

Comentariile sunt secven e 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 explica ii suplimentare ale programatorului, în vederea în elegerii 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 ad ugat posibilitatea de a scrie
comentarii pe o singur linie surs . Începutul unui astfel de comentariu este marcat de perechea //
iar sfâr itul s u este marcat de sfâr itul liniei (nu exist marcator special). Orice caracter aflat
dup // este ignorat, pân la trecerea pe o nou linie surs .

Instruc iunile sunt construc ii sintactice ale limbajului, terminate de caracterul ;


(punct i virgul ). Ele indic opera iile (ac iunile) care se aplic datelor în vederea ob inerii
rezultatelor scontate prin algoritm. Instruc iunile pot fi clasificate în: simple, structurate,
compuse.

Func iile sunt entit i (subprograme) care pot fi proiectate i realizate independent,
dar care nu se execut decât împreun cu o alt entitate de program, numit apelatoare. Conceptul
a fost definit de realizatorii limbajului Fortran i s-a impus în practica program rii din
Bazele program rii 49

urm toarele motive: evitarea scrierii repetate în program a unor secven e de instruc iuni aplicate
de mai multe ori pe seturi diferite de date; cre terea eficien ei activit ii de programare prin
crearea unor biblioteci de subprograme des utilizate, care pentru fiecare din aplica iile concrete
doar se apeleaz , f r s fie proiectate i realizate de fiecare dat ; necesitatea modulariz rii
problemelor cu grad înalt de complexitate.
Func ia are un nume i un tip. Ea se define te 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 lipse te, este considerat tipul implicit (int pentru
unele compilatoare, void pentru altele);
• nume este un identificator care reprezint numele func iei;
• lista-parametrilor-formali con ine parametrii formali sub forma:
[tip1 identificator1[,tip2 identificator[,tip3 identificator …]]]

Parametrii sunt separa i prin virgul . La limit , lista poate fi vid . Pentru fiecare
parametru trebuie specificat tipul, chiar dac mai mul i parametri sînt de acela i tip.
Func iile returneaz o valoare „prin nume”, dar pot returna valori i prin parametri. Unele
func ii (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. Func iilor care nu trebuie s întoarc
valori prin nume li se poate asocia tipul void (care, la unele compilatoare, este implicit).
Corpul este o instruc iune compus : con ine declara iile locale i instruc iunile executabile
care implementeaz algoritmul. Corpul func iei se execut pîn la executarea ultimei instruc iuni
sau pîn la executarea instruc iunii return. Forma ei general este:
return(expresie); sau
return expresie; sau
return;

Prima i a doua form sînt folosite în cazul func iilor care returneaz o valoarea prin
numele lor. Prin executarea acestei instruc iuni se evalueaz expresia, valoarea sa este atribuit
func iei i se încheie execu ia func iei. A treia form este folosit în cazul func iilor care nu
returneaz nici o valoare prin numele lor (poate chiar s lipseasc ). Dac este prezent , efectul ei
este încheierea execu iei func iei. Tipul expresiei din instruc iunea return trebuie s coincid cu
tipul func iei.
Apelul func iilor 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 stânga la dreapta.
Pentru o corect utilizare a datelor, tipurile parametrilor reali trebuie s fie acelea i ca ale celor
formali corespunz tori.

Programul este construc ia sintactic de cel mai înalt nivel. El codific algoritmul, fiind
constituit din declar ri i instruc iuni executabile. Dat fiind faptul c limbajul C este puternic
orientat spre func ii, programul principal este el însu i o func ie (care poate avea parametri i
poate întoarce un rezultat de tip întreg): main (cuvânt rezervat). La modul general, un program
este o în iruire de func ii i declara ii, printre care trebuie s existe o func ie denumit main,
Bazele program rii 50

lansat în execu ie la rularea programului. Pentru func ia 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 declara ii (format din instruc iuni
neexecutabile, cu rol doar în faza de compilare) i o parte executabil (format din instruc iuni
executabile). Unele limbaje impun o separare clar a acestora (de exemplu Pascal, COBOL,
FORTRAN), în care partea de declara ii precede partea executabil . Alte limbaje (de exemplu C,
C++) sunt mai flexibile, permi ând ca declara iile s alterneze cu instruc iunile executabile,
p strând îns regula c orice entitate referit trebuie definit anterior. Pentru a evita confuziile se
recomand ca declara iile s fie reunite la începutul blocului de instruc iuni pentru care sunt
vizibile.

Directivele de preprocesare. Înaintea compil rii, în C se desf oar etapa de


preprocesare, în cadrul c reia se efectueaz substituiri asupra textului surs scris de programator.
Prin preprocesare se rezolv cerin ele compil rii condi ionate, se asigur inserarea unor fi iere în
textul surs i se expandeaz macrodefini iile. Preprocesarea este controlat prin directive, a c ror
sintax (în format BNF) este:
<directiva>::=#<cuvant_rezervat>[<parametri>]

Directiva #include este folosit pentru includerea de fi iere cu text surs într-un program i
are urm toarea sintax :
#include<specificator_de_fisier>
sau
#include”specificator_de_fisier”

Prima form caut fi ierul specificat între fi ierele standard ale limbajului, folosindu-se
calea descris în mediul de programare. A doua form caut fi ierul specificat în calea curent (de
obicei este folosit pentru a include fi iere scrise de utilizator). Dac fi ierul c utat nu este g sit se
produce o eroare de compilare. Dac fi ierul este g sit, con inutul 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 con in la rândul lui directive care
determin noi includeri de text. Textul inclus va fi compilat ca parte component a programului.
Pentru a putea utiliza func iile care realizeaz opera iile de intrare/ie ire trebuie inclus
fi ierul stdio.h.
Exemplu: #include<stdio.h>

Directiva #define este folosit pentru a substitui unele secven e de caractere cu altele i
are forma general :
#define sir1 sir2
Bazele program rii 51

unde atât sir1 cât i sir2 sunt iruri de caractere. La preprocesare, se terge directiva din program
i se înlocuie te secven a de caractere sir1 cu secven a de caractere sir2 peste tot unde apare în
programul surs . Secven a 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 rânduri, dac la sfâr itul fiec rui rând (în afar
de ultimul) se scrie caracterul \ (backslash). Rolul acestuia va fi discutat în alt capitol. sir2 poate
s con in iruri de caractere pentru care au fost definite anterior. Acestea vor fi substituite
conform defini iilor lor.

Substituirea poate fi dezactivat din punctul în care apare directiva #undef pân la
sfâr itul programului sau pân la redefinirea lui sir1. Directiva are forma general :
#undef sir1
Între cele mai frecvente utiliz ri ale directivei #define sunt definirea de constante
simbolice (literali c rora li se asociaz identificatori) i definirea de macrodefini ii (necesare
simplific rii scrierii).
Din punct de vedere al textului surs , un macro se folose te la fel ca orice func ie: se
apeleaz prin numele simbolic urmat de lista parametrilor reali. Din punct de vedere al compil rii
exist o diferen fundamental : macro-urile sunt tratate la preprocesare. Preprocesorul terge
din textul surs apelul macro-ului i îl înlocuie te chiar cu secven a de definire. Parametrii
formali ai macro-ului sunt înlocui i cu parametrii reali, prin substituire de text (coresponden a se
face conform regulilor de punere în coresponden a parametrilor reali cu cei formali: unu-la-unu,
de la stânga la dreapta).

Test de autoevaluare

1. Specifica i cum va ar ta secven a de cod urm toare, 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 posibilit i multiple în declararea i utilizarea tipurilor de date. În general,


tipurile de date se clasific în statice i dinamice, împ r ite la rândul 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 Dup num rul de
Tipuri existente
alocare a memoriei valori memorate
Statice Întregi
Simple Reale
Caracter
Bazele program rii 52

Masiv
Structurate Articol
Fi ier
Pointer
Dinamice Simple
Referin

4.2.1. Tipurile simple de date


În limbajul C exist o serie de tipuri simple de date predefinite (tabelul 4.2), a c ror
lungime poate s difere de la un sistem de calcul la altul i de la o implementare la alta
(standardul C este mai elastic decât 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


Lun-
Grup
gime Domeniu de
a de Tipul Mod de reprezentare
(octe valori
dat
i)
unsigned char 1 0..255 (0..28-1) Codul ASCII al caracterului.
-128..127 (-27..27- Poate fi prelucrat ca un caracter
[signed] char 1 sau ca un întreg cu/f r semn.
1)
unsigned [int] 2 0..65535 Virgul fix aritmetic
Întreg [signed] [int] 2 -32768..32767 Virgul fix algebric
unsigned long 4 0..232-1 Virgul fix aritmetic
[signed] long
4 -231..231-1 Virgul fix algebric
[int]
3.4*10-
float 4 38 Virgul mobil simpl precizie
..3.4*1038
Real 1.7*10-308..
double 8 Virgul mobil dubl precizie
1.7*10308
3.4*10-
long double 10 4932 Virgul mobil extra precizie
..3.4*104932

Variabilele
Datele variabile î i modific valoarea pe parcursul execu iei programului. De aceea, ele se
asociaz unor zone de memorie. Identificatorii acestora se declar i apoi se refer în opera ii.
Opera iile afecteaz con inutul zonelor de memorie, care este interpretat ca fiind de un anumit tip.
Declararea variabilelor se realizeaz prin list de identificatori (separa i prin virgul ) pentru care
se specific tipul.
tip lista_variabile;
Declararea se poate face oriunde în program, cu urm toarea condi ie: variabilele trebuie
declarate înainte de a fi folosite (referite). Domeniul de valabilitate este limitat la blocul în care s-
a f cut declara ia.
Exemple:
unsigned x,y,z;
Bazele program rii 53

float a,b,c;
char k;

Variabilele pot fi ini ializate la momentul compil rii, dac se utilizeaz urm toarea
declara ie:

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 folose te cuvântul
rezervat typedef, astfel:
typedef descriere_tip nume_utilizator;
Exemple:
typedef int INTREG;
typedef float REAL;

Particularit ile 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 func ie de expresia din care face parte
operandul respectiv).
Valoarea numeric folosit depinde de modul de declarare a caracterului: cu sau f r
semn. Pentru caracterele cu coduri mai mici decât 128 nu se sesizeaz nici o diferen (se ob ine
aceea i valoare i pentru interpretarea ca virgul fix aritmetic i pentru interpretarea ca virgul
fix algebric ). Pentru caracterele cu coduri mai mari de 127, valoarea ob inut 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 compil rii. Datele constante pot fi literali (constante propriu-zise), care se
autoidentific prin valoare, sau constante simbolice, care sunt identificatori (denumiri) asocia i
altor constante (literali sau constante simbolice definite anterior). În C literalii sunt întregi, reali,
caracter i ir de caractere.

Literalii întregi sunt reprezenta i intern în virgul fix . Ei pot fi exprima i în bazele de
numera ie 10 (forma implicit ), 8 (folosind prefixul 0 – zero) sau 16 (folosind prefixul 0x sau
0X). În func ie de m rimea lor, se asociaz implicit un tip întreg ( i implicit un mod de
reprezentare). Se încearc întotdeauna întâi reprezentarea pe 16 bi i, conform tipului int; dac nu
este posibil , atunci se folose te reprezentarea pe 32 de bi i, conform tipului long.
Dac se dore te for area reprezent rii pe 32 de bi i (pentru o valoare din domeniul tipului
int), se adaug sufixul l sau L. Pentru a for a tipul f r semn (unsigned int sau unsigned long) se
folose te sufixul u sau U. Cele dou sufixe se pot folosi împreun , în orice ordine.
Bazele program rii 54

Literalii reali sunt reprezenta i intern în virgul mobil . Ei se pot exprima sub form
matematic (±întreg.frac ie) sau tiin ific (±întreg.frac ieE±exponent). Semnul + poate lipsi
(este implicit), iar e este echivalent, ca valoare, cu E. Din exprimare poate s lipseasc fie partea
frac ionar , fie partea întreag , fie partea întreag i exponentul (inclusiv litera e).
Literalii reali se reprezint intern pe 64 de bi i (tipul double). Pentru a for a reprezentarea
în simple precizie (tipul float) se adaug sufixul f sau F. Pentru a for a reprezentarea pe 80 de bi i
(tipul long double) se folose te 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 , a a cum s-a ar tat 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. Excep ie
fac caracterele cu semnifica ie special în C: ‘ (apostrof), " (ghilimele) i \ (backslash), care se
exprim printr-o succesiune de dou caractere, fiind precedate de caracterul \.
Exemple: B , b , 7 , (spa iu), * , \\ (caracterul backslash, cod ASCII 92), \ (caracterul apostrof,
cod ASCII 39), \ (caracterul ghilimele, cod ASCII 34).

Reprezentarea folosind caracterul backslash este numit secven escape. Secven ele
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 secven ele escape construite astfel: \ddd , unde d este o cifr din sistemul de
numera ie octal (0÷7). Construc ia 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 construc ie 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 ini ializarea 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 bi i care sunt
interpreta i ca un cod ASCII, ob inându-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 secven e escape. Un literal de tip
ir de caractere poate fi scris pe mai multe rânduri. Pentru a semnala c un literal continu pe
rândul urm tor se scrie caracterul \ la sfâr itul rândului curent.
Un ir de caractere este reprezentat intern prin codurile ASCII ale caracterelor, câte unul
pe fiecare octet, la sfâr it ad ugându-se caracterul nul (cod ASCII 0 – \0 ). Caracterul nul nu
poate s fac parte dintr-un ir, el având rolul de terminator de ir. În reprezentarea intern , un ir
de caractere ocup cu un octet mai mult decât num rul de caractere din componen a 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 program rii 55

"" - ir de lungime 1 (caracterul spa iu)


"" - irul de lungime 0 ( irul vid)

Constantele simbolice sunt literali c rora li se asociaz identificatori. În limbajul C


constantele simbolice se construiesc folosind directiva:
#define nume_constanta valoare

Utilizarea constantelor simbolice în cadrul programelor are urm toarele avantaje:


- literalii primesc nume sugestive, mai u or de re inut i de utilizat, mai ales dac sunt forma i
dintr-un num r 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 ini ializate la declarare, pentru care se rezerv
memorie, dar con inutul lor nu poate fi modificat pe parcursul execu iei 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 mul imi (colec ii) 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 octe i (lungimea unui segment de memorie).

Tipul masiv
Tipul masiv este structurat i desemneaz o mul ime finit de elemente omogene constituit
ca un tablou cu una, dou sau mai multe dimensiuni. Mul imea are un singur identificator i ofer
posibilitatea referirii elementelor în acces direct prin pozi ie, determinat printr-un num r de
expresii indiciale corespunzând dimensiunilor masivului. Masivul se declar folosind o construc ie
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 num rul de elemente de pe fiecare dimensiune. Se accept
oricâte dimensiuni, cu condi ia ca structura în ansamblul ei s nu dep easc 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 ini ializarea lexicografic a acestora, astfel


(pentru masiv bidimensional):
tip nume[dim1][dim2]=
Bazele program rii 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 s u. Elementele unui masiv se refer direct,
prin numele masivului urmat de indicele (indicii) corespunz tori. Indicii sunt expresii incluse între
paranteze drepte (se mai numesc i variabile indexate): [indice]. Pentru fiecare dimensiune a
masivului trebuie s existe câte 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 dep ire 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 rela ie de ordine ierarhic . Articolul poate fi reprezentat sub form de arbore, ale c rui
noduri sunt asociate componentelor structurii. Componentele de pe ultimul nivel sunt scalare i se
numesc date elementare sau câmpuri. 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
(r d cina arborelui) corespunde articolului în ansamblu. Conceptual, datele de grup de pe diverse
niveluri au acelea i propriet i ca i articolul, ceea ce permite ca aceast structur s fie construit
recursiv, prin descompunerea în structuri cu acelea i propriet i (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 asocia i variabilelor de tipul articol declarat.
Parametrii declara iei pot lipsi (dar nu to i 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 declar ri. Dac lipse te tip_articol, atunci trebuie s fie prezent
lista de variabile (nevid ), caz în care este vorba de o declarare de variabile de tip articol, f r
î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 c ror
elemente sunt de tip articol: var1[dim1][dim2]…[dimn].
Bazele program rii 57

DATA dat de grup (articol)

ZI LUNA AN date elementare

a)

PERSOANA dat de grup (articol)

dat de grup (articol)


NUME ADRESA DATA NA TERII

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 , ad ugând cuvântul rezervat typedef în fa a declar rii (în acest caz
nu mai pot fi declarate simultan i variabile).
Lista_campuri este o în iruire de declara ii de câmpuri separate prin punct i virgul ,
asem n toare declara iilor de variabile, de forma tip_camp nume_camp. Câmpurile unei structuri
pot fi variabile simple, masive sau alte articole. Lista câmpurilor 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 declara ia 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 câmpuri elementare, cu


reprezentarea intern i lungimea fizic specifice tipurilor lor. Lungimea zonei de memorie
rezervat pentru variabila de tip articol rezult din însumarea lungimilor câmpurilor. Aceasta nu
poate dep i 65520 octe i (ca orice variabil de tip structurat). Pentru structura unui articol î i
dovede te utilitatea operatorul sizeof, care asigur determinarea lungimii zonei de memorie
asociate unei variabile sau unui tip de date.
Exemplu:
Bazele program rii 58

Considerând declara iile 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 opera ia de atribuire, cu condi ia ca ambele variabile (surs i
destina ie) s fie articole de acela i 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 opera ia de atribuire, în condi iile 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 câmpurilor unei structuri se face prin calificare, folosind operatorul . (punct). În
referirea prin calificare, asigurarea identific rii unice a câmpurilor se realizeaz prin asocierea
numelui acestora cu numele articolului care le con ine. Construc ia r mâne la aceast form în
cazul în care structura are numai dou niveluri: articolul i câmpurile elementare ale acestuia.

În articolele cu structur recursiv se realizeaz calificarea progresiv cu articolele de pe


nivelurile superioare, primul calificator fiind numele articolului r d cin . În lan ul de calific ri,
numele articolului r d cin este nume de variabil , celelalte fiind nume de câmpuri 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 lâng calificare, regulile specifice
acestor structuri.
Exemplu:
Referirea prin calificare a câmpurilor 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
câmpuri. Construc iile angajat.nume i angajat.adresa corespund referirii globale a câmpurilor 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 întâlnite aplica ii care reclam utilizarea articolelor cu


structur variabil . La ini ializarea câmpurilor 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 dispozi ia utilizatorilor tipul predefinit reuniune
(union), care se comport ca i tipul struct cu o singur diferen : la un moment dat al execu iei
Bazele program rii 59

programului, în zona de memorie rezervat articolului nu este memorat decât unul dintre
câmpurile 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 câmpurilor componente. Gestiunea con inutului respectivei zone de
memorie va trebui realizat de c tre programator.

Lucrul cu iruri de caractere


irurile de caractere se reprezint conven ional ca masive unidimensionale (vectori) cu
elemente de tipul char. Totu i 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 octe i în care sunt memorate codurile ASCII ale caracterelor irului. Ultimul octet
con ine caracterul NULL (cod ASCII 0 – sau ASCIIZ), cu rol de marcator de sfâr it al irului.
Marcatorul de sfâr it de ir este gestionat automat de c tre sistem. Astfel, pentru memorarea unui
ir de n caractere sunt necesari n+1 octe i. Marcatorul de sfâr it nu face parte din ir i este tratat
ca atare de func iile care lucreaz cu iruri de caractere.
Exemplu:
1. char s[10]="Limbajul C";

0 1 2 3 4 5 6 7 8 9 10
L i m b a j u l C 0x00

Pentru prelucrarea irurilor de caractere, limbajul C pune la dispozi ia utilizatorului o serie de func ii
specifice, definite în biblioteca standard string.h. Limbajul C dispune i de alte func ii care lucreaz cu iruri
de caractere (func ii 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 func ii de
intrare/ie ire pentru irurile de caractere.

Teste de autoevaluare
Bazele program rii 60

2. . Se presupune un articol cu urm toarea structur :

Cod Vânz ri lunare


magazin Luna 1 Luna 2 … Luna 12
întreg real real … real
2 4 4 … 4
Scrie i modul de declarare a articolului i lungimea sa în num r de octe i. Exemplifica i referirea
câmpurilor.
3. Se presupune un articol cu urm toarea structur :
forma de înv mânt
data an de zi id
nume
na terii studiu
loc de data
bursa valoare
munc angaj rii
l l
z u a z u a
char[40] int char float char[30]
i n n i n n
a
Specifica i cum se realizeaz declararea i ini ializarea câmpurilor unui student la zi pentru structura
articolului prezentat.

4.3 Expresii

Asupra datelor pot fi aplica i operatori din diverse clase, rezultând construc ii sintactice
numite expresii. În forma lor cea mai general , expresiile sunt alc tuite 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 defini ie 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 eviden iat în exemplul urm tor:

a + (− b )− c + 15
expresie expresie expresie expresie

expresie
expresie

expresie

Ordinea de aplicare a operatorilor din expresii poate fi, total sau par ial, 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 absen a parantezelor, respectiv în
interiorul acestora, evaluarea se realizeaz în func ie de ordinul de preceden a operatorilor.

4.3.1 Operanzi i operatori


Bazele program rii 61

Un operand poate fi una din urm toarele construc ii:


• o constant simbolic ;
• un literal;
• o variabil simpl ;
• numele unui masiv;
• numele unui tip de dat ;
• numele unei func ii;
• referirea unui element de masiv;
• referirea unui câmp de articol;
• apelul unei func ii;
• o expresie.
Din ultima posibilitate rezult c expresia este o construc ie recursiv . Un operand are un
tip i o valoare. Valoarea se determin fie la compilare fie la execu ie. Nu pot fi operanzi irurile
de caractere.
Operatorii se clasific dup diferite criterii, precum num rul operanzilor asupra c rora se
aplic i tipul de opera ie 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
opera iei realizate, operatorii sunt aritmetici, logici, rela ionali etc.
Într-o expresie apar, de obicei, operatori din aceea i clas , dar pot fi i din clase diferite.
Se pot scrie expresii complexe care s con in operatori din toate clasele. La evaluarea acestor
expresii se ine cont de priorit ile operatorilor (numite i clase de preceden ), de asociativitatea
lor i regula conversiilor implicite.
Atunci când un operator binar se aplic la doi operanzi de tipuri diferite, înainte de a
efectua opera ia, cei doi operanzi sunt adu i la un tip comun. În general, operandul de tip inferior
se converte te c tre tipul operandului de tip superior. În primul rând se convertesc operanzii de
tip char c tre tipul int. Dac operatorul se aplic la doi operanzi cu acela i tip nu se face nici o
conversie, rezultatul având acela i tip cu cei doi operanzi. Dac valoarea lui dep e te domeniul
asociat tipului de dat , rezultatul este eronat (eroarea de dep ire de domeniu). Dac operatorul se
aplic la operanzi de tipuri diferite, conversia se face astfel:
1. dac un operand este de tipul long double, cel lalt se converte te la acest tip, iar
rezultatul va fi de tip long double;
2. dac un operand este de tip double, cel lalt se converte te la acest tip, iar rezultatul va fi
de tip double;
3. dac un operand este de tip float, atunci cel lalt se converte te la acest tip, iar rezultatul
va fi de tip float;
4. dac un operand este de tip unsigned long, atunci cel lalt se converte te la acest tip, iar
rezultatul va fi de tip unsigned long;
5. dac un operand este de tip long, atunci cel lalt se converte te la acest tip, iar rezultatul
va fi de tip long;
6. dac unul din operanzi este de tip unsigned iar cel lalt de tip int acesta se converte te la
tipul unsigned, iar rezultatul va fi de tip unsigned.
Regula se aplic pe rând fiec rui operator din cadrul unei expresii, ob inând în final tipul
expresiei.

4.3.2. Operatorii de atribuire


Atribuirea este o expresie cu forma general : v=expresie
Bazele program rii 62

unde v este o variabil simpl , un element de masiv, un câmp al unui articol sau o expresie în
urma evalu rii c reia se ob ine o adres . Entitatea care se poate afla în stânga operatorului de
atribuire se nume te left value.
Pentru a se putea efectua atribuirea, tipul expresiei i tipul entit ii din stânga 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 opera iile 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 stânga;
• întreaga expresie de atribuire are valoarea i tipul variabilei din stânga.

În practica program rii, se utilizeaz frecvent expresiile de forma v = v op (expresie)


(de exemplu a=a+b-c). Se observ redundan a de exprimare prn specificarea variabilei v atît în
membrul stâng cât i în cel drept. Pentru eliminarea acestei redundan e, s-au introdus operatorii
combina i, cu forma general
op=
unde op este un operator binar, aritmetic sau logic pe bi i (/, %, *, -, +, <<, >>, &, ^, |). 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 priorit ii lor, operatorii aritmetici sunt:
i. operatori unari +, -, ++, --
ii. operatori binari multiplicativi *, /, %
iii. operatori binari aditivi +, -
Opera iile efectuate de ace ti operatori sunt descrise în tabelul 4.3.

Tabelul 4.3. Operatorii aritmetici


Semnifica ie opera ie Operator
Schimbare semn -
P strare semn (nici un efect, nu este
+
folosit)
Decrementare (post sau pre) --
Incrementare (post sau pre) ++
Adunare +
Sc dere -
Înmul ire *
Împ r ire /
Împ r ire întreag (câtul) /
Bazele program rii 63

Împ r ire întreag (restul) %

Observa ie: Cu excep ia operatorului %, care admite numai operanzi întregi, ceilal i admit toate
tipurile numerice.

Operatorii ++ i -- au efect diferit, depinzând de pozi ia 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.
Semnifica ia unei unit i depinde de tipul operandului asupra c ruia se aplic . Pentru operanzi
numerici, o unitate înseamn unu.
Operatorul % are ca rol ob inerea restului unei împ r iri întregi. Operatorul / are efect
diferit, în func ie de tipul operanzilor:
a. dac cel pu in un operand este de tip real, se execut împ r ire real ;
b. dac ambii operanzi sunt întregi, se execut împ r ire întreag i se ob ine câtul.
Calculul câtului i restului unei împ r iri întregi se poate realiza i prin intermediul
func iei div. Rezultatul func iei are tipul div_t, definit în biblioteca stdlib.h astfel:
typedef struct {long int quot; //cît
long int rem; //rest
} div_t;

Exemplu:
Determinarea câtului (cat) i restului (rest) împ r irii num rului m la num rul 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 rela ionali


Expresiile logice sunt cele care, în urma evalu rii produc, în interpretarea programatorului,
valorile adev rat sau fals. Astfel de valori sunt produse de dou categorii de operatori: operatori
logici propriu-zi i i operatori rela ionali.
Operatorii logici sunt prezenta i în tabelul 4.4. (în ordinea priorit ii) iar operatorii rela ionali în
tabelul 4.5.
Tabelul 4.4. Operatorii logici
Semnifica ie opera ie Operator
Negare !
i logic &&
Sau logic ||
Sau exclusiv logic Nu exist

În limbajul C nu exist tipul de dat logic. Operanzii asupra c rora se aplic operatorii
logici sunt converti i în valori numerice i interpreta i conform conven iei: adev rat pentru
valoare nenul i fals pentru zero. Rezultatul unei opera ii logice este de tip int, conform
conven iei: pentru adev rat valoarea 1 iar pentru fals valoarea 0.
Bazele program rii 64

La evaluarea expresiilor logice se aplic principiul evalu rii par iale: dac expresia este de
tip aditiv (operanzi lega i prin operatorul sau), în momentul în care s-a stabilit c un operand are
valoarea adev rat toat expresia va fi adev rat i nu se mai evalueaz restul operanzilor.
Asem n tor, pentru o expresie multiplicativ (operanzi lega i prin operatorul i), dac un operand
are valoarea fals, expresia are valoarea fals i nu se mai evalueaz restul operanzilor.
Opera ia sau exclusiv între doi operanzi a i b se efectueaz cu expresia !a&&b||!b&&a,
conform tabelului urm tor:

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


0 0 1 1 0 0 0
0 0 0 0 0 0 0
0 0 0 1 0 1 1
0 0 1 0 1 0 1

Operatorii rela ionali sunt prezenta i în tabelul 4.5. Operatorii rela ionali au acela i nivel de
prioritate.
Rezultatul unei opera ii rela ionale este de tip int, conform conven iei: pentru adev rat valoarea 1,
iar pentru fals valoarea 0.
Pentru a nu se gre i la evaluarea unor expresii complexe, este indicat s se fac ra ionamentul
bazat pe logica boolean (cu valori de adev rat i fals).

Tabelul 4.5. Operatorii rela ionali


Semnifica ie opera ie 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 opera ii pe bi i, ai c ror operatori sunt prezenta i în tabelul 4.6.
Tabelul 4.6. Opera ii pe bi i
Semnifica ie opera ie Operator
i logic pe bi i &
Sau logic pe bi i |
Sau exclusiv logic pe bi i ^
Negare (complement fa de 1) ~
Deplasare la dreapta >>
Deplasare la stânga <<
Bazele program rii 65

Operanzii pot fi de orice tip întreg. Dac este nevoie, operanzii sunt extin i la reprezentare pe 16
bi i. Execu ia are loc bit cu bit. Pentru o pereche de bi i (x,y), valorile posibile rezultate în urma
aplic rii operatorilor logici la nivel de bit sunt prezentate în tabelul 4.7.

Tabelul 4.7 Rezultatele opera iilor logice pe bi i


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 opera iilor la nivel de bit se încadreaz i deplas rile binare la stânga sau
la dreapta a con inutului unei variabile întregi:
operand<<num r_pozi ii i operand>>num r_pozi ii

Exemplu:
1. Urm toarea secven afi eaz , în ordine invers , bi ii 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 lâng 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 stânga la dreapta,


întreaga secven fiind tratat ca o expresie c reia i se atribuie în final valoarea i tipul
corespunz toare ultimei expresii evaluate (expresie_n). Operatorul se utilizeaz acolo unde este
legal s apar o expresie în program i se dore te 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 (câtul împ r irii lui 10 la 2).

4.3.7. Operatorul de conversie explicit


Limbajul ofer posibilitatea conversiei explicite a tipului unei expresii c tre 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. Construc ia este numit expresie cast (conversia explicit se nume te
typecast). Trebuie re inut c nu se schimb efectiv tipul operandului, doar se folose te în expresie
valoarea operandului convertit la un alt tip. Opera ia de conversie de tip nu are efect permanent.
Exemplu:
int a=7;
float b=(float)a;
Bazele program rii 66

Dup execu ia secven ei, a are valoarea 7 (nu 7.0) nefiind afectat în nici un fel de opera ia de conversie
de tip, iar b are valoarea 7.0 (ob inut prin conversia valorii lui a c tre tipul float).

4.3.8. Operatorul dimensiune


Operatorul dimensiune este folosit pentru a afla dimensiunea în octe i a spa iului 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 câmp al unui articol.
În primele dou forme, rezultatul va fi num rul de octe i aloca i entit ii respective. Pentru
ultima form , rezultatul este num rul de octe i 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 func iilor. 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 func ii, parantezele rotunde „()” sunt numite operatori de apel de func ie,
ele delimitând lista parametrilor reali. Parantezele p trate „[]” au rolul de a include expresii care
reprezint indici pentru accesarea elementelor unui masiv. Ele se numesc operatori de indexare.

4.3.10. Operatorul condi ional


Operatorul condi ional 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 condi ional are simbolul ?:.
Cele dou caractere care compun simbolul apar intercalate între cei trei operanzi, conform formei
generale. Construc ia se nume te expresie condi ional . Valoarea i tipul acestei expresii sunt
identice cu cele ale expresie_2 (dac expresie_1 este adev rat ) sau cu cele ale expresie_3 (dac
expresie_1 este fals ).

4.3.11. Al i operatori
Din categoria operatorilor limbajului fac parte i urm torii:
a. operatorul de calificare, cu simbolul . (caracterul punct), folosit pentru a accesa un câmp
al unui articol;
b. operatorul de calificare (cu simbolul ->) folosit pentru a accesa un câmp atunci când se
tie adresa unei structuri;
c. operatorul de referen iere (cu simbolul &) folosit pentru a extrage adresa unei variabile;
d. operatorul de referen iere (cu simbolul *) folosit pentru a defini un pointer;
e. operatorul de dereferen iere (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
lucr ri).

4.3.12. Evaluarea expresiilor


Expresiile sunt evaluate pe baza urm toarelor reguli:
- Preceden a: determin ordinea de efectuare a opera iilor într-o expresie în care intervin
mai mul i operatori (gradul de prioritate);
Bazele program rii 67

- Asociativitatea: indic ordinea de efectuare a opera iilor în cazul unui set de operatori cu
aceea i preceden ;
- Regulile de conversie de tip: asigur stabilirea unui tip comun pentru ambii operanzi,
pentru fiecare opera ie care solicit acest lucru i în care tipurile difer .
Asociativitatea i preceden a operatorilor (începând cu prioritatea maxim ) sunt redate în
tabelul 4.8.
În concluzie, expresiile care pot fi construite în limbajul C se încadreaz în urm toarele
categorii: expresii de atribuire, expresii aritmetice, expresii logice, expresii rela ionale.

Tabelul 4.8. Preceden a operatorilor


Grad de
Operatori Asociativitate
prioritate
() [] . -> de la stânga la dreapta maxim
+-&*
(unari) ++ --
(tip) sizeof !
de la dreapta la stânga
~
* (binar) / %
+ - (binari)
<< >>
< <= > >=
== !=
& (binar) de la stânga la dreapta
^
|
&&
||
?:
= <<= >>=
+= -= *= /= de la dreapta la stânga
%= &= ^= |=
, de la stânga la dreapta minim

Teste de autoevaluare

4. Specifica i care va fi valoarea variabilei c.


int a=7,b=9,c;
c=(a>b)?a:b;
5. Scrie i secven ele echivalente pentru urm toarele exemple:
y=x++;
y=--x;
Bazele program rii 68

4.4. Realizarea structurilor fundamentale de control

4.4.1. Tipurile de instruc iuni


Instruc iunile unui program C se grupeaz într-un bloc delimitat de o pereche de acolade {}.
Instruc iunile se încheie cu caracterul ; (punct i virgul ), care este terminator de instruc iune i
este obligatoriu pentru a marca sfâr itul fiec reia.
Un program trebuie s execute cel pu in o instruc iune, chiar dac , la limit , aceasta este
vid . În limbajul C, un program se reg se te sub forma unei func ii r d cin , care, la limit , poate
avea un corp vid:
void main() {}
Dup modul de realizare a construc iilor sintactice i al num rului de ac iuni descrise, se
disting instruc iuni simple i structurate. De asemenea, pot fi create blocuri de instruc iuni execu-
tabile, denumite instruc iuni compuse.
O instruc iune compus este o secven de instruc iuni (simple, structurate sau compuse)
delimitat de perechea de acolade {}. Ea implementeaz natural structura secven ial din
programarea structurat . Mul imea instruc iunilor executabile ale unui program este, la limit , o
instruc iune compus . Orice instruc iune (simpl sau structurat ) poate fi transformat în
instruc iune compus .
O instruc iune este simpl dac descrie o singur ac iune, unic determinat i care nu
provoac condi ion ri. Din categoria instruc iunilor simple fac parte, de exemplu: instruc iunea
vid , instruc iunea de evaluare a unei expresii, goto, break, continue, return.
Instruc iunile structurate sunt construc ii care con in alte instruc iuni (simple, compuse
sau structurate) care vor fi executate alternativ sau repetitiv. Corespunz tor, prin instruc iunile
structurate se codific structurile fundamentale alternative sau repetitive din algoritm.

Pe lâng instruc iunile care implementeaz conceptele program rii structurate, C con ine
i instruc iuni care contravin acestora, datorit orient rii limbajului spre compactarea textului
surs i spre neconformism în stilul de programare impus de autori.

4.4.2. Instruc iunile simple


Instruc iunea vid descrie ac iunea vid . în C nu are o mnemonic explicit , fiind dedus din
contextul unor construc ii sintactice. Ea se folose te acolo unde trebuie s apar o instruc iune,
dar care nu trebuie s execute nimic. Situa ia este întâlnit de obicei în cazul instruc iunilor
structurate.
Exemple:
if (c==1) ; else c=2;
instruc iune vid ↑
if (c==1) ; else ;
instruc iuni vide ↑ ↑
{;}
instruc iune vid ↑

Instruc iunea de tip expresie evalueaz o expresie care, în cele mai dese cazuri, este de atribuire
sau de apel al unei func ii (vezi i capitolul Operatori i expresii). Instruc iunea de tip expresie se
ob ine scriind terminatorul de instruc iune dup o expresie (acolo unde este legal s apar o
instruc iune în program). Forma general este:
expresie;

4.4.3. Instruc iunea compus


Bazele program rii 69

Instruc iunea compus este o succesiunea de instruc iuni i declara ii, cuprinse între o pereche de
acolade. Se prefer ca declara iile s fie plasate înaintea instruc iunilor. Forma general este:
{declaratii
instructiuni}
Declara iile sunt valabile în interiorul instruc iunii compuse. Instruc iunea compus se
utilizeaz acolo unde este nevoie s se execute mai multe ac iuni, dar sintaxa impune prezen a
unei singure instruc iuni: mai multe instruc iuni sunt „transformate” într-o singur instruc iune
(compus ). Situa ia este întâlnit în cadrul instruc iunilor if, while, do, for, care precizeaz , în
sintaxa lor o singur instruc iune.

4.4.4. Instruc iunile structurate


În continuare, prin instruc iune se în elege o instruc iune simpl , compus sau structurat .

Realizarea structurilor alternative


a) Structura alternativ simpl (figura 4.2) permite realizarea unei ramific ri logice binare, în
func ie de valoarea unei condi ii (expresie cu rezultat logic). Instruc iunea care realizeaz aceast
structur este if :
if(expresie)instruc iune_1;
[else instruc iune_2];

fals adev rat


condi ie

Instruc iune 2 Instruc iune 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 adev rat) se execut instruc iune_1; în caz contrar se
execut instruc iune_2 sau se iese din structur (când construc ia else lipse te, caz în care
instruc iunea if realizeaz structura pseudoalternativ ).
Exemple:
1) if(a>b) a=c;
else a=b;
2. Rezolvarea ecua iei 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 ac iuni dintr-un grup, în func ie de
valorile pe care le poate lua un selector (figura 9.2). În limbajul C structura se simuleaz cu
instruc iunea switch, a c rei sintax este:

switch(expresie)
{case c_1: instruc iuni_1;
case c_2: instruc iuni_2;
………………
case c_n: instruc iuni_n;
[default: instruc iuni;]}
Bazele program rii 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); instruc iuni_1, instruc iuni_2, ...,
instruc iuni_n, instruc iuni sunt simple, compuse sau structurate. Dac pe o ramur sunt mai
multe instruc iuni, nu este nevoie s fie incluse între acolade (s fie instruc iune compus ).
Instruc iunea switch evalueaz expresia dintre paranteze, dup care caut în lista de
expresii constanta cu valoarea ob inut . Dac este g sit , se execut instruc iunile asociate valorii
respective i, secven ial, toate instruc iunile care urmeaz , pân la terminarea structurii de
selec ie. Dac valoarea c utat nu este g sit în list i ramura default este prezent , se execut
instruc iunile asociate acesteia. Dac ramura default lipse te nu se execut nimic. Pentru a limita
ac iunea strict la execu ia instruc iunilor asociate unei valori, trebuie inclus instruc iunea break,
care determin ie irea din structura switch.
Pentru a simula structura din figura 4.3 se scrie:
switch(expresie)
{case c_1: instruc iuni_1; break;
case c_2: instruc iuni_2; break;
………………
case c_n: instruc iuni_n; break;
[default: instruc iuni;]}

selector

selector = v1

selector = v2 selector = vn altfel

instruc iune 1 instruc iune 2 … instruc iune n instruc iune

Fig. 4.3. Structura alternativ multipl

Realizarea structurilor repetitive


a) Structura repetitiv condi ionat anterior este implementat prin instruc iunea while cu forma
general :
while (expresie) instruc iune;

Instruc iunea while se execut astfel: se evalueaz expresia i dac este diferit de zero
(adev rat ) se execut instruc iunea (simpl , compus sau structurat ), apoi se reia procesul pân
când la evaluarea expresiei se ob ine valoarea zero. În acest moment se încheie execu ia
instruc iunii while. Pentru a asigura ie irea din ciclu, instruc iunea trebuie s modifice valoarea
expresiei.
Dac la prima evaluare a expresiei se ob ine valoarea zero, atunci nu se execut nimic.
Instruc iunea while implementeaz natural structura corespunz toare din teoria program rii
structurate. Mecanismul de execu ie este redat în figura 4.4.
Bazele program rii 71

expresie ≠ 0 (adev rat)

=0 instruc iune
(fals)

Fig. 4.4. Mecanismul de execu ie a instruc iunii 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 condi ionat posterior este implementat (cu unele deosebiri fa
de teoria program rii structurate), prin intermediul instruc iunii do-while. Forma general este:
do instruc iune
while (expresie);
Instruc iunea do-while se execut astfel: se execut instruc iune apoi se evalueaz
expresia; dac expresia este nenul (adev rat ), se repet procesul, altfel se încheie execu ia.
Mecanismul de execu ie este redat în figura 4.5. Se observ c instruc iunea do-while se abate de
la teoria program rii structurate, realizând repeti ia pe condi ia adev rat, în timp ce structura
fundamental o realizeaz pe condi ia fals.

instruc iune

≠ 0 (adev rat)
expresie

= 0 (fals)

Fig. 4.5. Mecanismul de execu ie a instruc iunii do-while

Instruc iunea do-while este echivalent cu secven a:


instruc iune;
while(expresie) instruc iune;

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 program rii 72

c) Structura repetitiv cu num r tor nu este implementat în C. Ea poate fi simulat prin


instruc iunea for, care, datorit facilit ilor deosebite pe care le ofer , poate fi considerat ca o
instruc iune repetitiv cu totul particular , nedefinit în teoria program rii structurate. Ea este mai
apropiat de structura while-do. Instruc iunea for din C are urm toarea form general :
for(expresie_1; expresie_2; expresie_3)instruc iune;
Instruc iunea for se execut astfel: se evalueaz expresie_1; se evalueaz expresie_2 i
dac este nul (fals), se încheie execu ia lui for, altfel se execut instruc iune apoi se evalueaz
expresie_3. Se revine la evaluarea lui expresie_2 .a.m.d. Instruc iunea for realizeaz structura
repetitiv din figura 4.6 i poate fi înlocuit cu secven a:
expresie1;
while (expresie2)
{ instruc iune;
expresie3;}

expresie 1

≠ 0 (adev rat)
expresie 2

instruc iune
=0 (fals)

expresie 3

Fig. 4.6. Mecanismul de execu ie a instruc iunii for

Pentru a simula structura repetitiv cu num r tor (do-for) se folosesc forme particulare
pentru cele trei expresii:
expresie_1 va fi expresia de ini ializare: contor=valoare ini ial ;
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. Instruc iunile de salt necondi ionat i ie ire for at din structuri
Instruc iunile de salt necondi ionat i ie ire for at din structuri contravin principiilor program rii
structurate, dar pot fi utilizate în m sura în care, în aplica ii complexe, u ureaz munca
programatorului.

Prin instruc iunea continue, care se poate folosi numai în interiorul unei structuri
repetitive, se abandoneaz itera ia curent i se trece la urm toarea. Forma ei este:
continue;
Bazele program rii 73

Instruc iunea are urm toarele efecte:


• în interiorul instruc iunilor while i do-while: se abandoneaz itera ia curent i se trece la
evaluarea expresiei care controleaz terminarea buclei.
• în interiorul instruc iunii for: se abandoneaz itera ia curent i se trece la evaluarea
parametrului expresie_3.

Instruc iunea break este folosit numai în interiorul unei instruc iuni structurate i are
ca efect terminarea imediat a execu iei instruc iunii respective.

Instruc iunea goto realizeaz salt necondi ionat i este mo nit din primele limbaje de
programare, care nu foloseau principiile program rii structurate. Forma general este:
goto etichet ;
O etichet este un identificator urmat de caracterul : (dou puncte), dup care urmeaz o
instruc iune. Rolul unei etichete este de a defini un punct de salt, c tre care se poate face trimitere
prin instruc iunea goto. Etichetele au valabilitate local , în corpul func iei în care sunt definite.
Din acest motiv, nu se poate face salt din corpul unei func ii la o instruc iune aflat în alt
func ie.

Test de autoevaluare

6. Care din urm toarele secven e 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. Secven a: 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 re inerea pozi iei primei apari ii; b) minimul dintr-un
vector cu re inerea pozi iei ultimei apari ii; c) sortarea unui vector prin metoda bulelor;
d) sortarea unui vector prin metoda selec iei; e) c utarea unei valori date într-un vector.
8. Triunghiul de sub diagonala secundar (inclusiv diagonala) unei matrice p trate se poate
parcurge numai cu secven ele: 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. Urm toarele secven e 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 program rii 74

R spunsuri i comentarii la testele de autoevaluare

1. Dup preprocesare, secven a 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 octe i, iar referirea câmpurilor 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 ini ializarea câmpurilor 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 prime te valoarea maxim dintre a i b, anume 9.
5. y=x++; este echivalent cu secven a y=x; x=x+1;
y=--x; este echivalent cu secven a x=x-1; y=x;
6:d); 7:d); 8:e); 9:b).
Bazele program rii 75

Bibliografia unit ii de înv are

1. I. Gh. Ro ca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, M. Mircea, L. B t gan, C. Silvestru,


Bazele program rii calculatoarelor. Teorie i aplica ii în C, Ed. ASE, Bucure ti, 2006, ISBN 973-594-591-
6
2. I. Gh. Ro ca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, Programarea calculatoarelor. tiin a
înv rii unui limbaj de programare, Teorie i aplica ii, Ed. ASE, 2003
3. Ion Smeureanu, Marian Dârdal , Programarea în limbajul C/C++, Ed. CISON, Bucure ti 2004, ISBN
973-99725-7-8

Bibliografie
1. I. Gh. Ro ca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, M. Mircea, L. B t gan, C. Silvestru,
Bazele program rii calculatoarelor. Teorie i aplica ii în C, Ed. ASE, Bucure ti, 2006, ISBN 973-594-591-
6
2. I. Gh. Ro ca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, Programarea calculatoarelor. tiin a
înv rii unui limbaj de programare, Teorie i aplica ii, Ed. ASE, 2003
3. Ion Smeureanu, Marian Dârdal , Programarea în limbajul C/C++, Ed. CISON, Bucure ti 2004, ISBN
973-99725-7-8
4. Ro ca Gh. I., Ghilic-Micu B., Stoica M., Cocianu C., Uscatu C., Programarea calculatoarelor.
tiin a înv rii unui limbaj de programare. Teorie i aplica ii, Ed. ASE, Bucure ti 2003, ISBN
973-594-243-7

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