Documente Academic
Documente Profesional
Documente Cultură
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.
Bibliografie....................................................................................................................................75
Bazele program rii 4
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
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.
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).
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
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
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
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]
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 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
Î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.
BLOCK
S1 S1;
S2;
S2 S1 S2
nu da IF-THEN-ELSE
C IF C THEN
S1
ELSE
S2 S1 S2
C S1 S2 ENDIF;
a) Structura IF-THEN-ELSE
nu da IF-THEN
C
IF C THEN
S1
S1 ENDIF;
C S1
b) Structura IF-THEN
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;
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;
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
WHILE-DO
C da WHILE C DO
S
nu S ENDWHILE;
C S
a) Structura WHILE-DO
DO-UNTIL
S
DO
S
nu UNTIL C;
C S C ENDDO;
da
b) Structura DO-UNTIL
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
Teste de autoevaluare
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.
± 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
Test 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.
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
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
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.
s M
15 14 2 1 0
a) Virgul fix algebric
15 14 2 1 0
b) Virgul fix aritmetic
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
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
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
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
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.
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.
Suport extern
a a1 a2 ... an
de intrare
c1 c2 cn
f -1 c1* c 2* cn*
-1 -2 -3
a Suport extern
a* 1* a2 * ... an*
de ie ire
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
Î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).
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.
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.
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
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
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).
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)
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
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)
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
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
Î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
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.
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
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.
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
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
Lansare
în execu ie
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
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.
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
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.
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 .
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.
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
Masiv
Structurate Articol
Fi ier
Pointer
Dinamice Simple
Referin
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 .
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.
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.
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 */
{{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
a)
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.
programului, în zona de memorie rezervat articolului nu este memorat decât unul dintre
câmpurile acestuia.
Declararea tipului reuniune se realizeaz astfel:
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
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.
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.
Observa ie: Cu excep ia operatorului %, care admite numai operanzi întregi, ceilal i admit toate
tipurile numerice.
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;
Î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:
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).
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.
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);
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.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).
- 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.
Teste de autoevaluare
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.
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;
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.
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
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
=0 instruc iune
(fals)
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)
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
expresie 1
≠ 0 (adev rat)
expresie 2
instruc iune
=0 (fals)
expresie 3
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 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
#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
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