Documente Academic
Documente Profesional
Documente Cultură
1. INTRODUCERE
pa=ilor algoritmilor vor fi folosite =i mai t`rziu, ]n epoca modern[ a calculatoarelor. La recens[m`ntul efectuat ]n 1890 ]n S.U.A., Herman Hollerith (1860-1929) utilizeaz[ pentru memorarea datelor cartelele perforate, fapt ce reduce spectaculos timpul de procesare a informa\iilor. Legat =i de rezultatele ob\inute de Hollerith, ]n 1924 apare firma IBM (International Busines Machine Corporation), firm[ ce va juca un rol important ]n evolu\ia tehnicii de calcul pe plan mondial. }n 1940 George Stibitz construie=te la Bell Laboratories o ma=in[ de calcul electronic[. Patru ani mai t`rziu, ]n 1944, Howard Aiken de la Universitatea din Harvard construie=te calculatorul Mark I, care utilizeaz[ relee mecanice comandate electronic. Primul calculator electronic bazat pe tuburi electronice este considerat a fi ENIAC (Electronic Numerical Integrator And Calculator) construit de John Mauchly =i J. Presper Eckert, Universitatea din Pensylvania, ]n perioada 1942-1945. Unii cercet[tori ai istoriei evolu\iei calculatoarelor consider[ c[ prima ma=in[ care folose=te integral ]n construc\ia sa elemente electronice este calculatorul construit de John Atanasoff =i de asistentul s[u Clifford Berry ]n perioada 19371941. Revenind la ENIAC, se poate spune c[, fa\[ de calculatoarele din ziua de azi, era un gigant care se mi=ca ]ns[ foarte lent. Avea ]n structura sa aproape 20 000 de tuburi electronice, ocupa 160m2 =i avea o greutate de aproximativ 30 tone. Viteza de calcul putea ajunge p`n[ la 5000 de adun[ri pe secund[. O problem[ dificil[ era introducerea datelor =i a programului. Aceast[ activitate dura mai multe zile =i se f[cea cu ajutorul fi=elor celor 40 de panouri special construite ]n acest scop. Matematicianul american de origine german[ John von Neumann public[ ]n 1946, ]n S.U.A. proiectul primului calculator cu prelucrare secven\ial[ a instruc\iunilor =i datelor, memorate ]
4
mpreun[ ]ntr-o zon[ special[ numit[ memoria calculatorului. Principiile lui von Neumann au stat la baza dezvolt[rii calculatoarelor moderne. Prima aplicare a principiilor lui John von Neumann este datorat[ profesorului M. Wilkes de la Universitatea Cambridge din Anglia, care ]n 1949 a construit primul calculator cu program stocat ]ntr-o memorie cu ]nt`rziere, calculator ce a primit numele EDSAC (Electronic Delay Storage Automatic Calculator). Perioada care a urmat este ]mp[r\it[ ]n etape de evolu\ie cunoscute sub numele de genera\ii de calculatoare. Prezent[m ]n continuare limitele aproximative ]n timp ale fiec[rei perioade, precum =i caracteristicile sale principale. Genera\ia I de calculatoare este cuprins[ ]ntre anii 19461958 =i folose=te drept tehnologie de baz[ tuburile electronice. Alte caracteristici: memorie de mic[ capacitate =i timp de acces mare vitez[ de calcul mic[ (maxim 104 opera\ii/sec) se programeaz[ ]n cod ma=in[ =i ]n limbaje de
asamblare Genera\ia a II-a de calculatoare este localizat[ ]n timp ]ntre anii 1958-1964 =i se bazeaz[ pe tehnologia tranzistoarelor =i a diodelor semiconductoare. Caracteristicile de baz[ ale acestei genera\ii de calculatoare sunt: memorie intern[ cu capacitate sporit[ =i timp de acces mai mic vitez[ de calcul sporit[ (maxim 105 opera\ii/sec) apar limbaje de programare: FORTRAN (FORmula, TRANslator), COBOL (Common Business Oriented Language) =i ALGOL (ALGOrithmic Language) apar sisteme de operare
Genera\ia a III-a de calculatoare se ]ntinde de-a lungul perioadei 1964-1981 =i are la baz[ tehnologia circuitelor integrate. Printre caracteristicile celei de-a III-a genera\ii amintim: volum mic, capacitate mare de memorare viteza de calcul mari (106 adun[ri/sec) se dezvolt[ limbajele de programare de nivel ]nalt: PL/1, Pascal, LIST, Basic etc. =i de nivel mediu (limbajul C) Genera\ia 3.5 - 4 se ]ntinde ]n perioada 1982-1989 =i se bazeaz[ pe tehnologia circuitelor pe scar[ larg[ =i foarte larg[ (p`n[ la un milion de tranzistoare pe circuit integrat). Concomintent cu progresele ob\inute ]n domeniul tehnologiei folosite, se dezvolt[ puternic componentele logice de baz[ ale calculatorului. Astfel, ]n pre\ul unui calculator, costul soft-ului cre=te sensibil ]n raport cu costul datorat hard-ului. Se dezvolt[ modul de lucru interactiv, sistemele de gestiune a bazelor de date, apar limbaje de programare concurente. Genera\ia a V-a de calculatoare cuprinde perioada 19801990 =i se remarc[ at`t prin progrese tehnologice deosebite (grad ridicat de minituarizare datorat circuitelor cu integrate pe scar[ foarte larg[, viteze de ordinul miliardelor de opera\ii pe secund[, memorii externe de ordinul Gigaocte\ilor la pre\uri tot mai mici), c`t =i prin dezvoltarea impresionant[ a elementelor de inteligen\[ artificial[. Acest lucru a permis apari\ia unor limbaje specializate (de exemplu PROLOG PROgramare LOGic[) =i elaborarea mai eficient[ a unor sisteme expert care imit[ modul de ra\ionament al exper\ilor umani. Genera\ia a VI-a de calculatoare se dezvolt[ ]n prezent =i are la baz[ rezultatele ob\inute ]n opto electronic[ =i mai ales bioelectronic[.
2. ARHITECTURA CALCULATOARELOR
Calculatorul, ca sistem fizic destinat implementrii i prelucrrii automate a unor modele logico-matematice are la baz trei tipuri de resurse: resurse fizice (procesoare, memorie, dispozitive de intrare-ieire) sau resurse hard (hardware) resurse logice (sisteme de operare, programe utilitare, programe utilizator) sau resurse soft (software)
7
Funcionarea calculatorului devine posibil prin activarea unui anumit tip de conexiuni existente ntre unitile sale cu destinaie special numite uniti funcionale. Arhitectura unui calculator cuprinde reprezentarea unitilor sale funcionale i a legturilor dintre ele. Exist diverse tipuri arhitecturale, funcie de o serie de criterii care iau n calcul aspecte privind timpul i costul prelucrrilor, necesitile de prelucrare i transmitere a datelor, tipul problemelor care sunt rezolvate etc. Arhitectura clasic (serial) e reprezentat de sistemul de calcul monoprocesor sau maina de calcul John von Neumann.
Unitatea de memorie (UM) are rolul de a stoca n locaii (celule) de memorie, identificabile dup adrese, date de intrare, seturi de instruciuni destinate execuiei (programe) i rezultate ale execuiei acestora. Unitatea aritmetic i logic (UAL) permite efectuarea unor operaii aritmetice sau logice conform instruciunilor programului. Citirea instruciunilor din memorie, decodificarea lor i transmiterea semnalelor de comand pentru execuia lor, ctre UAL sau unitile de intrareieire, precum i controlul bunei funcionri a ntregului sistem de calcul, cad n sarcina unitii de comand i control (UCC). Unitatea de comand i control (UCC) mpreun cu unitatea aritmetic i logic (UAL) formeaz unitatea central de prelucrare (UCP) sau procesorul calculatorului. Procesorul mpreun cu unitatea de memorie alctuiesc unitatea central a calculatorului (UC). ntre elementele funcionale de baz ale calculatorului exist ci de comunicaie care permit circulaia informaiei reprezentat prin adrese, date de prelucrat, comenzi. Din punct de vedere funcional, sistemul de calcul John von Neumann se poate reprezenta sub forma schemei din Figura 2.1.
Figura 2.1 Modul de funcionare al acestui tip de calculator se poate rezuma astfel. Datele n forma lor primar (neprelucrat) precum i programul sunt preluate cu
9
ajutorul dispozitivelor de intrare, aduse la forma standard de reprezentare i transferate n memorie unde sunt memorate n locaii identificabile prin adrese. Fiecare instruciune a programului este preluat de UCC, care decodific operaia ce trebuie executat, trimite UAL comanda corespunztoare i solicit memoriei transferul ctre UAL a datelor aflate la adresele specificate n instruciune. UAL execut operaiile cerute i depune sub controlul UCC rezultatele temporar n memorie sau le transmite dispozitivelor de ieire.
2, 3, 4 bytes consecutivi formeaz un cuvnt. Lungimea cuvntului difer de la un tip de calculator la altul. Reprezentarea n memorie a informaiei se realizeaz la nivel de cuvnt sau de multipli ai acestuia. Accesul la o locaie de memorie se face pe baza adresei sale. Dac adresa se formeaz pe o configuraie de m bii, se poate explora un spaiu de adresare n memorie de 2m cuvinte. Timpul de acces reprezint timpul scurs de la cererea unei date din memorie i pn la obinerea acesteia. Accesul la o locaie de memorie este aleator (direct), iar timpul de acces este aproximativ acelai pentru orice locaie. Transferul informaiei n memorie se numete scriere, iar extragerea datelor din memorie se numete citire. Executarea unei operaii de citire-scriere se poate face doar cunoscnd adresa locaiei de memorie implicate. Aceasta va fi transmis de ctre UCC prin canale de comunicaie ntr-un registru de adrese al memoriei. Un circuit special de decodificare (decodificator) preia informaia din registru de adrese, o prelucreaz identificnd locaia cu adresa cerut. Dac se emite un semnal de citire, datele de la adresa localizat sunt transferate n registru de date; dac semnalul emis este de scriere, datele din registru de date sunt transferate n memorie n locaia identificat. n Figura 1.2 este reprezentat schematic modul de citire/scriere din/n memorie.
Memorie intern
11
Figura 2.2
Operand 1
Operand 2
Indicatori de condiie
R1 UAL RE
R2
C O M A N D A
Cod operaie
2.1.3.
Unitatea de comand[ =i control (UCC) realizeaz[ citirea instruc\iunilor programului din memorie =i execu\ia lor, asigur`nd totodat[ =i buna func\ionare a celorlalte unit[\i. }n general, instruc\iunile programului sunt de dou[ tipuri: instruc\iuni de transfer de date, de calcul, de schimb de informa\ii cu echipamentele periferice; instruc\iuni de decizie care modific[ ordinea de execu\ie a instruc\iunilor programului. Schematic, o instruc\iune poate fi reprezentat[ astfel (Figura 2.4): Cod opera\ie Figura 2.4 Cod opera\ie indic[ opera\ia care trebuie efectuat[, iar ]n zona adrese se memoreaz[ adresa unui operand sau a unei instruc\iuni. Unitatea de comand[ =i control poate fi reprezentat[ schematic astfel (Figura 2.5): adrese
memorie
}n registrul de instruc\iuni (RI) se p[streaz[ adresa curent[ citit[ din memorie pe toat[ durata execu\iei. }n zona contor program (CP) se afl[ adresa urm[toarei instruc\iuni care se va executa.
14
Calculatorului paralel reprezint[ o colec\ie de procesoare, de obicei de acela=i tip, interconectate ]ntr-o anumit[ re\ea care permite coordonarea activit[\ilor lor =i schimbul de date. Distan\ele dintre procesoare sunt mici, iar ]ntreg ansamblul ob\inut contribuie la rezolvarea unor probleme. Aceste caracteristici sunt esen\iale pentru a deosebi un calculator paralel de un sistem distribuit. Astfel, de=i un sistem distribuit este v[zut tot ca o colec\ie de procesoare, diferen\a este c[, ]n acest caz, ele sunt distribuite pe o arie geografic[ mare, sunt de obicei de tip diferit, iar scopul urm[rit este utilizarea ]n comun a resurselor disponibile, precum =i colectarea =i transmiterea informa\iilor. Eficien\a calculatorului paralel se datoreaz[ proces[rii paralele a datelor. Acest lucru permite reducerea timpului de rezolvare a unei probleme utiliz`nd procesoare cu viteze nu foarte mari =i ]n consecin\[ ieftine. Din acest motiv, un calculator paralel nu este neap[rat mai scump dec`t unul serial. }n ciuda acestei realit[\i =i a faptului c[ la ora actual[ cel pu\in 25 de mari companii produc calculatoare paralele, totu=i, penetrarea lor pe pia\a calculatoarelor este destul de slab[. Motivul esen\ial ]l constituie tehnologia software relativ primitiv[ a calculatoarelor paralele. De-a lungul timpului fondurile pentru cercetare ]n software au vizat ]n special sectorul calculatoarelor seriale. Un software eficient pentru un calculator serial nu este obligatoriu eficient =i pentru calculatoare paralele. Crearea unor biblioteci performante de software destinat calculatoarelor paralele necesit[ timp =i bine]n\eles fonduri. Calculatoarele Cray =i Ciber (ap[rute ]n anii 1970) s-au num[rat printre primele calculatoare din lume care au utilizat paralelismul. Ele au la baz[ un procesor vectorial care implementeaz[ tehnica pipeline. Originea termenului pipeline o g[sim ]n industria petrolier[, unde desemneaz[ o linie de selec\ie
15
pentru hidrocarburile dintr-un produs petrolier de baz[. Aceast[ tehnic[ este asem[n[toare cu ansamblarea unui produs pe o band[ rulant[: la fiecare unitate de timp fiecare diviziune de opera\ii este ]n lucru. Urmeaz[ apoi o dezvoltare rapid[ de noi genera\ii de supercalculatoare care cunosc ]mbun[t[\iri substan\iale: dispar bufferele (zonele tampon) de mare vitez[, o parte din memorie e distribuit[ ]ntre procesoare, iar o parte este accesibil[ tuturor unit[\ilor, se imagineaz[ =i se pun ]n practic[ noi modalit[\i de interconectare a procesoarelor etc. Calculatoarele paralele ]=i g[sesc utilitatea mai ales ]n rezolvarea problemelor care necesit[ solu\ii rapide sau sunt de dimensiuni mari. Iat[ c`teva exemple: probleme de procesarea imaginilor, probleme de modelare =i simulare (de exemplu simularea numeric[ a z[c[mintelor de petrol), probleme de prevedere a fenomenelor meteorologice etc. Clasificarea sistemelor paralele se poate face dup[ mai multe criterii cum ar fi: num[rul de procesoare, viteza de lucru a procesoarelor, mecanismul de control al sistemului, modul de organizare al memoriei, topologia dispunerii procesoarelor. }n leg[tur[ cu num[rul de procesoare apare termenul de granula\ie. Granula\ia poate fi: fin[ - aproximativ 1000 de procesoare fiecare trat`nd date pu\ine; grosier[ - aproximativ 16 de procesoare care trateaz[ date multe; medie - aproximativ 64 de procesoare. O modalitate clar[ de a clasifica calculatoarele paralele o dator[m lui Flynn (1966).
16
Conform acestei clasific[ri exist[ patru categorii de calculatoare paralele: SISD (Single Instruction Single Data) - un singur set de instruc\iuni =i un singur set de date; SIMD (Single Instruction Multiple Data) un singur set de instruc\iuni =i mai multe seturi de date; MISD (Multiple Instruction Single Data) mai multe seturi de instruc\iuni =i un singur set de date;
MIMD (Multiple Instruction Multiple Data) mai multe seturi de instruc\iuni =i mai multe seturi de date.
CPU
SI O instruc\iun e
Ad
O ev dat[
Date
Figura 2.7
r at
CPU are semnifica\ia de unitate central[ de procesare (Central Procesor Unit). }n figura de mai jos (Figura 2.8) se poate observa modul de func\ionare al unui SISD
17
x+y x y
Surs[ de date
Figura 2.8
SI
P1 P2 Pn
MD
MCU
Figura 2.9 Modul de func\ionare al unui astfel de sistem este sugerat de figura urm[toare (Figura 2.10).
18
Surs[ de date
Figura 2.10
Sistemele SIMD sunt folosite mai ales la rezolvarea unor probleme care permit execu\ia acelora=i opera\ii ]n acela=i timp. Problemele de procesare a imaginilor, de dinamica fluidelor sunt ] n acest sens ideale deoarece rezolvarea lor presupune execu\ia acelora=i opera\ii ]n diferite noduri ale grilelor folosite. Evident, cu ajutorul unui SIMD aceste calcule se pot efectua simultan.
Clasa sistemelor MISD cuprinde colec\iile de procesoare pipeline, considerate a fi ]n general neeficiente. O singur[ dat[ este prelucrat[ succesiv de aceste procesoare dup[ principiul benzii rulante. Schematic un sistem MISD se prezint[ astfel (Figura 2.11):
MI P1 P2 Pn
19
SD
MCU
Date
Figura 2.11
Date MI P2 P1 MD Memori e . . . Pn Figura 2.12 Modul de func\ionare al unui sistem MIMD este prezentat ]n urm[toarea schem[ (Figura 2.13): comun[
MC U
20
Program P2 Scade
Program Pn Test
Test
Unitate func\ional[
Surs[ de date
Figura 2.13
}NTREB{RI +I EXERCI|II
Ce este arhitectura unui calculator? Ce tipuri arhitecturale cunoa=te\i?
21
Care sunt unit[\ile func\ionale care alc[tuiesc arhitectura unui calculator serial? Descrie\i pe scurt arhitectura unit[\ii de memorie Descrie\i pe scurt arhitectura unit[\ii aritmetice =i logice Descrie\i pe scurt arhitectura unit[\ii de comand[ =i control Da\i o scurt[ defini\ie a calculatorului paralel Care sunt avantajele unui calculator paralel? Motiva\i de ce, ]n ciuda performan\elor, calculatoarele paralele nu cunosc o r[sp`ndire a=a de mare ca ma=inile de calcul seriale
Enumera\i c`teva domenii ]n care ]=i g[sesc utilitatea calculatoarele paralele Care este clasificarea lui Flynn?
3. BAZE DE NUMERA|IE
22
memoriei calculatoarelor, ]n informatic[ se utilizeaz[ reprezentarea numerelor ]n baza 2 sau puteri ale acesteia (baza 8 =i baza 16). Rezultatele ob\inute ]n analiza matematic[ ne arat[ c[ orice num[r real, se poate scrie ]ntr-o baz[ oarecare q 2 sub forma a n a n 1 a n 2 ... a1 a 0 . a 1 a 2 a 3 ... a i ... , unde a i sunt cifre ale bazei q , adic[ a i {0, 1, 2, ..., q 1} . }n informatic[, bazele uzuale sunt 2, 8 =i 16. Cifrele ]n baza 2 sunt {0, 1}, ]n baza 8, {0, 1, 2, 3, 4, 5, 6, 7}, iar ]n baza 16 sunt {0, 1, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}. Exemple ]n baza 10 396.83, -25691, 48 ]n baza 2 1101.11, 111001.11, 110101 ]n baza 8 675.02, 0.36, -475 ]n baza 16 69A, DEA.AB5, CAD.39A
Calea cea mai simpl[ de conversie a unui num[r dintr-o baz[ ]n alta este utilizarea bazei 10 ca baz[ intermediar[. Din acest motiv, ]n continuare prezent[m conversia numerelor din baza 10 ] ntr-o baz[ oarecare =i invers.
23
Exemple
11010 ( 2 ) = 1 2 4 + 1 2 3 + 0 2 2 + 1 21 + 0 2 0 = 2610 AC 3( 16 ) = A 16 2 + C 161 + 3 16 0 = 10 16 2 + 12 16 + 3 16 0 = 275510
Conversia unui num[r ]ntreg din baza 10 ]n baza oarecare q Pentru a ]n\elege algoritmul de conversie dintr-o baz[ q ]n baza 10 s[ consider[m dezvoltarea polinomial[ (1)
N 10 = a n q n +a n 1 q n 1 +... + a1 q +a 0
24
ob\inem
( 0) N 10 = a n q n 2 + a n 1 q n 3 +... + a 2 +
a1 a (1) = N 10 + 1 q q
i =0,1, 2, ..., n
( 1) = N 10 . unde N 10
(i ) Algoritmul se termin[ c`nd se ob\ine c`tul N 10 egal cu zero.
Exemple Convertim din baza 10 ]n baza 2, numerele 26, respectiv 2755 ob\inute ]n exemplul precedent, aplic`nd algoritmul descris. 26 2 26 13 0 12 1 2755 2752 3 2 1 1 2 0 16 172 160 12
2 6 6 0
2 3 2 1
16 10 10
16 0
Cifrele numerelor convertite se ob\in citind de la sf[r=it spre ]nceput resturile (cifrele ]ncercuite). Se ob\in rezultatele a=teptate: 2610 = 11010 2 =i 275510 = AC 316 .
25
Conversia p[r\ii frac\ionare a unui num[r real pozitiv dintr-o baz[ oarecare q ]n baza 10 Ca =i ]n cazul numerelor ]ntregi, conversia dintr-o baz[ q ]n baza 10 a unei frac\ii Fq se face utiliz`nd dezvoltarea sa polinomial[, adic[:
F10 = a 1 q 1 + a 2 q 2 + ... a m q m + ...
Exemple
0.11012 = 1 2 1 + 1 2 2 + 0 2 3 + 1 24 = 0.8125 0.2C16 = 2 10 1 + 12 16 2 = 0.17183
Conversia p[r\ii frac\ionare a unui num[r real pozitiv din baza 10 ]ntr-o baz[ oarecare q Pentru a afla cifrele num[rului F10 ]n baza q se porne=te de la dezvoltarea sa polinomial[, adic[: (2)
F10 = a 1 q 1 + a 2 q 2 + ... + a m q m +...
=i deci a 1 = [ q F10 ] unde prin [ x ] ]n\elegem partea ] ntreag[ a num[rului x. Cifra a-2 o ob\inem printr-un procedeu analog pornind ] ns[ de la frac\ia:
(1) F10 = a 2 q 1 + ... + a m q m +1 + ...
=i analog unde,
( 2) a 3 = q F10
]
26
atunci algoritmul se opre=te. }n caz contrar frac\ia este periodic[. Exemple Fie F10 = 0.171875 . Se dore=te conversia ]n baza 16. Aplic[m procedeul explicat mai sus =i avem:
0.171875 16 = 2.75 0.75 16 = 12 a 1 = 2 a 2 = C
Se ob\ine rezultatul 0.2C. Consider[m frac\ia 0.6 =i dorim conversia ei ]n baza 2. Ob\inem succesiv:
0.6 2 = 1.2 0.2 2 = 0.4 0.4 2 = 0.8 0.8 2 = 1.6 0.6 2 = 1.2 a 1 = 1 a 2 = 0 a 3 = 0 a 4 = 1 a 5 = 1
Se observ[ repetarea rezultatelor din patru ]n patru =i deci ob\inem frac\ia periodic[ 0.(1001)2.
triade
1 1 1 Tabelul 3.1
Conversia rapid[ unui num[r din octal ]n binar se face scriind ]n locul fiec[rei cifre octale triada corespunz[toare. Exemplu Num[rul 67.538 se scrie ]n baza 2 f[c`nd ]nlocuirile: 6 7 5 3 Se ob\ine: cu cu cu cu 1 1 1 0 1 1 0 1 0 1 1 1
Conversia rapid[ a unui num[r binar ]n octal se face astfel: pentru partea ]ntreag[ se marcheaz[ triadele ]ncep`nd de la virgul[ spre st`nga pentru partea frac\ionar[ se marcheaz[ triadele ]ncep`nd de la virgul[ spre dreapta fiecare triad[ este ]nlocuit[ cu valoarea corespunz[toare din baza 8 Exemplu 1 101 001.110 111 12 =151, 674 8 Conversia binar-hexazecimal Prezent[m mai jos (Tabelul 3.2) cu valorile cifrelor hexazecimale ]n binar (tetrade) hexa 0 1 2 3 4 5 6 7 8 binar 0000 0001 0010 0011 0100 0101 0110 0111 1000 Tabelul 3.2 hexa 9 A B C D E F Binar 1001 1010 1011 1100 1101 1110 1111
28
}n conversia binar-hexazecimal rolul triadelor este luat de tetrade, pa=ii algoritmului fiind identici cu cei ai conversiei binaroctal. Exemplu 110 1001 . 1101 1112 = 69, DE16 Observa\ie. Procedeele de conversie prezentate, binaroctal =i binar-hexazecimal se fac mecanic, f[r[ calcule =i din acest motiv sunt foarte rapide. O alt[ ra\iune pentru care sunt preferate bazele 8 =i 16 bazei 2 rezult[ din aspectul evident c[ numerele binare, datorit[ lungimii lor sunt mai greu de manipulat. Reguli de calcul ]n baza 2 =i baza 8. }n baza 2 adunarea =i ]nmul\irea se face conform Tabelului 3.3: + 0 1 0 1 0 1 1 10 Tabelul 3.3 La adunare se observ[ c[ apare transportul (bitul 1 din
10 = 1 +1 )
X 0 1
0 0 0
1 0 1
}n baza 8 tabelele pentru adunare =i ]nmul\ire sunt dup[ cum urmeaz[ (Tabelul 3.4):
29
+ 0 1 2 3 4 5 6 7
0 0 1 2 3 4 5 6 7
1 1 2 3 4 5 6 7 1 0
2 2 3 4 5 6 7 1 0 1 1
3 3 4 5 6 7 1 0 1 1 1 2
4 4 5 6 7 1 0 1 1 1 2 1 3
5 5 6 7 1 0 1 1 1 2 1 3 1 4
6 6 7 1 0 1 1 1 2 1 3 1 4 1 5
7 7 1 0 1 1 1 2 1 3 1 4 1 5 1 6
X 0 1 2
0 0 0 0
1 0 1 2 3 4 5 6 7
2 0 2 4 6 1 0 1 2 1 4 1 6
3 0 3 6 1 1 1 4 1 7 2 2 2 5
4 0 4 1 0 1 4 2 0 2 4 3 0 3 4
5 0 5 1 2 1 7 2 4 3 1 3 6 4 3
6 0 6 1 4 2 2 3 0 3 6 4 4 5 2
7 0 7 1 6 2 5 3 4 4 3 5 2 6 1
3 0 4 0 5 0 6 0 7 0
Tabelul 3.4
30
}NTREB{RI +I EXERCI|II
Care este reprezentarea ]n baza 2 =i 16 a numerelor: 3 265, 28, 293, 526? Care este valoarea ]n baza 10 a numerelor binare: 00110101, 01110101, 00010011? Converti\i ]n baza 10 numerele: 0. 11101, 11.010111, 10.0111, A3.267, ABA.BA Converti\i ]n bazele 2, 8, 16 numerele: 0.172, 62.845, 261.38, 1254.2968
31
Modul de reprezentare ]n modul =i semn are urm[toarele dezavantaje: exist[ dou[ reprezent[ri pentru zero. De exemplu, ]ntr-o reprezentare pe 8 bi\i avem:
+0 0 0 0 0 0 0 00 0 1 0 0 0 0 00 0
bi\ii de semn trebuie trata\i separat cand se efectueaz[ opera\ii trebuie definit[ opera\ia de sc[dere a numerelor astfel reprezentate.
Complementul fa\[ de 1 (cod invers) al unui num[r reprezentat ]n binar se ob\ine prin ]nlocuirea fiec[rei cifre binare cu complementul ei fa\[ de 1. Complementul fa\[ de 1 al cifrei 0 este 1, iar al cifrei 1 este 0. Exemplu. Valorile 7 =i 7 sunt reprezentate ]n binar, pe 8 bi\i sub forma:
7 7 0000 0 11 1 1111 1 0 0 0
Opera\ia de sc[dere se reduce la o opera\ie de adunare prin reprezentarea sc[z[torului ]n cod invers. Dac[ rezultatul este negativ atunci el va fi reprezentat tot ]n cod invers. Dac[ apare transport ]n st`nga rangului de semn aceasta se va aduna la rangul cel mai pu\in semnificativ (cel mai din dreapta) al rezultatului. Exemple }ntr-o reprezentare pe 8 bi\i opera\ia 7 6 se efectueaz[ astfel:
7 = 0 0 0 0 0 111 6 = 0 0 0 0 0 11 0 6 = 1 1 1 1 1 0 0 1
(+7) +(-6) 1
0 0 0 0 0 0 0 1 Se observ[ cum transportul din st`nga rangului de semn se adun[ la ultimul bit.
33
Se observ[ c[ 1 1 1 1 1 1 1 0 este reprezentarea cifrei 1 ] n cod invers pe o configura\ie de 8 bi\i. Observa\ie. +i ]n acest tip de reprezentare se men\ine dezavantajul reprezent[rii valorii zero sub dou[ forme, ]nt`lnit la codul direct. Exemplu (+5) +(-5) 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 1 1 1 1
Pentru a ]n\elege reprezentarea ]n cod complementar s[ scriem, de exemplu, opera\ia 8-3 sub forma
8 + (10 3) 10 = 8 + 7 10 = 15 10 = 5
Observ[m c[ rezultatul se poate ob\ine ]n felul urm[tor: se adun[ la desc[zut complementul fa\[ de 10 al sc[z[torului, adic[ se face opera\ia
8 + 7 = 15
34
Acest exemplu sugereaz[ ideea ca un num[r negativ ]n binar s[ fie reprezentat ]n cod complement fa\[ de 2 (cod complementar). Complementul fa\[ de 2 al unui num[r se ob\ine astfel: se ob\ine complementul fa\[ de 1 al num[rului se adun[ valoarea 1 la rangul cel mai semnificativ al num[rului Dac[ apare transport la st`nga rangului de semn acesta se ignor[, iar dac[ rezultatul este negativ aceasta este reprezentat tot ]n cod complementar fa\[ de 2. Observa\ie. Folosind acest cod, zero are o unic[ reprezentare. Exemplu 7 are valoarea 0 0 0 0 0 1 1 1 ]n binar 7 are codul invers 1 1 1 1 1 0 0 0 -7 are codul complementar 1 1 1 1 1 0 0 1 (+7) +(-7) 0 0 0 0 0 0 1 1 1 +1 1 1 1 1 0 0 1 10 0 0 0 0 0 0 0 se neglijeaz[
Se constat[ unicitatea reprezent[rii pentru zero. Calculatoarele moderne utilizeaz[ pentru reprezentarea numerelor ]ntregi negative codul complementar.
4.2. REALE
REPREZENTAREA
NUMERELOR
Reprezentarea numerelor reale se poate face sub dou[ moduri: ]n virgul[ fix[ ]n virgul[ mobil[
35
}n cazul ]n care primul bit este folosit pentru codificarea semnului, plaja de reprezentare pentru N10 va fi:
8.9375 N 10 7.9375
Se observ[ c[ puterea de reprezentare a numerelor reale ]n cazul folosirii virgulelor fixe este extrem de mic[. Din acest motiv folosirea virgulei fixe, ]n calculatoarele moderne se face numai dup[ ultimul rang, reprezent`ndu-se practic ]n aceast[ manier[ numai numerele ]ntregi.
poate
unde
ntreg,
36
Aici
are valoarea
4,
q valoarea
10,
iar
mantisa
a = 0.1532629
Condi\ia
1/ q | a | <1
condi\ia se scrie:
0.1 | a | <1
ceea ce este echivalent cu faptul c[ prima cifr[ dup[ virgul[ s[ fie diferit[ de 0. }n cazul ]n care se renun\[ la aceast[ restric\ie asupra mantisei, exist[ o infinitate de reprezent[ri echivalente. De exemplu, num[rul
Denumirea de virgul[ mobil[ vine tocmai de la deplasarea virgulei, func\ie de valoarea exponentului. Pentru a aduna dou[ numere scrise sub form[ normalizat[ trebuie ca ele s[ aib[ acela=i exponent. Dac[ exponen\ii sunt diferi\i, num[rul cu exponent mai mic este scris ]n virgul[ mobil[ nenormalizat[ astfel ]nc`t noul exponent ob\inut s[ fie egal cu cel mai mare dintre cei doi exponen\i. } nmul\irea se face ]nmul\ind mantisele =i adun`nd exponen\ii. Din cauza restric\iilor privind lungimea mantisei, aritmetica virgulei mobile difer[ de aritmetica obi=nuit[. Pentru a ilustra acest lucru, s[ presupunem c[ mantisei i se rezerv[ patru cifre zecimale =i s[ consider[m exemplele:
0.2345 10 3 + 0.32 10 2 = 0.2345 10 3 + 0.0320 10 3 = 0.2665 10 3 ; nu se
ultima cifr[ 5. }n programele ]n care calculele au un grad ridicat de complexitate, erorile se pot propaga, iar efectul este ob\inerea unui rezultat afectat de erori. Acest efect nedorit se poate contracara prin utilizarea unor metode numerice speciale, care ] nhib[ propagarea erorilor. Reprezentarea ]n virgul[ mobil[ se poate face sub dou[ forme: reprezentarea ]n virgul[ mobil[ simpl[ precizie =i reprezentarea ]n virgul[ mobil[ dubl[ precizie. Reprezentarea ]n virgul[ mobil[ simpl[ precizie se face pe 32 de bi\i =i are structura: 32 31 S 1 Caracteristic[ (c) 24 23
Frac\ie (f)
S reprezint[ semnul num[rului reprezentat, ocup[ un bit (bitul 32), iar valorile sale au semnifica\ia urm[toare:
S = 0 c`nd num[rul reprezentat are semnul negativ
S = 1 c`nd num[rul reprezentat are semnul pozitiv
Caracteristica c ocup[ 8 bi\i (bi\ii 24-31) =i con\ine valoarea exponentului la care se adaug[ valoarea 127, adic[:
c = e + 127
Folosirea acestei formule permite economisirea unui bit care ar fi necesar pentru memorarea semnului exponentului. Zona de 8 bi\i destinat[ caracteristicii este considerat[ totdeauna pozitiv[ =i deci:
0 c 2 8 1 = 255
38
Din acest motiv, valorile minime =i maxime ale exponentului sunt 127 respectiv 128. Cu alte cuvinte: dac[ c 127 atunci e 0 dac[ c < 127 atunci e 0
Frac\ia (f) este reprezentat[ ]n zona bi\ilor 1-23. Alinierea se face la st`nga, iar dac[ este cazul spa\iile libere se completeaz[ cu cifra zero. Reprezentarea ]n virgul[ mobil[ dubl[ precizie se face pe 64 de bi\i =i are structura: 64 63 S 1 Caracteristic[ (c) 53 52
Frac\ie (f)
C`mpurile din structur[ au aceea=i semnifica\ie ca la reprezentarea ]n virgul[ mobil[ simpl[ precizie. Difer[ doar lungimea caracteristicii (11 bi\i) =i a frac\iei (52 bi\i). Rela\ia dintre exponentul e =i caracteristica c este:
c = e + 1023
Valorile minime =i maxime ale exponentului sunt 1023 =i 1024, ceea ce arat[ o putere de reprezentare deosebit de mare ]n cazul folosirii virgulei mobile ]n dubl[ precizie.
4.3.
Calculatoarele prelucreaz[ at`t informa\ie numeric[, c`t =i informa\ie nenumeric[ (texte). Pentru reprezentarea informa\iei numerice se folosesc algoritmii =i conven\iile prezentate.
39
Reprezentarea informa\iei nenumerice (litere mari =i mici, cifre zecimale, semne de punctua\ie, operatori aritmetici =i logici, simboluri pentru controlul comunica\iei =i editare etc.) se face pe baza unor coduri. Aceste coduri asociaz[ fiec[rui semn utilizat o configura\ie binar[. Pentru o mul\ime de m semne sunt necesare 2n configura\ii binare unde n este cel mai mic num[r natural cu proprietatea 2 n m . De exemplu, fiecare element al unei mul\imi de 30 de semne poate fi codificat utiliz`nd una din cele 2 5 = 32 configura\ii binare distincte, cu lungimea de la 5 bi\i. Se observ[ c[ dou[ din cele 32 configura\ii binare posibile nu sunt folosite (sunt cuvinte f[r[ sens). Conven\ia de reprezentare a caracterelor alfanumerice, ]n calculatoarele moderne este codul ASCII (American Standard Code for Information Interchange). O configura\ie binar[ din codul ASCII are 8 bi\i (se pot codifica 2 8 = 256 semne). Plajele de reprezentare sunt urm[toarele: 0 31 32 127 codificarea caracterelor de control. codificarea literelor mari =i mici, a cifrelor zecimale =i a semnelor speciale. 128 255 codificarea semnelor cu utilizare special[. Exist[ =i alte coduri folosite ]n sistemele de calcul. Dintre acestea amintim codul EBCDIC (Extended Binary Coded Decimal Interchange Code).
}NTREB{RI +I EXERCI|II
Afla\i complementul fa\[ de 2 pentru numerele: 27, 35, 56, 5 reprezentate pe c`te un octet fiecare. Care este structura reprezent[rii ]n virgula mobil[ simpl[ precizie?
40
Care este structura reprezent[rii ]n virgula mobil[ dubl[ precizie? Ce se ]n\elege prin virgul[ mobil[ normalizat[? Ce este codul ASCII?
41
Figura 5.1 Un sistem de operare este alc[tuit din dou[ categorii de programe: programe de comand[ =i control programe de servicii
Programele de comand[ =i control coordoneaz[ =i controleaz[ toate func\iile sistemului de operare. Principalele componente ale sistemului de programe de comand[ =i control sunt: supervizorul sistemul de gestiune a intr[rilor/ie=irilor
Sarcinile supervizorului sunt urm[toarele: coordoneaz[ toate componentele sistemului de operare planific[, lanseaz[ =i urm[re=te execu\ia programelor depisteaz[ execu\ie Rutinele de baz[ sau frecvent folosite, ale supervizorului, sunt rezidente ]n memoria intern[. Celelalte sunt tranziente, adic[ sunt stocate ]n memoria auxiliar[ =i ]nc[rcate la nevoie ]n memoria intern[. Sistemul de gestiune al intr[rilor/ie=irilor coordoneaz[ modul de afectare al dispozitivelor periferice programelor, precum =i transferul datelor dintre dispozitivele de intrare/ie=ire =i memorie. Cea de-a doua component[ a unui sistem de operare programe de servicii- cuprinde: translatoare (asambloare, compilatoare, interpretoare) editoare de leg[turi (linkeditoare) ]nc[rc[toare editoare de text programe utilitare
42
=i
trateaz[
evenimentele
care
apar
la
programe bibliotecar programe pentru gestiunea opera\iilor de intrare/ie=ire pentru fi=iere =i baze de date
Deoarece sarcina de baz[ a unui sistem de operare este de a pune la dispozi\ia utilizatorului mijloace prin care s[ poat[ crea, stoca, prelucra, reg[si =i distruge informa\ia , func\iile sale de baz[ urm[resc realizarea acestor obiective. Prezent[m mai jos lista func\iilor de baz[ ale unui sistem de operare: preg[tirea =i lansarea ]n execu\ie a programelor de aplica\ie alocarea resurselor necesare execut[rii programelor planificarea execu\iei lucr[rilor dup[ anumite criterii, cum ar fi: timp de execu\ie, priorit[\i etc. folosirea utilitarelor pentru crearea unor facilit[\i de sortare (ordonare), creare biblioteci de programe, catalogare (depunere programe ]n bibliotec[) etc. coordonarea execu\iei mai multor programe, crearea unor facilit[\i de depanare etc. asistarea execu\iei programelor de aplica\ie folosind posibilit[\ile de comunicare om - calculator. Exist[ 4 tipuri de sisteme de operare: secven\iale cu multiprogramare
43
}n sistemele de operare secven\iale (batchprocessing) prelucrarea programelor se face serial. Execu\ia programului poate s[ ]nceap[ numai dup[ ce a fost ]nc[rcat complet ]n memorie ]mpreun[ cu datele. Din acest motiv gradul de ocupare al procesorului este mic ]n raport cu timpul total folosit pentru execu\ia programului (pentru c`teva secunde de folosire a unit[\ii centrale se pierd mai mult de 5 minute). Sistemele de operare cu multiprogramare (multiprogramming) au ap[rut tocmai din nevoia de a m[ri gradul de utilizare al procesorului. }n acest scop, ]n memoria partajat[ corespunz[tor pot fi ]nc[rcate mai multe programe. Execu\ia lor se realizeaz[ prin multiplexarea unit[\ii centrale. Dac[, de exemplu, ]n timpul execu\iei programului P1, se solicit[ o opera\ie de intrare/ie=ire, se execut[ o ]ntrerupere I/O (Input/Output), iar procesorul va continua s[ execute instruc\iuni ale unui alt program P2 =i a=a mai departe. Acest tip de execu\ie (programare concurent[) este, evident, mai eficient din punct de vedere al gradului de utilizare al procesorului, iar viteza cu care se execut[ programele creeaz[ percep\ia execu\iei lor simultane. Gestiunea corect[ a memoriei partajate, a accesului programelor la resurse (memorie, procesor, unit[\i de intrare/ie=ire) sunt doar dou[ din problemele majore care apar ]n plus la aceste tipuri de sisteme de operare. Sistemele de prelucrare multipl[ se implementeaz[ pe calculatoarele cu mai multe procesoare (calculatoare paralele). Mai multe procesoare pot executa simultan acela=i program dac[ este descompus ]n mai multe sarcini (multitasking). Sistemele de operare ]n timp real se folosesc pentru conducerea operativ[ a unor dispozitive ai c[ror parametrii se modific[ continuu.
44
Fazele execu\iei unui program Programul poate fi privit ca o unitate de operare. Indiferent ]n ce limbaj este scris, pentru a fi executat, programul trebuie translatat (tradus) ]n cod-ma=in[. Exist[ dou[ tipuri mari de translatoare: compilatoarele =i interpretoarele. Modul de lucru al compilatorului este urm[torul. Se analizeaz[ sintactic programul surs[ =i se furnizeaz[ o list[ de erori. Dup[ eliminarea erorilor de c[tre programator, se ob\ine forma binar translatabil[ (BT) a programului. Formatul BT ] nseamn[ un num[r de module obiect f[r[ leg[tur[ ]ntre ele. Programul care realizeaz[ leg[turile dintre module este editorul de leg[turi (linkeditorul). Se ob\ine forma IMT (Imagine Translatabil[ a Memoriei). Este forma care va fi preluat[ de programul ]nc[rc[tor =i va fi ]nc[rcat[ la o adres[ concret[ de memorie ob\in`ndu-se formatul IMA (Imagine Absolut[ a Memoriei). }n aceast[ form[ programul poate fi executat. Compilatorul limbajelor de asamblare se nume=te asamblor. Fazele execu\iei unui program translatat prin compilare sunt prezentate mai jos (Figura 5.2):
cod surs[
compilat or
forma linkedito r t BT
Figura 5.2 Modul de lucru al interpretorului este urm[torul. Se analizeaz[ sintactic linie cu linie programul. Dac[ linia de program analizat[ este corect[ din punct de vedere sintactic atunci se =i execut[ ]nainte de a trece la analiza urm[toarei linii. Se observ[ c[ diferen\a esen\ial[ dintre compilator =i interpretor se refer[ la
45
momentul c`nd se face execu\ia ]n raport cu analiza sintactic[ a programului. La compilator execu\ia se face dup[ ce tot programul a fost translatat, la interpretor analiza sintactic[ a unei linii de program este urmat[ obligatoriu de execu\ia ei. Fiecare necesarul de din cele dou[ este mai metode mare de translatare trebuie prezint[ avantaje =i dezavantaje. C`nd se folose=te compilatorul, memorie (memoria s[ con\in[ at`t codul surs[ c`t =i codul obiect), dar modulele obiect rezultate pot fi catalogate ]n biblioteci =i folosite la nevoie. }n cazul interpretorului este nevoie de memorie relativ pu\in[, dar execu\ia programului este mai anevoioas[ deoarece presupune pentru fiecare linie, la fiecare rulare, at`t translatarea c`t =i execu\ia.
}NTREB{RI +I EXERCI|II
Da\i o defini\ie scurt[ a sistemului de operare Care sunt cele dou[ categorii de programe care alc[tuiesc un sistem de operare? Care sunt sarcinile supervizorului? Care este rolul sistemului de gestiune al intr[rilor/ie=irilor? Enumera\i componentele programelor de servicii Enumera\i func\iile de baz[ ale unui sistem de operare Enumera\i =i caracteriza\i tipurile de sisteme de operare Care sunt fazele de execu\ie ale unui program?
46
Activitatea de rezolvare a problemelor cu calculatorul se bazeaz[ pe calit[\i cum ar fi: talent, creativitate, experien\[. Evident, ]n condi\iile cre=terii complexit[\ii problemelor de rezolvat, ]n scopul m[ririi eficien\ei acestei activit[\i, calit[\ile enumerate devin cu at`t mai necesare. Totu=i, acest lucru nu este suficient. }n timp, via\a a impus o nou[ abordare a activit[\ii
47
de rezolvare a problemelor cu calculatorul. Dorin\a =i nevoia de a ob\ine eficien\[ ]n acest domeniu au condus la conturarea unor etape bine definite, cu metode =i instrumente de lucru specifice. Astfel, o activitate care ]n trecut era v[zut[ mai ales ca un me=te=ug sau o art[, la ora actual[ este abordat[ tot mai des =i sub aspectul ei de activitate sistematic[. O list[ a etapelor pe care programatorul le parcurge ]n mod uzual ]n rezolvarea problemelor poate fi privit[ ca un important ajutor ]n ob\inerea unor rezultate bune. Evident, etapele pe care le enumer[m mai jos trebuie privite mai degrab[ ca un ghid, ]n sensul c[ parcurgerea lor con=tiincioas[ nu va conduce ]n mod obligatoriu la rezultatul scontat. A ignora aceste etape este ]ns[ la fel de d[un[tor cu a exagera importan\a lor. }n general, se accept[ ca fiind necesare urm[toarele faze ]n rezolvarea unei probleme cu calculatorul: 1. analiza problemei 2. proiectarea algoritmului de rezolvare 3. descrierea algoritmului 4. codificarea algoritmului (ob\inerea programului) 5. testarea programului 6. execu\ia programului, ob\inerea rezultatelor =i interpretarea lor 7. ]ntre\inerea programului }n prima etap[, etapa de analiz[ a problemei se are ]n vedere stabilirea modelului logico-matematic al problemei. Se identific[ cu claritate func\ia (sau func\iile) problemei, se stabilesc datele de ie=ire =i datele de intrare. Aceast[ etap[ are ca scop ] n\elegerea c`t mai exact[ a problemei pe care dorim s[ o rezolv[m. Etapa de proiectare a algoritmului are ca scop stabilirea algoritmului de rezolvare a problemei. Este etapa ]n care se precizeaz[ opera\iile pe care trebuie s[ le execute un calculator,
48
pentru a rezolva problema. }n cazul problemelor complexe este recomandabil[ descompunerea problemei ]n subprobleme care pot fi rezolvate mai u=or. Aceast[ tehnic[, numit[ top-down (de sus ]n jos) va avea ca efect final ob\inerea unui sistem de module conectate ]ntre ele dup[ logica impus[ de rezolvarea problemei. Practic, ]ntr-o prim[ faz[ se ob\ine o schi\[ general[ de rezolvare care se rafineaz[ succesiv p`n[ la ob\inerea comenzilor necesare execu\iei pe calculator. }mp[r\irea problemei ]n subprobleme prezint[ avantajul lucrului eficient ]n echip[ - subproblemele pot fi rezolvate simultan de c[tre membrii echipei. De asemenea, ob\inerea modulelor program prin implementarea fiec[rei subprobleme u=ureaz[ munca de depanare (depistarea erorilor) =i de ]ntre\inere a programului. Pe m[sur[ ce cre=te complexitatea problemelor de rezolvat, cre=te =i dificultatea de a descrie algoritmii c`t mai exact, f[r[ ambiguit[\i, utiliz`nd un limbaj natural. Din acest motiv s-au imaginat diferite forme de descriere (diagrama de structur[, scheme logice, pseudocod etc.) care, pe de o parte permit reprezentarea corect[ a algoritmilor ]ntr-o manier[ prietenoas[, natural[, iar pe de alt[ parte faciliteaz[ codificarea cu u=urin\[ ] ntr-un limbaj de programare. De=i foarte multe limbaje au caracter universal, totu=i anumite tr[s[turi ale problemei de rezolvat pot recomanda un anumit tip de limbaj. Astfel, pentru o problem[ ]n care predomin[ prelucr[rile numerice se va alege un limbaj puternic ] n acest sens, cum ar fi Fortran, Basic, Pascal etc. Pentru probleme ]n care opera\iile aritmetice au complexitate redus[, dar predomin[ prelucr[rile nenumerice (sortare, c[utare, reuniune de fi=iere etc.) se va alege un limbaj orientat pe aceste probleme (Cobol, dBase, FoxPro etc.). Dac[ problema necesit[ prelucr[ri ale unor baze de cuno=tin\e se pot folosi limbaje speciale ca Prolog, Lisp, Ada etc.
49
}n etapa de codificare, o importan\[ deosebit[ trebuie acordat[ stilului de programare. }n general se consider[ c[, stilul de programare este bun dac[ ]ndepline=te condi\ii cum ar fi: programul este ]nso\it de documenta\ia de analiz[ =i proiectare care trebuie s[ con\in[ elementele minimale descrierea func\iilor programului (ce face programul), diagrama de structur[ (schi\a general[ a programului) tabele de descriere a variabilelor de intrare =i ie=ire etc. exist[ procedee de validare a datelor. Se pot utiliza diverse procedee (sume de control, coduri autocorectoare, intervale de apartenen\[, scrierea cu ecou, verificarea unor rela\ii existente ]ntre variabilele de intrare etc.) programul este lizibil. Acest lucru se poate realiza prin folosirea scrierii indentate (]n fier[str[u) a liniilor de program, prin alegerea unor nume sugestive pentru identificatori, prin folosirea (neabuziv[) a comentariilor etc. Etapa de testare este etapa ]n care se elimin[ erorile programului. Erorile pot fi de natur[ sintactic[ sau de natur[ logic[. Eliminarea erorilor de natur[ sintactic[ se face ]n urma listelor de erori afi=ate de compilatoare. Stabilirea corectitudinii din punct de vedere logic a programului se poate face prin demonstra\ie matematic[ sau prin testarea programului folosind date de test. Deoarece demonstrarea matematic[ a corectitudinii este dificil[ chiar =i pentru programe mici, metoda uzual[ este metoda datelor de test. Datele de test trebuie alese cu grij[, astfel ]nc`t s[ se poat[ valida toate ramurile programului. Dac[ sunt erori se ] ncearc[ localizarea acestora folosind diverse metode.
50
O metod[ rapid[ const[ ]n afi=area unor mesaje din loc ]n loc, prin analiza c[rora se poate stabili zona unde se afl[ eroarea. Mediile moderne de programare, care asist[ programatorul ]n punerea la punct a programului ofer[ =i alte facilit[\i de depanare, cum ar fi: ferestre de observare ]n timpul execu\iei a unor variabile =i expresii, execu\ia pas cu pas a liniilor de program, puncte de oprire a execu\iei etc. O dat[ ]ndep[rtate erorile de sintax[ =i de logic[, programul poate fi executat. Rezultatele ob\inute sunt analizate, =i ]n urma interpret[rii lor se iau deciziile corespunz[toare. }n mod normal programele sunt proiectate spre a fi rulate (executate) la diverse intervale de timp, pe seturi de date diferite. Aplica\ia informatic[ ob\inut[ din unul sau mai multe programe trebuie privit[ =i ca un produs care sufer[ ]n timp un proces de uzur[ moral[. Activitatea de ]ntre\inere a programului const[ ]n modific[ri ale programelor ori de c`te ori este nevoie, f[cute tocmai ]n scopul de a men\ine aplica\ia la zi. Depanarea =i ]ntre\inerea programelor sunt dou[ din activit[\ile care pun ]n lumin[, ]n cel mai ]nalt grad, importan\a unui stil bun de programare. Este evident c[ aceste activit[\i vor fi ]ngreunate dac[ programele nu sunt suficient documentate, dac[ lipsesc comentariile, scrierea este neindentat[, iar logica programului se realizeaz[ prin folosirea abuziv[ a instruc\iunilor de salt.
}NTREB{RI +I EXERCI|II
Enumera\i etapele de rezolvare ale unei probleme cu calculatorul
51
Descrie\i pe scurt fiecare etap[ de rezolvare a unei probleme cu calculatorul Descrie\i c`teva tr[s[turi ale unui bun stil de programare
52
}n acest paragraf vom prezenta, ]ntr-o manier[ general[, opera\iile elementare =i obiectele pe care le ]nt`lnim de obicei ]ntr-un limbaj de programare. Datele sunt obiectele folosite ]ntr-un limbaj de programare =i pot fi de dou[ tipuri: date elementare =i date structurate. Datele elementare sunt recunoscute de calculator =i se refer[, ]n majoritatea cazurilor la urm[toarele tipuri de date: date numerice date logice date alfanumerice
Datele numerice pot fi ]ntregi sau reale. Datele ]ntregi pot fii reprezentate ]n sistemul zecimal (-64, 9569, + 311 etc.) sau ]n alte siteme (de exemplu ]n sistemul hexazecimal: AD4, 6E3C etc.). Datele reale se reprezint[ ]n multe limbaje de programare sub dou[ forme: ]n nota\ie uzual[ (nota\ie cu punct), unde virgula e reprezentat[ printr-un punct (-69.43, 812.115, + 0.6395 etc.) ]n nota\ie =tiin\ific[ (exponen\ial[). }n acest caz succesiunile E b sau e b au semnifica\ia de 10 b . De exemplu, 0.52 E + 02,
0.52 10 2 , 3.25 10 7 .
3.25e 07
]nseamn[
Opera\iile care se fac ]n mod obi=nuit sunt opera\ii de adunare, sc[dere, ]nmul\ire, ]mp[r\ire, ridicare la putere.
45
Datele logice se refer[ la valorile logice (numite =i booleene) adev[rat =i fals. Opera\iile permise sunt cele cunoscute: conjunc\ie (+I), disjunc\ia (SAU), nega\ia (NU), SAU exclusiv etc. dac[ not[m cu 1 valoarea adevarat =i cu 0 valoarea fals, rezultatele acestor opera\ii sunt dup[ cum urmeaz[ (Tabelul 7.1): a 0 0 1 1 b 0 1 0 1 a SI b 0 0 0 1 a SAU b 0 1 1 1 Tabelul 7.1 Datele alfanumerice se refer[ la caractere =i =iruri de caractere. Asupra acestor tipuri de date sunt permise opera\ii cum ar fi compara\ia, copierea, concatenarea (alipirea) etc. De exemplu, prin concatenarea =irurilor Ploie=ti =i Vest rezult[ =irul Ploie=ti - Vest. Se observ[ c[ un tip de date este caracterizat printr-o mul\ime de valori =i o mul\ime de opera\ii care se aplic[ acelor valori. }n cadrul unui algoritm, datele se prezint[ sub forma variabilelor =i a constantelor. Constantele nu-=i modific[ valoarea ]n timpul execu\iei algoritmului. De exemplu, 6.29 este o constant[ real[. O variabil[ ]=i poate modifica valoarea pe parcursul execu\iei algoritmului. Numele unei variabile se asociaz[ cu adresa unei celule, iar valoarea ei la un moment dat, cu con\inutul acesteia. Variabilele pot fi clasificate ]n variabile statice =i dinamice. }n cazul variabilele statice numelui unei variabile i se asociaz[ adresa unei loca\ii de memorie pe toat[ durata execu\iei algoritmului. NU a 1 1 0 0 a SAU exclusiv b 0 1 1 0
46
Valoarea variabilei este dat[ de con\inutul acestei loca\ii la un moment dat. De exemplu, atribuirea: x3 se poate schi\a grafic sub forma: x 3 Prin atribuirea
x7
7
Unei variabile dinamice i se poate asocia pe parcursul execu\iei unui algoritm diferite adrese. O dat[ fixat[ adresa celulei asociate se poate prelucra con\inutul (informa\ia propriu-zis[) din celul[. ]n cazul static asocierea numevariabil[ adres[ celul[ este fix[ (static[), conform schi\ei s
leg[tur[ static[ 3
]n cazul dinamic, asocierea nume-variabil[ adres[celule este variabil[ (dinamic[), dup[ cum sugereaz[ schema urm[toare:
d
Datele avute ]n vedere p`n[ acum sunt date elementare, indivizibile ]n raport cu opera\iile pe care le prelucreaz[. Combina\ii valide sintactic de date (operanzi) =i opera\ii (operatori) formeaz[ expresii.
47
}NTREB{RI +I EXERCI|II
Da\i exemple de date ]ntregi, reale, alfanumerice Ce se ]n\elege prin variabile statice? Ce se ]n\elege prin variabile dinamice?
8. STRUCTURI DE DATE
Abordarea datelor sub aspectul lor elementar este ]n foarte multe situa\ii, nesatisf[c[toare. De foarte multe ori, este preferabil sau chiar imperios necesar ca datele s[ fie privite drept componente ale unor structuri de date mai complexe. Structurile de date folosite frecvent ]n algoritmi sunt: tabloul, ]nregistrarea, lista linear[ simplu ]nl[n\uit[, lista linear[ dublu ]nl[n\uit[, stiva, coada, arborele, graful. Tabloul reprezint[ o colec\ie omogen[ de date (de acela=i tip, numit tip de baz[). Tablourile modeleaz[ vectori, matrici, masive multidimensionale. Accesul la elementele unui tablou se face folosind indicii. De exemplu, componentele ha=urate ale vectorului a =i ale matricii b din Figura 8.1 se desemneaz[ prin a[3] =i b[1][2] . Numerele 3, 1 =i 2 dintre
48
parantezele p[trate sunt indici. Indicele 3 desemneaz[ a 3-a component[ din =irul de componente a[1] , a[2] , a[3] , a[4] , iar indicii 1 =i 2 se refer[ la elementul aflat pe linia 1 =i coloana 2 din matricea b de dimensiune 3 4
numesc variabile indexate. Nota\ia indicelui =i implicit folosirea tablourilor are o importan\[ cov`r=itoare ]n prelucrarea datelor. Pentru a ilustra acest lucru, s[ presupunem c[, vrem s[ calcul[m suma a n numere reale cu n cunoscut. Dac[ n = 4 atunci, reprezent`nd cele 4 numere prin a, b, c =i d, vom avea algoritmul: Cite=te a, b, c, d
s a+b+c+ d
Scrie s Stop Dac[ n este mare (s[ zicem 100) merg`nd pe aceea=i idee, ar trebui s[ avem 100 de variabile =i s[ le prelucr[m conform algoritmului de mai sus. Evident, acest lucru este de neimaginat. Solu\ia const[ ]n a folosi n = 100 variabile indexate, xi ,
i = 1, n
=i de a calcula suma
x
i =1
folosind o
structur[ iterativ[ de control. }nregistr[rile modeleaz[ colec\ii neomogene de date. De exemplu, se presupunem c[ pentru fiecare persoan[ a unui colectiv ne intereseaz[ datele: nume (tip alfanumeric), v`rst[ (tip ]ntreg), salariu (tip real), sex (tip boolean). Pentru o persoan[ datele de tip diferit pot fi reunite ]ntr-o ]nregistrare ca ]n variabila ]nregistare info (Figura 8.2):
49
sex 1
nume, v`rst[, salariu, sex se numesc c`mpuri. Referirea la un c`mp se face folosind construc\ia nume_variabila.nume_camp De exemplu, info.nume se refer[ la =irul Ionescu, nume.varsta la valoarea 52 etc. }n mod natural listele de obiecte se pot memora ]n tablouri unidimensionale (vectori). De exemplu, lista de persoane Ionescu, Popescu, Georgescu, Vasilescu poate fi memorat[ ]n vectorul persoane (Figura 8.3): persoan e Ionesc u Popesc u Georgesc u Figura 8.3 Folosind structura tablou, dou[ elemente vecine din list[ sunt memorate la adrese vecine (de exemplu, vecinii Popescu =i Georgescu sun memorate la adresele vecine 2 =i 3). Aceast[ variant[ de implementare a listelor (numit[ static[) are avantajul unei parcurgeri rapide ]n ambele sensuri, ]n orice punct ne-am afla. Dificultatea apare la eliminarea sau ad[ugarea unui element nou ]n list[. Presupun`nd c[ vectorul ]n care se memoreaz[ lista are o dimensiune suficient[, introducerea persoanei Marinescu ]n list[ pe pozi\ia a 2-a implic[ deplasarea sub=irului Popescu, Georgescu, Vasilescu cu o pozi\ia spre dreapta conform schi\ei (Figura 8.4): Vasiles cu
Marinesc u
50
Ionescu
Popescu
Georges cu
Vasilesc u
Figura 8.4 Deplas[ri, dar de data asta, spre st`nga au loc =i atunci c`nd se elimin[ elemente din list[. De exemplu, dac[ din lista ini\ial[ se dore=te scoaterea persoanei Popescu acest lucru implic[ deplas[ri spre st`nga cu o pozi\ie (Figura 8.5).
Ionescu
Popescu
Georges
Vasilesc u
Figura 8.5 Aceste deplas[ri consum[ timp calculator a c[rui m[rime depinde de pozi\ia de inser\ie sau de =tergere. O solu\ie de implementare care rezolv[ elegant aceste probleme o reprezint[ listele ]nl[n\uite. }ntr-o list[ ] nl[n\uit[ elementele vecine din list[ nu sunt memorate obligatoriu la adrese vecine. Lista de mai sus poate fi implementat[ dinamic sub forma unei liste simplu ]nl[n\uite, ca ]n Figura 8.6:
Ionesc u
Popesc u
Vasilesc u
Orice element al listei (nod) este alc[tuit din dou[ c`mpuri. Un c`mp unde se memoreaz[ informa\ia propriuzis[ (Ionescu, Popescu, Georgescu, Vasilescu etc.) =i un c`mp de leg[tur[, unde se memoreaz[ adresa urm[torului element din list[. Evident, consumul de memorie este mai mare dec`t ]n cazul listelor lineare implementate prin vectori (static), ]
51
ns[ avantajul apare la efectuarea opera\iilor de inser\ie =i =tergere. Astfel, inser\ia ]n list[ a persoanei Marinescu se realizeaz[, conform schi\ei de mai jos (Figura 8.7), foarte simplu, actualiz`nd corespunz[tor leg[turile. Ionesc u Popesc u
Georges cu
Vasilesc u
Marinesc u
Figura 8.7 +tergerea persoanei Popescu din list[ ini\ial[ se face memor`nd ]n c`mpul de adres[ al primului nod (Ionescu) adresa nodului Georgescu. }n felul acesta nodul Popescu r[m`ne izolat. Schi\a urm[toare ilustreaz[ acest lucru (Figura 8.8). Ionesc u Popesc u Georges cu Vasilesc u
Figura 8.8 Analiz`nd lista simplu ]nl[n\uit[ se observ[ c[ vizitarea vecinului drept se face cu u=urin\[, datorit[ sensului st`ngadreapta ]n care s-au f[cut ]nl[n\uirile. Realizarea leg[turilor ]n ambele sensuri (st`nga-dreapta =i dreapta-st`nga) presupune ca fiecare nod s[ aib[ dou[ c`mpuri de leg[tur[. Ceea ce se ob\ine este lista dublu ]nl[n\uit[, ilustrat[ mai jos (Figura 8.9):
Iones cu Popescu Georges cu Vasiles cu
Figura 8.9
52
Cu pre\ul introducerii unui c`mp de leg[tur[ pentru fiecare c`mp se ob\ine astfel o list[ dinamic[ cu facilit[\i de deplasare rapid[ ]n ambele sensuri. }n informatic[, deosebit de utile sunt dou[ tipuri particulare de liste: stiva =i coada. Stiva este lista liniar[ ]n care ad[ugarea =i extragerea unui element se fac pe la acela=i cap al listei. Se spune c[ opera\iile ]n stiv[ se fac dup[ disciplina LIFO (Last In First Out Ultimul Intrat Primul Ie=it). Pentru a face ad[ug[ri sau extrageri este nevoie s[ se =tie pozi\ia ultimului element din stiv[. Aceasta este memorat[ ]ntr-o variabil[ numit[ v`rf. }n figura de mai jos (Figura 8.10) se prezint[ schematic cele dou[ implement[ri static[ =i dinamic[.
v`rf
X X X
v`rf
Figura 8.10 Coada este lista liniar[ ]n care ad[ugarea elementelor se face pe la un cap, iar extragerea elementelor pe la cel[lalt cap. Disciplina specific[ unei cozi este FIFO (First In First Out Primul Intrat Primul Ie=it). Mai jos (Figura 8.11), ar[t[m schi\a celor dou[ modalit[\i de implementare: static[ =i dinamic[. X X X prim ultim prim
53
ultim
Figura 8.11 Variabilele prim =i ultim arat[ locul de unde se extrag, respectiv unde se adaug[ elemente. Deoarece foarte multe probleme se refer[ la obiecte aflate ]ntr-o rela\ie de ordin ierarhic (piramidal), structura adecvat[ pentru descrierea acestor rela\ii este arborele. Ca exemple de structuri arborescente amintim: structura unei armate, structura unei c[r\i, structura unei firme, organizarea teritorial[ a unei \[ri etc. Schi\a de mai jos (Figura 8.12) arat[ organizarea studen\ilor p`n[ la nivel de grupe ]n cadrul profilului matematic[ al Facult[\ii de Litere =i +tiin\e.
profilul matematic[-informatic[
An I
An 2
An 3
An 4
Grupa 1
Grupa 2
Grupa 3
Grupa 4
Grupa 5
Grupa 6
Grupa 7
Grupa 8
Figura 8.12 Elementele arborelui se numesc noduri. O pozi\ie aparte o ocup[ nodul etichetat profilul matematic[-informatic[ care se nume=te r[d[cin[. P[str`nd analogia cu un arbore ]ntors, nodurile Grupa1, Grupa2 etc. se numesc frunze (sau noduri terminale). Implementarea arborilor se poate face de obicei dinamic, ]ns[ exist[ =i variante statice. Pentru descrierea celor mai complexe rela\ii dintre obiecte se utilizeaz[ graful. Un graf foarte cunoscut este re\eaua de c[i ferate descris[ ]n mersul trenurilor. }n acest caz,
54
obiectele (nodurile) sunt sta\iile de cale ferat[, iar muchiile grafului sunt reprezent[rile c[ilor ferate care leag[ sta\iile. Alte exemple: re\eaua de drumuri dintr-un ora= (nodurile sunt intersec\iile), re\eaua de calculatoare din universitate etc. C`nd rela\iile dintre obiecte sunt nesimetrice modelarea se face cu ajutorul digrafului (directed graph graf direc\ionat). Mai jos (Figura 8.13), prezent[m digraful datoriilor dintre patru persoane: Ion, Gheorghe, Mihai, Andrei. O s[geat[ de la nodul a la nodul b se traduce prin a este dator lui b.
Ion 1 Mihai 3
Gheorg he 2 Andrei 4
Figura 8.13 Se observ[ c[ Andrei nu are datorii, la nici-un membru al listei =i, ]n acela=i timp, nici unul dintre ace=tia nu-i este dator. Implementarea se poate face at`t static c`t =i dinamic. }n implementarea static[ se folose=te matricea de adiacen\ [. Dac[ vom considera nodurile ca fiind numerotate 1, 2, , n matricea de adiacen\[ A are semnifica\ia:
A=
Implementarea dinamic[ ia forma listelor de adiacen\[. Pentru exemplul considerat, lista de adiacen\[ este urm[toarea:
Mihai
}NTREB{RI +I EXERCI|II
Caracteriza\i tipul de date tablou. Exemplifica\i Da\i c`teva exemple de ]nregistr[ri Enumera\i avantajele =i dezavantajele implement[rilor statice =i dinamice ale listelor Caracteriza\i stiva. Da\i c`teva exemple. Caracteriza\i coada. Da\i c`teva exemple. Caracteriza\i arborele. Da\i c`teva exemple. Caracteriza\i graful. Da\i c`teva exemple.
56
57
generalitate furnizeaz[ rezultate pentru o mul\ime de date de intrare; finititudine procesul trebuie s[ fie finit pentru a furniza un rezultat concret; neambiguitate fiecare pas se execut[ dup[ reguli bine precizate.
Cerin\a ca pa=ii algoritmului s[ fie executabili se refer[ la capacitatea lor efectiv[ de a produce rezultate. De exemplu, comanda sorteaz[ ]n ordine cresc[toare toate numerele ] ntregi pozitive nu poate fi pasul unui algoritm, deoarece, a sorta toate numerele ]ntregi pozitive (o infinitate) este o ac\iune imposibil[. O posibilitate de a descrie un algoritm este limbajul natural. Datorit[ polisemiei unor termeni, limbajul natural nu este potrivit pentru reprezentarea algoritmilor. De foarte multe ori, ambiguitatea prezent[ ]ntr-un algoritm nu \ine de algoritmul ]nsu=i ci de modul s[u de reprezentare. Gradul de detaliere ]n reprezentarea unui algoritm poate s[ aib[ drept obiectiv nivelul opera\iilor executabile de c[tre un calculator. Descrierea rezultat[ este stufoas[ =i puternic ] ngreunat[ de omniprezen\a structurilor de salt condi\ionat =i necondi\ionat. Teorema de structur[ elaborat[ de Bhm =i Jacopini furnizeaz[ justificarea conceptului de programare structurat[ implementat ]n limbajele de programare moderne. Conform acestei teoreme, orice algoritm cu un singur punct de ]nceput =i un singur punct de terminare a execu\iei poate fi reprezentat ca o combina\ie de trei structuri algoritmice fundamentale: secven\a de dou[ sau mai multe opera\ii decizia alegerea unei opera\ii din dou[ alternative posibile itera\ia cu test ini\ial repetarea unei secven\e c`t timp este adev[rat[ o anumit[ condi\ie
58
Se observ[ c[ cele trei structuri de control corespund unor procese naturale ale ra\ionamentului uman: enumerare, decizie, repeti\ie. Acest lucru explic[ =i u=urin\a =i naturale\ea cu care sunt descri=i algoritmii folosind structurile de mai sus. De cele mai multe ori descrierea acestor structuri nu se face direct ]ntr-un limbaj de programare, ci se utilizeaz[ anumite conven\ii de reprezentare. Foarte des ]nt`lnite ]n practic[ sunt conven\iile de reprezentare sub form[ de schem[ logic[ =i pseudocod. Aceste conven\ii au avantajul lipsei de formalism (sunt mai intuitive) al limbajelor de programare =i totodat[ permit reprezentarea cu claritate a structurilor algoritmice fundamentale. Reprezentarea sub forma schemei logice folose=te simboluri grafice cu ]n\eles prestabilit. Cele mai uzuale simboluri sunt (Figura 9.1): Bloc terminal Bloc intrare ie=ire Bloc de calcul
Bloc de decizie
Bloc conector S[geat[ Figura 9.1 Pentru exemplificare s[ consider[m algoritmul de rezolvare al ecua\iei de gradul I. Fie deci ecua\ia
ax + b = 0
59
Variabilele de intrare sunt a =i b, iar variabila de ie=ire este x. }n limbaj natural, discu\ia ecua\iei de gradul I se poate face astfel: dac[ a 0 atunci ecua\ia este determinat[ =i are r[d[cina x = b / a dac[ a = 0 atunci analiz[m cazurile: dac[ b = 0 ecua\ia devine 0 x + 0 = 0 adic[ ecua\ia e nedeterminat[ dac[ b 0 ecua\ia devine 0 x + b = 0 adic[ ecua\ia este imposibil[ Se observ[ c[, de=i exemplul este destul de simplu, descrierea ]n limbaj natural este relativ greoaie. O descriere simpl[ =i clar[ este realizat[ mai jos (Figura 9.2) cu ajutorul Start schemei logice. Cite=t e a, b
Nu
Da
x b / a
Scrie x
Da
Nu
60
Stop
Figura 9.2 }n pseudocod, ]n locul simbolurilor grafice se utilizeaz[ cuvinte cu ]n\eles prestabilit (cuvinte cheie). Astfel, descrierea ecua\iei de gradul I ia forma: Cite=te a, b Dac[ a 0 Atunci x -b/a Scrie x Altfel Dac[ b = 0 Atunci Scrie Ecua\ie nedeterminat[ Altfel Scrie Ecua\ie imposibil[
Stop Se observ[ c[ modul de subordonare logic[ este sugerat cu ajutorul unor reguli de aliniere simple. Opera\ii elementare cum sunt citirea, scrierea, atribuirea, sf`r=it execu\ie, se pot reprezenta sub forma: Cite=te lista de variabile Scrie lista de expresii v expresie Stop Modul de reprezentare al celorlalte opera\ii complexe (decizia, itera\ia) va fi descris ]n paragrafele 9.2 =i 9.3.
9.1. SECVEN|A
61
O secven\[ este o suit[ de opera\ii care se execut[ ]n ordinea ]n care sunt scrise. De exemplu, descrierea algoritmului pentru calculul expresiei e = x + 1 este o secven\[ pe care o prezent[m mai jos: Cite=te x ex+1 Scrie e Stop
9.2. DECIZIA
Decizia are urm[toarele reprezent[ri ]n pseudocod =i schem[ logic[ (Figura 9.3):
Conditie
Adev[rat
secventa1
dac[ conditie este adev[rat[ secventa1, ] Fals se execut[ Adevrat n caz contrar se execut[ secventa2
max b
a> b
Scrie max Stop
max a
62
igura 9.3
conditie
Fals
Adevarat secventa
Figura 9.4 Efectul acestei structuri este urm[torul: se execut[ secventa c`t timp conditie este adev[rat[. Observa\ii. dac[ din start condi\ie ia valoarea Fals, secven\a nu se execut[ niciodat[ secventa trebuie s[ con\in[ enun\uri care s[ conduc[ la modificarea valorii de adevar a condi\iei dup[ un num[r finit de pa=i (condi\ia trebuie sa ia valoarea Fals la un moment dat pentru a se ie=i din ciclu, ]n caz contrar se produce o bucl[ etern[ sau un ciclu infinit).
63
C`t timp x > 6 Execut[ yx Stop Se observ[ c[ secven\a y x nu va modifica niciodat[ valoarea variabilei x. }n consecin\[, x va avea ] ntotdeauna valoarea 7, condi\ia x > 7 va fi ]ntotdeauna adev[rat[ =i, deci, secven\a y x se va executa de o infinitate de ori. Exemplu. Calculul sumei elementelor unui =ir. Sf`r=itul =irului este marcat de cifra zero.
Start
Cite=te x
s0
s s+ x
Cite=te x Scrie s Stop
x0
Da
Nu
Scrie x
Stop
s =s+x
Citeste x
Pentru a u=ura implementarea =i a spori claritatea programelor, majoritatea limbajelor de programare utilizeaz[ =i alte structuri algoritmice, echivalente logic cu structurile algoritmice fundamentale prezentate. Astfel, ]n cazul deciziei amintim decizia cu ramur[ vid[ =i decizia generalizat[ (sau selec\ia).
65
Fals
conditie
Adevarat
secventa
Figura 9.5 Efectul deciziei cu ramur[ vid[ const[ ]n execu\ia condi\ionat[ a secven\ei: secventa se execut[ numai dac[ conditie este adev[rat[. Exemplu. Calculul maximului dintre dou[ numere a =i b utiliz`nd decizia cu ramur[ vid[.
Start Cite=te a, b
Cite=te a,b
max a
Nu
max a
Dac[ a < b Atunci
max b
a<b
Da
max b
Stop
66
Decizia generalizat[ permite alegerea (selec\ia) unei alternative din mai multe posibile. Forma general[ a selec\iei este urm[toarea:
secventa1
Alege expresie Dintre C1: secventa1 C2: secventa2 . . . . . . Cn: secventan Altfel secventan+1
C1
C2
secventa2
C3 secventa3
ci se
ci se
execut[ secventan+1 =i se iese din structur[ Observa\ie. Secven\a secventan+1 este op\ional[. Exemplu. Se cite=te un caracter =i ]n func\ie de valoarea sa se scriu diferite mesaje. Algoritmul este descris ]n pseudocod. Citeste x Alege x Dintre a, A: Scrie (Ana) e: Scrie (Elena) m..a: Scrie (Mona, Nae, Oana) Altfel: Scrie (Ati tastat gresit)
67
Stop De regul[, ]n limbajele moderne de programare se implementeaz[ al[turi de itera\ia cu test ini\ial =i urm[toarele dou[ forme de echivalen\e: itera\ia cu contor (structura Pentru) itera\ia cu test final (structura Repet[ C`t Timp)
Itera\ia cu contor este un caz particular al itera\iei cu test ini\ial. Rolul central ]l ocup[ o variabil[ special[, numit[ variabil[ contor, care poate fi ini\ializat[, actualizat[ =i poate controla valoarea logic[ a condi\iei. Actualizarea ] nseamn[ modificarea cu o valoare constant[ (numit[ ra\ie sau pas) a variabilei contor. Reprezentarea ]n pseudocod =i sub form[ de schem[ logic[ a itera\iei cu contor este prezentat[ mai jos:
v vi
Observa\ie. Situa\ia descris[ ]n schema logic[ de mai sus se refer[ la cazul vi vf =i ra\ia r > 0. C`nd vi > vf =i r < 0 condi\ia de test se schimb[ ]n v vf. Structura de control Pentru se folose=te c`nd se cunoa=te num[rul de itera\ii. Observa\iile f[cute la structura C`t timp r[m`n valabile =i aici.
68
Pentru i 1, n Cite=te x
Execut[
s s+ x
Scrie s Stop Observa\ie. C`nd ra\ia lipse=te se consider[ c[ implicit are valoarea 1. Itera\ia cu test final se reprezint[ ]n pseudocod =i schem[ logic[ sub forma:
secventa
conditie
Fals
Observa\ii. Secventa se execut[ cel pu\in o dat[. Pentru a nu se cicla la infinit, secventa trebuie s[ con\in[ enun\uri care, dup[ un num[r finit de pa=i s[ conduc[ la valoarea de adev[r Fals pentru conditie. Exemplu. Calculul valorii citit de la tastatur[. Repet[ Cite=te x C`t Timp
y x y= x
x<0
Scrie y
69
Stop
9.4.2
PROCEDURI +I FUNC|II
Sunt frecvente cazurile ]n care o secven\[ de instruc\iuni este reluat[ pe parcursul unei algoritm schimb`ndu-se de fiecare dat[ numai valorile ini\iale ale variabilelor. Pentru a se evita scrierea acelora=i instruc\iuni de mai multe ori, acestea sunt organizate separat, sub forma unui subalgoritm =i apelate ]n algoritmul principal ori de c`te ori este nevoie.
70
Algoritm
Algoritm principal
Subalgorit m
apel subalgoritm
Instruc\iuni
care se repet[
apel subalgoritm
Instruc\iun
i care se repet[
apel subalgoritm
Subalgoritmul poate lua forma unei proceduri sau a unei func\ii. ihgiggire }n pseudocod o procedur[ se reprezint[ astfel: Procedura nume_procedura (lista_de_parametri) corpul procedurii Sf`r=it Preciz[ri: cuvintele Procedura =i Sf`r=it sunt cuvinte rezervate nume_procedura este evident numele procedurii =i serve=te la identificarea instruc\iunilor care se apeleaz[ lista_de_parametrii reprezin[ parametrii formali sau fictivi; lista poate fi vid[
71
Apelul unei proceduri se face prin specificarea numelui procedurii urmat de lista de parametrii actuali sau efectivi cuprin=i ]ntre paranteze rotunde: nume_procedura (lista_de_parametri) +i ]n acest caz lista_de_parametrii poate sa fie vid[. Transferul informa\iei dinspre algoritmul principal spre procedur[ =i invers se face prin intermediul parametrilor. Exist[ =i posibilitatea de a transmite informa\ii prin variabile globale, adic[ variabile care sunt recunoscute (se v[d) =i ]n algoritmul principal =i ]n procedur[. Aceast[ ultim[ variant[ nu este recomandat[ deoarece, tocmai datorit[ caracterului lor global, valorile variabilelor pot fi modificate uneori din gre=eal[. Parametrii formali pot sau nu avea acelea=i nume cu parametrii actuali. Important este ]ns[ ca ]n ambele liste s[ existe un num[r egal de parametrii, iar parametrii formali =i actuali de pe aceea=i pozi\ie s[ fie de tipuri compatibile. Numele procedurii nu intervine ]n opera\iile expresiilor din algoritm. Rolul s[u este numai de a identifica instruc\iunile care se apeleaz[. Exemplu. Calculul combin[rilor de n luate c`te k
k Cn =
n! , k!(n k )!
utiliz`nd o procedur[ pentru calculul factorialului. Descrierea se face ]n pseudocod. Procedura Fact (m,Fm)
p 1
Pentru k 2, n Execut[
p p k
Fm p
Sf`r=it
72
Cite=te n, k Fact (n, Fn) Fact (k, Fk) Fact (n-k, Fnk)
C nk Fn /( Fnk Fk )
Scrie Cnk Stop La efectuarea apelului, se execut[ instruc\iunile din procedur[, iar dup[ terminare se revine ]n algoritmul principal la prima instruc\iune de dup[ apel. Un algoritm principal poate apela subalgoritmi diferi\i, iar fiecare subalgoritm poate apela la r`ndul s[u al\i subalgoritmi. }n exemplul de mai sus procedura Fact este apelat[ de trei ori. De fiecare dat[ parametrii formali m,Fm sunt pu=i ]n coresponden\[ cu parametrii actuali corespunz[tori. De exemplu, la apelul Fact(n,Fn) parametrul formal m prime=te valoarea parametrului actual n. Se execut[ instruc\iunile din procedur[ iar rezultatul (n!) calculat ]n Fm se ]ntoarce ]n algoritmul principal prin parametrul actual corespunz[tor Fn. Analog, dup[ apelul succesiv al procedurii, ]n Fnk se va afla valoarea k!, iar ]n Fnk valoarea (n-k)! }n pseudocod, o func\ie se reprezint[ astfel: Func\ia nume_functie (lista_de_parametri) corpul func\iei Sf`r=it Preciz[ri: cuvintele Func\ie =i Sf`r=it sunt cuvinte rezervate nume_functie este numele func\iei lista_de_parametri reprezint[ parametri formali sau fictivi; lista poate fi vid[
73
Transferul informa\iei dinspre algoritm spre func\ie se face prin intermediul parametrilor formali la apelul func\iei. Rezultatul prelucr[rilor din corpul func\iei se ]ntoarce ]n algoritmul principal prin intermediul numelui func\iei. Din acest motiv, ]n corpul func\iei, nume_functie trebuie s[ primeasc[ cel pu\in o valoare. Numele func\iei urmat (dac[ e cazul) de list[ de parametri actuali cuprins[ ]ntre paranteze poate s[ fie operand ]ntr-o expresie; la apel construc\ia nume_functie(lista_parametri_actuali) va fi ]nlocuit[ cu rezultatul prelucr[rilor din corpul func\iei. Exemplu. Calculul expresiei
y = f ( x ) + 5.63
x + 2 daca x > 7 f ( x) = 10.25 daca x = 7 e x x daca x < 7
unde
Altfel Dac[ x = 7
f 10.25
Altfel
f ex x
Sf`r=it Cite=te x
y f ( x ) + 5.63
Scrie y Stop
74
}NTREB{RI +I EXERCI|II
Ce este algoritmul. Da\i c`teva exemple. Enumera\i caracteristicile de baz[ ale algoritmului Enun\a\i teorema de structur[ Descrie\i ]n pseudocod secven\a. Da\i c`teva exemple. Descrie\i ]n pseudocod decizia. Da\i c`teva exemple. Descrie\i ]n pseudocod itera\ia. Da\i c`teva exemple. Explica\i rolul procedurilor =i func\iilor. Da\i 3 exemple de func\ii =i 3 exemple de proceduri
75