Documente Academic
Documente Profesional
Documente Cultură
Curs BP PDF
Curs BP PDF
Bazele programrii
Bucureti 2010
TITLUL CURSULUI: Bazele programrii
INTRODUCERE
Cursul de Bazele programrii se adreseaz studenilor nscrii la programul de studiu ID,
organizat de facultatea Cibernetic, Statistic i Informatic Economic i face parte din planul
de nvmnt aferent anului I, semestrul II. Pentru o bun nelegere a noiunilor teoretice i
practice prezentate n acest curs, este recomandat s se fi parcurs anterior disciplina Bazele
tehnologiei informaiei.
Bibliografie....................................................................................................................................75
Bazele programrii 4
Cuprins
Obiectivele unitii de nvare 1
1.1. Caracteristicile i reprezentarea algoritmilor
1.2. Descrierea structurilor fundamentale
1.3. Structurarea i proiectarea algoritmilor
Rspunsuri i comentarii la testele de autoevaluare
Bibliografia unitii de nvare
Exemplu:
S se elaboreze algoritmul pentru rezolvarea ecuaiei: ax2 + bx + c = 0, a,b,c,x. Analiza arat c exist
patru situaii posibile care trebuie cuprinse n algoritm:
1. a 0, ecuaie de gradul II;
2. a = 0 i b 0, ecuaie de gradul I;
3. a = 0 i b = 0 i c 0, ecuaie imposibil;
4. a = 0 i b = 0 i c = 0, nedeterminare.
Rmne s fie rezolvate fiecare din aceste situaii sau unele din ele s fie grupate n funcie de cerine.
Iterativitatea este procesul prin care rezultatul este obinut ca urmare a execuiei repetate a
unui set de operaii, de fiecare dat cu alte valori de intrare. Numrul de iteraii poate fi cunoscut
sau necunoscut, dar determinabil pe parcursul execuiei. Indiferent de situaie, numrul de iteraii
trebuie s fie totdeauna finit. n cazul n care numrul de repetri nu este cunoscut iniial, oprirea
ciclrii se face combinnd instruciunile de calcul cu instruciunile de control. Condiiile finale ce
trebuie ndeplinite pentru terminarea ciclrii se bazeaz pe rezultatele calculelor pn la un moment
dat, de cele mai multe ori fiind corelate cu viteza de convergen a calculelor ctre o valoare stabil
i, implicit, cu gradul de aproximare impus unui rezultat.
Utilizarea iterativitii n descrierea algoritmilor este uneori o cale simplificatoare, alteori
singura alternativ de a preciza modul de desfurare a unui proces de calcul. n general, cnd
numrul de iteraii nu este cunoscut sau este variabil de la o execuie la alta, singura modalitate de
descriere a algoritmului presupune iterativitatea. Spre exemplu, ridicarea la ptrat a elementelor
unui vector cu 3 elemente se poate descrie prin urmtoarea succesiune de operaii:
V(1)=V(1) V(1)
V(2)=V(2) V(2)
V(3)=V(3) V(3)
Realizarea aceluiai lucru pentru un vector n-dimensional, cu n variind de la o execuie a
programului la alta, nu este posibil n aceast manier, deoarece un algoritm este corect dac are
precizai toi paii. Singura modalitate de realizare utilizeaz operaia V(I)=V(I) V(I), plasat ntr-
un ciclu variind dup I, de la 1 la o valoare final N, dat explicit de utilizator la fiecare execuie a
programului.
Recursivitatea este procesul iterativ prin care valoarea unei variabile se determin pe baza
uneia sau mai multora dintre propriile ei valori anterioare. Dup cum valoarea curent a variabilei
depinde de una sau mai multe valori anterioare, procesul este unirecursiv, respectiv multirecursiv.
Recursivitatea presupune definirea uneia sau mai multor formule de start (n funcie de
numrul valorilor anterioare de care depinde valoarea curent) i a unei formule recursive (de recu-
ren). Recursivitatea apare i n cazuri dintre cele mai simple, cum ar fi numrarea, factorialul,
nsumarea sau nmulirea elementelor unui ir.
Bazele programrii 6
Exemple:
A numra nseamn a aduga o unitate la valoarea anterior calculat. Dac se noteaz v0 = 0
valoarea iniial, numrarea se desfoar dup urmtorul proces recursiv:
v1 = v0 + 1
v2 = v1 + 1
v3 = v2 + 1
........
vi = vi-1 + 1
........
vn = vn1+1
Valoarea care intereseaz este vn. n procesul descris anterior se disting:
v0 = 0 formula de start
vi = vi-1 + 1 formula recursiv, pentru i=1,n
Cnd valorile obinute prin numrare nu necesit pstrarea n memorie, nu sunt necesare mai multe
locaii, ci una singur, care va fi suprascris la fiecare iteraie:
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
situaia multirecursivitii. Practic, prin transferul dinamic al valorilor intermediare, sunt necesare
attea zone de memorie cte valori precedente sunt necesare calculului termenului curent.
Exemplu:
Algoritmul lui Euclid pentru determinarea celui mai mare divizor comun a dou numere A i B.
rk
Restul curent se calculeaz pornind de la ultimul i penultimul rest, dup relaia: r k + 2 = r k - 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 demprit, cu I variabila mpritor i cu R
restul, formulele de start devin: Da; Ib. Iterativ, se calculeaz restul RD- D I i se execut
I
transferurile: DI; IR. mpritorul devine noul demprit, iar ultimul rest obinut devine mpritor n
iteraia urmtoare a algoritmului. Procesul iterativ continu pn se obine restul zero. Ultimul rest nenul
reprezint cel mai mare divizor comun al numerelor A i B.
Teste de autoevaluare
c1 cn
...
c2
c Nu Da
c c
Definiie:
Se numete schem logic un graf orientat n care:
a) Exist un singur bloc START i un singur bloc STOP;
b) Orice arc este etichetat cu una din urmtoarele informaii: START sau STOP; o citire sau
o scriere; o atribuire; un predicat, n care caz extremitatea iniial a arcului este extremitatea iniial
a unui bloc de ramificaie;
Bazele programrii 8
c) Orice arc face parte din cel puin un drum care ncepe cu blocul START i se termin cu
blocul STOP.
n practic, schemele logice alctuite conform regulilor enunate anterior pot lua forme
foarte complicate, greu de urmrit, uneori chiar de cel care le-a conceput. De aceea s-a simit
nevoia ca n construcia schemelor logice s se foloseasc numai anumite configuraii (structuri) i
s se respecte reguli stricte, obinndu-se, astfel, scheme logice structurate.
Definiie:
Se numete subschem logic un graf orientat n care:
a) Exist un unic vrf iniial (n care nu sosesc arce) i un vrf final (din care nu pleac arce);
b) Oricare arc este etichetat cu una din urmtoarele informaii: START sau STOP; o citire sau
o scriere; o atribuire; un predicat, n care caz extremitatea iniial a arcului este extremitatea iniial
a unui bloc de ramificaie;
c) Dac subschema conine blocul START (STOP), atunci extremitatea iniial (final) a
blocului este chiar vrful iniial (final);
d) Orice arc face parte din cel puin un drum ce unete vrful iniial cu cel final.
n particular, o schem logic este o subschem logic n care vrful iniial este extremitatea
iniial a blocului START, iar vrful final este extremitatea final a blocului STOP.
Prin recuren, schema logic structurat (s.l.s.) se definete astfel:
(I) Blocurile START, STOP, de intrare/ieire i de atribuire sunt s.l.s.;
(II) Dac s1 i s2 sunt s.l.s., atunci i subschemele din figura 1.1. sunt s.l.s. (cu respectarea
condiiilor referitoare la START i STOP).
(III) Orice s.l.s. se obine plecnd de la (I) i aplicnd de un numr finit de ori regulile (II).
S1
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? Rspunsul, afirmativ, este dat de teorema fundamental a
programrii structurate (teorema lui Bhm-Jacopini): orice schem logic este echivalent cu o
schem logic structurat. [Dodescu et al., 1987]
se pune problema portabilitii, mai ales atunci cnd se lucreaz n echip. Cel mai avansat
pseudocod universal a fost propus n anii 60 de Niklaus Wirth, pseudocod care ulterior a devenit
limbajul de programare Pascal. [Roca et al., 1998] Se propune urmtorul pseudocod:
Cuvinte cheie. Sunt mnemonice ale instruciunilor, unele fiind scrise n limba englez,
pentru compatibilizare cu literatura de specialitate (de exemplu WHILE-DO, IF-THEN-ELSE).
Instruciuni. Instruciunile pot fi scrise liber, n sensul c o instruciune se poate scrie pe
mai multe rnduri, iar un rnd poate conine mai multe instruciuni (separate prin ";").
Instruciunile se mpart n declaraii (instruciuni neexecutabile) i instruciuni efective
(executabile).
O declaraie este format din cuvinte cheie (de exemplu NTREG, REAL, CARACTER
etc.), urmat de un ir de variabile separate prin ",", variabile pentru care se indic faptul c au tipul
ntreg, real, caracter etc. Masivele se declar prin tipul elementelor sale, urmat de o construcie
care desemneaz numrul maxim de elemente pe fiecare dimensiune, sub forma [d1][d2]...[dn].
Exemple:
NTREG a, b, c;
REAL vector[20];
NTREG matrice [10][15];
Instruciunea de atribuire are forma: v=e, unde v este variabil, e este expresie, ambele de
aceeai natur (numeric, logic sau caracter).
Instruciunile de ramificare (IF-THEN-ELSE, IF-THEN, CASE-OF) i cele repetitive
(WHILE-DO, DO-UNTIL, DO-FOR) sunt prezentate mpreun cu structurile fundamentale.
Observaii:
a) Instruciunile corespund configuraiilor acceptate ntr-o schem logic structurat, deci sunt
compatibile cu programarea structurat.
b) Instruciunile acestui pseudocod se pot extinde la lucrul cu fiiere.
Teste de autoevaluare
3. Blocurile dintr-o subschem logic sunt etichetate cu una din informaiile: 1)START;
2)citire; 3)scriere; 4)expresie aritmetic; 5)expresie logic; 6)expresie relaional; 7)sir de
caractere; 8)atribuire; 9)salt necondiionat; 10)STOP. a)oricare; b)1,2,3,5,6,8 sau 10;
c)1,2,3,4,8 sau 10; d)1,2,3,5,6,7,8 sau 10; e)1,2,3,4,6,8,9 sau 10
4. Reprezentarea prin arbori este permis numai pentru structurile: 1)BLOCK; 2)IF-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 programrii 10
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 i1, 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;
Observaii:
1. Diferena esenial ntre WHILE-DO i DO-UNTIL cost n aceea c DO-UNTIL execut s cel
puin o dat, pe cnd WHILE-DO poate s nu execute pe s. Oricum, cele dou structuri se pot transforma
uor una n alta, astfel:
WHILE-DO(c,s)=IF-THEN(c,DO-UNTIL( c ,s))
DO-UNTIL(s,c)=BLOCK(s,WHILE-DO( c ,s))
2. Structura DO-FOR este un caz particular al structurii DO-UNTIL, putndu-se scrie:
DO-FOR(v,vi,vf,vr,s)=BLOCK(v=vi,WHILE-DO(vvf,BLOCK(s,v=v+vr)))
Bazele programrii 12
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;
vvf
S S
nu
v=v+vr
c) Structura DO-FOR
Teste de autoevaluare
Erorile n algoritmi
Un algoritm este eficient i devine operaional n msura n care ntre resursele de calcul
utilizate (timp i memorie calculator) i precizia rezultatelor se stabilete un raport acceptabil.
Cu toat precizia oferit de calculatoarele electronice, calitatea rezultatelor este influenat
de muli ali factori. Soluia unei probleme depinde de datele iniiale, acestea fiind obinute n urma
unor observaii, msurtori sau pe baza altor calcule prealabile. Precizia instrumentelor cu care se
fac observaiile, condiiile n care au loc acestea, precizia calculelor necesare determinrii unor
parametri iniiali genereaz erori n datele iniiale. n general, pentru aceast clas de erori se
stabilesc limite de eroare.
O parte din parametrii utilizai n formulele de calcul nu au o valoare exprimabil printr-un
numr finit de zecimale (de exemplu 3 , , e etc). Erorile de aproximare a lor sunt cunoscute i
Bazele programrii 14
vor fi astfel alese nct s fie corelate cu precizia dorit pentru calculele n care intr aceti
parametri.
O alt clas important de erori o constituie erorile de rotunjire. Ele apar ca urmare a
limitrii numrului de zecimale cu care se poate reprezenta un numr n calculator. Aceste erori
depind de modul de reprezentare a numerelor n calculator, de sistemul de numeraie folosit n
calcule, precum i de conversiile dintr-un sistem de numeraie n altul.
La rezolvarea, mai ales numeric, a unei probleme se folosete o metod matematic. De
multe ori, fenomenul modelat este supus unor condiii simplificatoare, n funcie de acestea alegnd
una sau alta din metodele de rezolvare existente. Alegerea metodei poate introduce aa numitele
erori de metod. Erorile introduse prin prezena n calculator a unor funcii crora n analiza
matematic le corespund serii infinite se numesc erori reziduale. Ele se explic prin imposibilitatea
calculrii unei serii infinite ntr-un numr finit de pai ai algoritmului.
x * y* * *
= = x * y , pentru eroarea relativ.
rx y * * rx * * ry * *
*
x y
*
x y x y
*
De reinut c la scderea a dou numere apropiate ca valoare, eroarea relativ i pierde din
acuratee datorit numitorului raportului care tinde spre zero. Relaiile funcioneaz i pentru n>2
numere. n cazul produsului a mai multor numere aproximative i nenule, eroarea relativ nu
depete suma erorilor relative ale numerelor:
x*. y* - (xy - x y ) = ( x + x*) ( y + y*) - x y = x y* + y x* + x* y*
* * * * * * * *
x*. y*
r x*. y* =
* *
x .y
n care, logaritmnd (valorile absolute permind acest lucru, iar x* i y* pentru simplificare au
acelai semn) i folosind formula de aproximare ln x - ln x * d ln x * = x* , rezult c
*
x
* *
y x* - x y*
r x* y* r x* + r y* . n cazul operaiei de mprire ( x )* , r ( x )* | r x* | + | r y* | , ceea ce
y ( y* ) 2 y
nseamn c eroarea relativ a ctului nu excede suma erorilor relative ale dempritului i
mpritorului. Erorile n cazul unor expresii calculabile prin operaiile elementare pot fi aproximate
folosind limita maxim a erorilor fiecrui termen n parte.
Bazele programrii 15
Teste de autoevaluare
7. Un algoritm structurat este echivalent cu un algoritm pus sub una din formele:
1)BLOCK(s1,s2); 2)IF-THEN-ELSE(c,s1,s2); 3)IF-THEN(c,s); 4)CASE-OF(i,s1,s2,...,sn,s);
5)WHILE-DO(c,s); 6)DO-UNTIL(s,c); 7)DO-FOR(v,vi,vf,vr,s). a)1,2,3,4,5,6,7; b) 1,2,3,5,6;
c) 1,2,5,6,7; d) 1,2,5; e) 1,2,6.
8. Teorema de structur stabilete c: a) orice schem logic este echivalent cu o schem
logic structurat; b) orice schem logic poate fi pus sub una din
formele:BLOCK(s1,s2); IF-THEN-ELSE(c,s1,s2); WHILE-DO(c,s); c) corectitudinea
unei scheme logice structurate se verific prin examinarea fiecrui nod din arborescena
sa; d) o schem logic structurat poate fi descompus n structurile privilegiate
Proiectarea algoritmilor
Conceptele principale ce s-au cristalizat n domeniul programrii structurate sunt:
proiectarea top-down, proiectarea modular, proiectarea structurat. Cele trei tipuri de proiectri
nu se exclud unul pe altul, ci se intercoreleaz pentru desfurarea unei activiti organizate i
disciplinate, concretizat n obinerea unor produse program care s reflecte clar ierarhizarea
prelucrrilor i care s faciliteze testarea i documentarea lor.
Proiectarea top-down presupune descompunerea, de la general la particular, a problemei
date n subprobleme sau funcii de prelucrat, conducnd la realizarea algoritmului n mai multe faze
succesive, fiecare faz fiind o detaliere a fazei anterioare pn cnd algoritmul este suficient de
rafinat (detaliat) pentru a fi codificat. Apar astfel, n diferite faze succesive, algoritmi din ce n ce
mai detaliai. n urma descompunerii se obine o structur liniar sau arborescent.
Proiectarea top-down este nsoit de codificare (scriere a programelor) top-down i testare
top-down. Codificarea top-down presupune, n principal, posibilitatea scrierii unui modul nainte de
a se proiecta modulele de nivel inferior (superior), iar testarea top-down const n realizarea ei de
sus n jos: se pornete cu modulul rdcin i cu unu sau mai multe module de ordin imediat
inferior, se continu cu ataarea unui alt nivel inferior etc., pn cnd s-au inclus n testare
modulele ultimului nivel. Testarea top-down poate lua n considerare, la un moment dat, numai
legturile unui modul cu module de pe nivelul inferior, fr testare propriu-zis a acestora din urm.
Proiectarea modularizat presupune descompunerea problemelor n pri numite
module, astfel nct fiecare din acestea s ndeplineasc anumite funcii bine definite.
Descompunerea se poate face n mai multe faze (la mai multe niveluri) prin metoda top-down.
Criteriile de descompunere n module depind, n mare msur, de experiena proiectanilor
(programatorilor).
Ele se refer, n principal, la: omogenizarea funciilor; utilizarea diverselor structuri de date;
separarea funciilor de intrare/ieire de funciile de prelucrare; utilizarea unor module deja
existente; posibilitile echipei n sarcina creia intr realizarea modulelor; utilizarea eficient a
resurselor calculatorului (periferice, timp, memorie intern) etc.
Proiectarea modularizat presupune, pe lng identificarea modulelor i a relaiilor dintre
ele, i precizarea modului i ordinii n care modulele sunt puse n lucru. Din punct de vedere al
funciilor pe care le conin, se disting: module de prelucrare (operaionale) care conin funcii de
prelucrare (operaii propriu-zise), module de comand (monitor) care apeleaz (activeaz) alte
module i module mixte, care conin att funcii de prelucrare ct i de comand. n stabilirea
ordinei de punere n lucru a modulelor, arborele se parcurge n preordine. Dup stabilirea
modulelor, acestea se abordeaz algoritmic, independent unul fa de altul.
Bazele programrii 16
Test de autoevaluare
1:d); 2:d); 3:b); 4:a); 5:c); 6:e); 7:d); 8:a); 9. Tipurile de proiectri care s-au
cristalizat n domeniul programrii structurate sunt: proiectarea top-down, proiectarea
modular, proiectarea structurat.
Rezumat
n cadrul acestei uniti de nvare au fost studiate urmtoarele aspecte n ceea ce privete
algoritmii i schemele logice:
cunotine teoretice privind caracteristicile i descrierea algoritmilor;
modaliti de reprezentare a algoritmilor sub form de scheme logice i pseudocod;
reprezentarea structurilor fundamentale sub form de schem logic, arbore, pseudocod
i exprimare analitic;
proiectarea, verificarea i analiza algoritmilor.
Dup ncheierea acestei uniti de nvare, studenii au cunotine i abiliti de rezolvare a
problemelor (n special lucrul cu masive), prin reprezentarea acestora sub form de algoritmi
structurai.
Cuprins
Obiectivele unitii de nvare 2
2.1. Informaia, data i reprezentarea intern a datelor
2.2. Structuri de date
Rspunsuri i comentarii la testele de autoevaluare
Bibliografia unitii de nvare
Informaia este un concept de maxim generalitate, care poate fi definit prin raportarea la
conceptele de materie i energie. Fondatorul ciberneticii, Norbert Wiener1, consider informaia
ca a treia form de manifestare a realitii obiective, apreciind c ea nu este nici materie, nici
energie, ci pur i simplu informaie. Se poate remarca faptul c definiia anterioar este dat n
sens negativ.
Pentru a ncerca o definiie afirmativ, se cuvine mai nti s se fac distincie ntre dou
maniere de a aborda conceptul pus n discuie: n general, ca semnele care circul pe diferite
canale ntre elementele lumii reale, cu forme specifice de receptare la diferitele niveluri de
manifestare a materiei vii; n particular, cnd elementul receptor este omul, ca fiin superioar pe
scara biologic. n acest ultim sens, informaia trebuie considerat n raport cu procesul de
cunoatere i cu modul de reflectare a rezultatelor sale n contiina fiinei umane. n literatura de
specialitate sunt identificate urmtoarele trsturi definitorii ale informaiei:
semn cu semnificaie: este obligatoriu ca un mesaj s fie construit ntr-o limb (limbaj) cunoscut
de receptor;
noutate: exist mesaje care, dei sunt redactate ntr-o limb cunoscut, nu conin nimic nou
pentru receptor, pierzndu-se calitatea de informaie;
1
Norbert Wiener Cybernetics or Control and Communication in the Animal and the Machine, Herman
and Cie, Paris, The MIT Press, Cambridge (Mass), Wiley and Sons, New York (1948), ediia a doua
revzuit i adugit (dou capitole noi), The MIT Press, Cambridge (Mass), Wiley and Sons, New York,
1961
Bazele programrii 19
utilitate: n raport cu interesele receptorului, este posibil ca un mesaj cu caracter de noutate s fie
inutil pentru activitatea sa, pierzndu-i, de asemenea, calitatea de informaie.
Corespunztor, se identific urmtoarele niveluri la care se consider informaia: sintactic, semantic i
pragmatic.
Nivelul sintactic este asociat sistemului de semne i regulilor utilizate pentru a le reuni n
construcii sintactice folosite pentru reprezentarea informaiei n procesul de culegere,
transmitere, nregistrare i prelucrare. Acestui nivel i corespunde conceptul de dat, care,
folosind notaia formal BNF (Backus-Nour Form), poate fi definit astfel:
<dat>: : = <identificator> <atribute> <valoare>.
Regulile de sintax care formeaz mulimea produciilor pot fi specificate n mai multe moduri,
dintre care se remarc notaia formal BNF (Backus Normal Form) i diagramele de sintax. n notaia
BNF, regulile sintactice (metadefiniiile) au forma:
<parte-stnga> ::= parte-dreapta
unde <parte-stnga> desemneaz metavariabila (variabila neterminal) care se definete, ::= este un
metasimbol avnd sensul de este prin definiie, iar parte-dreapta reprezint definiia metavariabilei.
n cadrul definiiei (parte-dreapta) se ntlnesc urmtoarele elemente:
<metavariabila>, categorie folosit n definirea altei categorii sintactice;
metaconstanta, element al alfabetului terminal;
care separ alternativele n definiie;
[ ] care indic o construcie opional;
{ } care indic posibilitatea repetrii construciei.
Alternativele se constituie prin juxtapunerea de metavariabile i/sau metaconstante.
Referitor la al doilea caz, se constat, ns, c este obligatorie existena unei intersecii
nevide ntre cele dou mulimi, numit redundan, astfel nct recepia i nelegerea
mesajului s aib loc.
n final putem sintetiza o serie de concluzii clarificatoare a problematicii puse n
discuie.
O informaie este un mesaj susceptibil de a aduce o cunotin i poate fi generat numai de
sisteme cu numr n finit de stri (n 2). Modelul de reprezentare a informaiei, formula scris,
reprezint o dat. Deosebirea dintre informaie i dat este echivalent cu deosebirea dintre obiect i
modelul su. Sub aspect semantic, informaia poate fi caracterizat ca semnificaie a datelor.
Calculatoarele actuale prelucreaz date pe baza crora se obin rezultate (tot date) care, prin
interpretare uman, capt un sens, devenind informaii.
C.E. Shannon a introdus noiunea de cantitate de informaie, care se poate defini astfel: fie
un experiment X, avnd un numr finit de evenimente elementare independente x1,x2,...,xn, care se
realizeaz cu probabilitile p1,p2,...,pn: X = x1 x2 ... xn . Dac X reprezint un sistem complet de
p p ... p
1 2 n
n
evenimente: 0pk1, pentru orice k{1,2,...,n} (1) i p
k =1
k = 1 (2), atunci cantitatea de informaie
(entropia) se msoar dup relaia:
n
H(p1 , p 2 , ..., p n ) = - p k log 2 p k (3)
k =1
Cantitatea de informaie se exprim, cel mai adesea, n bii. Bitul poate fi definit ca
informaia furnizat de un sistem cu dou stri echiprobabile:
x1 x 2
X = (4)
1/2 1/2
Aplicnd formula (3), se obine:
n
H(p1, p 2 ,..., p n ) = p k log 2 p k = (1/2)log 2 (1/2) (1/2)log 2 (1/2) == 1/2 + 1/2 = 1 bit
k =1
Prin dat se desemneaz un model de reprezentare a informaiei accesibil unui anumit
procesor (om, unitate central, program etc.), model cu care se poate opera pentru a obine noi
informaii despre fenomenele, procesele i obiectele lumii reale.
n notaie BNF, semnificaia cuvintelor de definire este urmtoarea.
Identificatorul este un nume care se asociaz datei, pentru a o distinge de alte date i a o
putea referi n procesele de prelucrare (referire prin nume).
Valoarea datei se poate preciza prin enumerare sau printr-o proprietate comun. Ea poate fi
numr ntreg, real, complex, logic, ir de caractere etc. Data care pstreaz aceeai valoare pe tot
parcursul prelucrrii este denumit constant. n caz contrar, data se numete variabil. Pentru
datele constante se folosete, n general, drept identificator chiar valoarea, adic o astfel de dat se
autoidentific prin forma textual a valorii, ceea ce justific denumirea de literal. n unele limbaje
de programare, ntre care i C, exist i posibilitatea definirii unor constante simbolice, crora li se
asociaz un identificator propriu.
Atributele precizeaz proprieti ale datei i ele determin modul n care aceasta va fi tratat
n procesul de prelucrare. Dintre atributele care se pot asocia unei date, cel mai important este tipul.
El precizeaz mulimea valorilor pe care le poate avea o dat, precum i mulimea de operaii care
se pot efectua cu elementele mulimii de valori ale datei. Pe lng tip, unei date i se pot asocia i
alte atribute, ca: precizia reprezentrii interne, cadrarea valorilor n zona afectat, modul de alocare
a memoriei pe parcursul prelucrrii (static, dinamic), valoarea iniial etc.
Bazele programrii 21
Data este elementar (scalar) dac apare ca o entitate indivizibil, att n raport cu
informaia pe care o reprezint, ct i n raport cu procesorul care o prelucreaz. O dat scalar
poate fi privit la nivelul unui procesor uman (nivel logic), respectiv la nivelul calculatorului, ca
procesor (nivel fizic). La nivel fizic, unei date i corespunde o zon de memorie de o anumit
mrime, situat la o anumit adres, n care sunt memorate, n timp i ntr-o form specific,
valorile acesteia.
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 convenia ca semnul "+" s fie reprezentat prin valoarea
binar 0 iar semnul "" prin valoarea binar 1);
M este o valoare exprimat n binar, n cod direct pentru numere pozitive i n cod
Bazele programrii 22
Tip reprezentare
Caracteristici
Simpl precizie Dubl precizie
reprezentare fracie
Valoarea minim
1 1
caracteristic
Valoarea maxim
254 2047
caracteristic
Eroare maxim fracie 2-24 10-7 2-24 10-7
Cel mai mic numr
21-127 10-38 21-1023 10-307
pozitiv
Cel mai mare numr
22254-127 1038 222047-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
Aa dup cum s-a artat, instruciunile sunt prelucrate de UCC. ncrcarea instruciunilor
n UCC se realizeaz automat. Pentru a lansa un program n execuie, UCC trebuie s "cunoasc"
adresa primei instruciuni de executat (adresa de start). Acesta este motivul pentru care n unele
limbaje de programare este obligatorie etichetarea primei instruciuni executabile. n exemplul
din figura 1.9. se presupune c adresa de start a programului este 47068. Aceast adres este
ncrcat n contorul de adrese (un registru special numit program counter - PC).
n UCC este ncrcat ntotdeauna instruciunea aflat la adresa precizat de PC. Registrul
PC este incrementat automat, fiind astfel pregtit s adreseze urmtoarea instruciune. Deci, dup
ce se execut instruciunea I1, coninutul lui PC devine 47108. Se ncarc n UCC instruciunea I2.
Dup execuia acesteia, PC va conine adresa 47128. Dei la aceast adres este memorat o dat,
ea este ncrcat n UCC i, prin urmare, este tratat ca instruciune. Se pot ivi urmtoarele
situaii:
- coninutul lui D4, printr-o ntmplare, coincide cu o instruciune a unitii centrale, caz n
care este executat ca atare i coninutul lui PC este autoincrementat;
- coninutul lui D4 nu coincide cu nici o instruciune acceptat de unitatea central, caz n
care programul este abandonat (terminare anormal).
Prin acest exemplu s-a artat cum data este tratat de calculator ca instruciune. Deci, prin
actualizarea contorului de adrese dup execuia fiecrei instruciuni, se asigur nlnuirea
normal a instruciunilor din program (derularea programului n secven). Cum se poate proceda
Bazele programrii 25
atunci cnd nu se face parcurgerea n secven i este nevoie s se sar peste cteva cuvinte de
memorie pentru a ajunge la instruciunea dorit? Programatorul are la dispoziie instruciunile de
salt, prin folosirea crora se asigur ntreruperea secvenei normale de program, prin ncrcarea
forat n PC a adresei la care se gsete instruciunea de executat.
Se presupune c instruciunea I2 este: SALT LA 47168. Dup ce se execut instruciunea
I1, contorul de locaii devine 47108. Se execut, n secven, instruciunea I2 care pune contorul
de adrese pe valoarea 47168 (fiind o instruciune de salt).
Prin urmare, n UCC se ncarc instruciunea I3 .a.m.d. n exemplul anterior s-a
considerat c toate instruciunile au lungimea de un cuvnt. n secvena logic a programului,
ultima instruciune trebuie s fie de tip STOP.
Dup extragerea instruciunii din memorie (prima etap n prelucrarea unei instruciuni)
se execut urmtoarele etape: calculul adresei operandului; efectuarea operaiei propriu-zise,
precizat de instruciune.
n cadrul fiecrei etape se execut un anumit numr de faze. Indiferent de modul de
realizare a fazelor (prin macroinstruciuni sau prin funciuni cablate), principial, modul de
prelucrare a unei instruciuni este asemntor. Se consider c n UCC se gsete instruciune I3:
ADUNA (4704) cu (4712) care adun coninutul de la adresa 47048 cu coninutul de la adresa
47128 iar rezultatul se depune la adresa celui de-al doilea operand. Pentru a nelege modul cum
se execut aceast instruciune se presupune c UAL este format din dou registre (sumatoare),
n care se realizeaz calcule. Instruciunea I3 poate fi descompus n urmtorii pai (figura 2.4.):
- preia coninutul operandului surs de la adresa 47048 (D3) ntr-un sumator;
- preia coninutul operandului destinaie de la adresa 47128 (D4) n al doilea sumator;
- efectueaz calculul ntre cele dou sumatoare, cu rezultatul n S1;
- depune coninutul sumatorului S1 n memorie la adresa 47128.
n mod similar se pot interpreta i alte operaii de calcul. Toate operaiile realizate asupra
datelor se efectueaz n unitatea aritmetico-logic. Aceast afirmaie este valabil i n cazul
uneia din cele mai simple operaii: MUTA (47148) IN (47008), care se descompune astfel:
- preia operandul surs de la adresa 47148 (D5) n sumatorul S1;
- depune coninutul sumatorului S1 n memorie la adresa 47008 (D1 se pierde, depunndu-
se peste el D5).
Ce se va ntmpla n cazul instruciunii ADUNA (47008) cu (47108)? Rspuns: coninutul
de la adresa 47108 (I2) este tratat ca dat.
D1 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 vzut cum instruciunea este tratat ca dat i, mai mult, cum un
program i poate modifica instruciunile proprii. Nu toate limbajele de programare ofer
posibilitatea intercalrii n memorie a datelor i instruciunilor. De fapt, aceast intercalare nici nu
Bazele programrii 26
Instruciune Pointer
Adres Adres operand Operand
Se spune c zona de memorie care stocheaz adresa operandului este de tip pointer. Toate
limbajele de programare accept adresarea direct a operanzilor. Unele dintre ele accept lucrul
cu pointeri (adresare indirect). n acest caz, programatorul trebuie ca, nainte de adresare, s
ncarce n zona de tip pointer adresa operandului.
Operaii de intrare/ieire
Operaiile de intrare/ieire realizeaz citirea - introducerea datelor n memorie - i
scrierea - extragerea datelor din memorie. Deoarece datele pot fi prelucrate doar dac se gsesc
n memoria intern, apare ca necesar operaia de citire prin care se transfer datele furnizate de
utilizator. Cum toate operaiile i depun rezultatul n memoria intern, punerea lor la dispoziia
utilizatorilor necesit operaia de scriere. Elementele care definesc o instruciune de I/E sunt:
- de unde (unde) sunt introduse/extrase datele;
- care este structura extern a datelor (formatul extern);
- care este adresa memoriei n/din care se introduc/extrag datele.
Reprezentarea numerelor pe suporturile externe la care are acces n mod direct operatorul
uman trebuie s fie ASCII. Modul de realizare a corespondenei dintre un numr reprezentat
ASCII pe un suport extern i acelai numr reprezentat intern virgul fix sau virgul mobil este
prezentat schematic n figura 2.6.
Fie aA. Aplicaia f este o codificare bijectiv a mulimii A ntr-o mulime de coduri
reprezentabile pe un suport intern (de exemplu, o codificare n virgul fix sau n virgul mobil).
Fiecare numr din A se reprezint pe un suport extern sub forma unui ir de caractere (caracterele
aparin unei mulimi K). Imaginea pe suportul extern a unui numr aA nu este, n general, unic
(de exemplu a=13,9 poate fi reprezentat n mai multe feluri: +13.9; 139; +139 etc.). Se noteaz cu
Ia mulimea imaginilor pe suportul extern de intrare pentru elementul aA. n figura 1.11 s-a
presupus c imaginea numrului aA pe suportul extern de intrare este irul de caractere a1, a2, ...
, an.
Aplicaia este o codificare standard a mulimii K de caractere (ASCII). irul c1,c2...cn
rezult din irul a1, a2,...an prin aplicarea funciei fiecrui caracter ai, i=1,2,...n. Se noteaz cu Ca
mulimea irurilor de coduri care se obine din elementele lui Ia prin aplicarea funciei , n modul
descris anterior.
Bazele programrii 27
Suport extern
a a1 a2 ... an
de intrare
f
c1 c2 cn
f(a) Suport intern
*
-1
f c1* c 2* cn*
-1 -2 -3
a Suport extern
a* 1* a2 * ... an*
de ieire
Teste de autoevaluare
n afara datelor scalare, n aplicaiile practice se utilizeaz colecii de date. ntre elementele
unei colecii de date pot fi identificate sau, eventual, pot fi introduse relaii care s determine pe
mulimea respectiv o anumit structur, adic un mod de ordonare, astfel nct s se faciliteze
prelucrarea. O colecie de date pe care s-a definit un mecanism de selectare a elementelor
(componentelor), constituie o structur de date. Ea este o entitate de sine stttoare,
individualizabil prin nume, ale crei componente i menin proprietile (tipul). Selectarea
componentelor unei structuri se poate realiza folosind identificatorii asociai acestora (accesul prin
nume) sau prin poziia pe care o ocupa n structur, n conformitate cu ordinea specificat.
Dup modul de selectare a componentelor, se disting: structuri cu acces direct, la care o
component poate fi selectat fr a ine seama de celelalte componente; structuri cu acces
Bazele programrii 28
secvenial, la care localizarea unei componente se face printr-un proces de parcurgere a mai multor
componente, conform cu ordinea acestora (traversare).
Dup tipul componentelor, structurile de date pot fi mprite n omogene, cnd
componentele sunt de acelai tip i neomogene, cnd componentele sunt de tipuri diferite.
Componentele unei structuri de date pot s fie date elementare (scalare) sau s fie ele
nsele structuri de date. Dac o structur de date se compune din (sau se poate descompune n)
structuri de acelai tip, se spune c structura respectiv de date este recursiv.
Structurile de date se pot regsi n memoria intern (structuri interne) sau pe un purttor
extern (band magnetic, disc magnetic, dischet etc.), caz n care se numesc structuri externe
(fiiere).
Dac n reprezentarea structurii de date pe suportul de memorie se nregistreaz,
mpreun cu componentele acesteia, i date care materializeaz relaiile de ordonare, se spune c
aceasta este o structur explicit (altfel, este implicit), iar datele suplimentare, de obicei adrese, se
numesc referine sau pointeri. Necesitatea acestor date suplimentare apare n cazul reprezentrii
dispersate a structurilor de date, n care componentele nu ocup zone adiacente pe suportul de
memorare. Reprezentarea componentelor n zone adiacente corespunde structurilor dense. Toate
structurile de date care au aceeai organizare i sunt supuse acelorai operaii formeaz un anumit
tip de structur de date, extinznd noiunea de tip de dat i asupra mulimilor ordonate de date.
n funcie de modul de alocare a zonelor de memorie se disting date de tip static sau
dinamic. Pentru datele de tip static sunt alocate zone de memorie bine definite, n momentul
compilrii. Pentru datele de tip dinamic, zonele de memorie sunt alocate n momentul execuiei, n
funcie de necesiti, fiind posibil chiar eliberarea memoriei ocupate de unele date. Tipul dinamic
corespunde tipului referin (pointer).
Masivul este o structur de date omogen, cu una, dou sau mai multe dimensiuni.
Pentru masivele uni, bi i tridimensionale se utilizeaz denumirile de vector, matrice, respectiv
plane de matrice. Structura este cu acces direct, referirea unui element fiind realizat printr-o
construcie sintactic numit variabil indexat, format din numele masivului i un numr de
expresii indiciale (indici) corespunznd dimensiunilor acestuia.
Diversele limbaje de programare implementeaz structura de masiv n modaliti diferite.
Limbajul C, care face obiectul acestei lucrri, le implementeaz necontiguu, bazndu-se pe
adresarea prin pointeri.
subarbori, conserv aceleai proprieti ca i structura n ansamblul su. Una din principalele
utilizri ale acestei structuri de date apare n legtur cu fiierele.
Elementele din structura nregistrrii sunt:
cmpuri elementare corespunznd nodurilor terminale de pe fiecare ramur a arborelui (n
exemplul din figura 2.7: MARCA, NUME, ZI, LUNA, AN, OCUPATIE, SECTIE, ATELIER,
ECHIPA);
cmpuri grupate (date de grup), corespunznd nodurilor neterminale (DATA
INCADRARII, LOCMUNCA) i, n ultim instan, chiar rdcinii (PERSOANA).
NIVEL
PERSOANA .1
Descrierea unei structuri de tip articol se face prin parcurgerea arborelui n preordine, astfel:
se parcurge arborele de sus n jos i de la stnga la dreapta, cu condiia descrierii complete a
fiecrui subarbore.
2.4.1. Grafuri
Un graf (sau un graf neorientat) este o structur G = (V,E), unde V este o mulime nevid
iar E este o submulime (posibil vid) a mulimii perechilor neordonate cu componente distincte
din V. Obiectele mulimii V se numesc vrfuri, iar obiectele mulimii E se numesc muchii. Dac
e=(u,v) E se spune c muchia e are ca extremiti u i v (este determinat de vrfurile u i v).
Graful G=(V,E) este finit dac V este o mulime finit. n continuare vor fi considerate n
exclusivitate grafurile finite, chiar dac acest lucru nu va fi precizat n mod explicit.
Fie grafurile Gi=(Vi,Ei), i=1,2. G2 este un subgraf al grafului G1 dac V2 V1 i
E 2 E 1 . Dac G2 este un subgraf al lui G1, G2 este un graf parial al lui G1 dac V2=V1.
Un graf orientat (digraf) este o structur D=(V,E), unde V este o mulime nevid de
obiecte numite convenional vrfuri, iar E este o mulime (posibil vid) de perechi ordonate cu
componente elemente distincte din V. Convenional, elementele mulimii E sunt numite arce sau
muchii ordonate. Terminologia utilizat relativ la digrafuri este similar celei corespunztoare
grafurilor.
Bazele programrii 30
Se numete graf ponderat o structur (V,E,W), unde G=(V,E) este un graf, iar W o
funcie, W : E (0, ) . Funcia W este numit pondere i asociaz fiecrei muchii a grafului un
cost/ctig al parcurgerii ei.
Fie G=(V,E) un graf, u,vV. Secvena de vrfuri : u0, u1,..,un este un u-v drum dac
u0=u, un=v, uiui+1E pentru i[0,n]. Lungimea drumului, notat l() este egal cu n.
Convenional, se numete drum trivial, un drum cu l()=0.
Cea mai simpl reprezentare a unui graf este cea intuitiv, grafic: fiecare vrf este figurat
printr-un punct, respectiv muchiile sunt reprezentate prin segmente de dreapt orientate (n cazul
digrafurilor) sau nu i etichetate (n cazul grafurilor ponderate) sau nu, avnd ca extremiti
punctele corespunztoare vrfurilor care le determin.
Exemple:
1
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
Dei acest mod de reprezentare este foarte comod i sugestiv n special n cazul grafurilor
cu numr mic de vrfuri, pentru prelucrri cu ajutorul calculatorului sunt necesare reprezentri
prin intermediul structurilor de date.
O modalitate de reprezentare este cea prin matrice de adiacen. Dac G=(V,E) este un
graf (sau digraf) cu V = n , atunci matricea de adiacen A Mnxn({0,1}) are componentele
1, dac ( v i , v j ) E
a ij = , unde vi, vj reprezint cel de-al i-lea, respectiv cel de-al j-lea nod din V.
0, altfel
Se observ c n cazul unui graf neorientat matricea de adiacen este simetric
() i, j = 1, n , a ij = a ji (perechile de vrfuri care caracterizeaz muchiile sunt neordonate, deci dac
uv E, atunci i vu E), n timp ce, n cazul unui digraf, este posibil ca (vi , v j ) E , (v j , vi ) E ,
deci aij aji.
sunt distincte, cu excepia, eventual, a extremitilor. Drumul este proces dac, pentru orice
0 i j n 1 , uiui+1 ujuj+1. Orice drum elementar este un proces.
Exemplu:
3. Pentru graful G, 1: v1, v2, v3, v2, 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 nct ui=vj. Orice drum cu
lungime cel puin 1 conine cel puin un drum elementar cu aceleai extremiti. ntr-adevr, dac
: u0,u1,..,un nu este elementar, atunci exist 0 i < j n i i 0 sau j n astfel nct ui=uj.
u j u j+1 ...u n , dac i = 0
'
Atunci drumul : u 0 u 1 ...u i , dac j = 0 este de asemenea un u0-un drum.
u u ...u u ...u , dac i 0, j n
0 1 i j+1 n
Aplicnd n continuare eliminarea duplicatelor vrfurilor n modul descris, rezult n final un 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,
pentru orice p1, a ij( p ) este numrul vi-vj drumurilor distincte de lungime p din graful G, unde
A p = (aij( p ) ) .
Fie Mn({0,1)} mulimea matricelor de dimensiuni nxn, componentele fiind elemente din
mulimea {0,1}. Pe Mn({0,1)}se definesc operaiile binare, notate i , astfel: pentru orice
A=(aij), B=(bij) din Mn({0,1)}, A B=(cij), A B=(dij), unde 1 i, j n , cij=max{aij, bij} i
dij=max{min{aik, bkj}, 1 k n }. Dac A=(aij) Mn({0,1)}, se noteaz { A k = (a (ijk ) ); k 1}
secvena de matrice definit prin:
(1) ( k 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 programrii 32
(1) ( 2) ( n 1)
Matricea M = A A K A se numete matricea existenei drumurilor n graful
G. Semnificaia componentelor matricei M este:
0, dac nu exist un v i v j drum n G
()1 i, j n, m ij = .
1, altfel
Exemplu:
1
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 existenei drumurilor permite verificarea dac un graf dat este conex.
Un graf este conex dac i numai dac toate componentele matricei M sunt egale cu 1.
Fie G=(V,E) un graf netrivial, u,vV i un u-v drum n G. se numete proces dac
toate muchiile drumului sunt distincte. Drumul este trivial dac : u,u. Drumul este un
circuit dac este un proces netrivial nchis. Circuitul : v1,v2,.,vn,v1 cu n3 este un ciclu al
grafului dac, pentru orice i, j, cu 1 i, j n , i j , rezult vivj. Orice ciclu este un drum
elementar nchis. Graful G este aciclic dac nu exist cicluri n G.
ntr-un digraf D noiunile de proces, circuit, ciclu sunt definite ca i n cazul
grafurilor.
Exemple:
6. n graful
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
aplicaii sunt cele arborescente. Graful G este arbore dac G este aciclic i conex. Fie G=(V,E)
graf arbore. Subgraful H=(V1,E1) al lui G este un subarbore al lui G dac H este graf arbore.
Exemple:
3
1
este arbore, deoarece pentru orice pereche
Graful 4 2 5 de vrfuri i,j, 1 i,j 6, ij, exist un i-j
drum i graful nu conine cicluri.
6
Bazele programrii 33
Verificarea proprietii unui graf de a fi arbore poate fi efectuat pe baza unor algoritmi
care s verifice calitile de conexitate i aciclicitate. Aceeai verificare poate fi realizat i pe
baza proprietilor care urmeaz.
Proprietatea 1: Un graf G=(V,E), cu V = n , E = m este graf arbore dac i numai dac G este
aciclic i n=m+1. Cu alte cuvinte, problema verificrii dac un graf este arbore revine la
verificarea aciclicitii grafului i a relaiei existente ntre numrul vrfurilor i numrul
muchiilor grafului.
Proprietatea 2: Un graf G=(V,E), cu V = n , E = m este graf arbore dac i numai dac G este
conex i n=m+1.
Not: Fie G=(V,E) un graf. Urmtoarele afirmaii sunt echivalente:
1. G este graf arbore
2. G este graf conex minimal (oricare ar fi eE, prin eliminarea muchiei e graful
rezultat nu este conex)
3. G este graf aciclic maximal (prin adugarea unei noi muchii n graf rezult cel
puin un ciclu).
Un graf orientat D=(V,E) cu proprietatea c pentru orice u, v V dac uvE, atunci
vu E se numete graf asimetric. Digraful D este simetric dac () u, v V, uvE, dac i numai
dac vuE.
Fie D=(V,E) digraf netrivial. Graful G=(V,E), unde E={uv | uvE sau vuE} se
numete graf suport al digrafului D.
Un arbore orientat este un arbore direcionat cu rdcin. Deoarece un arbore orientat este un caz
particular de digraf, pentru reprezentarea lui poate fi utilizat oricare din modalitile de
reprezentare a grafurilor. n plus exist i posibilitatea obinerii unor reprezentri mai eficiente
pentru acest tip de graf. Una dintre modaliti este reprezentarea FIU-FRATE, care const n
numerotarea convenional a vrfurilor grafului i n reinerea, pentru fiecare vrf i al arborelui, a
urmtoarelor informaii:
FIU(i), care reprezint numrul ataat primului descendent al vrfului i;
FRATE(i), care reprezint numrul ataat vrfului descendent al tatlui vrfului i i care
urmeaz imediat lui i;
INF(i), care reprezint informaia ataat vrfului i (de obicei valoarea i).
Pentru reprezentarea arborelui se reine rdcina i numrul nodurilor. Absena fiului,
respectiv a fratelui unui vrf este marcat printr-o valoare diferit de numerele ataate
vrfurilor (de obicei valoarea 0).
Exemplu:
1
Urmtorul arbore orientat este reprezentat astfel:
N=15 (numrul de noduri ale arborelui);
2
R=1(rdcina); 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 vrf v are maxim doi
descendeni (od(v)2). n cazul od(v)=2, cei doi descendeni sunt desemnai ca descendent stng
(fiu stnga), respectiv descendent drept (fiu dreapta). Pentru vrfurile cu od(v)=1, unicul
descendent este specificat fie ca fiu stnga, fie ca fiu dreapta.
Se numete nod terminal (frunz) orice vrf v al arborelui cu od(v)=0. Nodul v este
neterminal dac od(v)>0. Reprezentarea unui arbore binar poate fi realizat prin reinerea, pentru
fiecare nod, a legturilor ctre descendenii lui, absena unui descendent putnd fi reprezentat
prin valoarea nul (nil).
legtur fiu
identificator nod legtur fiu stnga
dreapta
Datorit particularitii lor, arborii binari ofer posibilitatea aplicrii de noi metode de
parcurgere (pe lng cele aplicabile pentru arborii generali): parcurgerile n preordine (RSD),
inordine (SRD) i postordine (SDR). Regula de vizitare pentru aceste tipuri de parcurgere
revine la parcurgerea subarborilor stng i drept corespunztori vrfului curent, care la
momentul iniial este chiar rdcina arborelui. Diferena ntre aceste trei tipuri de parcurgere
este dat de momentul n care devine vizitat fiecare vrf al arborelui. n parcurgerea RSD
(rdcin-subarbore stng-subarbore drept), fiecare vrf al arborelui este vizitat n momentul
n care devine vrf curent. n parcurgerea SRD (subarbore stng-rdcin-subarbore drept),
vizitarea vrfului este efectuat dup ce a fost parcurs subarborele stng. n parcurgerea SDR
(subarbore stng-subarbore drept-rdcin) vizitarea fiecrui vrf este efectuat dup ce au
fost parcuri subarborii afereni lui.
Exemplu:
Pentru arborele de la exemplul anterior, secvenele de vrfuri rezultate prin aplicarea parcurgerilor
RSD, SRD, SDR sunt:
preordine: 1,2,4,7,5,3,6,8,9
inordine: 4,7,2,5,1,8,6,9,3
postordine: 7,4,5,2,8,9,6,3,1.
2.4.3. Liste
Lista este o structur dinamic de date format din mai multe noduri. Un nod este o
structur de date care conine dou pri distincte: o parte de informaie util (memorat n nodul
respectiv) i o parte de informaie de legtur (folosit pentru a identifica n memorie urmtorul
nod din list).
Bazele programrii 35
C a)
C B
dn dn-1 d2 d1
b)
elibernd spaiul ocupat de componentele terse. Astfel, structura i numrul de noduri ale listei
sufer o permanent schimbare.
1. Traversarea. Localizarea unui nod prin traversare este o operaie de cutare. Scopul este
de a gsi un nod care s conin n partea de informaie util anumite date. Operaia de cutare se
poate ncheia cu succes, adic cu localizarea unui astfel de nod sau fr succes, n cazul n care
lista este vid sau nu exist un nod care conine informaiile cerute.
2. Inserarea. Inserarea unui nod ntr-o list nlnuit se poate realiza cu verificarea
existenei anterioare a nodului n list, caz n care nu se mai face inserarea, sau fr nici un fel de
verificare, caz n care se procedeaz direct la inserare (se permit noduri duplicate). n ambele
cazuri inserarea se poate face n mai multe locuri: la nceputul listei, la sfritul listei, dup sau
naintea unui anumit nod identificat printr-o cheie.
Inserarea unui nod la nceputul listei. Pentru inserarea ntr-o list simetric este necesar
crearea legturilor ntre noduri n ambele sensuri. Singura diferen fa de inserarea ntr-o list
asimetric este nscrierea informaiei despre nodul precedent. Deoarece inserarea are loc la
nceputul listei, nu va exista un nod precedent, deci informaia respectiv va primi valoarea nil.
Primul nod din lista iniial va avea acum ca precedent nodul nou creat p (figura 2.9). Se observ
c ntotdeauna se modific capul listei, nodul inserat devenind noul cap al listei.
cap
3
2
1 a)
p
cap
4 2
2 b)
1
p
Inserarea unui nod la sfritul listei. Pentru adugarea unui nod la sfritul listei se
creeaz nti un nod nou cu informaia util care trebuie inserat. Deoarece va fi ultimul nod n
list, nu exist un nod urmtor deci informaia de legtur spre nodul urmtor va avea valoarea
nil.
Dac lista este vid atunci capul listei ia ca valoare adresa noului nod creat (va fi singurul
nod din list). n caz contrar trebuie parcurs lista pentru a ajunge la ultimul nod, informaia de
legtur din acesta primind ca valoare adresa noului nod creat. n cazul unei liste simetrice
trebuie creat i legtura n sens invers (figura 2.10).
Bazele programrii 37
cap
a)
p
cap
b)
p
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 uor din punct
de vedere algoritmic dac ea privete nodul cap de list, deoarece se reduce, n principiu, la
actualizarea referinei de cap. Dac trebuie ters un nod interior listei, atunci tergerea propriu-
zis trebuie precedat de o cutare dup coninutul informaional al nodurilor. Dac listele simplu
nlnuite pot fi traversate ntr-un singur sens, n momentul n care s-a localizat nodul p de ters
nu se mai cunoate precedentul su q care, pentru eliminarea nodului p, trebuie s fie legat de
succesorul acestuia (figura 2.12.a). Datorit acestei situaii, este necesar introducerea unei
referine suplimentare q care, n procesul de traversare, s fie n urma lui p cu un nod. De aceea,
p se numete referin de urmrire. Iniial, cnd p=nil, se atribuie aceeai valoare lui q. Se
precede atribuirea de valoare pentru p care schimb nodul curent, de atribuirea q=p.
Bazele programrii 38
1
q
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 meninute dou referine: una pentru faa (f) i alta pentru spatele cozii (s). O coad este
vid atunci cnd f=s=nil.
Bazele programrii 39
Teste de autoevaluare
Rezumat
n cadrul acestei uniti de nvare au fost studiate urmtoarele aspecte n ceea ce privete datele
i structurile de date:
cunotine teoretice privind conceptele de informaie, dat, cunotin;
modaliti de reprezentare intern a datelor;
structuri statice i dinamice de date.
Dup ncheierea acestei uniti de nvare, studenii au cunotine i abiliti de reprezentare a
datelor i a structurilor de date.
Cuprins
Obiectivele unitii de nvare 3
3.1. Caracteristici generale ale PPAD
3.2. Fazele dezvoltrii programelor
Rspunsuri i comentarii la testele de autoevaluare
Bibliografia unitii de nvare
structuri de tip masiv (vectori, matrice, plane de matrice etc.). n cazul unor volume mai mari de
date se poate folosi i memoria extern, vzut ca o prelungire a celei interne, cu organizarea
datelor n fiiere (uzual, fiiere relative). n majoritatea cazurilor, chiar cnd datele sunt
organizate n fiiere, nu se ajunge la pstrarea lor pe perioade mari de timp, adic nu apare
necesitatea actualizrii datelor (adugri, modificri, tergeri). Singura problem n accesul la
datele organizate n fiiere o reprezint trecerea de la memorarea liniar a elementelor n fiier, la
caracterul lor de elemente ale unor masive (tablouri) cu dou sau mai multe dimensiuni.
Pe exemplul matricelor, alegnd liniarizarea pe linii (ordinea lexicografic), n cazul unei
matrice Amxn, poziia n fiierul relativ a unui element ai,j poate fi determinat printr-un calcul
simplu, folosind funcia rang r(i,j)=n(i-1)+j, i m, jn. Aceast tehnic se poate folosi la
memorarea datelor n fiier (crearea i popularea fiierului), permind chiar furnizarea
elementelor ntr-o ordine oarecare, cu condiia precizrii coordonatelor. La regsirea elementelor
masivului (consultarea fiierului), pornind de la poziia n fiier, pot fi determinate coordonatele
elementului, astfel:
- dac r modulo j = 0, atunci i=[r/n] i j=n;
- dac r modulo j <> 0, atunci i=[r/n]+1 i j=r modulo n.
n concluzie, la aceast clas de PPAD atenia principal se deplaseaz ctre algoritmul
de calcul, bazat, uzual, pe aproximri succesive, ce pot conduce la apariia unor tipuri specifice
de erori (erori de trunchiere i erori de rotunjire), care uneori se compenseaz, dar frecvent se
cumuleaz (se propag) pe parcursul prelucrrii, afectnd corectitudinea rezultatului final.
Datorit volumelor mari de date, la problemele din categoria b) accentul principal cade
pe organizarea i ntreinerea coleciilor de date memorate pe purttori externi. La limit, se poate
alege ntre dou soluii: organizarea datelor n fiiere (secveniale, relative sau indexate) sau
organizarea datelor n baze de date (cu structuri ierarhice, de tip reea sau relaionale).
Indiferent de nivelul de organizare ales, tehnologia de prelucrare conduce la lanuri
(sisteme) de programe, n general de dou tipuri: programe de creare i actualizare (ntreinere) a
coleciilor de date; programe de consultare (interogare), pentru satisfacerea cererilor de
informare. n algoritmi, principalele tipuri de operaii sunt cele de prelucrare a coleciilor de date
organizate pe purttori externi: citire, scriere, rescriere, tergere, precum i cele de verificare a
corectitudinii datelor (operaii de validare). Complexitatea calculelor este redus, adesea
nedepind nivelul celor patru operaii aritmetice.
n general, n rezolvarea PPAD se poate distinge ntre urmtoarele variante de soluii:
soluii proprii; utilizarea pachetelor de programe aplicative; soluii mixte. Alegerea ntre cele trei
variante depinde de mai muli factori, dintre care o importan aparte are aria (dimensiunile)
problemei: un domeniu de activitate strict delimitat (aplicaie informatic), respectiv ansamblul
activitilor unui organism economico-social (sistem informatic).
n general, soluiile proprii sunt posibile pentru orice PPAD. Din perspectiva costurilor
implicate de diversele faze ale realizrii unei soluii informatice, aceast variant este, frecvent,
cea mai neeconomic. Totui, adesea aceasta este singura variant accesibil, dup cum se poate
constata i din prezentarea urmtoarelor cazuri:
- la nivel de aplicaie informatic, atunci cnd domeniul de activitate are o serie de
particulariti care nu permit utilizarea unor eventuale pachete de programe aplicative i, evident,
cnd nu exist asemenea pachete de programe pentru domeniul respectiv;
- la nivel de sistem informatic, datorit marii diversiti a organismelor economico-
sociale, atunci cnd nu se poate pune problema unor soluii tip, cu posibilitatea ca unele
subsisteme (aplicaii) s fie realizate prin soluii mixte.
Utilizarea unor pachete de programe aplicative este posibil pentru activitile cu un
anumit grad de generalitate, care se regsesc n forme identice (sau cu diferene nesemnificative)
Bazele programrii 42
la mai multe organisme economico-sociale. Printre acestea pot fi menionate aplicaiile bazate pe
modele de programare liniar, gestiunea stocurilor, optimizarea transporturilor, optimizarea
croirii, gestiunea financiar-contabil etc.
Adoptarea unei asemenea soluii elimin costurile de proiectare i realizare a aplicaiilor
(sistemelor) informatice, dar poate conduce la unele necesiti de adaptare a sistemului
informaional propriu, n funcie de datele de intrare i modul de organizare a acestora, impuse
pachetelor de programe. Pe un plan mai general, n aceast categorie pot fi incluse i produse
care, fr a furniza direct soluii, simplific substanial efortul de realizare a lor, pentru domenii
specifice. De exemplu, pentru prelucrri de serii de date statistice, ca i pentru orice alte date ce
se organizeaz n tabele, pot fi utilizate produsele din categoria spread-sheet (foaie de calcul),
cum este EXCEL.
Soluiile mixte presupun ncadrarea n soluii proprii a unor pachete de programe
aplicative, destinate unora dintre aplicaiile unui sistem informatic. Aceast variant reduce, de
asemenea, costurile de realizare, dar necesit elaborarea unor interfee ntre intrrile/ieirile
pachetelor de programe i celelalte componente ale sistemului(aplicaiei) pentru care se
elaboreaz soluii proprii.
Realizarea sistemelor (aplicaiilor) informatice este un proces complex, structurat n mai
multe etape, cu obiective specifice. n modul de realizare a acestor etape, n resursele implicate i
n durata lor total vor exista o serie de diferene, impuse, pe de o parte, de varianta de soluie
aleas i, pe de alt parte, de nivelul de abordare (aplicaie, sistem informatic). Cu aceste
observaii, ntr-o abordare schematic, redus la enumerarea i prezentarea obiectivelor
principale, etapele de realizare a sistemelor informatice sunt urmtoarele:
studiul i analiza sistemului informaional actual, care are ca obiectiv principal
formularea cerinelor i a restriciilor pentru sistemul informatic (caietul de sarcini);
proiectarea de ansamblu, care presupune elaborarea modelului de ansamblu al
sistemului informatic i planificarea realizrii sale pe pri componente (subsisteme, aplicaii);
proiectarea de detaliu, care are ca obiective elaborarea modelului de detaliu al
sistemului informatic i stabilirea soluiilor tehnice de realizare (corespunztor, se face distincie
ntre proiectarea logic de detaliu i proiectarea fizic de detaliu);
elaborarea programelor, n care se realizeaz, conform prioritilor stabilite n etapa
anterioar i pe baza documentaiilor reunite n proiectul logic de detaliu i proiectul tehnic de
detaliu, programele incluse n fluxurile tehnologice specifice diverselor tipuri de prelucrri;
implementarea i exploatarea sistemului, care presupune darea n funciune a
sistemului i utilizarea curent a acestuia.
Pe baza diferenierilor evideniate, n cele ce urmeaz se abordeaz numai cazul unor
aplicaii informatice de mai mic amploare, pentru care se menine n continuare denumirea de
PPAD.
apelate, implicit sau explicit, procedurile utilizatorului sau ale sistemului, modul n care au fost
concepute operaiile de intrare/ieire sau, n general, cum au fost gestionate resursele de
intrare/ieire etc.
Dup parcurgerea acestor faze programul se testeaz n execuie, pe baza unor seturi
stabilite de date de control. n aceast faz programul se consider corect dac rezultatele
obinute sunt cele scontate (pentru datele de test, programatorii trebuie s determine dinainte
rezultatele - valorile i forma lor de prezentare). Se mai face meniunea c, ntr-un lan de
programe dintr-un sistem, trebuie testat ntreg lanul, n intercorelrile lui interne. Programele
considerate corecte se memoreaz pe medii magnetice, eventual constituite n biblioteci.
Definitivarea documentaiei programelor. Dei mai puin spectaculoas, chiar
birocratic, aceast etap este obligatorie pentru exploatarea, dezvoltarea i adaptarea
programelor, mai ales dac fac parte dintr-un sistem. Documentarea corect a programului face
posibil, de asemenea, folosirea lui de ctre ali utilizatori. S-a artat c, pe msura desfurrii
precedentelor etape, s-au realizat unele documente necesare exploatrii corecte a programelor.
Acestea se completeaz, redacteaz i ordoneaz, constituindu-se ntr-un dosar de prezentare i
exploatare, care cuprinde:
descrierea problemei (rezultate, date de intrare, procesul de prelucrare, formalizarea
matematic i modelul matematic, precizia algoritmului etc.);
descrierea resurselor necesare i a restriciilor de utilizare;
organigrama modulelor;
schemele logice structurate (sau alte forme de reprezentare a algoritmului) pentru
fiecare modul;
modul de apel al procedurilor i funciilor i structura datelor i parametrilor care se
transfer ntre apelator i apelat;instruciuni de utilizare (procedura de punere n lucru, lista i
forma ntrebrilor i rspunsurilor n conversaia cu utilizatorii, lista programelor care trebuie
executate n amonte etc.);
exemple de utilizare.
Exploatarea curent. Dup punerea la punct, programele intr n utilizare, fiind
urmrite n vederea depistrii unor erori care nu au putut fi sesizate anterior. Aceast faz asigur
meninerea n funciune i dezvoltarea programelor, proces care se poate continua pe tot parcursul
utilizrii lor.
Test de autoevaluare
cuvinte (dicionar) mpreun cu regulile de utilizare a lor (gramatic). Regulile de utilizare sunt
de sintax (form) i de semantic (sens).
Editare
Program surs
Compilare
Program
Listing asamblare
surs
Program obiect
Lansare
n execuie
executabile din biblioteca specific limbajului, invocate (apelate) implicit sau explicit de
programul surs al utilizatorului, ct i module executabile din bibliotecile realizate de utilizator.
Programul obiect executabil se lanseaz n execuie cu comenzi ale sistemului de operare.
Test de autoevaluare
Rezumat
n cadrul acestei uniti de nvare au fost studiate urmtoarele aspecte n ceea ce privete datele
i structurile de date:
caracteristici generale ale PPAD;
organizarea procesului de rezolvare a PPAD;
fazele dezvoltrii programelor.
Dup ncheierea acestei uniti de nvare, studenii au cunotine i abiliti de organizare a
procesului de rezolvare a problemelor i a etapelor de dezvoltare a programelor.
4. Caracteristicile limbajului C
Cuprins
Obiectivele unitii de nvare 4
4.1 Elementele de baz ale limbajului C
4.2 Tipurile de date n C
4.3 Expresii
4.4. Realizarea structurilor fundamentale de control
Rspunsuri i comentarii la testele de autoevaluare
Bibliografia unitii de nvare
Comentariile sunt secvene de text compuse din orice caractere admise n setul
limbajului, care au format liber i care nu se compileaz. n general, comentariile sunt necesare
pentru explicaii suplimentare ale programatorului, n vederea nelegerii ulterioare a logicii sale.
Comentariile sunt delimitate de perechile de caractere /* i */ i se pot ntinde pe mai multe linii
surs.
Orice caracter aflat ntre delimitatori este ignorat de compilator. Nu se admit comentarii
imbricate (incluse unul n altul). La compilatoarele C++ a fost adugat posibilitatea de a scrie
comentarii pe o singur linie surs. nceputul unui astfel de comentariu este marcat de perechea //
iar sfritul su este marcat de sfritul liniei (nu exist marcator special). Orice caracter aflat
dup // este ignorat, pn la trecerea pe o nou linie surs.
urmtoarele motive: evitarea scrierii repetate n program a unor secvene de instruciuni aplicate
de mai multe ori pe seturi diferite de date; creterea eficienei activitii de programare prin
crearea unor biblioteci de subprograme des utilizate, care pentru fiecare din aplicaiile concrete
doar se apeleaz, fr s fie proiectate i realizate de fiecare dat; necesitatea modularizrii
problemelor cu grad nalt de complexitate.
Funcia are un nume i un tip. Ea se definete printr-un antet i un corp (bloc) astfel:
antet
{
corp
}
Antetul are forma:
tip nume(lista_parametrilor_formali)
unde:
tip poate fi un tip simplu de dat. Dac lipsete, este considerat tipul implicit (int pentru
unele compilatoare, void pentru altele);
nume este un identificator care reprezint numele funciei;
lista-parametrilor-formali conine parametrii formali sub forma:
[tip1 identificator1[,tip2 identificator[,tip3 identificator ]]]
Parametrii sunt separai prin virgul. La limit, lista poate fi vid. Pentru fiecare
parametru trebuie specificat tipul, chiar dac mai muli parametri snt de acelai tip.
Funciile returneaz o valoare prin nume, dar pot returna valori i prin parametri. Unele
funcii (de exemplu, cele care citesc sau scriu date) execut servicii i apoi returneaz, prin
nume, valori care pot sau nu s fie utilizate n apelator. Funciilor care nu trebuie s ntoarc
valori prin nume li se poate asocia tipul void (care, la unele compilatoare, este implicit).
Corpul este o instruciune compus: conine declaraiile locale i instruciunile executabile
care implementeaz algoritmul. Corpul funciei se execut pn la executarea ultimei instruciuni
sau pn la executarea instruciunii return. Forma ei general este:
return(expresie); sau
return expresie; sau
return;
Prima i a doua form snt folosite n cazul funciilor care returneaz o valoarea prin
numele lor. Prin executarea acestei instruciuni se evalueaz expresia, valoarea sa este atribuit
funciei i se ncheie execuia funciei. A treia form este folosit n cazul funciilor care nu
returneaz nici o valoare prin numele lor (poate chiar s lipseasc). Dac este prezent, efectul ei
este ncheierea execuiei funciei. Tipul expresiei din instruciunea return trebuie s coincid cu
tipul funciei.
Apelul funciilor se face prin referirea lor ca operanzi n expresii, sub forma:
nume(lista_parametrilor_reali)
La apel, parametrii reali se pun n coresponden cu cei formali, de la stnga la dreapta.
Pentru o corect utilizare a datelor, tipurile parametrilor reali trebuie s fie aceleai ca ale celor
formali corespunztori.
Programul este construcia sintactic de cel mai nalt nivel. El codific algoritmul, fiind
constituit din declarri i instruciuni executabile. Dat fiind faptul c limbajul C este puternic
orientat spre funcii, programul principal este el nsui o funcie (care poate avea parametri i
poate ntoarce un rezultat de tip ntreg): main (cuvnt rezervat). La modul general, un program
este o niruire de funcii i declaraii, printre care trebuie s existe o funcie denumit main,
Bazele programrii 50
lansat n execuie la rularea programului. Pentru funcia main sunt permise mai multe forme ale
antetului:
main()
int main()
void main()
main(void)
void main(void)
int main(void)
Orice program este format dintr-o parte de declaraii (format din instruciuni
neexecutabile, cu rol doar n faza de compilare) i o parte executabil (format din instruciuni
executabile). Unele limbaje impun o separare clar a acestora (de exemplu Pascal, COBOL,
FORTRAN), n care partea de declaraii precede partea executabil. Alte limbaje (de exemplu C,
C++) sunt mai flexibile, permind ca declaraiile s alterneze cu instruciunile executabile,
pstrnd ns regula c orice entitate referit trebuie definit anterior. Pentru a evita confuziile se
recomand ca declaraiile s fie reunite la nceputul blocului de instruciuni pentru care sunt
vizibile.
Directiva #include este folosit pentru includerea de fiiere cu text surs ntr-un program i
are urmtoarea sintax:
#include<specificator_de_fisier>
sau
#includespecificator_de_fisier
Prima form caut fiierul specificat ntre fiierele standard ale limbajului, folosindu-se
calea descris n mediul de programare. A doua form caut fiierul specificat n calea curent (de
obicei este folosit pentru a include fiiere scrise de utilizator). Dac fiierul cutat nu este gsit se
produce o eroare de compilare. Dac fiierul este gsit, coninutul lui este inserat n program, n
locul directivei care l-a invocat, aceasta fiind tears (la limit poate fi considerat o substituire de
text).
Pentru ca textul inclus s fie vizibil din tot programul, se recomand ca directivele #include
s fie scrise la nceputul programului. Un text inclus poate s conin la rndul lui directive care
determin noi includeri de text. Textul inclus va fi compilat ca parte component a programului.
Pentru a putea utiliza funciile care realizeaz operaiile de intrare/ieire trebuie inclus
fiierul stdio.h.
Exemplu: #include<stdio.h>
Directiva #define este folosit pentru a substitui unele secvene de caractere cu altele i
are forma general:
#define sir1 sir2
Bazele programrii 51
unde att sir1 ct i sir2 sunt iruri de caractere. La preprocesare, se terge directiva din program
i se nlocuiete secvena de caractere sir1 cu secvena de caractere sir2 peste tot unde apare n
programul surs. Secvena sir1 este denumit nume iar sir2 este denumit descriere. Nu se face
nlocuirea dac sir1 apare n interiorul unui literal de tip ir de caractere sau n interiorul unui
comentariu. sir2 poate s fie descris pe mai multe rnduri, dac la sfritul fiecrui rnd (n afar
de ultimul) se scrie caracterul \ (backslash). Rolul acestuia va fi discutat n alt capitol. sir2 poate
s conin iruri de caractere pentru care au fost definite anterior. Acestea vor fi substituite
conform definiiilor lor.
Test de autoevaluare
Masiv
Structurate Articol
Fiier
Pointer
Dinamice Simple
Referin
Variabilele
Datele variabile i modific valoarea pe parcursul execuiei programului. De aceea, ele se
asociaz unor zone de memorie. Identificatorii acestora se declar i apoi se refer n operaii.
Operaiile afecteaz coninutul zonelor de memorie, care este interpretat ca fiind de un anumit tip.
Declararea variabilelor se realizeaz prin list de identificatori (separai prin virgul) pentru care
se specific tipul.
tip lista_variabile;
Declararea se poate face oriunde n program, cu urmtoarea condiie: variabilele trebuie
declarate nainte de a fi folosite (referite). Domeniul de valabilitate este limitat la blocul n care s-
a fcut declaraia.
Exemple:
unsigned x,y,z;
Bazele programrii 53
float a,b,c;
char k;
tip nume_variabila=valoare;
Exemple:
int dim_vector=100;
dim_vector=50; /*nu este eroare*/
Definirea de noi tipuri de date. Utilizatorul poate defini noi tipuri de date sau poate
atribui un alt nume unui tip predefinit sau definit anterior. n acest scop se folosete cuvntul
rezervat typedef, astfel:
typedef descriere_tip nume_utilizator;
Exemple:
typedef int INTREG;
typedef float REAL;
Particularitile unor tipuri simple de date. Tipul caracter memoreaz caractere ale
codului ASCII, reprezentate pe un octet. Variabilele de tip caracter pot fi utilizate i ca valori
numerice (modul de utilizare se alege automat, n funcie de expresia din care face parte
operandul respectiv).
Valoarea numeric folosit depinde de modul de declarare a caracterului: cu sau fr
semn. Pentru caracterele cu coduri mai mici dect 128 nu se sesizeaz nici o diferen (se obine
aceeai valoare i pentru interpretarea ca virgul fix aritmetic i pentru interpretarea ca virgul
fix algebric). Pentru caracterele cu coduri mai mari de 127, valoarea obinut este diferit.
Exemple:
Declararea i utilizarea variabilelor de tip caracter.
unsigned char a,b;
a=100;/* corect */
b=Q;/* corect */
b=81; /* corect, echivalent cu precedentul */
4.2.2. Constantele
Datele constante sunt predefinite la momentul scrierii programului iar valoarea lor este
generat la momentul compilrii. Datele constante pot fi literali (constante propriu-zise), care se
autoidentific prin valoare, sau constante simbolice, care sunt identificatori (denumiri) asociai
altor constante (literali sau constante simbolice definite anterior). n C literalii sunt ntregi, reali,
caracter i ir de caractere.
Literalii ntregi sunt reprezentai intern n virgul fix. Ei pot fi exprimai n bazele de
numeraie 10 (forma implicit), 8 (folosind prefixul 0 zero) sau 16 (folosind prefixul 0x sau
0X). n funcie de mrimea lor, se asociaz implicit un tip ntreg (i implicit un mod de
reprezentare). Se ncearc ntotdeauna nti reprezentarea pe 16 bii, conform tipului int; dac nu
este posibil, atunci se folosete reprezentarea pe 32 de bii, conform tipului long.
Dac se dorete forarea reprezentrii pe 32 de bii (pentru o valoare din domeniul tipului
int), se adaug sufixul l sau L. Pentru a fora tipul fr semn (unsigned int sau unsigned long) se
folosete sufixul u sau U. Cele dou sufixe se pot folosi mpreun, n orice ordine.
Bazele programrii 54
Literalii reali sunt reprezentai intern n virgul mobil. Ei se pot exprima sub form
matematic (ntreg.fracie) sau tiinific (ntreg.fracieEexponent). Semnul + poate lipsi
(este implicit), iar e este echivalent, ca valoare, cu E. Din exprimare poate s lipseasc fie partea
fracionar, fie partea ntreag, fie partea ntreag i exponentul (inclusiv litera e).
Literalii reali se reprezint intern pe 64 de bii (tipul double). Pentru a fora reprezentarea
n simple precizie (tipul float) se adaug sufixul f sau F. Pentru a fora reprezentarea pe 80 de bii
(tipul long double) se folosete sufixul l sau L. Cele dou sufixe nu se pot folosi mpreun.
La iniializarea unei variabile de tip caracter se poate folosi oricare din variantele de
reprezentare descrise anterior sau orice valoare numeric (ntreag sau real). n acest ultim caz,
din reprezentarea intern a literalului numeric se iau n considerare primii 8 bii care sunt
interpretai ca un cod ASCII, obinndu-se valoarea care se atribuie.
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 mulime finit de elemente omogene constituit
ca un tablou cu una, dou sau mai multe dimensiuni. Mulimea are un singur identificator i ofer
posibilitatea referirii elementelor n acces direct prin poziie, determinat printr-un numr de
expresii indiciale corespunznd dimensiunilor masivului. Masivul se declar folosind o construcie
de forma:
tip nume[dim1][dim2][dimn];
unde tip este tipul comun elementelor masivului, iar dim1, dim2, , dimn sunt expresii constante
(evaluate la compilare), care indic numrul de elemente de pe fiecare dimensiune. Se accept
oricte dimensiuni, cu condiia ca structura n ansamblul ei s nu depeasc zona de memorie
maxim permis pentru structurile de date.
Exemple:
int x[10]; /* vector cu 10 componente intregi*/
float a[10][20]; /* matrice cu 10 linii si 20 coloane
de elemente reale */
{{lista_const1}{lista_const2}{lista_constn}};
Exemple:
int b[10]={2,3,0,5,6,7,3,6,8,5};
/* vectorul contine valorile 2 3 0 5 6 7 3 6 8 5*/
float a[5][3]={{1,2,3},{1,2,3},{1,2,3}};
/* matricea contine valorile 1 2 3 1 2 3 1 2 3 0 0 0 0 0 0*/
Masivul poate fi referit global prin numele su. Elementele unui masiv se refer direct,
prin numele masivului urmat de indicele (indicii) corespunztori. Indicii sunt expresii incluse ntre
paranteze drepte (se mai numesc i variabile indexate): [indice]. Pentru fiecare dimensiune a
masivului trebuie s existe cte o referire de indice. Indicele de pe fiecare dimensiune are valoarea
minim 0 i valoarea maxim egal cu dimensiunea din declarare minus o unitate. Compilatorul
nu verific corectitudinea indicilor (n sensul de depire a dimensiunilor masivului la referirea
elementelor).
Tipul articol
Articolul este o structur de date eterogen, cu acces direct la elementele sale, ntre care
exist o relaie de ordine ierarhic. Articolul poate fi reprezentat sub form de arbore, ale crui
noduri sunt asociate componentelor structurii. Componentele de pe ultimul nivel sunt scalare i se
numesc date elementare sau cmpuri. Datele de pe celelalte niveluri, denumite date de grup, se
constituie prin agregarea datelor de pe nivelurile inferioare. Data de grup de cel mai nalt nivel
(rdcina arborelui) corespunde articolului n ansamblu. Conceptual, datele de grup de pe diverse
niveluri au aceleai proprieti ca i articolul, ceea ce permite ca aceast structur s fie construit
recursiv, prin descompunerea n structuri cu aceleai proprieti (figura 4.1).
Declararea mpreun a tipului articol i a variabilelor de acest tip se realizeaz conform
sintaxei:
struct tip_articol{lista_campuri} var1,var2,,varn;
unde tip_articol este identificatorul asociat tipului articol, iar var1, var2,, varn sunt
identificatorii asociai variabilelor de tipul articol declarat.
Parametrii declaraiei pot lipsi (dar nu toi deodat). Dac lipsesc parametrii var1,
var2,, varn, atunci tip_articol trebuie s fie prezent, fiind numai o declarare explicit de tip
nou, utilizabil ulterior la alte declarri. Dac lipsete tip_articol, atunci trebuie s fie prezent
lista de variabile (nevid), caz n care este vorba de o declarare de variabile de tip articol, fr
ns a declara i un tip utilizator nou. n continuare, tip_articol este un tip nou de date, iar var1,
var2,, varn sunt variabile de tipul tip_articol. Variabilele pot fi declarate i ca masive, ale cror
elemente sunt de tip articol: var1[dim1][dim2][dimn].
Bazele programrii 57
a)
Considernd declaraiile anterioare, expresia sizeof(data_nasterii) are valoarea 8, iar sizeof(angajat) are valoarea
90.
Datele de tip articol pot fi referite n dou moduri: global sau pe componente. Referirea
global este permis numai n operaia de atribuire, cu condiia ca ambele variabile (surs i
destinaie) s fie articole de acelai tip.
Referirea pe componente (prin numele lor) este o reflectare a faptului c articolul este o
structur cu acces direct. Referirea unor componente de tip articol din structura altui articol este
posibil numai n operaia de atribuire, n condiiile precizate anterior la referirea global. n cele
ce urmeaz se are n vedere numai referirea componentelor de tip dat elementar, situate pe
ultimul nivel al structurii.
Referirea cmpurilor unei structuri se face prin calificare, folosind operatorul . (punct). n
referirea prin calificare, asigurarea identificrii unice a cmpurilor se realizeaz prin asocierea
numelui acestora cu numele articolului care le conine. Construcia rmne la aceast form n
cazul n care structura are numai dou niveluri: articolul i cmpurile elementare ale acestuia.
programului, n zona de memorie rezervat articolului nu este memorat dect unul dintre
cmpurile 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 dispoziia utilizatorului o serie de funcii
specifice, definite n biblioteca standard string.h. Limbajul C dispune i de alte funcii care lucreaz cu iruri
de caractere (funcii de conversie), definite n biblioteca standard stdlib.h: atof (care necesit i includerea
bibliotecii standard math.h), atoi, atol, itoa, ltoa. De asemenea, n biblioteca stdio.h exist definite funcii de
intrare/ieire pentru irurile de caractere.
Teste de autoevaluare
Bazele programrii 60
4.3 Expresii
Asupra datelor pot fi aplicai operatori din diverse clase, rezultnd construcii sintactice
numite expresii. n forma lor cea mai general, expresiile sunt alctuite din operanzi i operatori.
Evaluarea expresiilor produce ca rezultat o valoare de un anumit tip. n metalimbajul BNF expresia
poate fi definit astfel:
<expresie>::=<operand>|<operator_unar><expresie>|
<expresie><operator_binar><expresie>
Prima variant din definiie corespunde celei mai simple forme de expresie, redus la o
variabil sau o constant de un anumit tip. A doua i a treia variant, prin aplicare repetat, conduc
la recursivitate n construirea expresiilor, proces evideniat n exemplul urmtor:
a + ({
{ b ) {c + 15 {
expresie expresie expresie expresie
14243
expresie
14 442444 3
expresie
1444424444 3
expresie
Ordinea de aplicare a operatorilor din expresii poate fi, total sau parial, impus prin
folosirea parantezelor. Acestea sunt evaluate cu prioritate, iar dac sunt mai multe niveluri de
paranteze, evaluarea se realizeaz din interior spre exterior. n absena parantezelor, respectiv n
interiorul acestora, evaluarea se realizeaz n funcie de ordinul de preceden a operatorilor.
unde v este o variabil simpl, un element de masiv, un cmp al unui articol sau o expresie n
urma evalurii creia se obine o adres. Entitatea care se poate afla n stnga operatorului de
atribuire se numete left value.
Pentru a se putea efectua atribuirea, tipul expresiei i tipul entitii din stnga operatorului
de atribuire trebuie s fie compatibile. Dac sunt incompatibile se produce eroare la compilare
(deoarece compilatorul nu poate insera n codul obiect apelurile pentru operaiile de conversie).
Efectele atribuirii constau n:
evaluarea expresiei din dreapta operatorului de atribuire, cu determinarea unei valori i
a unui tip;
memorarea valorii expresiei din dreapta n variabila din stnga;
ntreaga expresie de atribuire are valoarea i tipul variabilei din stnga.
Observaie: Cu excepia operatorului %, care admite numai operanzi ntregi, ceilali admit toate
tipurile numerice.
Exemplu:
Determinarea ctului (cat) i restului (rest) mpririi numrului m la numrul n se realizeaz astfel:
div_t x;
int m,n,cat,rest;
x=div(m,n);
cat=x.quot;
rest=x.rem;
n limbajul C nu exist tipul de dat logic. Operanzii asupra crora se aplic operatorii
logici sunt convertii n valori numerice i interpretai conform conveniei: adevrat pentru
valoare nenul i fals pentru zero. Rezultatul unei operaii logice este de tip int, conform
conveniei: pentru adevrat valoarea 1 iar pentru fals valoarea 0.
Bazele programrii 64
La evaluarea expresiilor logice se aplic principiul evalurii pariale: dac expresia este de
tip aditiv (operanzi legai prin operatorul sau), n momentul n care s-a stabilit c un operand are
valoarea adevrat toat expresia va fi adevrat i nu se mai evalueaz restul operanzilor.
Asemntor, pentru o expresie multiplicativ (operanzi legai prin operatorul i), dac un operand
are valoarea fals, expresia are valoarea fals i nu se mai evalueaz restul operanzilor.
Operaia sau exclusiv ntre doi operanzi a i b se efectueaz cu expresia !a&&b||!b&&a,
conform tabelului urmtor:
Operatorii relaionali sunt prezentai n tabelul 4.5. Operatorii relaionali au acelai nivel de
prioritate.
Rezultatul unei operaii relaionale este de tip int, conform conveniei: pentru adevrat valoarea 1,
iar pentru fals valoarea 0.
Pentru a nu se grei la evaluarea unor expresii complexe, este indicat s se fac raionamentul
bazat pe logica boolean (cu valori de adevrat i fals).
Operanzii pot fi de orice tip ntreg. Dac este nevoie, operanzii sunt extini la reprezentare pe 16
bii. Execuia are loc bit cu bit. Pentru o pereche de bii (x,y), valorile posibile rezultate n urma
aplicrii operatorilor logici la nivel de bit sunt prezentate n tabelul 4.7.
Exemplu:
1. Urmtoarea secven afieaz, n ordine invers, biii unui octet (dat de tip char).
char c;
scanf("%d",&c);
for(int i=0;i<8;i++,c=c>>1)
printf("%d",c&1);
Dup execuia secvenei, a are valoarea 7 (nu 7.0) nefiind afectat n nici un fel de operaia de conversie
de tip, iar b are valoarea 7.0 (obinut prin conversia valorii lui a ctre tipul float).
Teste de autoevaluare
Instruciunea de tip expresie evalueaz o expresie care, n cele mai dese cazuri, este de atribuire
sau de apel al unei funcii (vezi i capitolul Operatori i expresii). Instruciunea de tip expresie se
obine scriind terminatorul de instruciune dup o expresie (acolo unde este legal s apar o
instruciune n program). Forma general este:
expresie;
fals adevrat
condiie
Instruciune 2 Instruciune 1
Expresia poate fi de orice tip. Dac valoarea expresiei este diferit de zero (valoare
asociat din punct de vedere logic cu adevrat) se execut instruciune_1; n caz contrar se
execut instruciune_2 sau se iese din structur (cnd construcia else lipsete, caz n care
instruciunea if realizeaz structura pseudoalternativ).
Exemple:
1) if(a>b) a=c;
else a=b;
2. Rezolvarea ecuaiei de gradul I, ax+b=0:
a ? printf("Solutia este %10.5f",(float)-b/a) : b ? printf("Ecuatia nu are solutii") : printf("Solutii: orice x real");
b) Structura alternativ multipl permite alegerea unei aciuni dintr-un grup, n funcie de
valorile pe care le poate lua un selector (figura 9.2). n limbajul C structura se simuleaz cu
instruciunea switch, a crei sintax este:
switch(expresie)
{case c_1: instruciuni_1;
case c_2: instruciuni_2;
case c_n: instruciuni_n;
[default: instruciuni;]}
Bazele programrii 70
unde: expresie este de tip ntreg; c_1, c_2, , c_n sunt expresii constante, de tip int, unice (o
valoare nu poate s apar de dou sau mai multe ori); instruciuni_1, instruciuni_2, ...,
instruciuni_n, instruciuni sunt simple, compuse sau structurate. Dac pe o ramur sunt mai
multe instruciuni, nu este nevoie s fie incluse ntre acolade (s fie instruciune compus).
Instruciunea switch evalueaz expresia dintre paranteze, dup care caut n lista de
expresii constanta cu valoarea obinut. Dac este gsit, se execut instruciunile asociate valorii
respective i, secvenial, toate instruciunile care urmeaz, pn la terminarea structurii de
selecie. Dac valoarea cutat nu este gsit n list i ramura default este prezent, se execut
instruciunile asociate acesteia. Dac ramura default lipsete nu se execut nimic. Pentru a limita
aciunea strict la execuia instruciunilor asociate unei valori, trebuie inclus instruciunea break,
care determin ieirea din structura switch.
Pentru a simula structura din figura 4.3 se scrie:
switch(expresie)
{case c_1: instruciuni_1; break;
case c_2: instruciuni_2; break;
case c_n: instruciuni_n; break;
[default: instruciuni;]}
selector
selector = v1
Instruciunea while se execut astfel: se evalueaz expresia i dac este diferit de zero
(adevrat) se execut instruciunea (simpl, compus sau structurat), apoi se reia procesul pn
cnd la evaluarea expresiei se obine valoarea zero. n acest moment se ncheie execuia
instruciunii while. Pentru a asigura ieirea din ciclu, instruciunea trebuie s modifice valoarea
expresiei.
Dac la prima evaluare a expresiei se obine valoarea zero, atunci nu se execut nimic.
Instruciunea while implementeaz natural structura corespunztoare din teoria programrii
structurate. Mecanismul de execuie este redat n figura 4.4.
Bazele programrii 71
expresie 0 (adevrat)
=0 instruciune
(fals)
instruciune
0 (adevrat)
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 programrii 72
expresie 1
0 (adevrat)
expresie 2
instruciune
=0 (fals)
expresie 3
Prin instruciunea continue, care se poate folosi numai n interiorul unei structuri
repetitive, se abandoneaz iteraia curent i se trece la urmtoarea. Forma ei este:
continue;
Bazele programrii 73
Instruciunea break este folosit numai n interiorul unei instruciuni structurate i are
ca efect terminarea imediat a execuiei instruciunii respective.
Instruciunea goto realizeaz salt necondiionat i este monit din primele limbaje de
programare, care nu foloseau principiile programrii structurate. Forma general este:
goto etichet;
O etichet este un identificator urmat de caracterul : (dou puncte), dup care urmeaz o
instruciune. Rolul unei etichete este de a defini un punct de salt, ctre care se poate face trimitere
prin instruciunea goto. Etichetele au valabilitate local, n corpul funciei n care sunt definite.
Din acest motiv, nu se poate face salt din corpul unei funcii la o instruciune aflat n alt
funcie.
Test de autoevaluare
6. Care din urmtoarele secvene nu realizeaz suma a n elemente ale unui vector:
a) s=0; for(i=0; i<n; i++) s+=x[i]; b) s=0; for(i=n-1; i>=0; i--) s+=x[i]; c) s=0; i=0; while
(i<n) {s+=x[i]; i++;} ; d) s=0; i=n-1; while (i>0) {s+=x[i]; i--;} ; e) s=0; i=0; do { s+=x[i];
i++; } while(i<n);
7. Secvena: for(i=0; i<n-1; i++) {z=x[i]; p=i; for(j=i+1; j<n;
j++) if(x[j]<z) {z=x[j]; p=j; } a=x[i]; x[i]=z; x[p]=a; }
realizeaz:
a) minimul dintr-un vector cu reinerea poziiei primei apariii; b) minimul dintr-un
vector cu reinerea poziiei ultimei apariii; c) sortarea unui vector prin metoda bulelor;
d) sortarea unui vector prin metoda seleciei; e) cutarea unei valori date ntr-un vector.
8. Triunghiul de sub diagonala secundar (inclusiv diagonala) unei matrice ptrate se poate
parcurge numai cu secvenele: 1. for(i=0; i<n; i++) for(j=n-i-1; j<n; j++) ...; 2.
for(i=0; i<n; i++) for(j=n-1; j>=n-i-1; j--) ...; 3. for(i=n-1; i>=0; i--)
for(j=n-i-1; j<n; j++) ...; 4. for(i=n-1; i>=0; i--) for(j=n-1; j>=n-i-1; j-
-) ...; 5. for(j=0; j<n; j++) for(i=n-j-1; i<n; i++) ...; 6. for(j=0; j<n; j++)
for(i=n-1; i>=n-j-1; i--) ...; 7. for(j=n-1; j>=0; j--) for(i=n-j-1; i<n;
i++) ...; 8. for(j=n-1; j>=0; j--) for(i=n-1; i>=n-j-1; i--) do ....
a) 1,2,5 i 6; b) 3,4,7 i 8; c) 1,2,3 i 4; d) 5,6,7 i 8; e) toate.
9. Urmtoarele secvene descriu algoritmi recursivi: 1) s=0; for(i=n-1; i>=0; i--)
s+=x[i]; 2) for(i=0; i<n; i++) y[i]=x[i]; 3) nr=0; i=0; while(i<n) {if(x[i]>0)
nr+=1; i++; }; 4) for(i=0; i<n; i++) z[i]=x[i]*y[i]; 5) i=0; z=0; do
{z+=x[i]*y[i]; i++;} while(i<n); 6) s=1; for(i=0; i<n; i++) s*=i;
a) toate; b) 1,3,5 i 6; c) 2,4 i 6; d) 3 i 5; e) niciunul.
Bazele programrii 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 iniializarea cmpurilor unui student la zi pentru structura
prezentat se realizeaz astfel:
#include <stdio.h>
void main()
{ //Declararea articolului cu structura variabila:
struct articol { char nume[40];
struct { int zi, luna, an;} datan;
int an_st; char forma_inv;
union { struct {char bursa; float valoare;}zi;
struct {char loc_m[30];
struct {int zi, luna, an;}data_ang;
}id; } parte_vb; };
//Initializarea campurilor unui student la zi:
struct articol a={"Popescu Felix",{4,1,1974},1,'Z',{'D',250.5}};
printf("\nData nasterii: %i.%i.%i, Forma de inv.: %c, Val. bursa: %6.2f",
a.datan.zi, a.datan.luna, a.datan.an, a.forma_inv, a.parte_vb.zi.valoare); }
4. Variabila c primete valoarea maxim dintre a i b, anume 9.
5. y=x++; este echivalent cu secvena y=x; x=x+1;
y=--x; este echivalent cu secvena x=x-1; y=x;
6:d); 7:d); 8:e); 9:b).
Bazele programrii 75
Bibliografie
1. I. Gh. Roca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, M. Mircea, L. Btgan, C. Silvestru,
Bazele programrii calculatoarelor. Teorie i aplicaii n C, Ed. ASE, Bucureti, 2006, ISBN 973-594-591-
6
2. I. Gh. Roca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, Programarea calculatoarelor. tiina
nvrii unui limbaj de programare, Teorie i aplicaii, Ed. ASE, 2003
3. Ion Smeureanu, Marian Drdal, Programarea n limbajul C/C++, Ed. CISON, Bucureti 2004, ISBN
973-99725-7-8
4. Roca Gh. I., Ghilic-Micu B., Stoica M., Cocianu C., Uscatu C., Programarea calculatoarelor.
tiina nvrii unui limbaj de programare. Teorie i aplicaii, Ed. ASE, Bucureti 2003, ISBN
973-594-243-7