Sunteți pe pagina 1din 70

www.cartiaz.

ro Carti si articole online gratuite de la A la Z

LIMBAJE DE PROGRAMARE
CAPITOLUL 1.
ELEMENTE DE LOGIC MATEMATIC I ALGEBR BOOLEAN
1.1. Calculul propoziiilor
1.1.1. Noiunea de propoziie
DEFINIIA 1.1. Se numete propoziie un enun (un ansamblu de cuvinte
crora li s-a dat un sens) despre care se tie c este sau adevrat sau fals,
ns nu simultan i una i alta.
Exemple de propoziii:
1) n orice triunghi suma unghiurilor sale este egal cu 180o;
2) 3+2=5;
3) 2>5;
4) Balena este un mamifer.
5) Planeta Saturn este satelit al Pamntului.
Propoziiile 1), 2) i 4) sunt adevrate dar 3) i 5) sunt false.
O clas foarte larg de propoziii adevrate o constituie teoremele din
matematic.
Contraexemple (enunuri care nu sunt considerate propoziii):
1) x+2=5; (enunurile cu variabile sunt predicate)
2) Deschide ua !; (enun imperativ)
3) Numrul x divide numrul y; (predicat)
4) Atomul de aur este galben. (enun absurd)
1.1.2. Valoare de adevr
Notm cu P2 mulimea propoziiilor definite dup definiia 1.1.
DEFINIIA 1.2. Funcia v : P2 {0,1} se numete funcia valoare de adevr.
Fiecrei propoziii din mulimea propoziiilor P2 i se ataeaz valoarea 1 dac
propoziia este adevrat, i valoarea 0 dac este fals.
De obicei se vor nota propoziiile prin litere mici: p,q,r ... i cu v(p), v(q),
1

www.cartiaz.ro Carti si articole online gratuite de la A la Z

v(r)... valorile lor de adevr.

1.1.3. Operatori (operaii cu propoziii)


Cu ajutorul operatorilor definii n continuare se pot construi propoziii
compuse.
Negarea propoziiilor. Negarea propoziiei este propoziia "non p", care se
noteaz !p i care este adevrat cnd p este fals i fals cnd p este
adevrat.
Valoarea de adevr a propoziiei !p este dat n tabela urmtoare:
v(p)
1
0

v(!p)
0
1

Conjucia propoziiilor. Conjucia propoziiilor p,q este propoziia care se


citete "p i q", notat cu
pq, care este adevrat atunci i numai atunci cnd fiecare din propoziiile p,
q este adevrat.
Valoarea de adevr a propoziiei pq este dat n tabela urmtoare:
v(p) v(q) v(pq)
0
0
1
1

0
1
0
1

0
0
0
1

Disjuncia propoziiilor. Disjuncia propoziiilor p, q este propoziia care se


citete "p sau q" (notat pVq) i care este adevrat, atunci i numai atunci
cnd este adevrat cel puin una dintre propoziiile p, q.
2

www.cartiaz.ro Carti si articole online gratuite de la A la Z

Valoarea de adevr a propoziiei pVq este dat n tabela urmtoare:


v(p) v(q) v(pq)
0
0
0
1
0
Implicaia propoziiilor. S 1considerm
1
1

0
1
1
propoziia
compus (p)Vq a crei
1

valoare de adevr rezult din tabela urmatoare

v(p) v(q) v(!p) v((!p) q)


0
0
1
1

0
1
0
1

1
1
0
0

1
1
0
1

Propoziia (!p)Vq se noteaz p q i se numete implicaia


propoziiilor p,q (n acest ordine); p este ipoteza iar q este concluzia.
Observm c (!p)Vq este fals atunci i numai atunci cnd p este
adevrat i q fals, n celelalte cazuri fiind adevrat.
Echivalena propoziiilor. Cu propoziiile p, q putem forma propoziia
compus (pq) (qp) care se noteaz p i se citete "p dac i numai
dac q". Din tabela urmtoare se vede c propoziia p q este adevrat
atunci i numai atunci cnd p i q sunt n acelai timp adevrate sau false.

v(p)
0
0
1
1

v(q) v(pq)
0
1
0
1

v(qp) v(pq)

1
1
0
1

1
0
1
1

1
0
0
1

Formule echivalente n calculul propoziional


3

www.cartiaz.ro Carti si articole online gratuite de la A la Z

Cu operaiile anterioare se pot construi diverse expresii numite formule


ale calculului propoziional (notate cu a,b...).
O formul a(p,q,r, ...) care are valoarea o propoziie adevrat indiferent
cum sunt propoziiile p, q, r, ... se numete formul identic adevrat sau
tautologie.

Proprieti:
1) pV(qr) (pVq) (pVq)
2) p (qVr) (pq)V(pr)
3) p !(!p)
4) ! (pVq) !p !q
5) ! (pq) !p V !q
6) p q !p !q
7) pVq
qVp
8) pq
qp

distributivitai
negarea negaiei
legile lui De Morgan
principiul reducerii la absurd
comutativiti

1.2. Elemente de algebr boolean


Elementele pe care le vom prezenta n cele ce urmeaz sunt strict
necesare pentru a putea explica, n capitolele urmtoare, principiile funcionrii
calculatoarelor. Ne vom mrgini doar la prezentarea elementelelor de strict
necesitate, fr a intra n detalii referitoare la calculul propoziiilor, formele
normale etc.
1.2.1. Mulimea B2, operaii
Unul dintre capitolele importante ale logicii matematice este calculul
propoziiilor, avnd ca principale operaii negarea propoziiilor, conjuncia
propoziiilor i disjuncia propoziiilor. Valoarea de adevr a unei propoziii este
notat cu "1", iar valoarea de fals cu "0", simbolurile "1" i "0" fiind aici
simboluri fr neles numeric.
Mulimea format din elementele 0 i 1, cu operaiile + i definite n
clasa de resturi modulo 2, formeaz un inel.
Dup cum se va vedea, mulimea format din elementele 0 i 1 are
extrem de multe aplicaii n informatic.
4

www.cartiaz.ro Carti si articole online gratuite de la A la Z

Fie mulimea B2 = {0,1}. Peste aceast mulime se definesc mai multe


operaii.
DEFINIIA 1.3. Operaia binar notat , definit prin tabelul 1.1. se numete
disjuncie

0
1

0
1

1
1

Tabelul 1.1. Definirea operaiei


DEFINIIA 1.4. Operaia binar notat sau , definit prin tabelul 3.2. se
numete conjuncie.

0
1

0
0

0
1

Tabelul 1.2. Definirea operaiei


DEFINIIA 1.5. Operaia unar notat ! definit prin tabelul 3.3. se numete
negaie.
x

!x

0
1

1
0

Tabelul 1.3. Operaia !


n ordinea prioritilor, aceste operaii se succed astfel: !, , (negaia,
conjuncia, disjuncia).
n continuare vor fi prezentate principalele proprieti ale acestor operaii.
Ele pot fi demonstrate uor, folosindu-se tabelele de adevr.
TEOREMA 3.1. Urmtoarele 10 grupuri de proprieti sunt adevrate:
5

www.cartiaz.ro Carti si articole online gratuite de la A la Z

1. a (b c) = (a b) c
2. a (bc) = a ba c
3. a a = a
4. a b = b a
5. a (ab) = a
6. ! ! a = a
7. ! (a b) = !a !b
8. a 0 = 0
9. a 1 = a
10. a !a = 0

a(bc) = (ab)c
abc = (ab)(ac)
aa = a
ab = ba
aa b = a
! (ab) = !a !b
a0 = a
a1 = 1
a!a = 1

(Asociativiti)
(Distributiviti)
(Idempotene)
(Comutativiti)
(Absorbii)
(Dubla negaie)
(Legile lui De Morgan)

DEFINIIA 1.6. Structura algebric (B2, , , !) formeaz o algebr boolean


DEFINIIA 1.7. Operaia binar notat , definit prin tabelul 1.4. se numete
suma modulo 2 sau sau-exclusiv.

0
1

0
1

1
0

Tabelul 1.4. Definirea operaiei


TEOREMA 1.2. Structura algebric (B2, , ) formeaz un inel comutativ cu
element unitate. Acest inel poart numele de inel boolean.1
1.2.2. Funcii booleene i reprezentri ale lor
Vom nota prin B2n produsul cartezian al mulimii B2 cu ea nsi de n ori. Deci
B2n = B2B2...B2.
DEFINIIA 1.8. O funcie f : B2n --- > B2 se numete funcie boolean.
Un n-uplu x = (x1, x2, ..., xn) B2n va fi numit punct din B2n. Prin f(x) =
6

www.cartiaz.ro Carti si articole online gratuite de la A la Z

f(x1,x2,...,xn) vom nelege valoarea funciei n punctul x.


Este uor de vzut c n B2n sunt 2n puncte. Deci, pentru a reprezenta o
funcie boolean este necesar construcia tabelului cu valorile funciei n
fiecare dintre aceste puncte. Un astfel de tabel va avea 2n linii i n+1 coloane,
ca n tabelul 1.5.
x1

x2

...

xn-1

xn

f(x)

...

y0

...

y1

...

y2

...

y3

...

...

...

...

...

...

...

y2n-2

...

y2n-1

Tabelul 1.5. Definirea unei funcii Booleene de n variabile


Prin yi B2, i {0, 1, ... , 2n-1 } am notat valorile funciei f n toate punctele din
B2n.
De exemplu, se poate defini astfel funcia boolean de trei variabile din tabelul
1.6.
a

f(a,b,c)

0
0

0
1

1
0

0
1

0
1

1
0

1
0

1
0

1
1

0
1

1
0

0
1
7

www.cartiaz.ro Carti si articole online gratuite de la A la Z

Tabelul 1.6. O funcie Boolean de 3 variabile


Pe lng reprezentarea prin tabel, funciile booleene pot fi reprezentate
i cu ajutorul expresiilor booleene. n aceste expresii sunt folosii operatorii: !,
i . Operanzii sunt formai din variabilele funciei i eventual din simbolurile 0
i 1 avnd rolul de constante. Pentru schimbarea ordinii de efectuare a
operaiilor se folosesc parantezele ( i ).
n continuare vom da trei reguli dup care se poate construi o expresie
ce definete o funcie boolean dat prin tabelul ei de valori.
R1. Pentru fiecare linie din tabel pentru care yi=1 se va construi un
termen conjunctiv n conformitate cu regula R2. Termenii conjunctivi se vor
lega ntre ei prin operatori de disjuncie.
R2. La un termen conjunctiv particip cele n variabile, n conformitate cu
regula R3. Acestea variabile sunt legate ntre ele prin operatori de
conjuncie.
R3. Dac valoarea unei variabile n linia i este 1 atunci n termenul
conjunctiv apare variabila; dac valoarea ei este 0, atunci n termenul
conjunctiv apare negaia variabilei respective.
Urmnd aceste reguli, funcia de trei variabile dat ca exemplu n tabelul
1.6 va fi definit astfel:
f : B23 B2

f(a,b,c) = !a b !c !a b c a b !c

Cei trei termeni conjunctivi corespund liniilor y2, y3 i y6. Valorile celor trei
variabile n aceste linii sunt respectiv 010, 011 i 110. Aplicnd cele trei reguli,
se obine formula de mai sus.
Dup cum este cunoscut din calculul propoziiilor, o funcie boolean
8

www.cartiaz.ro Carti si articole online gratuite de la A la Z

poate avea mai multe reprezentri prin expresii. Acelai calcul al propoziiilor
definete diverse forme normale i descrie metode de simplificare a expresiilor
care reprezint funcii booleene. Obinerea unei expresii prin regulile R1-R3 de
mai sus conduce la forma normal disjunctiv perfect.

CAPITOLUL 2.
SISTEME I BAZE DE NUMERAIE
Numim sistem de numeraie totalitatea regulilor folosite pentru scrierea
numerelor, cu ajutorul unor simboluri numite cifre. n decursul istoriei s-au
impus mai multe sisteme de numeraie.
2.1. Tipuri de sisteme de numeraie
Cel mai primitiv mod de reprezentare a numerelor este rbojul. Pe un
b numit rboj, omul primitiv cresta cte o linie pentru fiecare obiect sau
animal care-i aparinea (blnuri, oi etc.). Tot pe un astfel de rboj se marcau
datoriile unui gospodar fa de altul (de unde i cunoscuta expresie "am scris
pe rboj").
S-a constatat c acest mod de scriere a numerelor este deosebit de
incomod. Pentru numere mari trebuie folosite multe semne, eventual trebuie
folosite semne diferite pentru numere mai deosebite (10, 50, 100 etc.). Aceste
semne se combin n diferite moduri. Dup felul de grupare i ordonare a
semnelor se deosebesc dou sisteme de numeraie: sistemul aditiv i sistemul
poziional.
2.1.1. Sistemul de numeraie aditiv (roman)
Sistemul de numeraie roman folosete pentru scrierea numerelor cifrele:
I, V, X, L, C, D, M
care corespund valorilor: unu, cinci, zece, cincizeci, o sut, cinci sute, respectiv
o mie.
Trei reguli importante guverneaz acest sistem de numeraie:
Regula 1. Mai multe cifre de aceeai valoare, scrise consecutiv,
reprezint suma acestor cifre.
De exemplu: XXX = 30; II = 2; MM = 2000.

Regula 2. O pereche de cifre de valori diferite, n care cifra de valoare


mai mare se afl n faa cifrei de valoare mai mic reprezint,
9

de asemenea, suma acestor cifre.


De exemplu:

XI = 10+1 = 11; VI = 5+1 = 6.

Regula 3. O pereche de cifre de valori diferite, n care cifra de valoare


mai mic se afl n faa cifrei de valoare mai mare reprezint
diferena acestor cifre.
De exemplu: IX = 10-1 = 9;

IC = 100-1 = 99.

Sistemul de numeraie roman prezint dezavantajul unei scrieri greoaie


i a lipsei unei reprezentri unice a numerelor. Astfel avem:
49 = IL = LIC
Alte neajunsuri ale acestui mod de scriere: numerele mari sunt n general
lungi i adesea de necuprins cu privirea, iar operaiile aritmetice cu aceste
semne sunt foarte anevoioase.
2.1.2. Sistemul de numeraie poziional (arab)
Acest sistem a fost introdus de ctre indieni i chinezi i a fost preluat de
ctre europeni datorit arabilor. El este un sistem poziional, n care aportul
unei cifre n stabilirea valorii numrului depinde att de valoarea ei ct i de
poziia pe care o ocup n scrierea numrului. Aceast caracteristic asigur
superioritatea sistemului de numeraie arab fa de sistemul de numeraie
roman.
n scrierea arab, fiecare grup de 10 elemente numrate (uniti)
formeaz o grup de rang superior (zeci), 10 grupe de zeci formeaz o grup
de rang superior grupei zeci (sute) .a.m.d., conform celor cunoscute de elevi
nc din clasa I primar. Datorit faptului c numrul zece este pragul de
trecere la un rang superior, se spune c este folosit baza de numeraie 10.
Pentru scrierea n baza 10 sunt folosite cifrele:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
n seciunile urmtoare vom dezvolta acest sistem de numeraie folosind
nu numai baza 10, ci i alte baze de numeraie.

10

2.2. Sisteme poziionale de numeraie n diverse baze


2.2.1. Reprezentarea numerelor naturale ntr-o baz b
Fie b N, b > 1 un numr numit baz de numeraie. ntreaga teorie
aritmetic a reprezentrii numerelor n baza b este fundamentat pe teorema
care urmeaz.
TEOREMA 2.1. Pentru orice numr natural nenul x, exist n mod unic un
numr natural n numit rang i n+1 numere naturale c0, c1, ... cn numite cifre n
baza b, care satisfac relaiile:
1) x = cnbn + cn-1bn-1 +...+ c1b + c0,
2) ci { 0, 1, ... , b-1 }, i { 0, 1, ..., n }
3) cn 0.
Demonstraie: Deoarece x 1, iar b > 1, rezult c exist, n mod unic, un
numr natural n pentru care este verificat dubla inegalitate (axioma lui
Arhimede):
bn x < bn+1
Acest numr n este cel din enunul teoremei. n continuare, vom aplica
inducia complet dup n.
Pentru n = 0, avem chiar c0 = x i alegerea este unic.
Presupunem teorema adevrat pentru n i s demonstrm c rmne
valabil i pentru n+1. Scriind teorema mpririi cu rest, unde dempritul este
x i mpritorul este b, rezult:
x = yb + r, cu 0 r < b
Vom pune acum c0 = r, care este determinat n mod unic. Dac bn+1 x <
bn+2, rezult c bn y < bn+1. Pentru y este valabil ipoteza de inducie, deci
pentru el exist n+1 cifre, pe care le vom nota c1, c2, ..., cn+1 i care sunt de
asemenea unic determinate. Rezult c avem:
x = cn+1bn+1 + cnbn +...+ c1b + c0
11

i c sunt verificate celelalte dou relaii din teorem. Cu aceasta, teorema


este complet demonstrat.
S atam acum fiecrui numr din mulimea { 0, 1, ..., b-1 } cte un
simbol (caracter, semn etc.) n aa fel, nct la numere diferite s atam
simboluri diferite. Convenim, de asemenea, c atunci cnd ne referim la o cifr
ci, s-i scriem de fapt simbolul Ci asociat numrului ci. Cu aceste convenii (i
cu ipoteza c simbolurile "(" i ")" nu reprezint cifre, avem reprezentarea
numrului x n baza b:
(CmCm-1...C1C0)b
n tot ceea ce urmeaz, vom identifica cifrele ci din teorem cu
simbolurile ataate lor Ci (i le vom scrie tot ci).
Observaie: Din definiia dat reprezentrii unui numr ntr-un sistem de
numeraie poziional cu baza b, rezult c o cifr indic o valoare de b ori mai
mare dect aceeai cifr situat ntr-o poziie de rang mai mic cu o unitate. Din
acest motiv sistemele de numeraie poziionale mai sunt numite sisteme
ponderate.
n sistemul de numeraie cu baza 10, numit sistem zecimal, sunt folosite
simbolurile de cifre:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Acest sistem este utilizat pe scar larg n prelucrarea manual a datelor,
precum i n comunicarea cu un sistem de calcul.
Sistemul de numeraie cu baza doi, numit sistem binar, folosete numai
cifrele 0 i 1. El st la baza construciei sistemelor de calcul.
Sistemul de numeraie cu baza 16, numit sistem hexazecimal folosete
cifrele:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
ultimele ase simboluri, de fapt primele ase litere ale alfabetului, scrise fie cu
majuscule fie cu minuscule, desemneaz numerele 10, 11, 12, 13, 14 i 15 ca
cifre n baza 16.
Din raiuni de scriere comod, i pentru evitarea unor confuzii,
simbolurile de cifre dintr-o anumit baz sunt preluate n bazele de
numeraie superioare. Astfel, n orice baz de numeraie cu b 16 se
folosesc simbolurile indicate mai sus, fiecare simbol indicnd acelai numr,
indiferent de baz. De exemplu, n baza 7 se folosesc simbolurile 0 6, iar
12

n baza 13 se folosesc simbolurile 0 9, A C; simbolul B este cifr doar


ncepnd cu baza 12 i reprezint cifra care are valoarea 11.
Este momentul s precizm c sunt folosite i alte reprezentri ale
cifrelor dect cea prin simboluri grafice. Aceast afirmaie este, aparent,
neobinuit, deoarece majoritatea covritoare a populaiei nu cunoate alt
sistem de numeraie dect cel zecimal! Dar, spre exemplu, atunci cnd se
folosete calculatorul pentru lucrul cu baze de numeraie foarte mari, fiecare
cifr este reprezentat prin coninutul unui cuvnt din memoria calculatorului.
2.2.2. Reprezentarea numerelor reale ntr-o baz b
Definiia dat reprezentrii numerelor naturale poate fi extins i la
numerele reale. Fie x > 0 un numr real.
DEFINIIA 2.1. Reprezentarea unui numr real x > 0 n baza b este (i se
scrie):
x = (cncn-1...c1c0,c-1c-2c-3...)b
dac sunt ndeplinite condiiile:
1)
2)
3)
4)

x = cnbn+cn-1bn-1+...+c1b+c0+c-1b-1+c-2b-2+c-3b-3...
ci {0,1,...,b-1} , i {n,...,1,0,-1,-2,-3,...}
cn 0
k 0 j < k astfel, nct cj < b-1

Comparnd definiia dat reprezentrii numerelor reale cu cea dat


reprezentrii numerelor ntregi, se observ c la numerele reale avem n plus
condiia 4). Aceast condiie cere s nu existe un rang la partea fracionar
dup care toate cifrele reprezentrii s fie egale cu b-1. Ea este necesar
pentru a asigura unicitatea reprezentrii numerelor. Drept contraexemplu,
considerm egalitile:
1/2 = 0,5 = 0,499999
numerele fiind scrise n baza 10.

Are loc urmtoarea:


TEOREMA 2.2. Fiind dat o baz de numeraie b, pentru orice numr real x >
0 exist o reprezentare unic n baza b conform definiiei 4.1. Numrul:
13

(cncn-1...c1c0)b
reprezint, n baza b, partea iintreag a numrului x, iar numrul
(0,c-1c-2c-3...)b
reprezint, n baza b, partea fracionar a numrului x.
DEFINITIA 2.2 Reprezentarea unui numr real x n baza b (extinderea
definiiei 4.1 la toate numerele reale).
a) Dac x > 0, atunci numrul se reprezint conform def. 2.1.
b) Dac x = 0, atunci x se reprezint 0.
c) Dac x < 0, atunci se pune mai nti semnul -, dup care urmeaz
reprezentarea numrului -x, conform definiiei 2.1.

2.2.3. Conversii ntre baze de numeraie


Existena i utilizarea mai multor baze de numeraie ridic problema
conversiei dintr-o baz n alta. Pentru fixarea ideilor, s presupunem c
numrul x este reprezentat ntr-o baz (baza veche) p i se dorete conversia
lui ntr-o baz (baza nou) q. Cele mai cunoscute metode de conversie sunt:
a) Metoda mpririi la baz a numerelor ntregi, cu calcule n baza p
(baza veche);
b) Metoda nmulirii cu baza a prilor fracionare, cu calcule n baz p
(baza veche);
c) Metoda substituiei, cu calcule n baza q (baza nou).

2.2.3.1. Conversia ntregilor prin mpriri succesive


Esena metodei este descris n demonstraia teoremei 4.1 i const n
faptul c cifra unitilor unui numr natural x scris ntr-o anumit baz q
coincide cu restul mpririi lui x la q. Aceast metod se aplic cu toate
calculele efectuate n baza veche pentru a obine reprezentarea lui x n noua
baz q. Algoritmul de conversie este descris n figura 4.1., folosind un limbaj
de tip pseudocod. n esen, se fac mpriri succesive ale numrului x la q. Se
14

reine de fiecare dat restul, iar ctul va deveni noul demprit. Resturile,
luate n ordinea invers a apariiei, vor fi cifrele n noua baz q.

DATE x ( din N*, scris n baza p), q (noua baz) ;


n := -1; d := x;
CAT TIMP d > 0 EXECUTA
n := n + 1;
cn := d mod q;
Cn := simbolul asociat cifrei cn n baza q;
d := d div q;
SF CAT TIMP ;
REZULTATE Cn Cn-1 ... C1 C0
Figura 2.1 Conversia ntregilor prin mpriri succesive
Exemple: S considerm numrul (985437)10 pe care vrem s-l
reprezentm pe rnd n bazele 6 i 16. Organizarea calculelor depinde de
fantezia celui care face conversia. Noi v propunem organizarea sub form de
tabel. Aa cum am mai spus, toate calculele se fac n baza p, n cazul de fa
baza 10. Conversia n baza 6 este prezentat n tabelul 2.1.
Citind ultima coloan din tabelul 2.1 de jos n sus, obinem rezultatul
conversiei:
(985437)10 = (33042113)6
n

Demprit
(baza 10)

Impritor
(q)
(baza 10)

Ct
(baza 10)

Rest
(cn)
(baza 10)

Simbol
cifr (Cn)
(baza 6)

0
1
2
3
4
5
6
7

985437
164239
27373
4562
760
126
21
3

6
6
6
6
6
6
6
6

164239
27373
4562
760
126
21
3
0

3
1
1
2
4
0
3
3

3
1
1
2
4
0
3
3

Tabelul 2.1 Conversia unui numr n baza 6


15

Acum conversia n baza 16 este dat n tabelul 2.2.

n
0
1
2
3
4

Demprit
(baza 10)
985437
61589
3849
240
15

Impritor
(q)
(baza 10)
16
16
16
16
16

Ct
(baza 10)

Rest
(cn)
(baza 10)

Simbol
cifr (Cn)
(baza 16)

61589
3849
240
15
0

13
5
9
0
15

D
5
9
0
F

Tabelul 2.2 Conversia unui numr n baza 16


Citind ultima coloan de jos n sus, obinem rezultatul conversiei: (985437)10 =
(F095D)16
n fine, aplicm aceeai metod pentru a trece din baza 6 n baza 16, cu
calculele fcute n baza 6. Tabelul 2.3 red aceste calcule, toate numerele din
tabel fiind n baza 6.

n
0
1
2
3
4

Demprit Impritor
(baza 6)
(q)
(baza 6)
33042113
1153045
25453
1040
23

24
24
24
24
24

Ct
(baza 6)

Rest
(cn)
(baza 6)

Simbol
cifr (Cn)
(baza 16)

1153045
25453
1040
23
0

21
5
13
0
23

D
5
9
0
F

Tabelul 2.3 Conversia din baza 6 n baza 16


Citind acum ultima coloan de jos n sus, obinem rezultatul conversiei:
(33042113)6 = (F095D)16
16

2.2.3.2. Conversia prilor fracionare prin nmuliri succesive


Ne intereseaz acum s gsim cifrele zecimale la trecerea dintr-o baz
veche p ntr-o baz nou q.
S notm cu y partea fracionar. Dup obinerea cifrei c -1 = [ q y ] n
baza q, se aplic din nou metoda nlocuind pe y cu { q y } .a.m.d. Acest
algoritm este descris n figura 2.2.
DATE y ( din (0,1), scris n baza p), q (noua baz) ;
n := 0 ; f := y;
CAT_TIMP (f > 0) sau (nu s-au obinut suficiente cifre) sau
(nu s-a obinut perioad: f nu coincide cu unul anterior)
EXECUTA
n := n - 1;
cn := [ f q ]; Cn := simbolul asociat cifrei cn n baza q;
f := { f q }
SF_CATTIMP
REZULTATE Cn Cn-1 ... C1 C0
Figura 2.2 Conversia prii fracionare prin nmuliri succesive
Prezentm n continuare cteva exemple. Pentru simplificarea calculelor,
presupunem c baza p este 10. Mai nti, vom trece numrul (0,43359375) 10 n
baza 8 (deci vom nmuli mereu prile fracionare cu 8).
0 43359375
.8
3 46875
3 75
6 0
Rezult c (0,43359375)10 = (0,336)8 i s-au obinut un numr finit de cifre la
partea fracionar.
n continuare vom converti tot n baza 8 numrul 0,51437, dar vom reine
numai trei cifre dup virgul:
0

51437
8

17

4
0
7
-

11496
91968
35744
----

Rezult c (0,51437)10 = (0,407...)8.


S convertim acum, tot n baza 8, numrul (0,45)10.
0 45
3
4
6
3

60
8
4
2

1
4
6
3
1
-

6
8
4
2
6
--

Rezult c (0,45)10 = (0,346314631...)8. Se observ c se obine o fracie


periodic mixt, deci (0,45)10 = (0,3(4631))8.
S trecem acum numrul (0,85)10 n baza 16.
0
13
9
9
-

8 5
6 0
6
6
---

16

Rezult c (0,85)10 = (0,D(9))16, unde D este simbolul cifrei cu valoarea (13)10.


Observaii:
1. Procesul de conversie se ncheie fie cnd dat partea fracionar
devine zero, fie cnd se consider c s-au extras suficiente cifre, fie cnd se
18

observ apariia perioadei. Dac conversia se face cu ajutorul calculatorului,


depistarea perioadei este dificil, motiv pentru care se folosete doar prima
sau a doua condiie de oprire.
2. Calculele se fac ntotdeauna cu un numr finit de cifre dup
virgul, indiferent dac conversia se face manual sau cu ajutorul
calculatorului. Din aceast cauz, teoretic ntotdeauna apare perioada. ntradevr, dac se rein k cifre dup virgul, dup maximum bk ncercri variabila
f din algoritmul 4.2 se va repeta.
3. Din cauza observaiilor de mai sus, o conversie dubl conduce la erori
de trunchiere. Spre exemplu, s trecem numrul (0,6)10 n baza 8 i s reinem
patru cifre. Avem c (0,6)10 = (0,4631...)8. Acum s aplicm acelai algoritm
pentru trecerea numrului (0,4631)8 n baza 10, cu calculele n baza 8.
0 4631
5
11
11
10

7772
7704
6650
422

(12)8
; (11)8 = (9)10
; (10)8 = (8)10

5 264
3 410
-- ----Rezult c (0,4631)8 = (0,599853...)10. Aceasta nseamn c n loc de (0,6)10,
n urma dublei conversii, se obine (0,599853...)10.
2.3. Relaii ntre bazele 2, 8 i 16
2.3.1. Cifre binare, octale, zecimale, hexazecimale
n informatic, bazele 2, 8 i 16 au o deosebit importan. Dup cum se
va vedea imediat, conversiile ntre aceste baze se pot realiza deosebit de
simplu. Ca terminologie, vom spune c lucrm n sistemul binar dac baza
este 2, sistemul octal dac baza este 8 i sistemul hexazecimal dac baza
este 16. n acest context, este firesc s folosim termenul de sistem zecimal
dac baza este 10.
Tabelul 2.4. conine corespondena ntre cele patru reprezentri ale
numerelor de la 0 la 15. Pentru o manevrare uoar ntre aceste patru baze de
numeraie, recomandm memorarea acestui tabel.
19

Zecim
al

Binar

Octal

Hexa

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

0
1
2
3
4
5
6
7
10
11
12
13
14
15
16
17

0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F

Tabelul 2.4. Corespondena ntre cifrele bazelor 10, 2, 8 i 16.


Orice grup de 3 cifre binare determin, n mod unic, o cifr octal;
reciproc, o cifr octal se reprezint n binar printr-un grup de 3 cifre binare,
completnd zerourile necesare la stnga. Un astfel de grup de 3 cifre binare l
numim triad.
Analog, orice grup de 4 cifre binare determin, n mod unic, o cifr
hexazecimal; reciproc, o cifr hexazecimal se reprezint n binar printr-un
grup de 4 cifre binare, completnd cu zerourile necesare la stnga. Un astfel
de grup de 4 cifre binare l vom numi tetrad.
2.3.2. Conversii binar - octal
S considerm numrul x = (cncn-1...c1c0,c-1c-2c-3...c-k)2. Fr a restrnge
generalitatea, presupunem c n+1 este multiplu de 3, iar k este de asemenea
un multiplu de 3 (deci att partea ntreag a numrului, ct i partea fracionar
a lui au cte un numr de cifre multiplu de 3). Dac nu este aa, se adaug,
dup necesiti, zerouri naintea lui cn, i/sau dup c-k. Aceste zerouri nu
modific valoarea numrului.
S scriem acum valoarea numrului x, grupnd n triade cifrele din
20

stnga i din dreapta virgulei zecimale i s evideniem astfel cteva triade:


X = cn2n+cn-12n-1+cn-22n-2 + cn-32n-3+cn-42n-4+cn-52n-5 + ...
+c525+c424+c323+c222+c12+ c0 + c-12-1+c-22-2+c-32-3 + ... + c-k+22-k+2+c-k+12k+1
+c-k2-k =
= (cn22+cn-12+cn-2)2n-2 + (cn-322+cn-42+cn-5)2n-5 + ... +
(c522+c42+c3)23 + c222+c12+c + (c-122+c-22+c-3)2-3 + ... + (c-k+222+c-k+12+c-k
k)2
S notm j=(n-2)/3 i s= k/3.
Se observ c numerele:
n-2, n-5, ..., 3, 0, -3, ..., -k
sunt multiplii lui 3 dintre -s3 i j 3.
Fiecare parantez de forma:
(cl+222+cl+12+cl), l {n-2, n-5, ..., 3, 0, -3, ..., -k}
este un numr de trei cifre n baza 2, deci un numr ntre 0 i 7. Altfel spus, o
astfel de parantez este o cifr n baza 8. Vom nota cu ri , cu i = l / 3
aceast cifr.
Fiecare dintre puterile lui 2 care apar pe lng cifrele ri cu aceti
exponeni poate fi transformat astfel:
2l = 23(l/3) = 8l/3 = 8i, unde
l {n-2, n-5, ..., 3, 0, -3, ..., -k}, respectiv
i {j, j-1, ..., 1, 0, -1, ..., -s}
Cu aceste notaii, avem:
x = rj8j + rj-18j-1 + ... + r18 + r0 + r-18-1 + ... + r-s8-s
deci x = (rj rj-1 ... r1 r0 ,r-1 r-2 r-3 ... r-s)8.
Raionnd invers, dac avem un numr scris n octal, reprezentarea lui
binar se obine pstrnd virgula zecimal, iar spre stnga i spre dreapta ei
se nlocuiete fiecare cifr octal cu triada corespunztoare ei.
21

Sintetiznd cele demonstrate mai sus, avem urmtoarele dou reguli


practice de trecere ntre bazele 2 i 8:
- Pentru trecerea din baza 2 n baza 8, se grupeaz cifrele reprezentrii
binare n triade, pornind de la virgul spre stnga i spre dreapta. Dac cel
mai din stnga grup al prii ntregi, respectiv cel mai din dreapta grup al prii
fracionare, nu are exact trei cifre, se completeaz cu zerouri la stnga pentru
partea ntreag, respectiv la dreapta pentru partea fracionar. Se nlocuiete
fiecare triad cu cifra octal corespunztoare.
- Pentru trecerea din baza 8 n baza 2, pornind de la virgul, spre
stnga i spre dreapta, se nlocuiete fiecare cifr octal cu triada binar
corespunztoare ei (fiecara cifr octal se va nlocui cu exact trei cifre binare!).
S considerm cteva exemple:
(100 101 110 , 111 011 001)2 = (456,731)8
(1001101011.0110100100101011)2 = (001 001 101 011.011 010 010 010 101
100)2 =(1153.322254)8
(11100111000001101)2 = (011 100 111 000 001 101)2 = (347015)8
(0,001000000111011011)2 = (000,001 000 000 111 011 011)2 = (0,100733)8
2.3.3. Conversii binar - hexazecimal
S considerm numrul x = (cncn-1...c1c0,c-1c-2c-3...c-k)2. Fr a restrnge
generalitatea, presupunem c n+1 este multiplu de 4, iar k este de asemenea
un multiplu de 4 (deci att partea ntreag a numrului, ct i partea fracionar
a lui au cte un numr de cifre multiplu de 4). Dac nu este aa, se adaug
dup necesiti zerouri naintea lui cn, i/sau dup c-k. Aceste zerouri nu
modific valoarea numrului.
Analog conversiilor binar - octal, aici se scrie valoarea numrului x,
grupnd n tetrade spre stnga i spre dreapta virgulei zecimale. ntreaga
demonstraie decurge analog celei prezentate n seciunea precedent, motiv
pentru care nu o mai relum. Dm numai dou reguli practice de trecere
ntre bazele 2 i 16:
- Pentru trecerea din baza 2 n baza 16, se grupeaz cifrele reprezentrii
binare n tetrade, pornind de la virgul spre stnga i spre dreapta. Dac cel
mai din stnga grup al prii ntregi, respectiv cel mai din dreapta grup al prii
fracionare, nu are exact patru cifre, se completeaz cu zerouri la stnga
22

pentru partea ntreag, respectiv la dreapta pentru partea fracionar. Se


nlocuiete fiecare tetrad cu cifra hexazecimal corespunztoare.
- Pentru trecerea din baza 16 n baza 2, pornind de la virgul, spre
stnga i spre dreapta, se nlocuiete fiecare cifr hexazecimal cu tetrada
binar corespunztoare ei (fiecara cifr hexazecimal se va nlocui cu exact
patru cifre binare!).
S considerm cteva exemple:
(110100101010,00111101)2 =

(D2A,3D)16

( 1001101011.0110100100101011)2 = (0010 0110 1011,0110 1001 0010


1011)2 =
=(26B,692B)16
( 11100111000001101)2 = (0001 1100 1110 0000 1101)2 = (1CE0D)16
( 0,001000000111011011)2 =
=(0,2076C)16

(0000,0010

0000

0111

0110

1100)2

2.3.4 Conversii octal - hexazecimal


Este evident c cel mai simplu mod de a face conversii ntre aceste dou
baze de numeraie este acela al folosirii bazei 2 ca intermediar. Pentru a nu
opera cu iruri nesfrite de cifre binare, facem urmtoarele recomandri:
- Pentru trecerea din baza 8 n baza 16, se grupeaz la stnga i dreapta
virgulei, cte 4 cifre octale. Acestea vor fi transformate mai nti n 12 cifre
binare, care apoi vor fi transformate n 3 cifre hexazecimale.
- Pentru trecerea din baza 16 n baza 8, se procedeaz analog, adic se
grupeaz la stnga i dreapta virgulei, cte 3 cifre hexazecimale. Acestea vor fi
transformate mai nti n 12 cifre binare, care apoi vor fi transformate n 4 cifre
octale.
De exemplu, (27354357,3576)8 =
intermediare n baza 2 se pot organiza astfel:

(5DD8EF,77E)16.

Gruprile

( 2735 4357, 3576 )8 = (010 111 011 101 100 011 101 111 , 011
101 111 110)2 =
(0101 1101 1101 1000 1110 1111 , 0111 0111 1110 )2 = ( 5DD
8EF , 77E )16

23

CAPITOLUL 3.
CODIFICAREA INFORMAIEI
3.1. Noiunea de cod; exemple
Codificarea a aprut din necesitatea de a se face schimb de mesaje care
s poat fi nelese numai de ctre persoanele care cunosc cheia codificrii.
Aceste schimburi de mesaje sunt necesare atunci cnd se manipuleaz
informaii secrete. n astfel de comunicaii este esenial mecanismul de
codificare, care trebuie s fie suficient de complex nct s mpiedice
descifrarea lui de ctre persoane neautorizate sau ru intenionate.
Ca parte integrant a prelucrrii informaiilor cu ajutorul calculatorului,
codificarea urmrete transpunerea informaiei din forma ei primar ntr-o
form accesibil calculatorului. Mecanismul codificrii trebuie s fie simplu,
astfel nct s poat fi automatizat n mod eficient.
3.1.1. Definirea codului
Trecnd peste particulariti i diferene de exprimare, se poate crea un
model matematic cuprinztor i general al procesului de codificare. S notm
prin:
S = { s1, s2, ..., sp }
mulimea simbolurilor primare de informaie. Dup caz, S poate fi mulimea
caracterelor ce se pot tipri, o mulime de cuvinte dintr-un anumit limbaj sau
limb, o submulime finit de numere etc. S notm prin:
A = { a1, a2, ..., aq }
un alfabet al codificrii, n care elementele ai le vom numi litere. Cu ajutorul
literelor alfabetului A, elementele mulimii S vor fi reprezentate ntr-o nou
form, forma codificat. Vom nota prin An mulimea tuturor cuvintelor de
lungime n formate cu litere din A. Deci
An = { w w = ai1ai2...ain / aijA, j = 1,n }
Prin A+ vom nota mulimea tuturor cuvintelor ce se pot forma cu litere din A.
Deci
24

A+ = A A2 ... An ...
DEFINIIA 3.1. O aplicaie injectiv C : S A+ se numete codificare a
simbolurilor din S, sau mai simplu, cod.
DEFINIIA 3.2. Un cod pentru care toate cuvintele de cod au aceeai lungime
n se numete uniform, iar n se numete lungimea codului. n acest caz avem
c
C : S An
Codurile care nu sunt uniforme se numesc coduri neuniforme.
3.1.2. Exemple simple de coduri
S stabilim o coresponden ntre cifrele zecimale i reprezentarea
lor binar. n acest caz avem de-a face cu un cod uniform, n care:
S = { 0, 1, ..., 9 }, A = B2 = { 0 , 1 }, n = 4
Codificarea prin funcia de codificare C este cea cunoscut, adic:
C(0) = 0000, C(1) = 0001, C(2) = 0010, ..., C(9) = 1001
Este binecunoscut alfabetul Morse. El este un cod pentru care S este
mulimea literelor mici, a cifrelor zecimale i a unor semne speciale. Mulimea
A este format din "." (punct); "-" (linie), care are ca lungime echivalentul a trei
puncte; "pauza" care poate avea trei lungimi: lungime de un punct ntre dou
semne din A, de trei puncte ntre dou semne din S, de cinci puncte ntre dou
cuvinte din S. Tabelul 3.1 definete funcia C pentru alfabetul Morse.
Mesajele n cod Morse sunt afiate de regul pe o band ngust i
continu de hrtie. Pn la apariia mijloacelor moderne de comunicaie, acest
cod s-a folosit pe scar larg n telegrafie i n transportul feroviar. Codul
Morse a fost astfel conceput nct caracterele mai frecvente s aib
codificarea mai scurt. Din punctul de vedere al modelului matematic, codul
Morse este cod neuniform, deoarece cuvintele de codificat au lungimi
cuprinse ntre 1 i 6 litere din A.
a

.-

-.

.----

.-.-

---

..---

25

-...

---.

...--

-.-.

.--.

....-

-..

--.-

.....

.-.

-....

..-.

...

--...

--.

----

---..

....

----.

..

..-

-----

.---

..--

......

-.-

...-

.-.-.-

.-..

.--

-.-....

--

-..-

---...

-.--

..--..

--..

--..--

Tabelul 3.1. Codificarea n alfabetul Morse


3.1.3. Problema decodificrii
Deoarece funcia de codificare C este injectiv, rezult c funcia:
C : S C(S) A+
este bijectiv. n acest caz problema decodificrii se pune astfel: fiind dat un
cuvnt w A+ s se determine si S astfel nct C(si) = w sau s se
rspund c nu exist un astfel de si. Cu alte cuvinte, trebuie evaluat n w
funcia:
C-1 : C(S) S
Pentru codurile uniforme, problema decodificrii este simpl. n schimb,
ea se complic la codurile neuniforme. O posibil rezolvare a decodificrii la
codurile neuniforme const n introducerea unui simbol consacrat ca element
despritor ntre dou secvene C(w1) i C(w2) consecutive. Codul Morse
folosete n acest scop "pauza" de diverse lungimi. Utilizarea unui astfel de
26

simbol determin creterea numrului de litere cu care se codific o


succesiune de simboluri din S.
Exist coduri neuniforme pentru care decodificarea se poate face fr
folosirea simbolurilor despritoare. Clasa acestor coduri este dat de definiia
care urmeaz.

DEFINIIA 3.3. Un cod C poart numele de cod unic decodificabil dac


pentru orice dou simboluri si i sj din S, nici una dintre secvenele de cod C(si)
i C(sj) nu este prefix pentru cealalt.
De exemplu, dac unui simbol s1 i atribuim codul a1a1a2, atunci nu mai
putem avea, pentru alte caractere, secvenele de cod a1, a1a1,a1a1a2a4 etc. . n
tabelul 3.2 este redat o codificare unic decodificabil pentru mulimile
S = { 0, 1, ..., 9 } i A = { 1, 2, 3 }
0

11

12

212

222

31

321

322

211

3321

3312

Tabelul 3.2. Un cod unic decodificabil

3.2. Codificarea datelor n calculator


3.2.1. Codificarea caracterelor
Fie S = { _, a, b, . . ., z, A, B, . . ., Z, 0, 1, . . ., 9, +, ., ;, :, $, . . .} mulimea
caracterelor tipribile, existente la fiecare imprimant, tastatur etc.
Pentru codificarea acestor caractere n vederea prelucrrii lor automate,
standardele internaionale impun o serie de restricii. Dup cum se va vedea,
aceste restricii sunt benefice pentru prelucrarea automat a caracterelor.
S considerm mulimile: l mulimea literelor mici ale alfabetului latin, L
mulimea literelor mari (n aceste mulimi nu intr caracterele romneti , , ,
, ), c mulimea cifrelor zecimale, s mulimea caracterelor speciale (spaiul l
vom nota cu _), iar f mulimea caracterelor funcionale, cele care nu apar la
tiprire (afiare), ci doar dirijeaz tiprirea (afiarea). Aadar:
27

l = { a, b, ..., z }, L = { A, B, ..., Z },
c = { 0, 1, ..., 9 }, s = { _, +, ;, :, $, ... },
f = {CR, LF, TAB, FF, BEL, BS, . . . }
n continuare, vom nota S = l L c s f. nainte de a descrie
condiiile codificrii, s prezentm rolul ctorva dintre caracterele funionale,
simbolizate mai sus prin grupuri de litere mari. CR provoac deplasarea
dispozitivului de afiare (tiprire) la nceput de rnd (Carriage Return). LF
provoac deplasarea dispozitivului cu un rnd mai jos (Line Feed), pstrnduse poziia n cadrul rndului. De obicei, se folosete succesiunea de caractere
CR LF pentru a separa dou linii de afiat, efectul lor cumulat fiind trecerea la
nceputul rndului urmtor. TAB este caracterul de tabulare, deci avansul
dispozitivului la poziia urmtorului stop de tabulare (de obicei peste 5-8
caractere). FF (Form Feed) provoac trecerea la pagina (ecranul) urmtoare
(urmtor). BEL provoac emiterea unui semnal sonor, iar BS provoac
deplasarea dispozitivului de afiare (tiprire) cu o poziie spre stnga, n
vederea tergerii (supraimprimrii) ultimului caracter.
Funcia de codificare se definete astfel:
C: S [0,m] ,
unde m este 127 sau 255. Dac considerm reprezentarea binar, avem de-a
face cu un cod uniform pe 7 bii, respectiv pe 8 bii. Avnd n vedere faptul c
octetul este unitatea de adresare a memoriei, codul pe 7 bii se extinde la 8 bii
punnd 0 la bitul cel mai semnificativ. Deci codificarea unui caracter este un
numr care ncape pe un octet.
0
1
2
3
4
5
6
7
8
9
10
11

00
01
02
03
04
05
06
07
08
09
0A
0B

NUL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
TAB
LF
VT

32 20
33 21
34 22
35 23
36 24
37 25
38 26
39 27
40 28
41 29
42 2A
43 2B

64 40 @
65 41 A
66 42 B
67 43 C
68 44 D
69 45 E
70 46 F
71 47 G
72 48 H
73 49 I
74 4A J
75 4B K

!
"
#
$
%
&
'
(
)
*
+
28

96 60 `
97 61 a
98 62 b
99 63 c
100 64 d
101 65 e
102 66 f
103 67 g
104 68 h
105 69 I
106 6A j
107 6B k

12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

0C
0D
0E
0F
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F

FF
CR
SO
SI
DLE
DC1
DC2
DC3
DC4
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
RS
US

44 2C
45 2D
46 2E
47 2F
48 30
49 31
50 32
51 33
52 34
53 35
54 36
55 37
56 38
57 39
58 3A
59 3B
60 3C
61 3D
62 3E
63 3F

,
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?

76 4C L
77 4D M
78 4E N
79 4F O
80 50 P
81 51 Q
82 52 R
83 53 S
84 54 T
85 55 U
86 56 V
87 57 W
88 58 X
89 59 Y
90 5A Z
91 5B [
92 5C \
93 5D ]
94 5E ^
95 5F _

108 6C l
109 6D m
110 6E n
111 6F o
112 70 p
113 71 q
114 72 r
115 73 s
116 74 t
117 75 u
118 76 v
119 77 w
120 78 x
121 79 y
122 7A z
123 7B {
124 7C |
125 7D }
126 7E ~
127 7F _

Tabelul 3.3 Codul ASCII


Standardele de codificare a caracterelor impun urmtoarele 4 condiii de
definire a funciei C.
1. x f ==> C(x) < C('_')
2. x S \ f ==> C(x) C('_')
3. C('a') < C('b') < ... < C('z')
C('A') < C('B') < ... < C('Z')
C('1') = C('0')+1 ... C('9') = C('8')+1
4. Intervalele:
[C('a') , C('z')],
[C('A') , C('Z')],
[C('0') , C('9')]
i mulimea C(s) au interseciile vide dou cte dou.
128 80
129 81

160 A0
161 A1

192 C0
193 C1
29

224 E0
225 E1

130 82
131 83
132 84
133 85
134 86
135 87
136 88
137 89
138 8A
139 8B
140 8C
141 8D
142 8E
143 8F
144 90
145 91
146 92
147 93
148 94
149 95
150 96
151 97
152 98 _
153 99
154 9A
155 9B
156 9C
157 9D
158 9E _
159 9F

162 A2
163 A3
164 A4
165 A5
166 A6
167 A7
168 A8
169 A9 _
170 AA
171 AB
172 AC
173 AD
174 AE
175 AF
176 B0
177 B1
178 B2
179 B3
180 B4
181 B5
182 B6
183 B7
184 B8
185 B9
186 BA
187 BB
188 BC
189 BD
190 BE
191 BF

194 C2
195 C3
196 C4
197 C5
198 C6
199 C7
200 C8
201 C9
202 CA
203 CB
204 CC
205 CD
206 CE
207 CF
208 D0
209 D1
210 D2
211 D3
212 D4
213 D5
214 D6
215 D7
216 D8
217 D9
218 DA
219 DB
220 DC
221 DD
222 DE
223 DF

226 E2
227 E3
228 E4
229 E5
230 E6
231 E7
232 E8
233 E9
234 EA
235 EB
236 EC
237 ED
238 EE
239 EF
240 F0
241 F1
242 F2
243 F3
244 F4
245 F5
246 F6
247 F7
248 F8
249 F9
250 FA
251 FB
252 FC _
253 FD
254 FE
255 FF
Tabelul 3.4 Extinderea codului ASCII

Un prim sistem de codificare stabilit a fost EBCDIC (Extended Binary


Decimal Interchange Code), care folosete pentru codificare numerele ntregi
din intervalul [0,255]. Calculatoarele medii-mari de tip IBM-360, IBM-370,
precum i FELIX-C folosesc codul EBCDIC.
n prezent, cel mai folosit sistem de codificare este ASCII (American
Standard Code for Information Interchange), care folosete pentru codificare
numerele ntregi din intervalul [0, 127].
30

Fa de condiiile 1-4 de mai sus, acest standard de codificare mai verific


condiia:
5. C('z') = C('a') + 25,
C('Z') = c('A') + 25
Tabelul 3.3 conine standardul ASCII. Fiecare coloan a tabelului conine
mai nti numrul de cod n zecimal, apoi acelai numr n hexazecimal,
urmate de simbolul din alfabet care se codific. Corespunztor coloanei
caracterelor funcionale, se precizeaz i simbolul pe care-l codific mainile
IBM-PC, precum i prescurtarea internaional corespunztoare caracterului
funcional codificat.
Calculatoarele IBM-PC folosesc codificarea ASCII extins, folosind
ntregii din intervalul [0,255]. Dintre aceste numere, cele din intervalul [0,127]
pstreaz codificarea ASCII standard, iar celelalte coduri desemneaz o serie
de caractere noi. Tabelul 3.4 prezint extinderea codificrilor pe intervalul
[128,255].

31

CAPITOLUL

4.

Algoritmic i programare

Rezolvarea unei probleme cu ajutorul calculatorului


presupune parcurgerea urmtoarelor faze:
1) Precizarea complet a problemei de rezolvat (specificarea);
2) Proiectarea
algoritmilor
de
rezolvare
a
problemei
(proiectarea);
3) Programarea propriu-zis a algoritmilor ntr-un limbaj de
programare (codificarea);
4) Testarea i verificarea (testarea);
5) Elaborarea documentaiei de realizare i a domentaiei de
exploatare (documentaia);
6) Exploatarea i ntreinerea programului (exploatarea).
Toate aceste faze constituie ciclul de via al programului
sau al produsului program. Prin produs program se nelege tot
ceea ce se produce prin activitile de mai sus. Nu detaliem
mai mult fiecare din fazele anterioare, aceasta ar depi
cadrul acestei cri. Ne vom axa mai mult pe fazele 1), 2) i
3) pentru problemele didactice care le vom rezolva.

4.1. Algoritm
Noiunea de algoritm nu se poate defini foarte uor. O definiie matematic, riguroas
este greu de dat chiar i cu ajutorul altor noiuni. Vom ncerca n continuare s descriem ce se
nelege prin algoritm.
Prin algoritm vom nelege un set finit de reguli
propoziii scrise ntr-un limbaj de descriere a algoritmilor
- care proceseaz, calculeaz, rezolv o problem.
Mai n detaliu, pentru fiecare problem P exist date
presupuse
cunoscute
(date
iniiale
pentru
algoritmul
corespunztor, A) i rezultate care se cer a fi gsite (date
finale). Evident, s-ar putea ca problema s nu aib sens
pentru orice date iniiale. Vom spune c datele pentru care
problema P are sens fac parte din domeniul D al algoritmului
A. Rezultatele obinute fac parte dintr-un domeniu R, astfel
c executnd algoritmul A cu datele de intrare xD vom obine
rezultatele rR.
Vom spune c A(x)=r i astfel algoritmul A
definete o funcie:
A : D R
Algoritmii au urmtoarele caracteristici: generalitate,
finitudine i generalitate.
Prin generalitate se nelege faptul c un algoritm este
aplicabil pentru orice date iniiale x. Deci un algoritm A nu
rezolv problema
P numai cu anumite date de intrare
particulare, ci o rezolv n general, oricare ar fi aceste
date din D. Astfel algoritmul lui Euclid de determinarea a
32

celui mai mare divizor comun al dou numere naturale a i b


rezolv problema pentru orice alegere a lui a i b i nu numai
pentru, s zicem, a > b.
Prin finitudine se nelege c regulile algoritmului sunt
n numr finit i numrul transformrilor ce trebuie aplicate
unei informaii admisibile xD pentru a obine rezultatul
final corespunztor este finit. Deci rezulatele se obin dup
un numr finit de transformri.
Prin unicitate se nelege c toate transformrile prin
care trece informaia iniial pentru a obine rezultatul rR
sunt bine
determinate de regulile algorimului. Aceasta
nseamn c fiecare pas din execuia algoritmului d rezultate
bine determinate i precizeaz n mod unic pasul urmtor.
Astfel spus, ori de cte ori am executa algoritmul, pornind de
la aceeai informaie admisibil
xD, transformrile prin
care se trece i rezultatele obinute sunt aceleai.
n descrierea algoritmilor se folosesc mai multe limbaje
de descriere, dintre care cele mai des folosite sunt:
- schemele logice;
- limbajul pseudocod.
Ne vom referi n continuare la limbajul pseudocod.

4.2. Limbajul pseudocod


Limbajul pseudocod este un limbaj inventat n scopul
proiectrii algoritmilor i este format din propoziii
asemntoare propoziiilor limbii romne, care corespund
structurilor de calcul i structurilor de control folosite n
construirea algoritmilor. Limbajul pseudocod are dou feluri
de propoziii:
- propoziii standard;
- propoziii nestandard.
Deoarece realizarea unui algoritm pentru rezolvarea unei
probleme nu este ntotdeauna o problem uoar se vor obine
forme intermediare a algoritmului. n acest proces de
rafinare se vor folosi pentru elementele nefinisate la un
anumit nivel propoziiile nestandard. Acestea
sunt texte
care descriu pri ale algoritmului incomplet elaborate
asupra crora se va reveni la un alt nivel de detaliere.
nceputul propoziiilor nestandard se marcheaz
printr-un
semn special (# sau @ de exemplu) iar sfritul prin punct.
Propoziiile standard au sintax i semantic bine precizate
i reflect n algoritm structurile de calcul i de control
ale procesului de rezolvare a problemei.
Pe lang aceste propoziii se pot folosi i comentarii scrise
ntre acolade i de obicei scrise pe linia propoziiilor
standard i nestandard.
33

Pentru marcarea
nceputului
folosete propoziia standard:
ALGORITMUL
Sfritul
standard:

unui

descrierii

numele_algoritmului

algoritm

se

marcheaz

unui

algoritm

se

ESTE:
prin

propoziia

SFRIT ALGORITM.
Cele dou propoziii standard nu au dect semnificaia
delimitrii descrierii unui algoritm de restul contextului n
care apare.
Pentru citirea datelor iniiale, care se presupun c sunt
cunoscute n problem se folosesc propoziiile standard:
DATE
list;
sau
CITETE
list;
unde list conine toate numele variabilelor a cror valoare
iniial este cunoscut.
Afiarea (tiprirea) sau precizarea rezultatelor obinute se
face cu ajutorul propoziiilor standard:
TIPRETE list;
sau
REZULTATE list;
unde list conine toate variabilele ce doresc s fie afiate
sau care s-au obinut n urma procesului de calcul descris de
algoritm.
Calculele se descriu
propoziiei standard:
[FIE]

prin

atribuiri

cu

ajutorul

variabil := expresie;

unde expresie este de obicei o expresie de calcul (sau o


variabil) iar variabil este o variabil cruia i se
atribuie rezultatul obinut dup efectuarea calculelor
indicate n expresie.
Structura de control de alternativ este de 3 tipuri:
- alternativa simpl;
- alternativa complet;
- alternativa generalizat.
Alternativa simpl se descrie prin propoziia standard:
DAC

condiie

ATUNCI
34

SFRITDAC;

unde condiie este de obicei o expresie relaional sau


logic iar S este un grup de propoziii standard (poate fi i
doar o propoziie standard).
Execuie:
1) Se evalueaz condiia;
2) Dac condiia este adevrat atunci se execut S i se trece
la propoziia urmtoare; dac condiia nu este ndeplinit
(fals) atunci se trece automat la propoziia urmtoare.
Alternativa

complet
DAC

se descrie prin propoziia standard:

condiie

ATUNCI
ALTFEL

S1
S2

SFRITDAC
Execuie:
1) Se evalueaz condiia;
2) Dac condiia este adevrat atunci se execut S1 i se
trece la propoziia urmtoare; dac condiia nu este
adevrat (fals) atunci se execut S2 i se trece la
propoziia urmtoare.
Alternativa generalizat se descrie prin propoziia standard:
SELECTEAZ i DINTRE
V1 : S1;
V2 : S2;
. . .
Vn : Sn
SFRITSELECTEAZ
Execuie:
1) Dac valoarea lui i este
egal cu Vi atunci se execut
secvena Si.
2) Se d controlul propoziiei de dup SFRITSELECTEAZ.
Structura de control repetitiv are trei forme:
- repetiia anterior testat (pretestat);
- repetiia posterior testat (posttestat);
- repetiia cu un numr determinat (i aprioric cunoscut)
de execuii.
Repetiia pretestat se descrie prin propoziia standard:
CTTIMP condiie EXECUT
S;
SFRITCTTIMP;
Execuie:
1) Se evalueaz condiia;
2) Dac condiia este adevrat atunci se execut S i se reia
35

evaluarea condiiei; dac condiia nu este adevrat atunci


se trece la propoziia imediat urmtoare.
n S trebuie modificat ntr-un fel oarecare condiia, altfel
ciclul ar deveni infinit dac la prima evaluare condiia ar
fi adevrat.
Repetiia posttestat se descrie prin propoziia standard:
REPET

S;
PNCND condiie;
SFRITREPET;
Execuie:
1) Se execut S;
2) Dac condiia este fals se reia execuia S; dac condiia
este adevrat atunci se trece la propoziia imediat
urmtoare.
n S trebuie modificat ntr-un fel oarecare condiia, altfel
ciclul ar deveni infinit dac la prima evaluare condiia ar
fi fals.
Structura posttestat REPET de mai sus este echivalent
cu urmtoarea secven:
S;
CTTIMP not condiie EXECUT
S;
SFRITCTTIMP;

Repetiia predefinit, cu numr determinat de execuii se


descrie prin propoziia standard:
PENTRU contor:=liminiial;limfinal[;pas]
S;
SFRITPENTRU

EXECUT

Aceast structur este echivalent cu secvena urmtoare:

limfinal

contor:=liminiial;
REPET
S;
contor:=contor+pas;
PNCND (contor > limfinal i pas > 0) sau (contor <
i pas < 0)
SFRITREPET;
36

Execuie:
1) Se iniializeaz contorul cu liminiial;
2) Se execut S; i se incrementeaz contorul cu pas (dac
pasul este 1 nu este obligatoriu s fie pus n eviden, e
implicit);
3) Se testeaz dac contorul nu depete limita final i se
reia punctul 2); dac contorul depete limita final
atunci se trece controlul la propoziia urmtoare.
Exemple:
1) S se determine dac un numr natural, n este palindrom sau
nu. Precizm c un numr este palindrom dac valoarea sa
este egal cu valoarea oglinditului su (citit de la dreapta
spre stnga).
Algoritmul Palindrom Este:
{ Problema palindromului }
Date n;
x := n;
{ x variabil intern de lucru
egal la nceput cu n}
m := 0;
{ n m se va construi oglinditul
lui n}
CatTimp x > 0 Executa
c := x modulo 10;
{ n c se izoleaz ultima cifr a
lui x, pas cu pas}
m := m*10 + c; { se adaug c la m}
x := x div 10;
{ se imparte x la 10 i se reine
ctul }
Sfarsit CatTimp ;
Daca m = n atunci Tiprete numarul este palindrom
altfel
Tiprete numarul este
palindrom
SfarsitDaca;

Sfarsit Algoritm

2) S se
determine cel mai lung platou dintr-un vector de
numere ntregi, ordonat cresctor.
Specificaia problemei este:
Intrare: n, a[i], i{0,1,...,n-1}
Un platou este caracterizat de o pereche de indici
(j,k) cu:
37

jk (a[j-1]<a[j]=a[k]<a[k+1]) iar lungimea lp=k+1-j.


Ieire: Cel mai lung platou este caracterizat de predicatul:
( j:0jn-p a[j]=a[j+p-1]) ( k:0kn-p-1) >
a[k]a[k+p])

prima abordare
Algoritmul platou Este:
i:=1;
scanare a tabloului a }
lp:=1;
platoului maxim }
CatTimp in-1 Executa
# determin lp
Sfarsit CatTimp
Sfarsit Algoritm

{ Problema platoului }
{
i este indicele de
{

lp conine lungimea

{ propoziie nestandard }

a doua rafinare
Algoritmul platou Este:
i:=1;
scanare a tabloului a }
lp:=1;
platoului maxim }
CatTimp in-1 Executa
Daca a[i-lp] a[i]
Sfarsit Daca;
i:=i+1;
Sfarsit CatTimp
Sfarsit Algoritm.

4.3.

STRUCTURA
4.3.1.

GENERAL

ISTORIC,

{ Problema platoului }
{
i este indicele de
{

Atunci

lp conine lungimea

lp:=lp+1;

UNUI

CONCEPIE ,
38

PROGRAM
EVOLUIE

Limbajul C a fost finalizat n 1972 de Dennis M. Ritchie


i Brian W. Kernighan de la firma american Bell Laboratories.
Prima versiune a limbajului se numete BCPL apoi urmtoarele
poart numele de A, B i C. Cei doi autori au dezvoltat aceste
prime versiuni n jurul sistemului de operare UNIX. La vremea
respectiv din aproximativ 13000 linii surs ale UNIX-ului
doar 200 de linii surs nu erau scrise n limbajul C. De acest
fapt se leag detractorii limbajului care spun c limbajul C
nu este un limbaj deosebit ci doar un fel de limbaj oficial
al sistemului de operare UNIX.
n anul 1978 apare manualul The C Programming Language
care este de fapt i prima standardizare a limbajului. Cei doi
autori intr astfel n istorie...
Dup anul 1980 odat cu dezvoltarea hardware apar i
primele PC-uri iar acestea implic i produse software
adecvate. Principalele
firme productoare de sofware
MICROSOFT
i
BORLAND - au dezvoltat unelte adecvate pentru
programarea i utilizarea limbajului C. Deocamdat firma
BORLAND deine supremaia prin versiunile mediului BORLAND C.
Cele mai folosite sunt versiunile 2.0, 3.1, 4.0. n ultimii
doi ani au aprut aa numitele medii visuale: VISUAL C
versiunile 4.5 i 5.0 care sunt de fapt extensii ale mediului
BORLAND C adaptate programrii orientate obiect i interfeei
grafice
WINDOWS 95. Mediile de programare BORLANDC
pot
compila 3 tipuri de programe surs C:
- fiiere cu extensia
.C
(fiiere cu programe
standard C);
- fiiere cu extensia .CP
(fiiere cu programe C+,
un C extins);
- fiiere cu extensia
.CPP
(fiiere cu programe C+
+).
Menionm c limbajul C++ a fost elaborat de Bjarne
Stroustrup de la AT&T. El este un superset al limbajului C i
permite
principalele
concepte
ale
programrii
prin
abstractizarea datelor i programrii orientate spre obiecte.
Limbajul C este un limbaj hibrid avnd faciliti
caracteristice limbajelor de asamblare ct i faciliti ale
limbajelor de nalt nivel.
Cteva dintre principalele caracteristici
ale limbajului C
sunt:
a) portabilitate:
chiar dac acest concept
nu-i
definit
foarte
riguros
spunem c
c
un
program
este
portabil dac el poate
fi transferat uor de la
un tip de calculator la altul; limbajul C este
un astfel de limbaj;
b) flexibilitate:
compilatorul
face
un
numr mai
redus de controale (face multe
39

conversii implicite);
b) programare structurat: limbajul are principalele structuri
ale programrii structurate:
structura
secvenial, structuraiterativ structura de selecie;
d) compactizare:
unele instruciuni sunt scrise foarte
compact; de exemplu i:=i+1
se poate scrie mai scurt ca i++;
e) lucrul pe bii i calcule cu adrese.

4.3.2.

CONCEPTUL

DE

FUNCIE

Un program C se compune din una sau mai multe funcii.


Funcia este o unitate lexical de program compilabil
independent. Una dintre funcii este funcie principal,
numele ei este predefinit i anume main. Execuia programului
ncepe cu prima instruciune din funcia principal. Dm n
continuare 2 exemple de structuri de program (fiiere surs):
1)

directive de preprocesare
directive de preprocesare
declaraii
declaraii de date globale

implementare funcia f1
. . .
implementare funcia fn

2)
de

date

declaraie

prototip

funcia
.

declaraie

prototip

void

void main(void)
{

globale

declaraii

funcia

f1
.
fn

main(void)
declaraii
instruciuni

instruciuni

}
implementare funcia f1
. . .
implementare funcia fn
Funcia principal main este
40

obligatorie pentru orice

program celelalte elemente fiind


optionale. Pentru ca o
anumit funcie s poat fi apelat e necesar ca ea s aib
declarat prototipul dac implementarea (definiia) ei se afl
dup funcia main (exemplul 1). Dac funcia principal se
afl la sfritul fiierului atunci nu mai e necesar
prototipul funciei apelate ci doar implementarea ei (exemplul
2). Comparnd structura unui program C cu structura unui
program PASCAL se observ nivelul de imbricare diferit. n
PASCAL apare o imbricare a procedurilor i funciilor pe cnd
n C nu exist o astfel de imbricare (rmne la nivelul
fiecrei funcii dac e cazul).
PASCAL
C

...

4.3.2.1.

Definiia

unei

funcii

Definiia unei funcii n limbajul C se compune din


antet i corp. O funcie poate fi apelat dac este precedat
de definiia sau de prototipul ei. Aceste lucruri care sunt
valabile n limbajul C se regsesc i n limbajul C++.

4.3.2.2. Antet

prototip

Antetul simplificat al unei funcii n C are formatul:


tip

nume_funcie (lista_parametrilor_formali)

unde: tip - reprezint tipul valorii returnate de funcie


sau dac funcia nu
returneaz nici o valoare se pune cuvntul cheie
void;
nume_funcie reprezint un identificator clasic
format dintr-un mixaj
de litere i cifre, primul caracter fiind
obligatoriu litera;
41

printre litere se numr i liniua de


subliniere;
lista_parametrilor_formali
nume de variabile separate
prin virgule.
Exemple:
1) double radical (double x)
returneaza valoarea gasita

// calculeaza radacina patrata din x si

2) double radical_n (double x, int n) // calculeaza radacina de ordinul n din x

Prototipul unei funcii este


sfrit se pune caracterul ;

4.3.2.3.

asemntor

Corpul

unei

antetului

dar

la

funcii

Corpul unei funcii C se compune din declaraii de


variabile locale i instruciuni scrise ntre acolade conform
figurii de mai jos.
{ declaraii
instruciuni
}
i pentru c autorii limbajului C consider c un limbaj
de programare se nva mai repede scriind i executnd
programe ct mai timpuriu vom da un mic exemplu de funcie.
int modul (int i)
retruneaza aceasta valoare
{ if (i < 0)
return i;
if (i = = 0) return 0;
else
return i;
}

4.4. EXPRESII,

// determina valoarea absoluta a intregului i si

OPERANZI,
4.4.1.

OPERATORI
EXPRESII

O expresie n limbajul C este format fie dintr-un


operand fie din mai muli operanzi legai ntre ei prin
operatori. O expresie are o valoare i un tip care se
determin
aplicnd
operatorii
conform
prioritilor
i
asociativitii acestora.
n limbajul C operatorii se asociaz de la stnga la
dreapta, exceptnd operatorii unari i de atribuire, care se
asociaz de la dreapta la stnga.. Totodat pot fi folosite
parantezele rotunde pentru a impune o anumit ordine n
executarea operaiilor.

4.4.2. OPERANZI
42

Un operand n limbajul C poate fi una din urmtoarele


elemente:
- o constant;
- o constant simbolic;
- numele unei variabile simple;
- numele unui tablou;
- numele unei structuri;
- numele unei funcii;
- referirea la elementul unui tablou (variabil cu indici);
- referirea la elementul unei structuri;
- apelul unei funcii;
- o expresie inclus n paranteze rotunde.
Exemple:

9876

- constant ntreag;
x
- variabil simpl;
t[i][3]
-

variabil cu indici;
constant hexazecimal;
nume de tablou;

0xabcd

(expresie)
expresie inclus n paranteze rotunde.
f1
numele unei funcii

4.4.3.

OPERATORI

Operatorii limbajului C pot fi grupai n mai multe


clase, dar oricum ei pot fi folosii mpreun ntr-o aceeai
expresie. Operatorii au ariti diferite: unari, binari,
ternari i totodat
o anumit prioritate implicit care e
redat n tabelul de mai jos. Operatorii de aceeai prioritate
se afl trecui n aceeai linie. Liniile tabelulul conin
operatorii
limbajului
C
n
ordinea
descresctoare
a
prioritilor. Astfel n prima linie se afl operatorii de
prioritate maxim, iar n ultima linie operatorul virgul cu
prioritatea cea mai mic. Cu excepia operatorilor ., >,&,*, a parantezelor rotunde (folosite la definiia i
apelul funciilor) i a parantezelor drepte (folosite la
variabilele cu indici) ceilali operatori vor fi explicai n
aceast lecie.
( )
[ ] . ->
- (unar) +(unar)
(tip) sizeof
*
/
%
+
<<
>>
<
<=
>=
>

*(unar)

&(unar)

43

++ --

= =
!=
&
^
|
&&
| |
? : (ternar)
= op=
op poate fi: *(binar)
(binar) << >> & ^ |
,

4.4.3.1.

Operatori

+(binar)

aritmetici

Lista operatorilor aritmetici este redat mai jos:


(minus unar);
(plus unar);
*
/
% operatori binari multiplicativi; (nmulire,
mprire, restul mpririi ntregi);
+ - operatori binari aditivi (adunare i scdere).
+

Operatorii de pe aceeai linie au aceeai prioritate. Cei


unari au prioritate mai mare dect cei binari. Operatorii
multiplicativi au prioritate mai mare dect cei aditivi.
Exemple:
int i,j,k;
float x,y;
double t[10];
// se dau cateva exemple de expresii folosind operatorii aritmetici
i*x+t[5];
-y+k;
i%j;
i/j;
x*-y;

4.4.3.2.

// daca i=9 si j=4 atunci i%j are valoarea 1


// daca i=9 si j=4 atunci i/j are valoarea 2
// - este operatorul unar deci avem x*(-y)

Operatori

relaionali

Lista operatorilor relaionali este redat astfel:


<
(mai mic)
<=
(mai mic sau egal; cele dou caractere ce
operatorul sunt concatenate)
>
(mai mare)
>=
(mai mare sau egal; cele
operatorul sunt concatenate)

dou

caractere

ce

compun

compun

Toi operatorii relaionali au aceeai prioritate. Ea


este
mai
mic
dect
prioritatea
operatorilor
aditivi.
Rezultatul aplicrii unui operator relaional este 1 sau 0,
dup cum operanzii se afl n relaia definit de operatorul
respectiv sau nu.
44

Exemple:
atunci

a= 4 i b= -5
a>0
a<=0
are
a+b>0
a>=b
are
a<0
are
a+b>=b-a
are
a+b>=(b-a)*(b-a)

4.4.3.3.

are valoarea 1;
valoarea 0;
are valoarea 0;
valoarea 1;
valoarea 0;
valoarea 1;
are valoarea 0;

Operatori

de

egalitate

Lista operatorilor de egalitate este redat mai jos:


= = (egal; dou semne = concatenate)
!=
(diferit; semnele sunt concatenate).
Operatorii de egalitate au ambii aceeai prioritate i
este imediat mai mic dect a operatorilor relaionali.
Operatorul = = testeaz egalitatea a doi operanzi. Dac
operanzii sunt egali atunci rezultatul operaiei = = este 1,
n caz contrar este 0. Operatorul != furnizeaz rezultatul 1
cnd cei doi operanzi sunt diferii i 0 cnd sunt egali.
Exemple:
a= 2 i b=-1
atunci
a= =b
are valoarea 0;
a!=b
are valoarea 1;
a*b!=a+b are valoarea 1;

4.4.3.4.
!
&&
||

Operatori

logici

Lista operatorilor logici este redat mai jos:


(negaia logic - operator unar);
(I logic);
(SAU logic).

Operatorul ! are aceeai prioritate cu operatorii unari


+ i -. Operatorul &&
este mai prioritar dect
operatorul ||, dar are o prioritate mai mic dect
operatorii de egalitate.
n limbajul C nu exist valori logice speciale. Valoarea
fals se reprezint prin zero. Orice valoare diferit de zero
reprezint valoarea adevrat.
Dac operatorul ! se aplic la un operand a crui
valoare este zero, atunci rezultatul este 1. Dac acelai
operator se aplic la un operand a crui valoare este diferit
de zero, atunci rezultatul este 0.
Dm n continuare
tabelele operatorilor logici binari
aplicate valorilor 0 i 1.
&&

||
45

sau exclusiv
0

0
0

Chiar dac pentru sau exclusiv nu exist operator el se


poate realiza prin expresia urmtoare aplicat operanzilor a
i b:
!a&&b||!b&&a sau folosind parantezele rotunde ((!a)
&&b)||((!b)&&a).
Operatorii logici se evalueaz de la stnga la dreapta.
Dac la evaluarea unei expresii se ajunge ntr-un punct n
care se cunoate valoarea ntregii expresii, atunci restul
expresiei nu se mai evalueaz.
Dac a=0 i b=1 atunci expresia ! a||b are valoarea 1 pentru
c !a are deja valoarea 1.

4.4.3.5.

Operatori

logici

pe

bii

Lista operatorilor logici pe bii este redat mai jos n


ordinea descrectoare a prioritilor:
~
(operator unar; complement fa de 1)
>> <<
(deplasri
la
dreapta,
respectiv
la
stnga)
&
(I pe bii)
^
(SAU-EXCLUSIV pe bii)
|
(SAU pe bii)
Operatorul ~, fiind unar, are aceeai prioritate ca i
ceilali operatori unari ai limbajului C. El schimb fiecare
bit 1 al operandului n 0 i invers.
Operatorul
>> realizeaz deplasarea la dreapta care
este echivalent cu o mprire ntreag cu puteri a lui 2; a
>> 3 este echivalent cu [a/23].
Operatorul
<< realizeaz deplasarea la stnga care
este echivalent cu o nmulire cu puteri a lui 2;
a << 3
este echivalent cu a*8.
Pentru operatorii &,
operaiilor:
^

&

|,

^ dm n continuare tabelele
|

0
1

Observaii:
1o. Operanzii care nu ocup un cuvnt (16 bii) se extind la un
46

cuvnt. De exemplu expresia ~0 are ca rezultat un cuvnt cu


toi bii egali cu 1.
2o. Operatorii logici pe bii se execut bit cu bit spre
deosebire de operatorii logici care se evalueaz global. De
exemplu dac x=2 i y=1 sunt variabile de tip int atunci:
x&&y
are valoarea 1 pentru c ambii operanzi
sunt diferii de 0.
x&y
are
valoarea
0
conform
schemei de mai jos
0000 0000 0000 0010
0000
0000
0000 0001
&
0000 0000 0000 0000
3o. Operatorul & se folosete frecvent pentru a anula bii din
configuraia unui cuvnt, iar operatorul
|
pentru a seta
(pune) bii ntr-un anumit mod;
4o. Operanzii trebuie s fie ntregi (de tipul int sau long).
5o. Atenie la deplasri nu se modific valoarea operandului;
deci trebuie s facem o atribuire; de exemplu a = a << 3 va
modifica valoarea lui a pe cnd a << 3 nu modific valoarea
lui a.
Exemple:
1) Fie declaraia:
int i;
atunci expresia i >> 8 & 255 are ca rezultat valoarea celui
mai semnificativ octet a lui i; i >> 8 deplaseaz octetul
mai
semnificativ
al
lui
i
n
poziia
mai
puin
semnificativ; se face apoi un I logic pe bii cu masca 255
care pstreaz octetul mai puin semnificativ.
2)

Fie expresia: (x >> 6) & ~(~ 0 << 3)


S presupunem c x are valoarea n bii
1010
1011
1000 1101.
Atunci x>>6 are valoarea
1111
1110 1010 1110
Al doilea operand pregtete o masc astfel:
~0
~0<<3
~(~0<<3)

1111 1111 1111 1111


1111 1111 1111 1000
0000 0000 0000 0110

Rezultatul final este dat de:


0000 0000 0000 0111
1111 1110 1010 1110
0000 0000 0000 0110
Practic s-a obinut valoarea biilor 8,7,6 a lui x (numerotai
de la dreapta la stnga ncepnd cu 0).
47

4.4.3.6.

Operatori

de

atribuire

n forma cea mai simpl operatorul de atribuire


noteaz cu = i se utilizeaz n construcii de forma:
v=expresie;

se

(v este fie o variabil simpl, fie variabil cu indici sau un


element de structur).
Aceast construcie se mai numete expresie de atribuire.
Ea este considerat ca fiind un caz particular de expresie.
Tipul ei coincide cu tipul lui v, iar valoarea ntregii
expresii este chiar valoarea atribuit lui v.
O expresie de forma:

v1=(v=expresie);

este i ea legal i se efectueaz n felul urmtor :


- se evalueaz expresia expresie i valoarea ei se atribuie
lui v;
- valoarea lui v se atribuie apoi i lui v1.
Deoarece operatorii de atribuire se asociaz de la dreapta la stnga, expresia de mai
sus se poate scrie i fr paranteze: v1=v=expresie;
n general, putem
expresie de forma:

realiza

atribuiri

multiple

printr-o

vn =. . . =v1=v=expresie
Dac expresia din dreapta semnului egal are un tip diferit de
cel al variabilei v, atunci nti valoarea ei se convertete
spre tipul variabilei v i pe urm se realizeaz atribuirea,
Pentru operaia de atribuire, n afara semnului egal se
mai poate folosi i succesiunea :
op=
unde prin op se nelege unul din operatorii binari aritmetici sau logici pe bii, adic unul din
urmtorii:
% / * - + & ^ | << >>
Acest mod de construcie se folosete pentru a compacta un anumit tip de atribuire. Astfel
expresia:
v op = expresie;
este identic cu expresia de atribuire:
v = op expresie;
Exemple:
int i, j;
double x, y;
int v[10];

48

i=5;
j=10;
x=y=10.01;
i +=1;
x*=3;
j<<=10;
v[i]*=i
x /= x-y

4.4.3.7.

//
//
//
//
//

echivalenta
echivalenta
echivalenta
echivalenta
echivalenta

Operatori

cu i=i+1 si cu i++
cu x=x*3
cu j=j<<10
cu v[i]=v[i]*i
cu x = x/(x-y)

de

incrementare

decrementare

Aceti operatori sunt unari i au aceeai prioritate cu ceilali operatori unari ai


limbajului C. Operatorul de incrementare se noteaz prin ++ i mrete valoarea
operandului cu unu, iar operatorul de decrementare se noteaz prin - - i micoreaz
valoarea operandului cu unu. Operatorii sunt folosii prefixat i postfixat. Astfel operatorii
prefixai au notaia:
++operand; - - operand;
Ei se aplic mai nti i apoi se folosete valoarea lor.
Astfel operatorii postfixai au notaia:
operand++; operand - -;
Se folosete valoarea operanzilor i apoi se aplic incrementarea sau decrementarea.
Menionm c aceti operatori se pot aplica numai la urmtorii operanzi:
- variabil simpl;
- variabil cu indici;
- referire la elementul unei structuri.
Exemple:
int i,j;
double x,y;
int vector [5];
j=i++;
y=--x;
i=++vector[j]

// este echivalent cu j=i si i=i+1;


// este echivalent cu x=x-1 si y=x;
// este echivalent cu vector[j]=vector[j]+1 si i=vector[j]

4.4.3.8. Operatorul de conversie explicit (expresie cast)


Pentru forarea tipului unui operand se folosete o construcie de forma:
(tip) operand
Prin aceasta valoarea operandului se convertete spre tipul indicat n paranteze.
Exemplu:
int i,j;
double y;
i=8; j=5;
y=i/j;

// y are valoarea 1, pentru ca se face impartirea intreaga i/j

Dac vom converti operanzii i i j spre tipul double se va obine rezultatul corect adic 1.6.
49

Deci:
int i,j;
double y;
i=8; j=5;
y=(double) i / (double) j;

// y are valoarea 1.6,

Construcia (tip) este un operator unar prin care se expliciteaz conversia dorit. Are aceeai
prioritate ca restul operatorilor unari.

4.4.3.9. Operatorul dimensiune (sizeof)


Pentru a determina lungimea n octei a unei date se poate folosi construcia:
sizeof (data)
unde data poate fi:
- numele unei variabile simple;
- numele unui tablou;
- numele unei structuri;
- numele unui tip;
- referirea la elementul unui tablou sau structur.
Exemple:
int i;
long l;
float f;
double d;
char c;
int itablou[5];
double dtablou[5];
sizeof (i)
sizeof (l)
sizeof (f)
sizeof (d)
sizeof (c)
sizeof (itablou[1])
sizeof (dtablou[1])
sizeof (itablou)
sizeof (dtablou)

//
//
//
//
//
//
//
//
//

are valoarea 2;
are valoarea 4;
are valoarea 4;
are valoarea 8;
are valoarea 1;
are valoarea 2;
are valoarea 8;
are valoarea 10;
are valoarea 40;

50

4.4.3.10. Regula conversiilor implicite


n general o expresie C conine operanzi de tipuri diferite. Pentru operatorii binari
exist situaii cnd operanzii nu sunt de acelai tip i trebuie executate conversii astfel nct
operatorii s se aplice pentru operanzi de acelai tip. Aceste conversii le face automat
compilatorul. Exist o regul a conversiilor implicite care are urmtorii pai:
- fiecare operand de tip char se convertete spre tipul int i fiecare operand de tipul float
se convertete spre double;
- dac unul dintre operanzi este de tip double atunci i cellalt se convertete spre tipul
double i rezultatul va avea tipul double;
- dac unul dintre operanzi este de tip long, atunci i cellalt se convertete spre tipul long
i rezultatul va avea tipul long;
- dac unul dintre operanzi este de tip unsigned, atunci i cellalt se convertete spre tipul
unsigned i rezultatul va fi de tipul unsigned;
- la acest pas se ajunge numai dac ambii operanzi sunt de tip int i deci operaia se execut
cu operanzii respectivi, iar rezultatul va fi de tip int.
Aplicnd regula de mai sus pas cu pas (la fiecare operator n momentul efecturii lui), se
ajunge n final la evaluarea ntregii expresii i prin acesta se determin tipul expresiei. Regula
conversiilor implicite nu se aplic pentru operatorul de atribuire (valoarea expresiei din partea
dreapt a semnului de atribuire se convertete spre tipul variabilei din stnga semnului egal).
Exemple:
int i, j, k;
float a, b;
double x, y;
unsigned p;
long r;
char c;

expresii

conversii

i-j/k
a/b

nu
int
a spre double
b spre double
double
nu
double
a spre double
i spre double
double
i spre double
double
nu
int
i spre double
double
c spre int
int
10 spre double
double
10 spre unsigned
unsigned
5 spre long
long
se realizeaz mprirea ntreag ntre
i i j i rezultatul se convertete spre double

x+y
i+a
i-3.14
i+3
i+x
i-c
x+10
p-10
r*5
(double)(i/j)

tipul expresiei

Dac rezultatul unei operaii depete domeniul de valori ce corespunde tipului


rezultatului, valoarea respectiv se trunchiaz i rezultatul este eronat.
48

4.4.3.11. Operatori condiionali


Operatorii condiionali sunt ? i : i se folosesc mpreun n construcii de forma:
exp1 ? exp2 : exp3
Evaluarea se face astfel:
- se evalueaz expresia exp1;
- dac exp1 este diferit de zero, atunci valoarea i tipul expresiei condiionale sunt egale cu
valoarea i tipul expresiei exp2; altfel cu expresia exp3.
Exemplu: procesul de determinare a maximului a dou numere a i b este:
dac a>b

atunci max=a
altfel max=b

sfdac
n limbajul C se poate realiza acest proces cu ajutorul operatorilor condiionali astfel:
max= a>b ? a : b
Dac a>b atunci expresia condiional are valoarea i tipul lui a altfel expresia condiional
are valoarea i tipul lui b.

4.4.3.12. Operatorul virgul


Operatorul , este folosit pentru gruparea mai multor expresii ntr-una singur.
Cu ajutorul acestui operator (care are prioritatea cea mai mic) se construiesc expresii de
forma:
exp1, exp2,. . ., expn
Aceast expresie are valoarea i tipul ultimei expresii (deci a lui expn).
Exemplu:
k= (i=10, j=j+5; i+j)
Se execut pe rnd cele dou atribuiri de la stnga la dreapta din parantezele rotunde apoi se
face suma i+j i n final se atribuie aceast sum lui k.

4.5. INSTRUCIUNI
4.5.1.

SCURT

ISTORIC

AL

METODELOR

DE

PROGRAMARE

Vom prezenta n continuare cteva metode de programare


dar nu exhaustiv, nefiind aici cadrul adecvat (eventual ntrun curs de Software Engineering). O clasificare cronologic a
ceea ce vrem s prezentm ar fi urmtoarea:
a) programarea artizanal;
b) programarea procedural;
c) programarea modular;
d) programarea structurat;
e) programarea prin abstractizarea datelor;
49

f) programarea

orientat spre obiecte.

4.5.1.1.

Programare

artizanal

Aceast metod de fapt nu este o metod propriu-zis


ci este prima modalitate de programare odat cu
apariia calculatoarelor. Intuiia i experiena
programatorului joac un rol important. Fiecare
programator
i
are
propriile
reguli
de
programare. Programele sunt monolitice (un singur
corp de instruciuni), lungi i greu de neles de
alt programator. nsui cel ce a elaborat un
astfel
de
program
ntmpin
dificulti
de
nelegere a propriului program dup un timp
oarecare.
4.5.1.2.

Programare

procedural

Odat cu apariia primelor limbaje de nalt nivel se


utilizeaz programarea procedural. Necesitatea ca anumite
secvene de program s fie folosite de mai multe ori duce la
organizarea acestora n uniti distincte de program numite n
diverse limbaje subprograme, subrutine, proceduri, etc. De
multe ori procedurile trebuie s fie generale deci procesarea
s fac abstractizare de valorile datelor. De exemplu o
procedur de calcul al radicalului de ordinul 2 trebuie s
calculeze acest lucru din orice numr real pozitiv iar pentru
cele negative s semnaleze eroare. Procedurile trebuie deci
parametrizate cu anumite variabile
numite parametri formali.
Valorile de la apel ale parametrilor formali se numesc
parametri efectivi. Programarea procedural are la baz deci
utilizarea
procedurilor,
iar
acestea
realizeaz
o
abstractizare prin parametri.
La apelare o procedur
funcioneaz dup principiul cutiei negre (black box): se
cunosc intrrile i ieirile rezultate din acestea dar nu i
modul de transformare care nu e important n acest moment.
n majoritatea limbajelor procedurale de programare se
consider 2 categorii de proceduri:
- proceduri care definesc o valoare de revenire (denumite i
funcii);
- proceduri care nu definesc o valoare de revenire.
n limbajele C i C++ procedurile de ambele categorii se
numesc funcii.

4.5.1.3.

Programarea

modular

Pe msur ce complexitatea aplicaiilor a crescut, a


aprut ideea de a descompune problemele n subprobleme mai
50

simple care la rndul lor pot fi descompuse n altele mai


simple i aa mai departe. n felul acesta se ajunge la o
descompunere arborescent a problemei date n subprobleme mai
simple. Programarea subproblemelor devine o problem mai
simpl i fiecare subproblem are o anumit independen fa
de celelalte subprobleme. De asemenea, interfaa ei cu
celelalte subprobleme este limitat i bine precizat prin
procesul de descompunere a problemei iniiale. De obicei,
programarea unei subprobleme, component a descompunerii
arborescente a problemei iniiale, conduce la realizarea unui
numr relativ mic de proceduri (funcii). Aceste funcii pot
prelucra n comun anumite date. Unele dintre ele sunt
independente de funciile realizate pentru alte subprobleme
componente ale descompunerii arborescente. Altele realizeaz
chiar interfaa cu subproblemele nvecinate.
Despre funciile obinute n urma programrii unei
subprobleme se obinuiete s se spun c sunt nrudite. De
obicei, aceste funcii, mpreun cu datele pe care le
prelucreaz, se pstreaz ntr-un fiier i se compileaz
independent.
O colecie de funcii nrudite, mpreun cu datele pe
care le prelucreaz n comun formeaz un modul. n felul
acesta, problema iniial se realizeaz printr-un program
alctuit din module.
Programarea modular are la baz elaborarea programelor
pe module.
O parte din datele utilizate n comun de funciile
modulului, sau chiar toate datele modulului, nu sunt necesare
i n alte module. Aceste date pot fi protejate sau cum se mai
spune, ascunse n modul.
Limbajul C i C++, permite ascunderea datelor n modul
folosind date care au clasa de memorie static. Mai mult, pot
fi declarate i funciile ca statice i atunci ele vor fi
ascunse n modul (nu pot fi apelate din afara modului).
Ascunderea funciilor n modul se face pentru acele funcii
care nu se utilizeaz la realizarea interfeei modulului cu
celelalte module. Ascunderea datelor i funciilor n module
permite protejarea datelor i prentmpin utilizarea eronat
a funciilor.

4.5.1.4.

Programarea

structurat

Descompunerea unei probleme n subprobleme mai simple se


poate face succesiv n mai multe etape,
pn cnd
subproblemele
sunt
direct
programabile
sub
forma
unor
proceduri sau module. Aceast descompunere succesiv se mai
numete rafinare pas cu pas (stepwise refinement).. Evident c
se obine o descompunere arborescent. Procedurile se pot
organiza sau nu n module. n cadrul procedurilor se folosesc
anumite structuri de control a execuiei. Aceasta impune o
anumit disciplin a programrii. Structurile de control de
sunt:
51

a) secvena;
b) iteraia (pretestat, posttestat, cu numr prestabilit de
ciclri);
c) alternativa (simpl, complet, generalizat).
Instruciunea
de
baz
(primitiv)
n
cadrul
acestor
structuri de control este instruciunea de atribuire.
Aceast abordare a programrii s-a nscut din necesitatea
eliminrii instruciunii de control GO TO care face saltul
necondiionat
la
o instruciune precizat, alta dect
instruciunea
urmtoare
ei.
Profesorul
Dijsktra
de
la
Universitatea din Eindhoven spunea, prin anul 1965, calitatea
unui programator este invers proporional cu numrul de
instruciuni GO TO folosite i a impus D-structurile de
control:
a) secvena;
b) iteraia pretestat;
c) alternativa simpl.
D-structurile se regsesc n toate limbajele procedurale.
Corespondena ar fi:
a) secvena este echivalent
cu execuia
instruciunilor
n ordinea scrierii lor n
programul surs;
b) iteraia pretestat echivalent cu WHILE ... DO;
c) alternativa simpl echivalent cu IF ... THEN.
O ilustrare grafic a celor trei D-structuri se d n
continuare.

S1
da
C
S

da
nu

S2

nu

Sn

S-a demonstrat ulterior (Bohm i Jacopini) c orice


algoritm se poate descrie doar cu D-structurile dar pentru o
mai bun lizibilitate i nelegere a programelor surs s-au
adugat i iteraia postestat (REPEAT ... UNTIL), iteraia cu
numr prestabilit de ciclri (FOR ... DO), alternativa
complet (IF ... THEN ... ELSE) i alternativa generalizat
(CASE ... OF).
n unele limbaje se folosesc i alte structuri pe lng cele
de mai sus pentru o ct mai fidel reflectare a algoritmului.

4.5.1.5.
52

Programarea

prin

abstractizarea

datelor

n toate aceste tehnologii anterioare se urmrete mai


mult organizarea programului i mai puin rezolvarea ct mai
natural a problemei. Programarea prin abstractizarea datelor
i programarea orientat spre obiecte propun metodologii n
care conceptele deduse din analiza problemei s poat fi
reflectate ct mai fidel n program i s se poat manevra cu
instanieri
ale
acestor
concepte
ct
mai
natural.
Se
realizeaz o mai mare fidelitate a programului fa de
problem. De exemplu dac ntr-o problem n care se
proceseaz numere complexe e nevoie s se lucreze ntr-o form
ct mai apropiat cu forma matematic se poate introduce tipul
COMPLEX (tip care nu exist n limbajele de programare) i
apoi se pot declara variabile de acest tip. Mai mult ar trebui
s se poat face toate operaiile matematice asupra datelor de
tip COMPLEX. n general un TAD (Tip Abstract de Date) are dou
componente fundamentale:
datele membru (reflect reprezentarea tipului);
funciile membru (reflect comportamentul tipului).

4.5.1.6.

Programarea

orientat

spre

obiecte

Un neajuns al programrii prin abstractizarea datelor


este faptul c nu permite exprimarea legturilor dintre
diferite concepte (TAD-uri). Singura legtur dintre concepte
care se poate exprima, este aceea c datele membru ale unei
clase pot fi obiecte ale unei alte clase. Acest lucru nu este
suficient n cazul n care conceptele sunt strns dependente
ntre ele formnd structuri ierarhice. Exprimarea ierarhiilor
conduce la atribute suplimentare cum sunt cele de motenire.
Aceste atribute conduc la un nou model de programare pe care
l numim programare orientat obiect.
n vrful unei ierarhii se afl fenomenul sau forma de
existen care are trsturi comune pentru toate celelalte
componente ale ierarhiei respective. Pe nivelul urmtor al
ierarhiei se afl componentele care pe lng trsturile
comune
de
pe
nivelul
superior,
mai
au
i
trsturi
suplimentare, specifice. O ierarhie, de obicei, are mai multe
nivele, iar situarea unui element pe un nivel sau altul al
ierarhiei este uneori o problem deosebit de complex. Dm n
exemplul urmtor o ierarhie arborescent pentru conceptele de
paralelogram, dreptunghi, romb i ptrat.
Paral
elogram

Romb

Dreptunghi

P
53

trat

Dac paralelogramul se afl n vrful ierarhiei atunci pe


nivelul
imediat
inferior
se
aeaz
dreptunghiul
(paralelogramul
cu
un
unghi
drept)
dar
i
rombul
(paralelgramul cu
2 laturi alturate congruente). Apoi
ptratul se poate defini fie ca un dreptunghi cu laturile
congruente fie ca un romb cu un unghi drept. Conceptul de pe
fiecare
nivel
se
observ
c
motenete
proprietile
conceptului imediat superior din care este derivat.
La ora actual, toate ramurile cunoaterii tiinfice
sunt pline de ierarhii rezultate n urma clasificrii
cunotinelor acumulate n perioada lung de observare a
fenomenelor i formelor de existen a lumii materiale i
spirituale. Clasificrile ierarhice ale cunotinelor pot fi
ntlnite att n domeniile care pleac de la cele mai
concrete forme ale lumii materiale, cum sunt botanica,
zoologia, biologia, etc ct i n domenii care studiaz
concepte dintre cele mai abstracte, cum ar fi matematica sau
filozofia.
Aceste ierarhii sunt rezultatul definirii conceptelor
dup regula includerii genul proxim i diferena specific.
Limbajul C dispune de un set bogat de instruciuni care
permit scrierea de:
- programe structurate,
- programe flexibile,
- programe compacte.
Totodat limbajul C permite aplicarea metodelor de
programare procedural, programare modular i programare
structurat. Pe lng aceste metodologii limbajul C++ permite
i programarea prin abstractizarea datelor i programarea
orientat spre obiecte.
Vom descrie
n continuare instruciunile limbajului C.
Ca o caracteristic sintactic toate instruciunile limbajului
se termin prin caracterul ;, excepie fcnd instruciunile
care se termin cu acolada nchis.

4.5.2.

INSTRUCIUNEA VID

Instruciunea vid se reduce la caracterul ;. Ea nu are nici un efect. Adesea este nevoie
de ea la construcii n care se cere prezena unei instruciuni, dar nu este necesar s se execute
nimic n punctul respectiv.

4.5.3.

INSTRUCIUNEA

EXPRESIE

Instruciunea expresie se obine scriind punct i virgul


dup o expresie, deci:
54

expresie;
Exist cazuri particulare ale instruciunii expresie:
1) expresia de atribuire, care de altfel este cel mai important
caz particular al instruciunii expresie:
expresie;
2) apelul unei funcii:
nume_funcie (par1, par2, . . . parn);
3) incrementrile i decrementrile pre i post fixate:
variabil++; ++variabil;
variabil- -; - - variabil;
Exemplu:
void main (void)
{ int i;
float f;
double d;
i=10;
// instructiune de atribuire
i++;
// i se mareste cu 1
f=i;
// instructiune de atribuire (valoarea lui i se converteste in float)
d=++f;
// incrementare lui f si atribuirea valorii lui d
putchar(a);
// instructiune de apel
}

4.5.4.

INSTRUCIUNEA

COMPUS

Instruciunea compus este o succesiune de declaraii


urmate de instruciuni, succesiune inclus ntre acolade:
{
declaraii
instruciuni
}
Pot lipsi declaraiile sau instruciunle dar nu n
acelai timp. Dac delaraiile sunt prezente, atunci ele
definesc variabile care sunt valabile numai n instruciunea
compus respectiv.
Exemplu:
. . .
{ int i=100;
// variabila i este definita in aceasta instructiune compusa
i++;
// i are valabilitate doar intre acolade; dupa acolada inchisa i isi
printf (i=%d\n,i); // pierde valabilitatea
}
Observaii:
1o. Dup acolada inchis a unei instruciuni compuse nu se pune
;.
2o.
Corpul
unei
funcii
are
aceeai
structur
ca
i
instruciunea compus, deci o funcie are formatul:
55

antetul funciei
instruciune compus

4.5.5.

INSTRUCIUNEA

if

Instruciunea if permite s realizm o ramificare a


execuiei n funcie de valoarea unei expresii. Ea are dou
formate ce permit aplicarea structurii de alternativ simpl
i compus.
Formatul 1:
if (expresie) instructiune;
Efectul:
1) se evalueaz expresia din paranteze;
2) dac valoarea expresiei este diferit de zero (deci conform
conveniei are valoarea adevrat), atunci se execut
instructiune, altfel se trece la instruciunea urmtoare.
Formatul 2:

if (expresie)
else

instructiune_1;
instructiune_2;

Efectul:
1) se evalueaz expresia din paranteze;
2) dac valoarea expresiei este diferit de zero (deci conform
conveniei are valoarea adevrat), atunci se execut
instructiune_1, altfel se execut instructiune_2; apoi n
ambele cazuri se trece la instruciunea urmtoare.
Observaii:
1o. Se pot folosi instruciuni if imbricate, nivelul de
imbricare fiind
oarecare (deci nu exist o limitare a
numrului de imbricri).
2o. Pentru mai multe imbricri se folosete regula asocierii
if-lui cu else astfel:
un else se pune n coresponden cu primul if care se afl
naintea lui n textul surs i nu este inclus n
instruciunea care l precede pe el i nici nu i corespunde
deja un else.
Exemple
void main (void)
{ float x,y,a;
x=-5;
y=10;
if (x<0)
if (y<0)
else
else a=0;
56

// ultimul else se asociaza cu primul if iar


a=1; // penultimul else se asociaza cu cel de-al doilea if
a=2;

}
void main (void)
{ float x,y,a;
x=-5;
y=10;
if (x<0)
{ if (y<0) a=1; }
compusa care
else a=0;
}

// ultimul else se asociaza cu primul if deoarece cel de-al


// de-al doilea if este inclus in instructiunea
// il precede pe if

void main (void)


// citeste trei intregi si scrie minimul dintre ei
{int i,j,k,min;
scanf (\ndati i=%d, &i);
scanf (\ndati j=%d, &j);
scanf (\ndati k=%d, &k);
if (i>j)
min=j;
else
min=i;
if (k<min)
min=k;
printf (min(%d,%d,%d)= %d\n,i,j,k,,min);
}

4.5.6.
Instruciunea while

INSTRUCIUNEA

while

are urmtorul format:

while (expresie) instructiune;


Cu ajutorul instruciunii while se realizeaz structura repetitiv pretestat (condiionat
anterior).
Efectul:
1) se evalueaz valoarea expresiei din paranteze;
2) dac expresia are valoarea diferit de zero, atunci se execut instructiune i se reia punctul
1), altfel se trece la instruciunea urmtoare instruciunii while.
Deci instructiune se execut repetat atta timp ct expresia din parantez este diferit de
zero. Se observ c dac expresia are valoarea zero de la nceput, atunci instructiune nu se
execut niciodat.
Antetul ciclului while este construcia while (expresie) iar instructiune formeaz corpul
ciclului. n cazul n care este necesar s se execute repetat mai multe instruciuni, se utilizeaz o
instruciune compus format din instruciunile respective.
Exemplu:
Vom crea un program care citete un ntreg n i scrie n!. Algoritmul n pseudocod este urmtorul:
Citeste n
f=1
i=2
CtTimp i<=n execut
57

f=f*i;
i=i+1
SfritCtTimp
Scrie n,f
Programul n C este:
#include<stdio.h>
void main (void)
{ int n,i;
double f;
f=1.0;
i=2;
printf(\n dati n= );
scanf(%d,&n);
while (i<=n)
{ f=f*i;
i++;
}
printf(\nn=%d, iar n!=%g\n,n,f);
}

Corpul ciclului while se poate scrie mai compact astfel:


while (i<=n) f*=i++;

4.5.7. INSTRUCIUNEA for


Instruciunea for, ca i instruciunea while, se utilizeaz pentru a realiza o structur
repetitiv pretestat. Formatul instruciunii este:
for(exp1; exp2; exp3) instructiune;
Antetul ciclului este definit de for(exp1; exp2; exp3) iar instructiune formeaz corpul
ciclului. Prima expresie exp1 constituie partea de iniializare a ciclului, iar exp3 este partea de
reiniializare a ciclului. Condiia de continuare a ciclului este exp 2. De obicei exp1 i exp3
reprezint atribuiri.
Efectul:
1) se execut secvena de iniializare definit de expresia exp1;
2) se evalueaz exp2; dac exp2 are valoarea zero, atunci se iese din ciclu, adic se trece la
instruciunea urmtoare instruciunii for, altfel se execut instruciunea din corpul ciclului;
3) se execut apoi secvena de reiniializare definit de exp3, apoi se reia secvena de la punctul
2).
Observaii:
1o. Ca i n cazul instruciunii while, instruciunea din corpul ciclului for poate s nu se execute
niciodat dac exp2 are valoarea zero chiar la prima evaluare.
58

2o. Expresiile din antetul instruciunii for pot fi i vide; totui caracterele ; vor fi ntotdeauna
prezente.
3o. Comparnd instruciunile for i while observm c instruciunea for cu formatul anterior se
poate realiza cu secvena urmtoare folosind while:
exp1;
while (exp2)
{ instructiune;
exp3;
}
Invers, o instruciune while de forma: while (exp) instructiune este echivalent cu
urmtoarea instruciune for:
for(; exp; ) instructiune.
Autorii limbajului C propun ca instruciunea for s se foloseasc cu prioritate pentru ciclurile
care au pas.
Exemple:
Vom da o secven de instruciuni care nsumeaz elementele unui tablou:
s=0;
for(i=0; i<n; i++) s=s+tab[i];
sau scris mai compact:
for (s=0, i=0; i<n; i++) s+=tab[i];
n continuare vom da un mic program care afieaz numrul caracterelor citite de la
intrarea standard stdin.
#include <stdio.h>
void main(void)
{ long n;
for (n=0; getchar()!=EOF; n++);
printf (\nnumarul caracterelor citite =%ld\n,n);
}
sau scris cu instruciunea while
#include <stdio.h>
void main(void)
{ long n=0;
while (getchar()!=EOF) n++;
printf (\nnumarul caracterelor citite =%ld\n,n);
}

4.5.8. INSTRUCIUNEA do-while


Aceast instruciune realizeaz structura repetitiv condiionat posterior (posttestat) dar
modificat fa de REPEAT .. UNTIL. Aceast instruciune s-a introdus pentru o mai mare
flexibilitate n scrierea programelor. Formatul ei este:
do
instructiune;
59

while (exp);
Efectul:
1) se execut instruciunea instructiune;
2) se evalueaz expresia exp din paranteze;
3) dac valoarea expresiei este zero se trece la instruciunea urmtoare instruciunii do-while;
altfel se revine i se execut din nou instructiune.
Observaii:
1o. Structura realizat de instruciunea do-while poate fi realizat printr-o secven n care se
folosete instruciunea while astfel:
instructiune;
while (exp) instructiune;
o
2 . Se observ c n cazul instruciunii do-while, corpul ciclului se execut cel puin odat, spre
deosebire de ciclurile while i for unde corpul ciclului poate s nu se execute niciodat.
Exemplu:
Vom da un program care calculeaz rdcina ptrat dintr-un numr real a>=0.
#include<stdio.h>
#define EPS 1e-10
void main (void)
{ double x1,x2,y,a;
clrscr();
printf(\ndati un numar real pozitiv a=);
if (scanf(%lf,&a) !=1 || a<0)
printf (numarul citit nu este pozitiv\n);
else {
x2 = 1.0;
do { x1 = x2;
x2 = 0.5 *(x1+a/x1);
if ((y=x2-x1) < 0) y = -y;
}
while (y >= EPS);
printf (radacina patrata din:%g este: %.2lf\n,a,x2);
} //sfirsit else
}

// sterge ecranul

// formula de iteratie

// 2 zecimale

4.5.9. INSTRUCTIUNEA switch


Instruciunea switch permite realizarea structurii alternativa generalizat. Ea este
echivalent cu o imbricare de structuri de alternativ simple. Utilizarea instruciunii switch face
n schimb programul mult mai clar.
Formatul instruciunii switch este urmtorul:
switch (exp)
{ case c1:
case c2:
...
case cn:
60

sir1
break;
sir2
break;
sirn
break;

default:

sir

}
unde:

c1,. . . cn sunt constante sau constante simbolice;


sir1, . . . ,sirn, sir sunt iruri de instruciuni.

Efectul:
1) se evalueaz expresia din parantez;
2) se compar pe rnd valoarea expresiei cu valorile constantelor c1, . . . , cn;
3) dac valoarea expresiei coincide cu valoarea lui ck, se execut secvena de instruciuni
definit prin sirk; n cazul n care valoarea expresiei nu coincide cu nici una din constantele
c1, . . . , cn, se execut secvena de instruciuni definit prin sir;
4) dup execuia secvenei sirk sau sir se trece la instruciunea urmtoare instruciunii switch,
adic la prima instruciune aflat dup acolada nchis care termin instruciunea switch
respectiv; evident, acest lucru are loc dac irul care se execut nu impune, el insui, un alt
mod de continuare a execuiei, de exemplu o revenire din funcia respectiv, un salt la o
anumit instruciune, etc.
Observaii:
1o. Ramura default nu este obligatorie. n lipsa ei, dac valoarea expresiei nu coincide cu nici
una din constantele c1,. . . , cn, instruciunea switch respectiv nu are nici un efect.
2o.Construcia break reprezint o instruciune. Ea termin fiecare ramur de instruciuni
sir1, . . . , sirn, provocnd saltul la instruciunea urmtoare instruciunii switch sau, cum se mai
spune, realizeaz ieirea din instruciunea switch.
3o. Instruciunea break nu este obligatorie. n cazul n care este absent, se execut secvenial
urmtoarea ramur. De exemplu dac avem secvena:
switch (exp)
{ case c1: sir1
case c2: sir2
}
ea se execut n felul urmtor:
- dac valoarea expresiei este egal cu c1 se execut sir1 i apoi sir2;
- dac valoarea expresiei este egal cu c2 se execut sir2;
- daca valoarea expresiei difera de valorile c1 i c2 instruciunea switch de mai sus nu
este efectiv, se trece la instruciunea urmtoare care urmeaz dup switch.
- secvena de mai sus se putea realiza i astfel:
if (exp = = c1)
{ sir1
sir2
}else if (exp = = c2) sir2
Exemplu:
Vom citi din fiierul de intrare construcii de forma: op1 operator op2, unde op1 i op2 sunt numere
ntregi (operanzi ntregi) iar operator este un operator aritmetic {+, -, *, /}. La ieire se
va scrie valoarea expresiei citite. De exemplu dac se citete secvena 100/3 se va afia
rezultatul 33. Programul permite citirea i evaluarea mai multor astfel de expresii, pn la
ntlnirea sfritului de fiier.
#include <stdio.h>

61

void main (void)


{ int op1,op2,operator,rezultat,i;
while (( i=scanf(%d %c %d, &op1,&operator, &op2)) != EOF)
if (i = = 3 )
// ramura adevarat inseamna ca s-au citit 3 campuri corecte
{ switch (operator)
{ case +: rezultat = op1 + op2 ;
// avem adunare
break;
case - : rezultat = op1 op2; // avem scadere
break;
case * : rezultat = op1 * op2;
// avem inmultire
break;
case / :
// avem impartire intreaga
if (op2 = = 0)
{ printf (divizor nul\n);
rezultat = 0;
} else rezultat = op1 / op2;
break;
default : printf (operator eronat\n);
rezultat = 0;
} // sfarsit switch
printf (%d %c %d %d\n, op1, operator, op2, rezultat);
} else
printf (expresie eronat\n);
// sfarsit if si while
}

4.5.10. INSTRUCIUNEA break


Formatul instruciunii este urmtorul:
break;
De obicei instruciunea break se folosete pentru a iei dintr-un ciclu. Dac exist mai
multe cicluri imbricate instruciunea break va trece controlul la ciclul de nivel imediat superior
(deci imbricarea rmne, nu se iese din toate ciclurile). O alt utilizare este n instruciunea
switch, dup cum am observat n paragraful anterior.
Un alt exemplu de utilizare frecvent este ieirea dintr-un ciclu infinit de forma:
for ( ; ; )
{. . .
if (exp) break;
...
}

4.5.11. INSTRUCIUNEA continue


Formatul instruciunii este urmtorul:
continue;
Efectul:
1) n ciclurile while i do-while ea realizeaz saltul la evaluarea expresiei care decide asupra
continurii ciclului;
2) n ciclul for ea realizeaz saltul la pasul de reiniializare.
62

Observaie:
1o. Instruciunea continue se utilizeaz numai n corpul unui ciclu, permind, dup caz, s se
treac la pasul urmtor al ciclului sau s se ias din ciclu.

4.5.12. INSTRUCIUNEA goto


Conform principiilor programrii structurate instruciunea goto nu ar fi necesar. Dar ea a
fost introdus n limbaj, deoarece, n anumite cazuri, se dovedete a fi util, asigurnd o
flexibilitate mai mare n programare. De multe ori ieirea dintr-un ciclu imbricat n alte cicluri se
realizeaz mai simplu cu ajutorul instruciunii goto. n lipsa ei ar trebui s folosim mai muli
indicatori i teste asupra valorilor acestora pentru ieirea din ciclu. Saltul fcut de goto se face la
o instruciune care este prefixat de o etichet.
Prin etichet vom nelege un nume urmat de caracterul :. Etichetele sunt locale unei
funcii.
Instruciunea goto are urmtorul format:
goto eticheta;
Efectul:
1) se realizeaz saltul la instruciunea prefixat de eticheta al crei nume se afl scris dup
cuvntul cheie goto.

4.5.13. APELUL I REVENIREA DINTR-O FUNCIE


4.5.13.1. Apelul unei funcii
n limbajul C funciile sunt de dou tipuri:
- funcii care returneaz o valoare la revenirea din ele;
- funcii care nu returneaz nici o valoare la revenirea din ele.
O funcie care nu returneaz nici o valoare la revenirea din ea se apeleaz printr-o
instruciune de apel. Ea are urmtorul format:
nume (lista_parametrilor_efectivi); (*)
unde:
- nume este numele funciei;
- lista_parametrilor_efectivi este fie vid, fie se compune din una sau mai multe
expresii separate prin virgul.
Instruciunea de apel este un caz particular al instruciunii expresie. Parametrii efectivi
(de la apel) trebuie s corespund cu cei formali (de la definirea funciei) prin ordine, tip i
numr.
n cazul n care o funcie returneaz o valoare, ea poate fi apelat fie printr-o
instruciune de apel, fie sub forma unui operand al unei expresii.
Observaii:
1o. Dac nu dorim s utilizm valoarea returnat de funcia respectiv, apelul se face printr-o
63

instruciune de apel.
2o. Dac dorim s utilizm valoarea returnat de funcie, vom folosi apelul funciei drept operand
ntr-o expresie, operandul avnd formatul (*).
Exemple de apeluri de funcii folosite pn acum sunt apelurile funciilor standard printf,
scanf, getchar i putchar. Funciile printf i putchar au fost apelate prin instruciuni de apel,
valorile returnate de ele nefiind utilizate. n schimb funciile scanf i getchar au fost apelate n
ambele moduri, att prin instruciuni de apel, ct i ca operanzi n diferite expresii.

4.5.13.2. Prototipul unei funcii


O funcie poate fi apelat dac ea este definit n fiierul surs nainte de a fi apelat.
Dup cum am prezentat n lecia 1 nu ntotdeauna este posibil acest lucru i n astfel de cazuri
apelul funciei trebuie s fie precedat de prototipul ei.
Prototipul unei funcii are ca scop s informeze compilatorul despre:
- tipul valorii returnate de funcie;
- tipurile parametrilor.
n felul acesta, la apelul unei funcii, compilatorul poate face teste cu privire la tipul
expresiilor care reprezint parametrii efectivi, precum i unele conversii necesare asupra valorii
returnate de funcie.
Observaii:
1o. Tipurile parametrilor pot s lipseasc. n acest caz, compilatorul nu controleaz tipurile
parametrilor efectivi, singura informaie coninut de prototip fiind tipul valorii returnate de
funcia respectiv.
2o. Absena att a prototipului unei funcii, ct i a definiiei funciei nainte de a fi apelat este
posibil; n acest caz se presupune c funcia returneaz o valoare de tip int.
3o. n practic se recomand utilizarea prototipurilor pentru toate funciile nainte de a fi apelate.
n acest scop, ele vor fi scrise la nceputul fiierelor surs.
Formatele posibile ale unui prototip sunt:
formatul 1:tip nume (lista_declaratiilor_de_parametri);
formatul 2:tip nume (lista_ tipurilor_parametrilor);
formatul 3:tip nume (void);
formatul 4:tip nume ();
Formatul 2 este cel mai utilizat. Formatul 3 se poate folosi pentru orice funcie care nu
are parametri. Formatul 4 se poate folosi pentru orice funcie la al crei apel nu se doresc teste
referitoare la tipul parametrilor efectivi.
Funciile din biblioteca standard a limbajului C au prototipurile definite n fiierele de tip
.h.

4.5.13.3. Apel prin valoare i apel prin referin


La apelul unei funcii, fiecrui parametru formal i se atribuie valoarea parametrului
efectiv care-i corespunde. Deci, la apelul unei funcii se transfer valorile parametrilor efectivi.
Din aceast cauz se spune c apelul este prin valoare (call by value). n anumite limbaje de
programare, la apel nu se transfer valorile parametrilor efectivi ci adresele acestora. n acest caz
se spune c apelul este prin referin (call by refference).
ntre cele dou tipuri de apeluri exist o diferen esenial i anume: n cazul apelului
64

prin valoare funcia apelat nu poate modifica parametrii efectivi din funcia apelant, neavnd
acces la ei. n cazul apelului prin referin, funcia apelat, dispunnd de adresele parametrilor
efectivi, i poate modifica.
n limbajul C apelul se realizeaz implicit prin valoare. n cazul c un parametru este
numele unui tablou atunci transferul se realizeaz prin referin deoarece numele unui tablou este
un pointer i conine adresa primului element al tabloului. Transferul prin referin se realizeaz
cu ajutorul variabilelor de tip pointer i cu ajutorul operatorului de adres (&).

4.5.13.4. Revenirea dintr-o funcie


Revenirea dintr-o funcie se poate face n dou moduri:
- la ntlnirea instruciunii return;
- dup execuia ultimei sale instruciuni, adic a instruciunii care precede acolada
nchis ce termin corpul funciei respective.
Instruciunea return are dou formate:
return; sau

return expresie;

Primul format se utilizeaz


cnd funcia nu returneaz o valoare, iar cel de-al doilea
cnd funcia returneaz o valoare. n acest ultim caz, funcia returneaz valoarea expresiei
specificate.
Observaie:
1o. Cnd revenirea se face dup execuia ultimei instruciuni a funciei nu se returneaz o valoare;
revenirea n acest caz, se face ca i cum acolada nchis de la sfritul corpului funciei ar fi
precedat de instruciunea return.
Exemplu: vom da un exemplu de apel al funciei care determin rdacina ptratic dintr-un
numr nenegativ.
#include<stdio.h>
double radacina_2 (double)
void main (void)
{ double d;
clrscr();

// prototipul functiei
// functia principala care citeste d
// si afiseaza radacina patrata din d
// sterge ecranul

if (scanf (%lf,&d) != || d<0)


printf (numarul dat este eronat\n);
else
printf (d=%f, radacina patrata = %.10g\n, d, radacina_2(d));
#define EPS 1e-10
double radacina_2 (double x)
{ double x1,x2,y;
x2 = 1.0;
do { x1 = x2;
x2 = 0.5 *(x1+x/x1); // formula de iteratie
if ((y=x2-x1) < 0) y = -y;
}
while (y >= EPS);

65

return x2;
}

Observaie:
1o. Limbajul C dispune de o bibliotec matematic n care sunt incluse o serie de funcii pentru
calculul valorilor funciilor elementare. Exist o funcie numit sqrt (cu prototipul double sqrt
(double);). Fiierul care conine biblioteca matematic se numete math.h i trebuie inclus n
fiierul surs de lucru dac se dorete utilizarea funciilor definite n el.
Pentru algoritmul palindromului, scris n pseudocod, dm i varianta n limbajul C:
#include<stdio.h>
#include<conio.h>
void main(void)
{ long n,m,x;
int c;
printf ("\ndati un numar natural:");
scanf ("%ld",&n);
x=n;
m=0;
while (x > 0)
{ c = x % 10;
m = m*10+c;
x = x / 10;
}
if (n == m) printf ("numarul %ld este palindrom",n);
else
printf ("numarul %ld nu este palindrom",n);
getch();
}

66

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