Documente Academic
Documente Profesional
Documente Cultură
Bazele programrii
Bucureti 2010
Cuprins
1.
Bazele programrii
Bazele programrii
Exemplu:
S se elaboreze algoritmul pentru rezolvarea ecuaiei: ax2 + bx + c = 0, a,b,c,x. Analiza arat c exist
patru situaii posibile care trebuie cuprinse n algoritm:
1. a 0, ecuaie de gradul II;
2. a = 0 i b 0, ecuaie de gradul I;
3. a = 0 i b = 0 i c 0, ecuaie imposibil;
4. a = 0 i b = 0 i c = 0, nedeterminare.
Rmne s fie rezolvate fiecare din aceste situaii sau unele din ele s fie grupate n funcie de cerine.
Bazele programrii
Exemple:
A numra nseamn a aduga o unitate la valoarea anterior calculat. Dac se noteaz v0 = 0
valoarea iniial, numrarea se desfoar dup urmtorul proces recursiv:
v1 = v0 + 1
v2 = v1 + 1
v3 = v2 + 1
........
vi = vi-1 + 1
........
vn = vn1+1
Valoarea care intereseaz este vn. n procesul descris anterior se disting:
v0 = 0
formula de start
vi = vi-1 + 1
formula recursiv, pentru i=1,n
Cnd valorile obinute prin numrare nu necesit pstrarea n memorie, nu sunt necesare mai multe
locaii, ci una singur, care va fi suprascris la fiecare iteraie:
formula de start
V=0
V=V+1
formula recursiv, pentru i=1,n
Utilizarea mai multor zone de memorie pentru calculele intermediare devine obligatorie n
situaia multirecursivitii. Practic, prin transferul dinamic al valorilor intermediare, sunt necesare
attea zone de memorie cte valori precedente sunt necesare calculului termenului curent.
Exemplu:
Algoritmul lui Euclid pentru determinarea celui mai mare divizor comun a dou numere A i B.
rk
r k +1 ,
rk +1
cu r0 = A; r1 = B i k = 0,1,2,... Prin [ ] s-a notat partea ntreag a expresiei. Ultimul rest nenul reprezint
cel mai mare divizor comun. Dac se noteaz cu D variabila demprit, cu I variabila mpritor i cu R
restul, formulele de start devin: Da; Ib. Iterativ, se calculeaz restul RD- D I i se execut
I
transferurile: DI; IR. mpritorul devine noul demprit, iar ultimul rest obinut devine mpritor n
iteraia urmtoare a algoritmului. Procesul iterativ continu pn se obine restul zero. Ultimul rest nenul
reprezint cel mai mare divizor comun al numerelor A i B.
Teste de autoevaluare
1. Caracteristicile oricrui algoritm sunt: 1. Generalitate; 2. Complementaritate; 3. Claritate;
4. Finitudine; 5. Recursivitate; 6. Iterativitate.
a) toate; b) 1,3,4,5 i 6; c) 1,2,3 i 4; d) 1,3 i 4; e) 1,2,5 i 6.
2. Un algoritm recursiv este: a) un algoritm care se autoapeleaz ; b) un proces repetitiv
static; c) un proces repetitiv dinamic; d) un proces repetitiv prin care valoarea unei
variabile se determin pe baza a cel puin uneia dintre valorile ei anterioare; e) un
proces alternativ prin care valoarea unei variabile se determin pe baza a cel puin
uneia dintre valorile ei anterioare.
Bazele programrii
Blocul STOP este un arc etichetat cu cuvntul STOP, pentru care vrful final nu este pus
explicit n eviden, deoarece din el nu pot pleca arce:
STOP
Blocul de citire este un arc etichetat cu informaia: citirea unor valori de pe suportul
extern i nscrierea lor n locaii de memorie corespunztoare unor variabile.
Citete
list-de-variabile
sau
ve
sau
ev
Blocul de ramificare (selecie) este o mulime de n arce care pleac din acelai vrf, arce
etichetate cu predicatele C1, C2,...,Cn (predicat = condiie = expresie logic, care poate fi adevrat
(1) sau fals (0)), care satisfac relaiile:
C1 C2 ... Cn = 1; Ci Cj = 0, () i j; i,j= 1, n
Relaiile exprim faptul c unul i numai unul din aceste predicate poate fi satisfcut
(adevrat).
c1
c2
...
cn
Nu
Da
Definiie:
Se numete schem logic un graf orientat n care:
a) Exist un singur bloc START i un singur bloc STOP;
b) Orice arc este etichetat cu una din urmtoarele informaii: START sau STOP; o citire sau
o scriere; o atribuire; un predicat, n care caz extremitatea iniial a arcului este extremitatea iniial
a unui bloc de ramificaie;
Bazele programrii
c) Orice arc face parte din cel puin un drum care ncepe cu blocul START i se termin cu
blocul STOP.
n practic, schemele logice alctuite conform regulilor enunate anterior pot lua forme
foarte complicate, greu de urmrit, uneori chiar de cel care le-a conceput. De aceea s-a simit
nevoia ca n construcia schemelor logice s se foloseasc numai anumite configuraii (structuri) i
s se respecte reguli stricte, obinndu-se, astfel, scheme logice structurate.
Definiie:
Se numete subschem logic un graf orientat n care:
a) Exist un unic vrf iniial (n care nu sosesc arce) i un vrf final (din care nu pleac arce);
b) Oricare arc este etichetat cu una din urmtoarele informaii: START sau STOP; o citire sau
o scriere; o atribuire; un predicat, n care caz extremitatea iniial a arcului este extremitatea iniial
a unui bloc de ramificaie;
c) Dac subschema conine blocul START (STOP), atunci extremitatea iniial (final) a
blocului este chiar vrful iniial (final);
d) Orice arc face parte din cel puin un drum ce unete vrful iniial cu cel final.
n particular, o schem logic este o subschem logic n care vrful iniial este extremitatea
iniial a blocului START, iar vrful final este extremitatea final a blocului STOP.
Prin recuren, schema logic structurat (s.l.s.) se definete astfel:
(I) Blocurile START, STOP, de intrare/ieire i de atribuire sunt s.l.s.;
(II) Dac s1 i s2 sunt s.l.s., atunci i subschemele din figura 1.1. sunt s.l.s. (cu respectarea
condiiilor referitoare la START i STOP).
(III) Orice s.l.s. se obine plecnd de la (I) i aplicnd de un numr finit de ori regulile (II).
S1
S1
S2
Structura
secvenial
S2
Structura alternativ
IF-THEN-ELSE
c
S
Structura repetitiv
WHILE-DO
O schem logic structurat este o s.l.s. care este chiar o schem logic.
Se pune ntrebarea: se poate genera orice schem logic folosind numai formele impuse
schemelor logice structurate? Sau altfel spus, se poate transforma orice schem logic ntr-o
schem logic bine structurat? Rspunsul, afirmativ, este dat de teorema fundamental a
programrii structurate (teorema lui Bhm-Jacopini): orice schem logic este echivalent cu o
schem logic structurat. [Dodescu et al., 1987]
Reprezentarea algoritmilor prin pseudocod
Descrierea algoritmilor cu ajutorul schemelor logice se dovedete, n unele cazuri, greoaie,
practica impunnd n ultima vreme descrierea lor printr-un text coerent, construit pe baza unor
reguli. O astfel de descriere se numete metalimbaj (pseudocod). Exist multe variante de
metalimbaje. Oricine poate crea un pseudocod propriu, perfect acceptabil, cu condiia ca el s
conin structurile de baz, suficiente pentru a descrie orice algoritm. Evident c i la pseudocoduri
Bazele programrii
se pune problema portabilitii, mai ales atunci cnd se lucreaz n echip. Cel mai avansat
pseudocod universal a fost propus n anii 60 de Niklaus Wirth, pseudocod care ulterior a devenit
limbajul de programare Pascal. [Roca et al., 1998] Se propune urmtorul pseudocod:
Cuvinte cheie. Sunt mnemonice ale instruciunilor, unele fiind scrise n limba englez,
pentru compatibilizare cu literatura de specialitate (de exemplu WHILE-DO, IF-THEN-ELSE).
Instruciuni. Instruciunile pot fi scrise liber, n sensul c o instruciune se poate scrie pe
mai multe rnduri, iar un rnd poate conine mai multe instruciuni (separate prin ";").
Instruciunile se mpart n declaraii (instruciuni neexecutabile) i instruciuni efective
(executabile).
O declaraie este format din cuvinte cheie (de exemplu NTREG, REAL, CARACTER
etc.), urmat de un ir de variabile separate prin ",", variabile pentru care se indic faptul c au tipul
ntreg, real, caracter etc. Masivele se declar prin tipul elementelor sale, urmat de o construcie
care desemneaz numrul maxim de elemente pe fiecare dimensiune, sub forma [d1][d2]...[dn].
Exemple:
NTREG a, b, c;
REAL vector[20];
NTREG matrice [10][15];
CITETE(A,B);
CITETE(xi);
Instruciunea de atribuire are forma: v=e, unde v este variabil, e este expresie, ambele de
aceeai natur (numeric, logic sau caracter).
Instruciunile de ramificare (IF-THEN-ELSE, IF-THEN, CASE-OF) i cele repetitive
(WHILE-DO, DO-UNTIL, DO-FOR) sunt prezentate mpreun cu structurile fundamentale.
Observaii:
a) Instruciunile corespund configuraiilor acceptate ntr-o schem logic structurat, deci sunt
compatibile cu programarea structurat.
b) Instruciunile acestui pseudocod se pot extinde la lucrul cu fiiere.
Teste de autoevaluare
3. Blocurile dintr-o subschem logic sunt etichetate cu una din informaiile: 1)START;
2)citire; 3)scriere; 4)expresie aritmetic; 5)expresie logic; 6)expresie relaional; 7)sir de
caractere; 8)atribuire; 9)salt necondiionat; 10)STOP. a)oricare; b)1,2,3,5,6,8 sau 10;
c)1,2,3,4,8 sau 10; d)1,2,3,5,6,7,8 sau 10; e)1,2,3,4,6,8,9 sau 10
4. Reprezentarea prin arbori este permis numai pentru structurile: 1)BLOCK; 2)IF-THENELSE; 3)CASE-OF; 4)WHILE-DO; 5)DO-UNTIL; 6)DO-FOR. a) toate; b)1,2,3,4 i 5;
c)2,3,4,5 i 6; d)1,2 i 4; e)1,2 i 5.
Bazele programrii
10
arbore
pseudocod
BLOCK
S1;
S2;
S1
S2
S1
S2
S2
arbore
da
pseudocod
IF-THEN-ELSE
S1
C
S1
S2
IF C THEN
S1
ELSE
S2
ENDIF;
a) Structura IF-THEN-ELSE
s.l.s.
nu
arbore
da
pseudocod
IF-THEN
IF C THEN
S1
ENDIF;
S1
C
S1
b) Structura IF-THEN
Bazele programrii
11
i=1
S2
pseudocod
CASE-OF i
i1, 2, ..., n
i=n
i=2
S1
arbore
...
Sn
S1
S2
...
Sn
CASE-OF i
i=1: S1
i=2: S2
... ... ...
i=n: Sn
ELSE: S
ENDCASE;
i=1
S2
pseudocod
CASE-OF i
i=n
i=n-1
i=2
S1
arbore
...
Sn-1
Sn
S1
S2
...
Sn-1
Sn
CASE-OF i
i=1: S1
i=2: S2
... ... ...
i=n-1: Sn-1
i=n: Sn
ENDCASE;
Bazele programrii
12
s.l.s.
arbore
pseudocod
WHILE-DO
C
nu
da
S
WHILE C DO
S
ENDWHILE;
a) Structura WHILE-DO
s.l.s.
arbore
pseudocod
DO-UNTIL
S
nu
da
b) Structura DO-UNTIL
s.l.s.
arbore
v=vi
vvf
DO-FOR
v=vi, vf, vr
da
S
nu
DO
S
UNTIL C;
ENDDO;
pseudocod
v=v+vr
c) Structura DO-FOR
Teste de autoevaluare
Bazele programrii
13
Bazele programrii
14
vor fi astfel alese nct s fie corelate cu precizia dorit pentru calculele n care intr aceti
parametri.
O alt clas important de erori o constituie erorile de rotunjire. Ele apar ca urmare a
limitrii numrului de zecimale cu care se poate reprezenta un numr n calculator. Aceste erori
depind de modul de reprezentare a numerelor n calculator, de sistemul de numeraie folosit n
calcule, precum i de conversiile dintr-un sistem de numeraie n altul.
La rezolvarea, mai ales numeric, a unei probleme se folosete o metod matematic. De
multe ori, fenomenul modelat este supus unor condiii simplificatoare, n funcie de acestea alegnd
una sau alta din metodele de rezolvare existente. Alegerea metodei poate introduce aa numitele
erori de metod. Erorile introduse prin prezena n calculator a unor funcii crora n analiza
matematic le corespund serii infinite se numesc erori reziduale. Ele se explic prin imposibilitatea
calculrii unei serii infinite ntr-un numr finit de pai ai algoritmului.
Dac x este valoarea exact i x* o valoare aproximativ a lui x, obinut ca urmare a
prezenei unor erori din clasele menionate anterior, se disting urmtoarele situaii:
x* > x
x* este o aproximare a lui x prin adaos;
x* realizeaz o aproximare prin lips.
x* < x
Diferena x * = x - x * reprezint eroarea, iar cnd nu intereseaz sensul ei se calculeaz
x * = x x * , care poart numele de eroare absolut.
Erorile pot fi acceptate sau respinse, nu numai n funcie de mrimea lor, ci i n funcie de
x x*
mrimea valorilor crora li se asociaz. n acest scop se calculeaz raportul rx * =
care
x*
desemneaz eroarea relativ.
n cazul operaiilor de adunare i scdere, eroarea absolut nu depete suma erorilor
absolute a celor dou numere care se adun algebric.
*
*
x* y* = (x y) - ( x y ) = x* y* , pentru eroarea absolut;
*
x * y*
x * y , pentru eroarea relativ.
*
=
rx * * ry * *
rx y
*
*
x y
x y
x y
De reinut c la scderea a dou numere apropiate ca valoare, eroarea relativ i pierde din
acuratee datorit numitorului raportului care tinde spre zero. Relaiile funcioneaz i pentru n>2
numere. n cazul produsului a mai multor numere aproximative i nenule, eroarea relativ nu
depete suma erorilor relative ale numerelor:
*
*
* *
*
* *
*
x*. y* - (xy - x y ) = ( x + x*) ( y + y*) - x y = x y* + y x* + x* y*
*
* *
x*. y*
* *
x .y
n care, logaritmnd (valorile absolute permind acest lucru, iar x* i y* pentru simplificare au
*
acelai semn) i folosind formula de aproximare ln x - ln x * d ln x * = x* , rezult c
x
*
*
y x* - x y*
, r ( x )* | r x* | + | r y* | , ceea ce
r x* y* r x* + r y* . n cazul operaiei de mprire ( x )*
y
y
( y* ) 2
nseamn c eroarea relativ a ctului nu excede suma erorilor relative ale dempritului i
mpritorului. Erorile n cazul unor expresii calculabile prin operaiile elementare pot fi aproximate
folosind limita maxim a erorilor fiecrui termen n parte.
r x*. y* =
Bazele programrii
15
Teste de autoevaluare
7. Un algoritm structurat este echivalent cu un algoritm pus sub una din formele:
1)BLOCK(s1,s2); 2)IF-THEN-ELSE(c,s1,s2); 3)IF-THEN(c,s); 4)CASE-OF(i,s1,s2,...,sn,s);
5)WHILE-DO(c,s); 6)DO-UNTIL(s,c); 7)DO-FOR(v,vi,vf,vr,s). a)1,2,3,4,5,6,7; b) 1,2,3,5,6;
c) 1,2,5,6,7; d) 1,2,5; e) 1,2,6.
8. Teorema de structur stabilete c: a) orice schem logic este echivalent cu o schem
logic structurat; b) orice schem logic poate fi pus sub una din
formele:BLOCK(s1,s2); IF-THEN-ELSE(c,s1,s2); WHILE-DO(c,s); c) corectitudinea
unei scheme logice structurate se verific prin examinarea fiecrui nod din arborescena
sa; d) o schem logic structurat poate fi descompus n structurile privilegiate
Proiectarea algoritmilor
Conceptele principale ce s-au cristalizat n domeniul programrii structurate sunt:
proiectarea top-down, proiectarea modular, proiectarea structurat. Cele trei tipuri de proiectri
nu se exclud unul pe altul, ci se intercoreleaz pentru desfurarea unei activiti organizate i
disciplinate, concretizat n obinerea unor produse program care s reflecte clar ierarhizarea
prelucrrilor i care s faciliteze testarea i documentarea lor.
Proiectarea top-down presupune descompunerea, de la general la particular, a problemei
date n subprobleme sau funcii de prelucrat, conducnd la realizarea algoritmului n mai multe faze
succesive, fiecare faz fiind o detaliere a fazei anterioare pn cnd algoritmul este suficient de
rafinat (detaliat) pentru a fi codificat. Apar astfel, n diferite faze succesive, algoritmi din ce n ce
mai detaliai. n urma descompunerii se obine o structur liniar sau arborescent.
Proiectarea top-down este nsoit de codificare (scriere a programelor) top-down i testare
top-down. Codificarea top-down presupune, n principal, posibilitatea scrierii unui modul nainte de
a se proiecta modulele de nivel inferior (superior), iar testarea top-down const n realizarea ei de
sus n jos: se pornete cu modulul rdcin i cu unu sau mai multe module de ordin imediat
inferior, se continu cu ataarea unui alt nivel inferior etc., pn cnd s-au inclus n testare
modulele ultimului nivel. Testarea top-down poate lua n considerare, la un moment dat, numai
legturile unui modul cu module de pe nivelul inferior, fr testare propriu-zis a acestora din urm.
Proiectarea modularizat presupune descompunerea problemelor n pri numite
module, astfel nct fiecare din acestea s ndeplineasc anumite funcii bine definite.
Descompunerea se poate face n mai multe faze (la mai multe niveluri) prin metoda top-down.
Criteriile de descompunere n module depind, n mare msur, de experiena proiectanilor
(programatorilor).
Ele se refer, n principal, la: omogenizarea funciilor; utilizarea diverselor structuri de date;
separarea funciilor de intrare/ieire de funciile de prelucrare; utilizarea unor module deja
existente; posibilitile echipei n sarcina creia intr realizarea modulelor; utilizarea eficient a
resurselor calculatorului (periferice, timp, memorie intern) etc.
Proiectarea modularizat presupune, pe lng identificarea modulelor i a relaiilor dintre
ele, i precizarea modului i ordinii n care modulele sunt puse n lucru. Din punct de vedere al
funciilor pe care le conin, se disting: module de prelucrare (operaionale) care conin funcii de
prelucrare (operaii propriu-zise), module de comand (monitor) care apeleaz (activeaz) alte
module i module mixte, care conin att funcii de prelucrare ct i de comand. n stabilirea
ordinei de punere n lucru a modulelor, arborele se parcurge n preordine. Dup stabilirea
modulelor, acestea se abordeaz algoritmic, independent unul fa de altul.
Bazele programrii
16
Test de autoevaluare
9. Care tipurile de proiectri cristalizate n domeniul programrii structurate?
Bazele programrii
17
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
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.
3. Roca I. Gh., Apostol C., Ghilic-Micu B., Roca V., Programare sistematic n Pascal, Ed.
Didactic i Pedagogic, Bucureti 1998, ISBN 973-30-3341-3
Bazele programrii
18
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.
Bazele programrii
20
Referitor la al doilea caz, se constat, ns, c este obligatorie existena unei intersecii
nevide ntre cele dou mulimi, numit redundan, astfel nct recepia i nelegerea
mesajului s aib loc.
n final putem sintetiza o serie de concluzii clarificatoare a problematicii puse n
discuie.
O informaie este un mesaj susceptibil de a aduce o cunotin i poate fi generat numai de
sisteme cu numr n finit de stri (n 2). Modelul de reprezentare a informaiei, formula scris,
reprezint o dat. Deosebirea dintre informaie i dat este echivalent cu deosebirea dintre obiect i
modelul su. Sub aspect semantic, informaia poate fi caracterizat ca semnificaie a datelor.
Calculatoarele actuale prelucreaz date pe baza crora se obin rezultate (tot date) care, prin
interpretare uman, capt un sens, devenind informaii.
C.E. Shannon a introdus noiunea de cantitate de informaie, care se poate defini astfel: fie
un experiment X, avnd un numr finit de evenimente elementare independente x1,x2,...,xn, care se
realizeaz cu probabilitile p1,p2,...,pn: X = x1 x2 ... xn . Dac X reprezint un sistem complet de
p p ... p
1 2
n
k =1
(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
Bazele programrii
21
M
a) Virgul fix algebric
N
15 14
Bazele programrii
22
0
15
0
14
...
...
0
6
0
5
1
4
1
3
0
2
0
1
0
0
1
6
1
5
0
4
0
3
1
2
1
1
1
0
0
2
0
1
0
0
1
15
1
14
...
...
1
15
1
14
...
...
1
6
1
5
0
4
1
3
Exemple:
Pentru simplificare se consider un cuvnt format din patru bii:
Complementul fa de 2 pentru 0110:
01
10
stnga
dreapta
Rezultat:
10
10
Complementul fa de 2 pentru 1101:
110
1
stnga
dreapta
Rezultat:
001
1
Bazele programrii
23
caracteristic
8 (11) bii
fracie
23 (52) bii
Exemplu:
S se reprezinte n simpl precizie numrul 75,375.
75,375 = 1001011,011(2) = 1,001011011*26
s=1
mantisa = 1,001011011(2)
fracia = 001011011(2)
caracteristica = 6 + 127 = 133 = 10000101(2)
Reprezentarea intern: 1
10000101 00101101100000000000000
Tip reprezentare
Simpl precizie
Dubl precizie
8
11
23
52
Bazele programrii
24
Tip reprezentare
Simpl precizie
Dubl precizie
Caracteristici
reprezentare fracie
Valoarea minim
caracteristic
Valoarea maxim
caracteristic
Eroare maxim fracie
Cel mai mic numr
pozitiv
Cel mai mare numr
pozitiv
Domeniu de
reprezentare
254
2047
2-24 10-7
2-24 10-7
21-127 10-38
21-1023 10-307
22254-127 1038
222047-1023 10307
[1038 , 1038]
[10307 , 10307]
Bazele programrii
25
atunci cnd nu se face parcurgerea n secven i este nevoie s se sar peste cteva cuvinte de
memorie pentru a ajunge la instruciunea dorit? Programatorul are la dispoziie instruciunile de
salt, prin folosirea crora se asigur ntreruperea secvenei normale de program, prin ncrcarea
forat n PC a adresei la care se gsete instruciunea de executat.
Se presupune c instruciunea I2 este: SALT LA 47168. Dup ce se execut instruciunea
I1, contorul de locaii devine 47108. Se execut, n secven, instruciunea I2 care pune contorul
de adrese pe valoarea 47168 (fiind o instruciune de salt).
Prin urmare, n UCC se ncarc instruciunea I3 .a.m.d. n exemplul anterior s-a
considerat c toate instruciunile au lungimea de un cuvnt. n secvena logic a programului,
ultima instruciune trebuie s fie de tip STOP.
Dup extragerea instruciunii din memorie (prima etap n prelucrarea unei instruciuni)
se execut urmtoarele etape: calculul adresei operandului; efectuarea operaiei propriu-zise,
precizat de instruciune.
n cadrul fiecrei etape se execut un anumit numr de faze. Indiferent de modul de
realizare a fazelor (prin macroinstruciuni sau prin funciuni cablate), principial, modul de
prelucrare a unei instruciuni este asemntor. Se consider c n UCC se gsete instruciune I3:
ADUNA (4704) cu (4712) care adun coninutul de la adresa 47048 cu coninutul de la adresa
47128 iar rezultatul se depune la adresa celui de-al doilea operand. Pentru a nelege modul cum
se execut aceast instruciune se presupune c UAL este format din dou registre (sumatoare),
n care se realizeaz calcule. Instruciunea I3 poate fi descompus n urmtorii pai (figura 2.4.):
- preia coninutul operandului surs de la adresa 47048 (D3) ntr-un sumator;
- preia coninutul operandului destinaie de la adresa 47128 (D4) n al doilea sumator;
- efectueaz calculul ntre cele dou sumatoare, cu rezultatul n S1;
- depune coninutul sumatorului S1 n memorie la adresa 47128.
n mod similar se pot interpreta i alte operaii de calcul. Toate operaiile realizate asupra
datelor se efectueaz n unitatea aritmetico-logic. Aceast afirmaie este valabil i n cazul
uneia din cele mai simple operaii: MUTA (47148) IN (47008), care se descompune astfel:
- preia operandul surs de la adresa 47148 (D5) n sumatorul S1;
- depune coninutul sumatorului S1 n memorie la adresa 47008 (D1 se pierde, depunnduse peste el D5).
Ce se va ntmpla n cazul instruciunii ADUNA (47008) cu (47108)? Rspuns: coninutul
de la adresa 47108 (I2) este tratat ca dat.
D1
4700
D2
4702
4704
D3
4706
I1
I2
4710
4712
D4
4714
D5
I3
4716
D6
4720
4722
I4
4726
S1
PC
4716
+
adun (4704) cu (4712)
S2
UAL
(I3)
UCC
Bazele programrii
26
Pointer
Adres operand
Operand
Operaii de intrare/ieire
Operaiile de intrare/ieire realizeaz citirea - introducerea datelor n memorie - i
scrierea - extragerea datelor din memorie. Deoarece datele pot fi prelucrate doar dac se gsesc
n memoria intern, apare ca necesar operaia de citire prin care se transfer datele furnizate de
utilizator. Cum toate operaiile i depun rezultatul n memoria intern, punerea lor la dispoziia
utilizatorilor necesit operaia de scriere. Elementele care definesc o instruciune de I/E sunt:
- de unde (unde) sunt introduse/extrase datele;
- care este structura extern a datelor (formatul extern);
- care este adresa memoriei n/din care se introduc/extrag datele.
Reprezentarea numerelor pe suporturile externe la care are acces n mod direct operatorul
uman trebuie s fie ASCII. Modul de realizare a corespondenei dintre un numr reprezentat
ASCII pe un suport extern i acelai numr reprezentat intern virgul fix sau virgul mobil este
prezentat schematic n figura 2.6.
Fie aA. Aplicaia f este o codificare bijectiv a mulimii A ntr-o mulime de coduri
reprezentabile pe un suport intern (de exemplu, o codificare n virgul fix sau n virgul mobil).
Fiecare numr din A se reprezint pe un suport extern sub forma unui ir de caractere (caracterele
aparin unei mulimi K). Imaginea pe suportul extern a unui numr aA nu este, n general, unic
(de exemplu a=13,9 poate fi reprezentat n mai multe feluri: +13.9; 139; +139 etc.). Se noteaz cu
Ia mulimea imaginilor pe suportul extern de intrare pentru elementul aA. n figura 1.11 s-a
presupus c imaginea numrului aA pe suportul extern de intrare este irul de caractere a1, a2, ...
, an.
Aplicaia este o codificare standard a mulimii K de caractere (ASCII). irul c1,c2...cn
rezult din irul a1, a2,...an prin aplicarea funciei fiecrui caracter ai, i=1,2,...n. Se noteaz cu Ca
mulimea irurilor de coduri care se obine din elementele lui Ia prin aplicarea funciei , n modul
descris anterior.
Bazele programrii
27
a
a1
a2
...
an
Suport extern
de intrare
f
c1
c2
cn
Suport intern
f(a)
-1
c1*
-1
a*
1*
c 2*
cn*
-3
-2
a2 *
...
an*
Suport extern
de ieire
Teste de autoevaluare
Bazele programrii
28
secvenial, la care localizarea unei componente se face printr-un proces de parcurgere a mai multor
componente, conform cu ordinea acestora (traversare).
Dup tipul componentelor, structurile de date pot fi mprite n omogene, cnd
componentele sunt de acelai tip i neomogene, cnd componentele sunt de tipuri diferite.
Componentele unei structuri de date pot s fie date elementare (scalare) sau s fie ele
nsele structuri de date. Dac o structur de date se compune din (sau se poate descompune n)
structuri de acelai tip, se spune c structura respectiv de date este recursiv.
Structurile de date se pot regsi n memoria intern (structuri interne) sau pe un purttor
extern (band magnetic, disc magnetic, dischet etc.), caz n care se numesc structuri externe
(fiiere).
Dac n reprezentarea structurii de date pe suportul de memorie se nregistreaz,
mpreun cu componentele acesteia, i date care materializeaz relaiile de ordonare, se spune c
aceasta este o structur explicit (altfel, este implicit), iar datele suplimentare, de obicei adrese, se
numesc referine sau pointeri. Necesitatea acestor date suplimentare apare n cazul reprezentrii
dispersate a structurilor de date, n care componentele nu ocup zone adiacente pe suportul de
memorare. Reprezentarea componentelor n zone adiacente corespunde structurilor dense. Toate
structurile de date care au aceeai organizare i sunt supuse acelorai operaii formeaz un anumit
tip de structur de date, extinznd noiunea de tip de dat i asupra mulimilor ordonate de date.
n funcie de modul de alocare a zonelor de memorie se disting date de tip static sau
dinamic. Pentru datele de tip static sunt alocate zone de memorie bine definite, n momentul
compilrii. Pentru datele de tip dinamic, zonele de memorie sunt alocate n momentul execuiei, n
funcie de necesiti, fiind posibil chiar eliberarea memoriei ocupate de unele date. Tipul dinamic
corespunde tipului referin (pointer).
Structuri statice de date
Pe lng datele elementare (scalare), fie ele constante sau variabile, frecvent este necesar
introducerea n memoria intern a unor colecii de date ntre elementele crora exist anumite
relaii. Practica programrii a impus, ca structuri de date frecvent utilizate, masivul (tabloul) i
articolul. Aceste structuri i dovedesc utilitatea n aproape toate aplicaiile practice, ceea ce explic
implementarea lor - cu unele diferene i particulariti - n majoritatea limbajelor de programare.
Masivul este o structur de date omogen, cu una, dou sau mai multe dimensiuni.
Pentru masivele uni, bi i tridimensionale se utilizeaz denumirile de vector, matrice, respectiv
plane de matrice. Structura este cu acces direct, referirea unui element fiind realizat printr-o
construcie sintactic numit variabil indexat, format din numele masivului i un numr de
expresii indiciale (indici) corespunznd dimensiunilor acestuia.
Diversele limbaje de programare implementeaz structura de masiv n modaliti diferite.
Limbajul C, care face obiectul acestei lucrri, le implementeaz necontiguu, bazndu-se pe
adresarea prin pointeri.
Articolul este o structur de date eterogen, de tip arborescent (figura 2.2.).
Componentele structurii arborescente, numite cmpuri, sunt individualizate prin nume. Relaia de
ordine ierarhic dintre cmpuri se precizeaz fie prin numere de nivel, fie prin incluziuni de articole
n articole.
Articolul este o structur cu acces direct, adic fiecare cmp (elementar sau grupat) poate fi
referit direct prin numele su, fr a face referiri la celelalte elemente din structura nregistrrii.
Articolul este o structur recursiv, deoarece datele de grup din interiorul ei corespunznd unor
Bazele programrii
29
subarbori, conserv aceleai proprieti ca i structura n ansamblul su. Una din principalele
utilizri ale acestei structuri de date apare n legtur cu fiierele.
Elementele din structura nregistrrii sunt:
cmpuri elementare corespunznd nodurilor terminale de pe fiecare ramur a arborelui (n
exemplul din figura 2.7: MARCA, NUME, ZI, LUNA, AN, OCUPATIE, SECTIE, ATELIER,
ECHIPA);
cmpuri grupate (date de grup), corespunznd nodurilor neterminale (DATA
INCADRARII, LOCMUNCA) i, n ultim instan, chiar rdcinii (PERSOANA).
NIVEL
.1
PERSOANA
MARCA
NUME
ZI
DATA NCADR.
LUNA
AN
OCUPAIE
SECTIE
LOC DE MUNCA
ATELIER
.2
ECHIPA .3
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
Dei acest mod de reprezentare este foarte comod i sugestiv n special n cazul grafurilor
cu numr mic de vrfuri, pentru prelucrri cu ajutorul calculatorului sunt necesare reprezentri
prin intermediul structurilor de date.
O modalitate de reprezentare este cea prin matrice de adiacen. Dac G=(V,E) este un
graf (sau digraf) cu V = n , atunci matricea de adiacen A Mnxn({0,1}) are componentele
1, dac ( v i , v j ) E
a ij =
, unde vi, vj reprezint cel de-al i-lea, respectiv cel de-al j-lea nod din V.
0, altfel
Se observ c n cazul unui graf neorientat matricea de adiacen este simetric
() i, j = 1, n , a ij = a ji (perechile de vrfuri care caracterizeaz muchiile sunt neordonate, deci dac
uv E, atunci i vu E), n timp ce, n cazul unui digraf, este posibil ca (vi , v j ) E , (v j , vi ) E ,
deci aij aji.
n cazul grafurilor ponderate, reprezentarea matriceal este asemntoare celei prezentate
anterior. Matricea ponderilor unui graf ponderat G=(V,E,W), V = n , WMnxn((0, )) are
componentele:
W(v i , v j ), dac (v i , v j ) E
w i, j =
,
, altfel
unde vi, vj reprezint cel de-al i-lea, respectiv cel de-al j-lea nod din V, =0 dac ponderea are
semnificaia de ctig, respectiv = dac are semnificaia de pierdere, n cazul n care se
dorete reprezentarea costurilor ca ponderi ale grafului.
Una dintre cele mai importante proprieti ale grafurilor o constituie posibilitatea de
accesare, prin intermediul unei secvene de muchii (arce), a oricrui vrf al grafului plecnd
dintr-un vrf dat, proprietate cunoscut sub numele de conexitate sau conexiune.
Fie : u0, u1,..,un un drum n graful G=(V,E). este un drum nchis dac u0=un. n caz
contrar, se numete drum deschis. Drumul este elementar dac oricare dou vrfuri din
Bazele programrii
31
sunt distincte, cu excepia, eventual, a extremitilor. Drumul este proces dac, pentru orice
0 i j n 1 , uiui+1 ujuj+1. Orice drum elementar este un proces.
Exemplu:
3. Pentru graful G, 1: v1, v2, v3, v2,
v5, v3, v4 este un v1-v4 drum care nu
este proces; 2: v1, v2, v5, v1, v3, v4
este un v1-v4 proces care nu este
drum elementar; 3: v1, v3, v4 este un
v1-v4 drum elementar.
v2
G:
v4
v5
v3
v1
Fie : u0,u1,..,un un drum n graful G=(V,E). : v0,v1,..,vm este un subdrum al lui dac
este un drum i pentru orice j, 0 j m , exist i, 0 i n astfel nct ui=vj. Orice drum cu
lungime cel puin 1 conine cel puin un drum elementar cu aceleai extremiti. ntr-adevr, dac
: u0,u1,..,un nu este elementar, atunci exist 0 i < j n i i 0 sau j n astfel nct ui=uj.
u j u j+1 ...u n , dac i = 0
'
este de asemenea un u0-un drum.
Atunci drumul : u 0 u 1 ...u i , dac j = 0
u u ...u u ...u , dac i 0, j n
0 1 i j+1 n
Aplicnd n continuare eliminarea duplicatelor vrfurilor n modul descris, rezult n final un u0un drum elementar.
Exemplu:
v2
4. n graful
v1
v6
v7
v4
v5
v3
v8
v10
v9
dac : v1, v2, v4, v5, v3, v1, v2, v5, v6, v7, v8, v9, v5, v9, v8, v10, atunci 1: v1, v2, v5, v9, v8, v10 , 2: v1, v2, v4,
v5, v9, v8, v10 sunt v1-v10 subdrumuri elementare.
Fie G=(V,E) un graf, V = n . Dac A este matricea de adiacen asociat grafului atunci,
pentru orice p1, a ij( p ) este numrul vi-vj drumurilor distincte de lungime p din graful G, unde
A p = (aij( p ) ) .
Fie Mn({0,1)} mulimea matricelor de dimensiuni nxn, componentele fiind elemente din
mulimea {0,1}. Pe Mn({0,1)}se definesc operaiile binare, notate i , astfel: pentru orice
A=(aij), B=(bij) din Mn({0,1)}, A B=(cij), A B=(dij), unde 1 i, j n , cij=max{aij, bij} i
dij=max{min{aik, bkj}, 1 k n }. Dac A=(aij) Mn({0,1)}, se noteaz { A k = (a (ijk ) ); k 1}
secvena de matrice definit prin:
(1)
k
( k 1)
A = A, A = A A , () k 2 .
Dac A este matricea de adiacen a unui graf G=(V,E), atunci pentru fiecare k,
1 k n 1,
(k)
1, dac exist drum de lungime k de la i la j
.
a ij =
0, altfel
Bazele programrii
32
(1)
( n 1)
( 2)
Exemplu:
1
5. Pentru graful:
1
A=
1
1 1 1
1 0
0 0 0
2
0 1
, A =
0 0 1
1 1
0 1 0
1 1
1 1
1 1
1 1
3
1 0
, A =
1 1
1 1
1 1
1 1
1 1
1
1 1
1
, M=
1 1
1
1 1
1
1 1 1
1 1 1
1 1 1
1 1 1
Calculul matricei existenei drumurilor permite verificarea dac un graf dat este conex.
Un graf este conex dac i numai dac toate componentele matricei M sunt egale cu 1.
Fie G=(V,E) un graf netrivial, u,vV i un u-v drum n G. se numete proces dac
toate muchiile drumului sunt distincte. Drumul este trivial dac : u,u. Drumul este un
circuit dac este un proces netrivial nchis. Circuitul : v1,v2,.,vn,v1 cu n3 este un ciclu al
grafului dac, pentru orice i, j, cu 1 i, j n , i j , rezult vivj. Orice ciclu este un drum
elementar nchis. Graful G este aciclic dac nu exist cicluri n G.
ntr-un digraf D noiunile de proces, circuit, ciclu sunt definite ca i n cazul
grafurilor.
Exemple:
6. n graful
v1
v2
v4
v3
v5
v6
2.4.2. Arbori
n clasa grafurilor conexe, structurile cele mai simple, dar care apar cel mai frecvent n
aplicaii sunt cele arborescente. Graful G este arbore dac G este aciclic i conex. Fie G=(V,E)
graf arbore. Subgraful H=(V1,E1) al lui G este un subarbore al lui G dac H este graf arbore.
Exemple:
3
1
Graful
Bazele programrii
33
Verificarea proprietii unui graf de a fi arbore poate fi efectuat pe baza unor algoritmi
care s verifice calitile de conexitate i aciclicitate. Aceeai verificare poate fi realizat i pe
baza proprietilor care urmeaz.
Proprietatea 1: Un graf G=(V,E), cu V = n , E = m este graf arbore dac i numai dac G este
aciclic i n=m+1. Cu alte cuvinte, problema verificrii dac un graf este arbore revine la
verificarea aciclicitii grafului i a relaiei existente ntre numrul vrfurilor i numrul
muchiilor grafului.
Proprietatea 2: Un graf G=(V,E), cu V = n , E = m este graf arbore dac i numai dac G este
conex i n=m+1.
Not: Fie G=(V,E) un graf. Urmtoarele afirmaii sunt echivalente:
1. G este graf arbore
2. G este graf conex minimal (oricare ar fi eE, prin eliminarea muchiei e graful
rezultat nu este conex)
3. G este graf aciclic maximal (prin adugarea unei noi muchii n graf rezult cel
puin un ciclu).
Un graf orientat D=(V,E) cu proprietatea c pentru orice u, v V dac uvE, atunci
vu E se numete graf asimetric. Digraful D este simetric dac () u, v V, uvE, dac i numai
dac vuE.
Fie D=(V,E) digraf netrivial. Graful G=(V,E), unde E={uv | uvE sau vuE} se
numete graf suport al digrafului D.
Un arbore orientat este un arbore direcionat cu rdcin. Deoarece un arbore orientat este un caz
particular de digraf, pentru reprezentarea lui poate fi utilizat oricare din modalitile de
reprezentare a grafurilor. n plus exist i posibilitatea obinerii unor reprezentri mai eficiente
pentru acest tip de graf. Una dintre modaliti este reprezentarea FIU-FRATE, care const n
numerotarea convenional a vrfurilor grafului i n reinerea, pentru fiecare vrf i al arborelui, a
urmtoarelor informaii:
FIU(i), care reprezint numrul ataat primului descendent al vrfului i;
FRATE(i), care reprezint numrul ataat vrfului descendent al tatlui vrfului i i care
urmeaz imediat lui i;
INF(i), care reprezint informaia ataat vrfului i (de obicei valoarea i).
Pentru reprezentarea arborelui se reine rdcina i numrul nodurilor. Absena fiului,
respectiv a fratelui unui vrf este marcat printr-o valoare diferit de numerele ataate
vrfurilor (de obicei valoarea 0).
Exemplu:
Urmtorul arbore orientat este reprezentat astfel:
N=15 (numrul de noduri ale arborelui);
R=1(rdcina); FIU=(2,5,7,9,0,10,0,0,13,0,0,0,
0,0,0), fiul lui 1 este 2, iar vrful 9 are fiul
13; FRATE=(0,3,4,0,6,0,8,0,0,11,12,0,14,15, 0),
vrful 1 nu are frate, iar vrful 14 are fratele 15.
2
5
3
6
10
11 12
4
8
9
13
14 15
Bazele programrii
34
identificator nod
legtur fiu
dreapta
Datorit particularitii lor, arborii binari ofer posibilitatea aplicrii de noi metode de
parcurgere (pe lng cele aplicabile pentru arborii generali): parcurgerile n preordine (RSD),
inordine (SRD) i postordine (SDR). Regula de vizitare pentru aceste tipuri de parcurgere
revine la parcurgerea subarborilor stng i drept corespunztori vrfului curent, care la
momentul iniial este chiar rdcina arborelui. Diferena ntre aceste trei tipuri de parcurgere
este dat de momentul n care devine vizitat fiecare vrf al arborelui. n parcurgerea RSD
(rdcin-subarbore stng-subarbore drept), fiecare vrf al arborelui este vizitat n momentul
n care devine vrf curent. n parcurgerea SRD (subarbore stng-rdcin-subarbore drept),
vizitarea vrfului este efectuat dup ce a fost parcurs subarborele stng. n parcurgerea SDR
(subarbore stng-subarbore drept-rdcin) vizitarea fiecrui vrf este efectuat dup ce au
fost parcuri subarborii afereni lui.
Exemplu:
Pentru arborele de la exemplul anterior, secvenele de vrfuri rezultate prin aplicarea parcurgerilor
RSD, SRD, SDR sunt:
preordine: 1,2,4,7,5,3,6,8,9
inordine: 4,7,2,5,1,8,6,9,3
postordine: 7,4,5,2,8,9,6,3,1.
2.4.3. Liste
Lista este o structur dinamic de date format din mai multe noduri. Un nod este o
structur de date care conine dou pri distincte: o parte de informaie util (memorat n nodul
respectiv) i o parte de informaie de legtur (folosit pentru a identifica n memorie urmtorul
nod din list).
Bazele programrii
35
dn-1
d1
d2
a)
C
dn
dn-1
d2
d1
b)
Bazele programrii
36
elibernd spaiul ocupat de componentele terse. Astfel, structura i numrul de noduri ale listei
sufer o permanent schimbare.
1. Traversarea. Localizarea unui nod prin traversare este o operaie de cutare. Scopul este
de a gsi un nod care s conin n partea de informaie util anumite date. Operaia de cutare se
poate ncheia cu succes, adic cu localizarea unui astfel de nod sau fr succes, n cazul n care
lista este vid sau nu exist un nod care conine informaiile cerute.
2. Inserarea. Inserarea unui nod ntr-o list nlnuit se poate realiza cu verificarea
existenei anterioare a nodului n list, caz n care nu se mai face inserarea, sau fr nici un fel de
verificare, caz n care se procedeaz direct la inserare (se permit noduri duplicate). n ambele
cazuri inserarea se poate face n mai multe locuri: la nceputul listei, la sfritul listei, dup sau
naintea unui anumit nod identificat printr-o cheie.
Inserarea unui nod la nceputul listei. Pentru inserarea ntr-o list simetric este necesar
crearea legturilor ntre noduri n ambele sensuri. Singura diferen fa de inserarea ntr-o list
asimetric este nscrierea informaiei despre nodul precedent. Deoarece inserarea are loc la
nceputul listei, nu va exista un nod precedent, deci informaia respectiv va primi valoarea nil.
Primul nod din lista iniial va avea acum ca precedent nodul nou creat p (figura 2.9). Se observ
c ntotdeauna se modific capul listei, nodul inserat devenind noul cap al listei.
cap
2
a)
1
p
cap
b)
1
p
Bazele programrii
37
cap
a)
p
cap
b)
p
r
2
3
q
q
a)
b)
Bazele programrii
38
1
q
p
a) Liste asimetrice
2
1
b) Liste simetrice
dn
dn-1
a)
stiva
FA
citire
tergere
dn
F
d1
d2
dn-1
d2
b)
coad
SPATE
d1
inserare
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.
Bazele programrii
40
Bazele programrii
41
structuri de tip masiv (vectori, matrice, plane de matrice etc.). n cazul unor volume mai mari de
date se poate folosi i memoria extern, vzut ca o prelungire a celei interne, cu organizarea
datelor n fiiere (uzual, fiiere relative). n majoritatea cazurilor, chiar cnd datele sunt
organizate n fiiere, nu se ajunge la pstrarea lor pe perioade mari de timp, adic nu apare
necesitatea actualizrii datelor (adugri, modificri, tergeri). Singura problem n accesul la
datele organizate n fiiere o reprezint trecerea de la memorarea liniar a elementelor n fiier, la
caracterul lor de elemente ale unor masive (tablouri) cu dou sau mai multe dimensiuni.
Pe exemplul matricelor, alegnd liniarizarea pe linii (ordinea lexicografic), n cazul unei
matrice Amxn, poziia n fiierul relativ a unui element ai,j poate fi determinat printr-un calcul
simplu, folosind funcia rang r(i,j)=n(i-1)+j, i m, jn. Aceast tehnic se poate folosi la
memorarea datelor n fiier (crearea i popularea fiierului), permind chiar furnizarea
elementelor ntr-o ordine oarecare, cu condiia precizrii coordonatelor. La regsirea elementelor
masivului (consultarea fiierului), pornind de la poziia n fiier, pot fi determinate coordonatele
elementului, astfel:
- dac r modulo j = 0,
atunci i=[r/n] i j=n;
- dac r modulo j <> 0,
atunci i=[r/n]+1 i j=r modulo n.
n concluzie, la aceast clas de PPAD atenia principal se deplaseaz ctre algoritmul
de calcul, bazat, uzual, pe aproximri succesive, ce pot conduce la apariia unor tipuri specifice
de erori (erori de trunchiere i erori de rotunjire), care uneori se compenseaz, dar frecvent se
cumuleaz (se propag) pe parcursul prelucrrii, afectnd corectitudinea rezultatului final.
Datorit volumelor mari de date, la problemele din categoria b) accentul principal cade
pe organizarea i ntreinerea coleciilor de date memorate pe purttori externi. La limit, se poate
alege ntre dou soluii: organizarea datelor n fiiere (secveniale, relative sau indexate) sau
organizarea datelor n baze de date (cu structuri ierarhice, de tip reea sau relaionale).
Indiferent de nivelul de organizare ales, tehnologia de prelucrare conduce la lanuri
(sisteme) de programe, n general de dou tipuri: programe de creare i actualizare (ntreinere) a
coleciilor de date; programe de consultare (interogare), pentru satisfacerea cererilor de
informare. n algoritmi, principalele tipuri de operaii sunt cele de prelucrare a coleciilor de date
organizate pe purttori externi: citire, scriere, rescriere, tergere, precum i cele de verificare a
corectitudinii datelor (operaii de validare). Complexitatea calculelor este redus, adesea
nedepind nivelul celor patru operaii aritmetice.
n general, n rezolvarea PPAD se poate distinge ntre urmtoarele variante de soluii:
soluii proprii; utilizarea pachetelor de programe aplicative; soluii mixte. Alegerea ntre cele trei
variante depinde de mai muli factori, dintre care o importan aparte are aria (dimensiunile)
problemei: un domeniu de activitate strict delimitat (aplicaie informatic), respectiv ansamblul
activitilor unui organism economico-social (sistem informatic).
n general, soluiile proprii sunt posibile pentru orice PPAD. Din perspectiva costurilor
implicate de diversele faze ale realizrii unei soluii informatice, aceast variant este, frecvent,
cea mai neeconomic. Totui, adesea aceasta este singura variant accesibil, dup cum se poate
constata i din prezentarea urmtoarelor cazuri:
- la nivel de aplicaie informatic, atunci cnd domeniul de activitate are o serie de
particulariti care nu permit utilizarea unor eventuale pachete de programe aplicative i, evident,
cnd nu exist asemenea pachete de programe pentru domeniul respectiv;
- la nivel de sistem informatic, datorit marii diversiti a organismelor economicosociale, atunci cnd nu se poate pune problema unor soluii tip, cu posibilitatea ca unele
subsisteme (aplicaii) s fie realizate prin soluii mixte.
Utilizarea unor pachete de programe aplicative este posibil pentru activitile cu un
anumit grad de generalitate, care se regsesc n forme identice (sau cu diferene nesemnificative)
Bazele programrii
42
la mai multe organisme economico-sociale. Printre acestea pot fi menionate aplicaiile bazate pe
modele de programare liniar, gestiunea stocurilor, optimizarea transporturilor, optimizarea
croirii, gestiunea financiar-contabil etc.
Adoptarea unei asemenea soluii elimin costurile de proiectare i realizare a aplicaiilor
(sistemelor) informatice, dar poate conduce la unele necesiti de adaptare a sistemului
informaional propriu, n funcie de datele de intrare i modul de organizare a acestora, impuse
pachetelor de programe. Pe un plan mai general, n aceast categorie pot fi incluse i produse
care, fr a furniza direct soluii, simplific substanial efortul de realizare a lor, pentru domenii
specifice. De exemplu, pentru prelucrri de serii de date statistice, ca i pentru orice alte date ce
se organizeaz n tabele, pot fi utilizate produsele din categoria spread-sheet (foaie de calcul),
cum este EXCEL.
Soluiile mixte presupun ncadrarea n soluii proprii a unor pachete de programe
aplicative, destinate unora dintre aplicaiile unui sistem informatic. Aceast variant reduce, de
asemenea, costurile de realizare, dar necesit elaborarea unor interfee ntre intrrile/ieirile
pachetelor de programe i celelalte componente ale sistemului(aplicaiei) pentru care se
elaboreaz soluii proprii.
Realizarea sistemelor (aplicaiilor) informatice este un proces complex, structurat n mai
multe etape, cu obiective specifice. n modul de realizare a acestor etape, n resursele implicate i
n durata lor total vor exista o serie de diferene, impuse, pe de o parte, de varianta de soluie
aleas i, pe de alt parte, de nivelul de abordare (aplicaie, sistem informatic). Cu aceste
observaii, ntr-o abordare schematic, redus la enumerarea i prezentarea obiectivelor
principale, etapele de realizare a sistemelor informatice sunt urmtoarele:
studiul i analiza sistemului informaional actual, care are ca obiectiv principal
formularea cerinelor i a restriciilor pentru sistemul informatic (caietul de sarcini);
proiectarea de ansamblu, care presupune elaborarea modelului de ansamblu al
sistemului informatic i planificarea realizrii sale pe pri componente (subsisteme, aplicaii);
proiectarea de detaliu, care are ca obiective elaborarea modelului de detaliu al
sistemului informatic i stabilirea soluiilor tehnice de realizare (corespunztor, se face distincie
ntre proiectarea logic de detaliu i proiectarea fizic de detaliu);
elaborarea programelor, n care se realizeaz, conform prioritilor stabilite n etapa
anterioar i pe baza documentaiilor reunite n proiectul logic de detaliu i proiectul tehnic de
detaliu, programele incluse n fluxurile tehnologice specifice diverselor tipuri de prelucrri;
implementarea i exploatarea sistemului, care presupune darea n funciune a
sistemului i utilizarea curent a acestuia.
Pe baza diferenierilor evideniate, n cele ce urmeaz se abordeaz numai cazul unor
aplicaii informatice de mai mic amploare, pentru care se menine n continuare denumirea de
PPAD.
Bazele programrii
43
Bazele programrii
44
apelate, implicit sau explicit, procedurile utilizatorului sau ale sistemului, modul n care au fost
concepute operaiile de intrare/ieire sau, n general, cum au fost gestionate resursele de
intrare/ieire etc.
Dup parcurgerea acestor faze programul se testeaz n execuie, pe baza unor seturi
stabilite de date de control. n aceast faz programul se consider corect dac rezultatele
obinute sunt cele scontate (pentru datele de test, programatorii trebuie s determine dinainte
rezultatele - valorile i forma lor de prezentare). Se mai face meniunea c, ntr-un lan de
programe dintr-un sistem, trebuie testat ntreg lanul, n intercorelrile lui interne. Programele
considerate corecte se memoreaz pe medii magnetice, eventual constituite n biblioteci.
Definitivarea documentaiei programelor. Dei mai puin spectaculoas, chiar
birocratic, aceast etap este obligatorie pentru exploatarea, dezvoltarea i adaptarea
programelor, mai ales dac fac parte dintr-un sistem. Documentarea corect a programului face
posibil, de asemenea, folosirea lui de ctre ali utilizatori. S-a artat c, pe msura desfurrii
precedentelor etape, s-au realizat unele documente necesare exploatrii corecte a programelor.
Acestea se completeaz, redacteaz i ordoneaz, constituindu-se ntr-un dosar de prezentare i
exploatare, care cuprinde:
descrierea problemei (rezultate, date de intrare, procesul de prelucrare, formalizarea
matematic i modelul matematic, precizia algoritmului etc.);
descrierea resurselor necesare i a restriciilor de utilizare;
organigrama modulelor;
schemele logice structurate (sau alte forme de reprezentare a algoritmului) pentru
fiecare modul;
modul de apel al procedurilor i funciilor i structura datelor i parametrilor care se
transfer ntre apelator i apelat;instruciuni de utilizare (procedura de punere n lucru, lista i
forma ntrebrilor i rspunsurilor n conversaia cu utilizatorii, lista programelor care trebuie
executate n amonte etc.);
exemple de utilizare.
Exploatarea curent. Dup punerea la punct, programele intr n utilizare, fiind
urmrite n vederea depistrii unor erori care nu au putut fi sesizate anterior. Aceast faz asigur
meninerea n funciune i dezvoltarea programelor, proces care se poate continua pe tot parcursul
utilizrii lor.
Test de autoevaluare
Bazele programrii
45
cuvinte (dicionar) mpreun cu regulile de utilizare a lor (gramatic). Regulile de utilizare sunt
de sintax (form) i de semantic (sens).
Editare
Program surs
Compilare
Program
asamblare
Listing
surs
Program obiect
Biblioteci
utilizator
Harta alocrii
memoriei
Link-editare
Biblioteci
standard
Program obiect
executabil
Lansare
n execuie
Bazele programrii
46
executabile din biblioteca specific limbajului, invocate (apelate) implicit sau explicit de
programul surs al utilizatorului, ct i module executabile din bibliotecile realizate de utilizator.
Programul obiect executabil se lanseaz n execuie cu comenzi ale sistemului de operare.
Test de autoevaluare
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.
Bazele programrii
47
4. Caracteristicile limbajului C
Cuprins
Obiectivele unitii de nvare 4
4.1 Elementele de baz ale limbajului C
4.2 Tipurile de date n C
4.3 Expresii
4.4. Realizarea structurilor fundamentale de control
Rspunsuri i comentarii la testele de autoevaluare
Bibliografia unitii de nvare
Bazele programrii
48
Exemple:
PretUnitar, MatrUnitate, SumaElemVector,MedAritmPond.
Exemple:
for, do, if, else, char, long, float, while, return etc.
const, enum, signed, void etc. (din ANSI C);
_AL, _AX, _DX, _BX, _FLAGS (din Turbo C).
Comentariile sunt secvene de text compuse din orice caractere admise n setul
limbajului, care au format liber i care nu se compileaz. n general, comentariile sunt necesare
pentru explicaii suplimentare ale programatorului, n vederea nelegerii ulterioare a logicii sale.
Comentariile sunt delimitate de perechile de caractere /* i */ i se pot ntinde pe mai multe linii
surs.
Orice caracter aflat ntre delimitatori este ignorat de compilator. Nu se admit comentarii
imbricate (incluse unul n altul). La compilatoarele C++ a fost adugat posibilitatea de a scrie
comentarii pe o singur linie surs. nceputul unui astfel de comentariu este marcat de perechea //
iar sfritul su este marcat de sfritul liniei (nu exist marcator special). Orice caracter aflat
dup // este ignorat, pn la trecerea pe o nou linie surs.
Instruciunile sunt construcii sintactice ale limbajului, terminate de caracterul ;
(punct i virgul). Ele indic operaiile (aciunile) care se aplic datelor n vederea obinerii
rezultatelor scontate prin algoritm. Instruciunile pot fi clasificate n: simple, structurate,
compuse.
Funciile sunt entiti (subprograme) care pot fi proiectate i realizate independent,
dar care nu se execut dect mpreun cu o alt entitate de program, numit apelatoare. Conceptul
a fost definit de realizatorii limbajului Fortran i s-a impus n practica programrii din
Bazele programrii
49
urmtoarele motive: evitarea scrierii repetate n program a unor secvene de instruciuni aplicate
de mai multe ori pe seturi diferite de date; creterea eficienei activitii de programare prin
crearea unor biblioteci de subprograme des utilizate, care pentru fiecare din aplicaiile concrete
doar se apeleaz, fr s fie proiectate i realizate de fiecare dat; necesitatea modularizrii
problemelor cu grad nalt de complexitate.
Funcia are un nume i un tip. Ea se definete printr-un antet i un corp (bloc) astfel:
antet
{
corp
}
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)
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.
sau
#includespecificator_de_fisier
Prima form caut fiierul specificat ntre fiierele standard ale limbajului, folosindu-se
calea descris n mediul de programare. A doua form caut fiierul specificat n calea curent (de
obicei este folosit pentru a include fiiere scrise de utilizator). Dac fiierul cutat nu este gsit se
produce o eroare de compilare. Dac fiierul este gsit, coninutul lui este inserat n program, n
locul directivei care l-a invocat, aceasta fiind tears (la limit poate fi considerat o substituire de
text).
Pentru ca textul inclus s fie vizibil din tot programul, se recomand ca directivele #include
s fie scrise la nceputul programului. Un text inclus poate s conin la rndul lui directive care
determin noi includeri de text. Textul inclus va fi compilat ca parte component a programului.
Pentru a putea utiliza funciile care realizeaz operaiile de intrare/ieire trebuie inclus
fiierul stdio.h.
Exemplu: #include<stdio.h>
Directiva #define este folosit pentru a substitui unele secvene de caractere cu altele i
are forma general:
#define sir1 sir2
Bazele programrii
51
unde att sir1 ct i sir2 sunt iruri de caractere. La preprocesare, se terge directiva din program
i se nlocuiete secvena de caractere sir1 cu secvena de caractere sir2 peste tot unde apare n
programul surs. Secvena sir1 este denumit nume iar sir2 este denumit descriere. Nu se face
nlocuirea dac sir1 apare n interiorul unui literal de tip ir de caractere sau n interiorul unui
comentariu. sir2 poate s fie descris pe mai multe rnduri, dac la sfritul fiecrui rnd (n afar
de ultimul) se scrie caracterul \ (backslash). Rolul acestuia va fi discutat n alt capitol. sir2 poate
s conin iruri de caractere pentru care au fost definite anterior. Acestea vor fi substituite
conform definiiilor lor.
Substituirea poate fi dezactivat din punctul n care apare directiva #undef pn la
sfritul programului sau pn la redefinirea lui sir1. Directiva are forma general:
#undef sir1
ntre cele mai frecvente utilizri ale directivei #define sunt definirea de constante
simbolice (literali crora li se asociaz identificatori) i definirea de macrodefiniii (necesare
simplificrii scrierii).
Din punct de vedere al textului surs, un macro se folosete la fel ca orice funcie: se
apeleaz prin numele simbolic urmat de lista parametrilor reali. Din punct de vedere al compilrii
exist o diferen fundamental: macro-urile sunt tratate la preprocesare. Preprocesorul terge
din textul surs apelul macro-ului i l nlocuiete chiar cu secvena de definire. Parametrii
formali ai macro-ului sunt nlocuii cu parametrii reali, prin substituire de text (corespondena se
face conform regulilor de punere n coresponden a parametrilor reali cu cei formali: unu-la-unu,
de la stnga la dreapta).
Test de autoevaluare
1. Specificai cum va arta secvena de cod urmtoare, dup preprocesare:
#define N 10
#define M 10
#define MAX (M+N)
#define DIM(a,b) (a)*(b)
char v[N],v1[10+DIM(5+M,6)];
char v1[10*MAX];
char m[M][N];
Dup numrul de
valori memorate
Statice
Simple
Tipuri existente
ntregi
Reale
Caracter
Bazele programrii
52
Structurate
Dinamice
Simple
Masiv
Articol
Fiier
Pointer
Referin
unsigned char
Lungime
(octe
i)
1
[signed] char
unsigned [int]
[signed] [int]
unsigned long
[signed] long
[int]
2
2
4
0..255 (0..28-1)
-128..127 (-27..271)
0..65535
-32768..32767
0..232-1
-231..231-1
Grup
a de
dat
ntreg
Real
Tipul
float
double
long double
10
Domeniu de
valori
3.4*10..3.4*1038
1.7*10-308..
1.7*10308
3.4*104932
..3.4*104932
38
Mod de reprezentare
Codul ASCII al caracterului.
Poate fi prelucrat ca un caracter
sau ca un ntreg cu/fr semn.
Virgul fix aritmetic
Virgul fix algebric
Virgul fix aritmetic
Virgul fix algebric
Virgul mobil simpl precizie
Virgul mobil dubl precizie
Virgul mobil extra precizie
Variabilele
Datele variabile i modific valoarea pe parcursul execuiei programului. De aceea, ele se
asociaz unor zone de memorie. Identificatorii acestora se declar i apoi se refer n operaii.
Operaiile afecteaz coninutul zonelor de memorie, care este interpretat ca fiind de un anumit tip.
Declararea variabilelor se realizeaz prin list de identificatori (separai prin virgul) pentru care
se specific tipul.
tip lista_variabile;
Exemple:
unsigned x,y,z;
Bazele programrii
53
float a,b,c;
char k;
Exemple:
int dim_vector=100;
dim_vector=50; /*nu este eroare*/
Definirea de noi tipuri de date. Utilizatorul poate defini noi tipuri de date sau poate
atribui un alt nume unui tip predefinit sau definit anterior. n acest scop se folosete cuvntul
rezervat typedef, astfel:
typedef descriere_tip nume_utilizator;
Exemple:
typedef int INTREG;
typedef float REAL;
Particularitile unor tipuri simple de date. Tipul caracter memoreaz caractere ale
codului ASCII, reprezentate pe un octet. Variabilele de tip caracter pot fi utilizate i ca valori
numerice (modul de utilizare se alege automat, n funcie de expresia din care face parte
operandul respectiv).
Valoarea numeric folosit depinde de modul de declarare a caracterului: cu sau fr
semn. Pentru caracterele cu coduri mai mici dect 128 nu se sesizeaz nici o diferen (se obine
aceeai valoare i pentru interpretarea ca virgul fix aritmetic i pentru interpretarea ca virgul
fix algebric). Pentru caracterele cu coduri mai mari de 127, valoarea obinut este diferit.
Exemple:
Declararea i utilizarea variabilelor de tip caracter.
unsigned char a,b;
a=100;/* corect */
b=Q;/* corect */
b=81; /* corect, echivalent cu precedentul */
4.2.2. Constantele
Datele constante sunt predefinite la momentul scrierii programului iar valoarea lor este
generat la momentul compilrii. Datele constante pot fi literali (constante propriu-zise), care se
autoidentific prin valoare, sau constante simbolice, care sunt identificatori (denumiri) asociai
altor constante (literali sau constante simbolice definite anterior). n C literalii sunt ntregi, reali,
caracter i ir de caractere.
Literalii ntregi sunt reprezentai intern n virgul fix. Ei pot fi exprimai n bazele de
numeraie 10 (forma implicit), 8 (folosind prefixul 0 zero) sau 16 (folosind prefixul 0x sau
0X). n funcie de mrimea lor, se asociaz implicit un tip ntreg (i implicit un mod de
reprezentare). Se ncearc ntotdeauna nti reprezentarea pe 16 bii, conform tipului int; dac nu
este posibil, atunci se folosete reprezentarea pe 32 de bii, conform tipului long.
Dac se dorete forarea reprezentrii pe 32 de bii (pentru o valoare din domeniul tipului
int), se adaug sufixul l sau L. Pentru a fora tipul fr semn (unsigned int sau unsigned long) se
folosete sufixul u sau U. Cele dou sufixe se pot folosi mpreun, n orice ordine.
Bazele programrii
54
Literalii reali sunt reprezentai intern n virgul mobil. Ei se pot exprima sub form
matematic (ntreg.fracie) sau tiinific (ntreg.fracieEexponent). Semnul + poate lipsi
(este implicit), iar e este echivalent, ca valoare, cu E. Din exprimare poate s lipseasc fie partea
fracionar, fie partea ntreag, fie partea ntreag i exponentul (inclusiv litera e).
Literalii reali se reprezint intern pe 64 de bii (tipul double). Pentru a fora reprezentarea
n simple precizie (tipul float) se adaug sufixul f sau F. Pentru a fora reprezentarea pe 80 de bii
(tipul long double) se folosete sufixul l sau L. Cele dou sufixe nu se pot folosi mpreun.
Literalii caracter se reprezint intern prin codul ASCII al caracterului respectiv, pe
un octet. Exprimarea extern depinde de caracterul respectiv. Literalii de tip caracter pot
participa n expresii cu valoarea lor numeric, aa cum s-a artat anterior.
Exprimarea extern a unui caracter direct imprimabil (existent pe tastatur, cu coduri
ASCII cuprinse ntre 32 i 127) se face prin caracterul respectiv inclus ntre apostrofuri. Excepie
fac caracterele cu semnificaie special n C: (apostrof), " (ghilimele) i \ (backslash), care se
exprim printr-o succesiune de dou caractere, fiind precedate de caracterul \.
Exemple: literalul
"Acesta este un literal \"sir de caractere\" \
scris pe doua randuri."
reprezint irul Acesta este un literal "sir de caractere" scris pe doua randuri.
Bazele programrii
55
""
""
Exemple:
#define pi 3.141592653589
#define raspuns "D"
Exemplu:
const int dim_vector=10;
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 */
Bazele programrii
56
{{lista_const1}{lista_const2}{lista_constn}};
Exemple:
int b[10]={2,3,0,5,6,7,3,6,8,5};
/* vectorul contine valorile 2 3 0 5 6 7 3 6 8 5*/
float a[5][3]={{1,2,3},{1,2,3},{1,2,3}};
/* matricea contine valorile 1 2 3 1 2 3 1 2 3 0 0 0 0 0 0*/
Masivul poate fi referit global prin numele su. Elementele unui masiv se refer direct,
prin numele masivului urmat de indicele (indicii) corespunztori. Indicii sunt expresii incluse ntre
paranteze drepte (se mai numesc i variabile indexate): [indice]. Pentru fiecare dimensiune a
masivului trebuie s existe cte o referire de indice. Indicele de pe fiecare dimensiune are valoarea
minim 0 i valoarea maxim egal cu dimensiunea din declarare minus o unitate. Compilatorul
nu verific corectitudinea indicilor (n sensul de depire a dimensiunilor masivului la referirea
elementelor).
Tipul articol
Articolul este o structur de date eterogen, cu acces direct la elementele sale, ntre care
exist o relaie de ordine ierarhic. Articolul poate fi reprezentat sub form de arbore, ale crui
noduri sunt asociate componentelor structurii. Componentele de pe ultimul nivel sunt scalare i se
numesc date elementare sau cmpuri. Datele de pe celelalte niveluri, denumite date de grup, se
constituie prin agregarea datelor de pe nivelurile inferioare. Data de grup de cel mai nalt nivel
(rdcina arborelui) corespunde articolului n ansamblu. Conceptual, datele de grup de pe diverse
niveluri au aceleai proprieti ca i articolul, ceea ce permite ca aceast structur s fie construit
recursiv, prin descompunerea n structuri cu aceleai proprieti (figura 4.1).
Declararea mpreun a tipului articol i a variabilelor de acest tip se realizeaz conform
sintaxei:
struct tip_articol{lista_campuri} var1,var2,,varn;
unde tip_articol este identificatorul asociat tipului articol, iar var1, var2,, varn sunt
identificatorii asociai variabilelor de tipul articol declarat.
Parametrii declaraiei pot lipsi (dar nu toi deodat). Dac lipsesc parametrii var1,
var2,, varn, atunci tip_articol trebuie s fie prezent, fiind numai o declarare explicit de tip
nou, utilizabil ulterior la alte declarri. Dac lipsete tip_articol, atunci trebuie s fie prezent
lista de variabile (nevid), caz n care este vorba de o declarare de variabile de tip articol, fr
ns a declara i un tip utilizator nou. n continuare, tip_articol este un tip nou de date, iar var1,
var2,, varn sunt variabile de tipul tip_articol. Variabilele pot fi declarate i ca masive, ale cror
elemente sunt de tip articol: var1[dim1][dim2][dimn].
Bazele programrii
57
DATA
ZI
LUNA
AN
date elementare
a)
dat de grup (articol)
PERSOANA
ADRESA
DATA NATERII
date elementare
ZI
LUNA
AN
b)
Descrierea constituie o definire implicit de un nou tip de dat. Este posibil definirea
explicit a unui nou tip de dat, adugnd cuvntul rezervat typedef n faa declarrii (n acest caz
nu mai pot fi declarate simultan i variabile).
Lista_campuri este o niruire de declaraii de cmpuri separate prin punct i virgul,
asemntoare declaraiilor de variabile, de forma tip_camp nume_camp. Cmpurile unei structuri
pot fi variabile simple, masive sau alte articole. Lista cmpurilor nu poate fi vid.
Exemplu: pentru exemplele din figura 6.1, declararea poate fi realizat prin definire recursiv,
astfel:
struct tip_data {
unsigned zi;
char luna[3];
int an; };
struct persoana {
char nume[30];
char adresa[50];
struct tip_data data_nasterii;
} angajat;
Dac nu ar fi existat declaraia tipului articol tip_data, atunci tipul persoana putea fi scris astfel:
struct persoana {
char nume[30];
char adresa[50];
struct {
unsigned zi;
char luna[3];
int an;
} data_nasterii;
} angajat;
Exemplu:
Bazele programrii
58
Considernd declaraiile anterioare, expresia sizeof(data_nasterii) are valoarea 8, iar sizeof(angajat) are valoarea
90.
Datele de tip articol pot fi referite n dou moduri: global sau pe componente. Referirea
global este permis numai n operaia de atribuire, cu condiia ca ambele variabile (surs i
destinaie) s fie articole de acelai tip.
Referirea pe componente (prin numele lor) este o reflectare a faptului c articolul este o
structur cu acces direct. Referirea unor componente de tip articol din structura altui articol este
posibil numai n operaia de atribuire, n condiiile precizate anterior la referirea global. n cele
ce urmeaz se are n vedere numai referirea componentelor de tip dat elementar, situate pe
ultimul nivel al structurii.
Referirea cmpurilor unei structuri se face prin calificare, folosind operatorul . (punct). n
referirea prin calificare, asigurarea identificrii unice a cmpurilor se realizeaz prin asocierea
numelui acestora cu numele articolului care le conine. Construcia rmne la aceast form n
cazul n care structura are numai dou niveluri: articolul i cmpurile elementare ale acestuia.
n articolele cu structur recursiv se realizeaz calificarea progresiv cu articolele de pe
nivelurile superioare, primul calificator fiind numele articolului rdcin. n lanul de calificri,
numele articolului rdcin este nume de variabil, celelalte fiind nume de cmpuri ale
articolului. Dac anumite componente sunt structuri de date de alte tipuri (de exemplu masive sau
iruri de caractere), n referirea elementelor lor se aplic, pe lng calificare, regulile specifice
acestor structuri.
Exemplu:
Referirea prin calificare a cmpurilor articolului angajat de tipul persoana (vezi exemplele anterioare) se
realizeaz astfel:
angajat.nume;
angajat.adresa;
angajat.data_nasterii.zi;
angajat.data_nasterii.luna;
angajat.data_nasterii.an
n aceste referiri, angajat este identificatorul variabilei articol, celelalte elemente sunt identificatori de
cmpuri. Construciile angajat.nume i angajat.adresa corespund referirii globale a cmpurilor respective, care
sunt iruri de caractere. Pentru a referi, de exemplu, primul caracter din ir, se scrie: angajat.nume[0].
Exemplu:
#include <stdio.h>
void main()
{
struct persoana {
char nume[40];
char adresa[30];
struct {
int zi, luna, an;} datan;
};
//Initializarea articolului din exemplul 1:
struct persoana p={"Popescu Ion", "Bucuresti, Magheru 14", 2, 4, 1960};
//sau cu evidentierea structurii data nasterii:
struct persoana p1={"Popescu Ion", "Bucuresti, Magheru 14", {2, 4, 1960}};
printf("\n%i",p1.datan.an);
Bazele programrii
59
programului, n zona de memorie rezervat articolului nu este memorat dect unul dintre
cmpurile acestuia.
Declararea tipului reuniune se realizeaz astfel:
union nume_tip { tip_camp1 camp1;
tip_camp2 camp2;
................
tip_campn campn;};
Exemplu:
1. char s[10]="Limbajul C";
0
L
1
i
2
m
3
b
4
a
5
j
6
u
7
l
9
C
10
0x00
Pentru prelucrarea irurilor de caractere, limbajul C pune la dispoziia utilizatorului o serie de funcii
specifice, definite n biblioteca standard string.h. Limbajul C dispune i de alte funcii care lucreaz cu iruri
de caractere (funcii de conversie), definite n biblioteca standard stdlib.h: atof (care necesit i includerea
bibliotecii standard math.h), atoi, atol, itoa, ltoa. De asemenea, n biblioteca stdio.h exist definite funcii de
intrare/ieire pentru irurile de caractere.
Teste de autoevaluare
Bazele programrii
60
Vnzri lunare
Luna 1
Luna 2
Luna 12
ntreg
real
real
real
2
4
4
4
nume
char[40]
z
i
l
u
n
a
an de
studiu
a
n
int
zi
id
bursa
valoare
loc de
munc
char
float
char[30]
data
angajrii
z
i
l
u
n
a
n
Specificai cum se realizeaz declararea i iniializarea cmpurilor unui student la zi pentru structura
articolului prezentat.
4.3 Expresii
Asupra datelor pot fi aplicai operatori din diverse clase, rezultnd construcii sintactice
numite expresii. n forma lor cea mai general, expresiile sunt alctuite din operanzi i operatori.
Evaluarea expresiilor produce ca rezultat o valoare de un anumit tip. n metalimbajul BNF expresia
poate fi definit astfel:
<expresie>::=<operand>|<operator_unar><expresie>|
<expresie><operator_binar><expresie>
Prima variant din definiie corespunde celei mai simple forme de expresie, redus la o
variabil sau o constant de un anumit tip. A doua i a treia variant, prin aplicare repetat, conduc
la recursivitate n construirea expresiilor, proces evideniat n exemplul urmtor:
a + ({
b ) {c + 15
{
{
expresie expresie expresie expresie
14243
expresie
14
4
42444
3
expresie
1444424444
3
expresie
Ordinea de aplicare a operatorilor din expresii poate fi, total sau parial, impus prin
folosirea parantezelor. Acestea sunt evaluate cu prioritate, iar dac sunt mai multe niveluri de
paranteze, evaluarea se realizeaz din interior spre exterior. n absena parantezelor, respectiv n
interiorul acestora, evaluarea se realizeaz n funcie de ordinul de preceden a operatorilor.
Bazele programrii
61
Bazele programrii
62
unde v este o variabil simpl, un element de masiv, un cmp al unui articol sau o expresie n
urma evalurii creia se obine o adres. Entitatea care se poate afla n stnga operatorului de
atribuire se numete left value.
Pentru a se putea efectua atribuirea, tipul expresiei i tipul entitii din stnga operatorului
de atribuire trebuie s fie compatibile. Dac sunt incompatibile se produce eroare la compilare
(deoarece compilatorul nu poate insera n codul obiect apelurile pentru operaiile de conversie).
Efectele atribuirii constau n:
evaluarea expresiei din dreapta operatorului de atribuire, cu determinarea unei valori i
a unui tip;
memorarea valorii expresiei din dreapta n variabila din stnga;
ntreaga expresie de atribuire are valoarea i tipul variabilei din stnga.
n practica programrii, se utilizeaz frecvent expresiile de forma v = v op (expresie)
(de exemplu a=a+b-c). Se observ redundana de exprimare prn specificarea variabilei v att n
membrul stng ct i n cel drept. Pentru eliminarea acestei redundane, s-au introdus operatorii
combinai, cu forma general
op=
unde op este un operator binar, aritmetic sau logic pe bii (/, %, *, -, +, <<, >>, &, ^, |). O expresie de
forma
v op= expresie
este echivalent cu
v = v op (expresie)
Exemple:
Expresia a=a+b-c este echivalent cu a+=b-c.
Expresia i*=5 este echivalent i=i*5.
Semnificaie operaie
Schimbare semn
Pstrare semn (nici un efect, nu este
folosit)
Decrementare (post sau pre)
Incrementare (post sau pre)
Adunare
Scdere
nmulire
mprire
mprire ntreag (ctul)
Operator
+
-++
+
*
/
/
Bazele programrii
63
Observaie: Cu excepia operatorului %, care admite numai operanzi ntregi, ceilali admit toate
tipurile numerice.
Operatorii ++ i -- au efect diferit, depinznd de poziia fa de operand, astfel:
a. dac apar naintea operandului, valoarea acestuia este modificat nainte de a fi utilizat la
evaluarea expresiei din care face parte: ++var (preincrementare) sau --var (predecrementare);
b. dac apar dup operand, valoarea acestuia este folosit la evaluarea expresiei din care face
parte, apoi este modificat: var++ (postincrementare) sau var-- (postdecrementare).
Incrementare/decrementarea au ca efect modificarea valorii operandului cu o unitate.
Semnificaia unei uniti depinde de tipul operandului asupra cruia se aplic. Pentru operanzi
numerici, o unitate nseamn unu.
Operatorul % are ca rol obinerea restului unei mpriri ntregi. Operatorul / are efect
diferit, n funcie de tipul operanzilor:
a. dac cel puin un operand este de tip real, se execut mprire real;
b. dac ambii operanzi sunt ntregi, se execut mprire ntreag i se obine ctul.
Calculul ctului i restului unei mpriri ntregi se poate realiza i prin intermediul
funciei div. Rezultatul funciei are tipul div_t, definit n biblioteca stdlib.h astfel:
typedef struct {long int quot; //ct
long int rem; //rest
} div_t;
Exemplu:
Determinarea ctului (cat) i restului (rest) mpririi numrului m la numrul n se realizeaz astfel:
div_t x;
int m,n,cat,rest;
x=div(m,n);
cat=x.quot;
rest=x.rem;
Operatorii logici sunt prezentai n tabelul 4.4. (n ordinea prioritii) iar operatorii relaionali n
tabelul 4.5.
Bazele programrii
64
La evaluarea expresiilor logice se aplic principiul evalurii pariale: dac expresia este de
tip aditiv (operanzi legai prin operatorul sau), n momentul n care s-a stabilit c un operand are
valoarea adevrat toat expresia va fi adevrat i nu se mai evalueaz restul operanzilor.
Asemntor, pentru o expresie multiplicativ (operanzi legai prin operatorul i), dac un operand
are valoarea fals, expresia are valoarea fals i nu se mai evalueaz restul operanzilor.
Operaia sau exclusiv ntre doi operanzi a i b se efectueaz cu expresia !a&&b||!b&&a,
conform tabelului urmtor:
a
!a
!b
!a&&b
!b&&a
!a&&b||!b&&a
0
0
0
0
0
0
1
0
0
1
0
1
0
0
0
0
0
1
0
0
1
Operatorii relaionali sunt prezentai n tabelul 4.5. Operatorii relaionali au acelai nivel de
prioritate.
Rezultatul unei operaii relaionale este de tip int, conform conveniei: pentru adevrat valoarea 1,
iar pentru fals valoarea 0.
Pentru a nu se grei la evaluarea unor expresii complexe, este indicat s se fac raionamentul
bazat pe logica boolean (cu valori de adevrat i fals).
Tabelul 4.5. Operatorii relaionali
Semnificaie operaie
Operator
Mai mare
>
Mai mare sau egal
>=
Mai mic
<
Mai mic sau egal
<=
Egal
==
Diferit
!=
Bazele programrii
65
Operanzii pot fi de orice tip ntreg. Dac este nevoie, operanzii sunt extini la reprezentare pe 16
bii. Execuia are loc bit cu bit. Pentru o pereche de bii (x,y), valorile posibile rezultate n urma
aplicrii operatorilor logici la nivel de bit sunt prezentate n tabelul 4.7.
Tabelul 4.7 Rezultatele operaiilor logice pe bii
x
y
x&y
x|y
x^y
~x
0
0
0
0
0
1
0
1
0
1
1
1
1
0
0
1
1
0
1
1
1
1
0
0
Tot n categoria operaiilor la nivel de bit se ncadreaz i deplasrile binare la stnga sau
la dreapta a coninutului unei variabile ntregi:
operand<<numr_poziii i operand>>numr_poziii
Exemplu:
1. Urmtoarea secven afieaz, n ordine invers, biii unui octet (dat de tip char).
char c;
scanf("%d",&c);
for(int i=0;i<8;i++,c=c>>1)
printf("%d",c&1);
Exemple:
int a=10, b=3, c, d;
d=(c=a+b, b+=c, a/2);
Valorile variabilelor dup evaluarea expresiei sunt: a=10, c=13, b=16, d=5 (ctul mpririi lui 10 la 2).
Se observ c operatorul nu are un simbol explicit. El este format din numele unui tip de
dat inclus ntre paranteze. Construcia este numit expresie cast (conversia explicit se numete
typecast). Trebuie reinut c nu se schimb efectiv tipul operandului, doar se folosete n expresie
valoarea operandului convertit la un alt tip. Operaia de conversie de tip nu are efect permanent.
Exemplu:
int a=7;
float b=(float)a;
Bazele programrii
66
Dup execuia secvenei, a are valoarea 7 (nu 7.0) nefiind afectat n nici un fel de operaia de conversie
de tip, iar b are valoarea 7.0 (obinut prin conversia valorii lui a ctre tipul float).
unde expresie_1, expresie_2 i expresie_3 sunt expresii. Operatorul condiional are simbolul ?:.
Cele dou caractere care compun simbolul apar intercalate ntre cei trei operanzi, conform formei
generale. Construcia se numete expresie condiional. Valoarea i tipul acestei expresii sunt
identice cu cele ale expresie_2 (dac expresie_1 este adevrat) sau cu cele ale expresie_3 (dac
expresie_1 este fals).
Bazele programrii
67
Asociativitate
() [] . ->
de la stnga la dreapta
+-&*
(unari) ++ -(tip) sizeof !
~
de la dreapta la stnga
Grad de
prioritate
maxim
* (binar) / %
+ - (binari)
<< >>
< <= > >=
== !=
& (binar)
de la stnga la dreapta
^
|
&&
||
?:
= <<= >>=
+= -= *= /=
%= &= ^= |=
,
de la dreapta la stnga
de la stnga la dreapta
Teste de autoevaluare
minim
Bazele programrii
68
instruciune vid
instruciuni vide
if (c==1) ; else ;
{;}
instruciune vid
Instruciunea de tip expresie evalueaz o expresie care, n cele mai dese cazuri, este de atribuire
sau de apel al unei funcii (vezi i capitolul Operatori i expresii). Instruciunea de tip expresie se
obine scriind terminatorul de instruciune dup o expresie (acolo unde este legal s apar o
instruciune n program). Forma general este:
expresie;
Bazele programrii
69
fals
Instruciune 2
condiie
adevrat
Instruciune 1
Exemple:
1)
if(a>b) a=c;
else a=b;
2. Rezolvarea ecuaiei de gradul I, ax+b=0:
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;
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;
selector
selector = v1
selector = v2
instruciune 1
instruciune 2
selector = vn
instruciune n
altfel
instruciune
Instruciunea while se execut astfel: se evalueaz expresia i dac este diferit de zero
(adevrat) se execut instruciunea (simpl, compus sau structurat), apoi se reia procesul pn
cnd la evaluarea expresiei se obine valoarea zero. n acest moment se ncheie execuia
instruciunii while. Pentru a asigura ieirea din ciclu, instruciunea trebuie s modifice valoarea
expresiei.
Dac la prima evaluare a expresiei se obine valoarea zero, atunci nu se execut nimic.
Instruciunea while implementeaz natural structura corespunztoare din teoria programrii
structurate. Mecanismul de execuie este redat n figura 4.4.
Bazele programrii
71
expresie
=0
(fals)
0 (adevrat)
instruciune
2. i=0;
while (i<n)
{printf("\n %4.2f",v[i]);
i=i+1;}
while (expresie);
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
expresie 2
=0 (fals)
0 (adevrat)
instruciune
expresie 3
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]);}
}
Bazele programrii
73
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 ....
Bazele programrii
74
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-5916
2. I. Gh. Roca, B. Ghilic-Micu, C. Cocianu, M. Stoica, C. Uscatu, Programarea calculatoarelor. tiina
nvrii unui limbaj de programare, Teorie i aplicaii, Ed. ASE, 2003
3. Ion Smeureanu, Marian Drdal, Programarea n limbajul C/C++, Ed. CISON, Bucureti 2004, ISBN
973-99725-7-8
4. Roca Gh. I., Ghilic-Micu B., Stoica M., Cocianu C., Uscatu C., Programarea calculatoarelor.
tiina nvrii unui limbaj de programare. Teorie i aplicaii, Ed. ASE, Bucureti 2003, ISBN
973-594-243-7