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 1 considerm 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 1 1 0 1

v(qp) v(pq) 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 0 1 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 0 1

Tabelul 1.2. Definirea operaiei DEFINIIA 1.5. Operaia unar notat ! definit prin tabelul 3.3. se numete negaie. x 0 1 !x 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) a a = a a b = b a a a b = a ! (ab) = !a !b a 0 = a a 1 = 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 0 1

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 0 0 0 0 ... 1 1 x2 0 0 0 0 ... 1 1 ... ... ... ... ... ... ... ... xn-1 0 0 1 1 ... 1 1 xn 0 1 0 1 ... 0 1 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 0 0 0 0 1 1 1 B 0 0 1 1 0 0 1 c 0 1 0 1 0 1 0
7

f(a,b,c) 0 0 1 1 0 0 1

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 0 1 2 3 4 5 6 7 Demprit (baza 10) 985437 164239 27373 4562 760 126 21 3 Impritor (q) (baza 10) 6 6 6 6 6 6 6 6 Ct (baza 10) 164239 27373 4562 760 126 21 3 0 Rest (cn) (baza 10) 3 1 1 2 4 0 3 3 Simbol cifr (Cn) (baza 6) 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) 61589 3849 240 15 0

Rest (cn) (baza 10) 13 5 9 0 15

Simbol cifr (Cn) (baza 16) 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. Demprit Impritor (baza 6) (q) (baza 6) 33042113 1153045 25453 1040 23 24 24 24 24 24 Ct (baza 6) 1153045 25453 1040 23 0 Rest (cn) (baza 6) 21 5 13 0 23 Simbol cifr (Cn) (baza 16) D 5 9 0 F

n 0 1 2 3 4

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
17

51437 8

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 1 4 6 3 1 60 8 4 2 6 8 4 2 6 -8

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 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

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

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

Hexa 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 ..-.n o -. --25

1 2

.---..---

b c d e f g h i j k l m

-... -.-. -.. . ..-. --. .... .. .---..-.. --

p q r s t u v w x y z

---. .--. --..-. ... ---....-....--..-.---..

3 4 5 6 7 8 9 0 . , ; : ? !

...-......... -.... --... ---.. ----. ----...... .-.-.-.-.... ---... ..--.. --..--

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 1 12 2 212 3 222 4 31 5 321 6 322 7 211 8 3321 9 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 ! " # $ % & ' ( ) * +
28

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

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
29

192 C0 193 C1

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

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

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

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
Algoritmic i programare

4.

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

unui

algoritm

se

numele_algoritmului se marcheaz

ESTE: prin propoziia

algoritm

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 S 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: ATUNCI ALTFEL S1 S2

condiie

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: contor:=liminiial; REPET S; contor:=contor+pas; PNCND (contor > limfinal i pas > 0) sau (contor < i pas < 0) SFRITREPET; 36

limfinal

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. { Problema platoului } { i este indicele de { lp conine lungimea

Atunci

lp:=lp+1;

4.3.

STRUCTURA
4.3.1.

GENERAL
38

UNUI

PROGRAM
EVOLUIE

ISTORIC,

CONCEPIE ,

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 de date 2) globale

implementare funcia f1 . . . implementare funcia fn

declaraie

prototip

funcia . .

f1 . fn

declaraie

prototip

funcia

void main(void) { declaraii

void {

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 Prototipul unei funcii este sfrit se pune caracterul ; // calculeaza radacina patrata din x si

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

asemntor

antetului

dar

la

4.3.2.3.

Corpul

unei

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; } // determina valoarea absoluta a intregului i si

4.4. EXPRESII,

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] 0xabcd t -

variabil cu indici; constant hexazecimal; nume de tablou;

(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) << >> & ^ | ,

+(binar)

4.4.3.1.
+

Operatori

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; // 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)

4.4.3.2.

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)

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

4.4.3.3.

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. && 0 1 || 45 0 1

sau exclusiv 0 1 1 1

0 0 1

0 0

0 1

0 1

0 1

1 0

0 1

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: ^ 0 1 1 1 0 1 & 0 1 0 1 0 0 0 1 |, ^ dm n continuare tabelele | 0 1 0 1 0 1 0 1 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
se

n forma cea mai simpl operatorul de atribuire noteaz cu = i se utilizeaz n construcii de forma: v=expresie;

(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

// // // // //

echivalenta echivalenta echivalenta echivalenta echivalenta

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)

4.4.3.7.

Operatori

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 i-j/k a/b x+y i+a i-3.14 i+3 i+x i-c x+10 p-10 r*5 (double)(i/j)

conversii

tipul expresiei

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

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 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. atunci max=a altfel max=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. da nu S2 S

S1 da C S

Sn

nu

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: } unde:

sir

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