Sunteți pe pagina 1din 134

VALERIU LUPU

ALGORITMI. TEHNICI I LIMBAJE DE PROGRAMARE

EDITURA UNIVERSITII TEFAN cel MARE SUCEAVA 2 !

Prefa
Cartea isi propune in primul rand sa fie un curs si nu o "enciclopedie" de algoritmi. Pornind de la structurile de date cele mai uzuale si de la analiza eficientei algoritmilor, cartea se concentreaza pe principiile fundamentale de elaborare a algoritmilor: greedy, divide et impera, programare dinamica, backtracking. Majoritatea algoritmilor selectati au o conotatie estetica. fortul necesar pentru intelegerea elementelor mai subtile este uneori considerabil. Ce este insa un algoritm "estetic"! Putem raspunde foarte simplu: un algoritm este estetic daca e"prima mult in cuvinte putine. #n algoritm estetic este oare in mod necesar si eficient! Cartea raspunde si acestor intrebari. $n al doilea rand, cartea prezinta mecanismele interne esentiale ale limbajului %isual &asic si trateaza implementarea algoritmilor in mod iterative cat si recursiv. 'otusi, aceasta carte nu este un curs complet de %isual &asic. (lgoritmii nu sunt pur si simplu "transcrisi" din pseudo)cod in limbajul %isual &asic, ci sunt reganditi din punct de vedere al programarii orientate pe obiect. *peram ca, dupa citirea cartii, veti dezvolta aplicatii de programare in mod iterative cat si recursiv si veti elabora implementari ale altor structuri de date. Programele pot fi scrise si in limbajul C+. (cest limbaj se caracterizeaza, in principal, prin introducerea claselor parametrice si a unui mecanism de tratare a e"ceptiilor foarte avansat, facilitati deosebit de importante pentru dezvoltarea de biblioteci C+. ,ara a face concesii rigorii matematice, prezentarea este intuitiva, cu numeroase e"emple. (m evitat, pe cat posibil, situatia in care o carte de informatica incepe ) spre disperarea ne)matematicienilor ) cu celebrul ",ie ... ", sau cu o definitie. (m incercat, pe de alta parte, sa evitam situatia cand totul "este evident", sau "se poate demonstra". ,iecare capitol este conceput fluid, ca o mica poveste, cu putine referinte si note. Multe rezultate mai te-nice sunt obtinute ca e"ercitii. (lgoritmii sunt prezentati intr)un limbaj pseudo)cod compact, fara detalii inutile. Presupunem ca cititorul nu are la baza cel putin un curs introductiv in programare, fiindu)i straini termeni precum algoritm, recursivitate, functie, procedura si pseudo)cod. "ista mai multe modalitati de parcurgere a cartii. $n functie de interesul si pregatirea cititorului, acesta poate alege oricare din partile referitoare la elaborarea, analiza, sau implementarea algoritmilor. Cu e"ceptia partilor de analiza a eficientei algoritmilor .unde sunt necesare elemente de matematici superioare/, cartea poate fi parcursa si de catre un elev de liceu. Pentru parcurgerea sectiunilor de implementare, este recomandabila cunoasterea limbajului %isual &asic. *)a dovedit utila si e"perienta autorului de peste douzeci de ani in dezvoltarea produselor soft0are. 1e multumesc pentru aprecieri pro2contra asupra lucr3rii membrilor catedrei de informatic3 de la ,acultatea de 4tiin5e conomice 6i (dministra5ie Public3. (utorul, Conf. univ. dr. 1upu %aleriu #niversitatea 74tefan cel Mare8 *uceava ,acultatea de 4tiin5e conomice 6i (dministra5ie Public3 Catedra de $nformatic3

Cuprins

C"#$%&l'l I C"#$%&l'l II C"#$%&l'l III C"#$%&l'l IV C"#$%&l'l V C"#$%&l'l VI C"#$%&l'l VII C"#$%&l'l VIII C"#$%&l'l I( C"#$%&l'l ( C"#$%&l'l (I C"#$%&l'l (II B$)l$&*+",$e

:escrierea algoritmilor .................................................................................................; *ubprograme ................................................................................................. .............<; Metode de proiectare a algoritmilor ...........................................................................=3 (naliza algoritmilor ...................................................................................... .............=> Clase de algoritmi ........................................................................................................39 volu5ia limbajelor de programare .............................................................................9< 1imbajul %isual &asic ................................................................................................?? @eguli privind alegerea unui limbaj de programare ...................................................;A Metoda backtracking ..................................................................................................>3 Metoda Divide et impera ............................................................................................A< Metoda Greedy ...........................................................................................................A? *tudii de caz B (plica5ii ................................................................................ ...........<CA ....................................................................................................................................<3?

CAPITOLUL I
DESCRIEREA ALGORITMILOR -.- Al*&+$%./ #+&*+"./ #+&*+"."+e (pari5ia primelor calculatoare electronice a constituit un salt uria6 Dn direc5ia automatiz3rii activit35ii umane. Eu e"ist3 ast3zi domeniu de activitate Dn care calculatorul s3 nu D6i arate utilitateaF<GH. Calculatoarele pot fi folosite pentru a rezolva probleme, numai dac3 pentru rezolvarea acestora se concep programe corespunz3toare de rezolvare. 'ermenul de program .programare/ a suferit sc-imb3ri Dn scurta istorie a informaticii. Prin anii I;C problemele rezolvate cu ajutorul calculatorului erau simple 6i se g3seau algoritmi nu prea complica5i pentru rezolvarea lor. Prin program se Dn5elegea rezultatul scrierii unui algoritm Dntr)un limbaj de programare. :in cauza cre6terii comple"it35ii problemelor, ast3zi pentru rezolvarea unei probleme adesea vom concepe un sistem de mai multe programe. :ar ce este un algoritm! J defini5ie matematic3, riguroas3, este greu de dat, c-iar imposibil3 f3r3 a introduce 6i alte no5iuni. %om Dncerca Dn continuare o descriere a ceea ce se Dn5elege prin algoritm. Ee vom familiariza cu aceast3 no5iune prezentKnd mai multe e"emple de algoritmi 6i observKnd ce au ei Dn comun. Cel mai vec-i e"emplu este algoritmul lui uclid, algoritm care determin3 cel mai mare divizor comun a dou3 numere naturale. vident, vom prezenta mai mul5i algoritmi, cei mai mul5i fiind lega5i de probleme accesibile absolven5ilor de liceu. %om constata c3 un algoritm este un te"t finit, o secven53 finit3 de propozi5ii ale unui limbaj. :in cauz3 c3 este inventat special Dn acest scop, un astfel de limbaj este numit l$.)"0 1e 1e2c+$e+e " "l*&+$%.$l&+. ,iecare propozi5ie a limbajului precizeaz3 o anumit3 regul3 de calcul, a6a cum se va observa atunci cKnd vom prezenta limbajul Pseudocod. Jprindu)ne la semnifica5ia algoritmului, la efectul e"ecu5iei lui, vom observa c3 fiecare algoritm define6te o func5ie matematic3. :e asemenea, din toate sec5iunile urm3toare va reie6i foarte clar c3 un algoritm este scris pentru rezolvarea unei probleme. :in mai multe e"emple se va observa Dns3 c3, pentru rezolvarea acelea6i probleme, e"ist3 mai mul5i algoritmi. Pentru fiecare problem3 P e"ist3 date presupuse cunoscute .date ini5iale pentru algoritmul corespunz3tor, A/ 6i rezultate care se cer a fi g3site .date finale/. vident, problema s)ar putea s3 nu aib3 sens pentru orice date ini5iale. %om spune c3 datele pentru care problema P are sens fac parte din domeniul D al algoritmului A. @ezultatele ob5inute fac parte dintr)un domeniu R, astfel c3 e"ecutKnd algoritmul A cu datele de intrare xD vom ob5ine rezultatele rR. %om spune c3 A(x)=r 6i astfel algoritmul A define6te o func5ie A 3 D 4445 R . (lgoritmii au urm3toarele caracteristici: generalitate, finitudine 6i unicitate. Prin generalitate se Dn5elege faptul c3 un algoritm este aplicabil pentru orice date ini5iale xD. :eci un algoritm ( nu rezolv3 problema P cu ni6te date de intrare, ci o rezolv3 Dn general, oricare ar fi aceste date. (stfel, algoritmul de rezolvare a unui sistem liniar de n ecua5ii cu n necunoscute prin metoda lui Lauss, rezolv3 orice sistem liniar 6i nu un singur sistem concret. Prin finitudine se Dn5elege c3 te"tul algoritmului este finit, compus dintr)un num3r finit de propozi5ii. Mai mult, num3rul transform3rilor ce trebuie aplicate unei informa5ii admisibile xD pentru a ob5ine rezultatul final corespunz3tor este finit. Prin unicitate se Dn5elege c3 toate transform3rile prin care trece informa5ia ini5ial3 pentru a ob5ine rezultatul rR sunt bine determinate de regulile algoritmului. (ceasta Dnseamn3 c3 fiecare pas din e"ecu5ia algoritmului d3 rezultate bine determinate 6i precizeaz3 Dn mod unic pasul urm3tor. (ltfel spus, ori de cKte ori am e"ecuta algoritmul, pornind de la aceea6i informa5ie admisibil3 xD, transform3rile prin care se trece 6i rezultatele ob5inute sunt acelea6i. Mn descrierea algoritmilor se folosesc mai multe limbaje de descriere, dintre care cele mai des folosite sunt: ) limbajul sc-emelor logiceN
;

) limbajul Pseudocod. Mn continuare vom folosi pentru descrierea algoritmilor limbajul Pseudocod care va fi definit Dn cele ce urmeaz3. Mn ultima vreme sc-emele logice sunt tot mai pu5in folosite Dn descrierea algoritmilor 6i nu sunt deloc potrivite Dn cazul problemelor comple"e. Prezent3m Dns3 6i sc-emele logice, care se mai folosesc Dn manualele de liceu, DntrucKt cu ajutorul lor vom preciza Dn continuare semantica propozi5iilor Pseudocod. -.2 Sc6e.e l&*$ce Schema logic este un mijloc de descriere a algoritmilor prin reprezentare grafic3. @egulile de calcul ale algoritmului sunt descrise prin blocuri .figuri geometrice/ reprezentKnd opera5iile .pa6ii/ algoritmului, iar ordinea lor de aplicare .succesiunea opera5iilor/ este indicat3 prin s3ge5i. ,iec3rui tip de opera5ie Di este consacrat3 o figur3 geometric3 .un bloc tip/ Dn interiorul c3reia se va Dnscrie opera5ia din pasul respectiv. Prin e7ec'8$" '9'$ "l*&+$%. descris printr)o sc-em3 logic3 se Dn5elege efectuarea tuturor opera5iilor precizate prin blocurile sc-emei logice, Dn ordinea indicat3 de s3ge5i. Mn descrierea unui algoritm, deci 6i Dntr)o sc-em3 logic3, intervin variabile care marc-eaz3 atKt datele cunoscute ini5ial, cKt 6i rezultatele dorite, precum 6i alte rezultate intermediare necesare Dn rezolvarea problemei. MntrucKt :"+$")$l" joac3 un rol central Dn programare este bine s3 definim acest concept. %ariabila define6te o m3rime care D6i poate sc-imba valoarea Dn timp. a are un nume 6i, eventual, o valoare. ste posibil ca variabila Dnc3 s3 nu fi primit valoare, situa5ie Dn care vom spune c3 ea este neini5ializat3. %alorile pe care le poate lua variabila apar5in unei mul5imi : pe care o vom numi domeniul variabilei. Mn concluzie vom Dn5elege prin variabil3 tripletul .nume, domeniul D, valoare/ unde valoare apar5ine mul5imii D OnedefinitP. Bl&c'+$le 1el$.$%"%&"+e Start 6i Stop .,ig.<.=.<. a 6i <.=.<. b/ vor marca Dnceputul respectiv sfKr6itul unui algoritm dat printr)o sc-em3 logic3. :escrierea unui algoritm prin sc-em3 logic3 va Dncepe cu un singur bloc Start 6i se va termina cu cel pu5in un bloc Stop. Bl&c'+$le 1e $9%+"+e;$e<$+e ite!te 6i "ipre!te .,ig. <.=.<. c 6i d/ indic3 introducerea unor :ate de intrare respectiv e"tragerea unor @ezultate finale. le permit precizarea datelor ini5iale cunoscute Dn problem3 6i tip3rirea rezultatelor cerute de problem3. &locul ite!te ini5ializeaz3 variabilele din lista de intrare cu valori corespunz3toare, iar blocul "ipre!te va preciza rezultatele ob5inute .la e"ecu5ia pe calculator cere afi6area pe ecran a valorilor e"presiilor din lista de ie6ire/. Bl&c'+$le 1e "%+$)'$+e .calcul/ se utilizeaz3 Dn descrierea opera5iilor de atribuire .:Q/. Printr)o astfel de opera5ie, unei variabile var i se atri#uie valoarea calculat3 a unei e"presii expr .,ig.<.=.<. e/.

F$*.-.2.-. &locurile sc-emelor logice


>

Bl&c'+$le 1e 1ec$=$e marc-eaz3 punctele de ramifica5ie ale algoritmului Dn etapa de decizie. @amificarea poate fi dubl3 .#locul logic, ,ig.<.=.<.f/ sau tripl3 .#locul aritmetic, ,ig. <.=.<.g/. $locul de deci%ie logic indic3 ramura pe care se va continua e"ecu5ia algoritmului Dn func5ie de Dndeplinirea .ramura D"/ sau neDndeplinirea .ramura N'/ unei condi5ii. Condi5ia care se va Dnscrie Dn blocul de decizie logic va fi o e"presie logic3 a c3rei valoare poate fi una dintre valorile "adev3rat" sau "fals". $locul de deci%ie aritmetic va -ot3rD ramura de continuare a algoritmului Dn func5ie de semnul valorii e"presiei aritmetice Dnscrise Dn acest bloc, care poate fi negativ3, nul3 sau pozitiv3. Bl&c'+$le 1e c&9ec%"+e marc-eaz3 Dntreruperile s3ge5ilor de leg3tur3 dintre blocuri, dac3 din diverse motive s)au efectuat astfel de Dntreruperi .,ig.<.=.<.-/. Pentru e"emplificare vom da Dn continuare dou3 sc-eme logice, corespunz3toare unor algoritmi pentru rezolvarea problemelor P<.=.< 6i P<.=.=. P&'('&' S )e re%olve ecua*ia de grad doi a+(,#+,c=- (a,#,cR .i a-)' Metoda de rezolvare a ecua5iei de gradul doi este cunoscut3. cua5ia poate avea r3d3cini reale, respectiv comple"e, situa5ie recunoscut3 dup3 semnul discriminantului d Q b= ) 9ac.

F$*.-.2.2. (lgoritm pentru rezolvarea ecua5iei de gradul doi

F$*.-.2.>. (lgoritm pentru calculul unei sume.

(lgoritmul de rezolvare a problemei va citi mai DntKi datele problemei, marcate prin variabilele a, # 6i c. %a calcula apoi discriminantul d 6i va continua Dn func5ie de valoarea lui d, a6a cum se poate vedea Dn fig.<.=.=. P&'('(' S )e calcule%e )uma elementelor po%itive ale unui !ir de numere reale dat' *c-ema logic3 .dat3 Dn ,ig.<.=.3/ va con5ine imediat dup3 blocul *'(@' un bloc de citire, care precizeaz3 datele cunoscute Dn problem3, apoi o parte care calculeaz3 suma cerut3 6i un bloc de tip3rire a sumei g3site, Dnaintea blocului *'JP. Partea care calculeaz3 suma S cerut3 are un bloc pentru ini5ializarea
G

cu C a acestei sume, apoi blocuri pentru parcurgerea numerelor: "<, "=R"n 6i adunarea celor pozitive la suma S. Pentru aceast3 parcurgere se folose6te o variabil3 contor i, care este ini5ializat3 cu < 6i cre6te mereu cu < pentru a atinge valoarea n, indicele ultimului num3r dat. *c-emele logice dau o reprezentare grafic3 a algoritmilor cu ajutorul unor blocuri de calcul. "ecu5ia urmeaz3 sensul indicat de s3geat3, putKnd avea loc reveniri Dn orice punct din sc-ema logic3. :in acest motiv se poate ob5ine o sc-em3 logic3 DncKlcit3, greu de urm3rit. @ezult3 importan5a compunerii unor sc-eme logice structurate .:)sc-eme, dup3 :jikstra/, care s3 con5in3 numai anumite structuri standard de calcul 6i Dn care drumurile de la *'(@' la *'JP s3 fie u6or de urm3rit. -.>. L$.)"0'l PSEUDOCOD 1imbajul Pseudocod este un limbaj inventat Dn scopul proiect3rii algoritmilor 6i este format din propozi5ii asem3n3toare propozi5iilor limbii romKne, care corespund structurilor de calcul folosite Dn construirea algoritmilor. (cesta va fi limbajul folosit de noi Dn proiectarea algoritmilor 6i va fi definit Dn cele ce urmeaz3. SinKnd seama c3 ob5inerea unui algoritm pentru rezolvarea unei probleme nu este Dntotdeauna o sarcin3 simpl3, c3 Dn acest scop sunt folosite anumite metode pe care le vom descrie Dn capitolele urm3toare, Dn etapele intermediare din ob5inerea algoritmului vom folosi propozi5ii curente din limba romKn3. (cestea sunt considerate elemente nefinisate din algoritm, asupra c3rora trebuie s3 se revin3 6i le vom numi propozi5ii nestandard. :eci limbajul Pseudocod are dou3 tipuri de propozi5ii: #+&#&=$8$$ 2%"91"+1, care vor fi prezentate fiecare cu sinta"a 6i semnifica5ia .semantica/ ei 6i #+&#&=$8$$ 9e2%"91"+1. (6a cum se va ar3ta mai tKrziu, #+&#&=$8$$le 9e2%"91"+1 sunt te"te care descriu p3r5i ale algoritmului Dnc3 incomplet elaborate, nefinisate, asupra c3rora urmeaz3 s3 se revin3. Pe lKng3 aceste propozi5ii standard 6i nestandard, Dn te"tul algoritmului vom mai introduce propozi5ii e"plicative, numite c&.e9%"+$$. Pentru a le distinge de celelalte propozi5ii, comentariile vor fi Dnc-ise Dntre acolade. @olul lor va fi e"plicat pu5in mai tKrziu. P+&#&=$8$$le 2%"91"+1 ale limbajului Pseudocod folosite Dn aceast3 lucrare, corespund structurilor de calcul prezentate Dn figura <.3.< 6i vor fi prezentate Dn continuare. ,iecare propozi5ie standard Dncepe cu un cuvKnt c-eie, a6a cum se va vedea Dn cele ce urmeaz3. Pentru a deosebi aceste cuvinte de celelalte denumiri, construite de programator, Dn acest capitol vom scrie cuvintele c-eie cu litere mari. Men5ion3m c3 6i propozi5iile simple se termin3 cu caracterul INI Dn timp ce propozi5iile compuse, deci cele Dn interiorul c3rora se afl3 alte propozi5ii, au un marcaj de sfKr6it propriu. :e asemenea, men5ion3m c3 propozi5iile limbajului Pseudocod vor fi luate Dn seam3 Dn ordinea DntKlnirii lor Dn te"t, asemenea oric3rui te"t al limbii romKne. Prin e7ec'8$" '9'$ "l*&+$%. descris Dn Pseudocod se Dn5elege efectuarea opera5iilor precizate de propozi5iile algoritmului, Dn ordinea citirii lor. Mn figura <.3.<, prin (, & s)au notat subsc-eme logice, adic3 secven5e de oricKte structuri construite conform celor trei reguli men5ionate Dn continuare. S%+'c%'+" 2ec:e98$"l? .fig.<.3.<.a/ este redat3 prin concatenarea propozi5iilor, simple sau compuse, ale limbajului Pseudocod, care vor fi e"ecutate Dn ordinea DntKlnirii lor Dn te"t.

a/ structura secven5ial3

b/ structura c/ structura alternativ3 repetitiv3 F$*'+" -.>.-. *tructurile elementare de calcul


A

Propozi5iile simple din limbajul Pseudocod sunt C$' 4' , '$P(@ 4' , ,$ 6i apelul de subprogram. Propozi5iile compuse corespund structurilor alternative 6i repetitive. S%+'c%'+" "l%e+9"%$:? .fig.<.3.<.b/ este redat3 Dn Pseudocod prin propozi5ia :(CT, prezentat3 Dn sec5iunea <.3.=, iar 2%+'c%'+" +e#e%$%$:? din fig.<.3.<.c este redat3 Dn Pseudocod prin propozi5ia CU' '$MP, prezentat3 Dn sec5iunea <.3.3. &o-m 6i Vacopini au demonstrat c3 orice algoritm poate fi descris folosind numai aceste trei structuri de calcul. Propozi5iile DATE 6i RE@ULTATE sunt folosite Dn faza de specificare a problemelor, adic3 enun5area riguroas3 a acestora. Propozi5ia DATE se folose6te pentru precizarea datelor ini5iale, deci a datelor considerate cunoscute Dn problem3 .numite 6i date de intrare/ 6i are sinta"a: DATE li)t/ unde li)t con5ine toate numele variabilelor a c3ror valoare ini5ial3 este cunoscut3. Mn general, prin list3 se Dn5elege o succesiune de elemente de acela6i fel desp3r5ite prin virgul3. :eci Dn propozi5ia DATE, Dn dreapta acestui cuvKnt se vor scrie acele variabile care marc-eaz3 m3rimile cunoscute Dn problem3. Pentru precizarea rezultatelor dorite se folose6te propozi5ia standard REZULTATE li)t/ Dn construc5ia "list3" ce urmeaz3 dup3 cuvKntul RE@ULTATE fiind trecute numele variabilelor care marc-eaz3 .con5in/ rezultatele cerute Dn problem3. (cum putem preciza mai e"act ce Dn5elegem prin cunoa6terea complet3 a problemei de rezolvat. vident, o problem3 este cunoscut3 atunci cKnd se 6tie care sunt datele cunoscute Dn problem3 6i ce rezultate trebuiesc ob5inute. :eci pentru cunoa6terea unei probleme este necesar3 precizarea variabilelor care marc-eaz3 date considerate cunoscute Dn problem3, care va fi reflectat3 printr)o propozi5ie DATE 6i cunoa6terea e"act3 a cerin5elor problemei, care se va reflecta prin propozi5ii RE@ULTATE. %ariabilele prezente Dn aceste propozi5ii au anumite semnifica5ii, presupuse cunoscute. Cunoa6terea acestora, scrierea lor e"plicit3, formeaz3 ceea ce vom numi Dn continuare 2#ec$,$c"+e" #+&)le.e$. *pecificarea unei probleme este o activitate foarte important3 dar nu 6i simpl3. :e e"emplu, pentru rezolvarea ecua5iei de gradul al doilea, specificarea problemei, scris3 de un Dncep3tor, poate fi: DATE a,#,c/ 0 oeficien*ii ecua*iei 1 REZULTATE x&,x(/ 0 Rdcinile ecua*iei 1 (ceast3 specifica5ie este Dns3 incomplet3 dac3 ecua5ia nu are r3d3cini reale. Mn cazul Dn care r3d3cinile sunt comple"e putem nota prin x&, x( partea real3 respectiv partea imaginar3 a r3d3cinilor. *au pur 6i simplu, nu ne intereseaz3 valoarea r3d3cinilor Dn acest caz, ci doar faptul c3 ecua5ia nu are r3d3cini reale. Cu alte cuvinte avem nevoie de un mesaj care s3 ne indice aceast3 situa5ie .vezi sc-ema logic3 <.=.=/, sau de un indicator, fie el ind. (cest indicator va lua valoarea < dac3 r3d3cinile sunt reale 6i valoarea C Dn caz contrar. :eci specifica5ia corect3 a problemei va fi DATE a,#,c/ 0 oeficien*ii ecua*iei 1 REZULTATE ind, 02n indicator3 &=rdcini reale, -=complexe1 x&,x(/ 0 Rdcinile ecua*iei, 4n ca%ul ind=&,1 0re)pectiv partea real !i cea 1 0imaginar 4n ca%ul ind=-1 vident c3 specificarea problemei este o etap3 important3 pentru g3sirea unei metode de rezolvare 6i apoi Dn proiectarea algoritmului corespunz3tor. Eu se poate rezolva o problem3 dac3 aceasta nu este bine cunoscut3, adic3 nu avem scris3 specificarea problemei. C'9&"<%e c&.#le% #+&)le." este prima regul3 ce trebuie respectat3 pentru a ob5ine cKt mai repede un algoritm corect pentru rezolvarea ei. 1.3.1 Algoritmi liniari Propozi5iile CITETE 6i TIPRETE sunt folosite pentru ini5ializarea variabilelor de intrare cu datele cunoscute Dn problem3, respectiv pentru tip3rirea .aflarea/ rezultatelor ob5inute. Mn etapa de
<C

programare propriu)zis3 acestor propozi5ii le corespund Dntr)un limbaj de programare instruc5iuni de intrare)ie6ire. Propozi5ia CITETE se folose6te pentru precizarea datelor ini5iale, deci a datelor considerate cunoscute Dn problem3 .numite 6i date de intrare/ 6i are sinta"a: CITE TE li)t / unde li)t con5ine toate numele variabilelor a c3ror valoare ini5ial3 este cunoscut3. :eci Dn propozi5ia CITETE, Dn dreapta acestui cuvKnt se vor scrie acele variabile care apar Dn propozi5ia DATE Dn specificarea problemei. *e subDn5elege c3 aceste variabile sunt ini5ializate cu valorile cunoscute corespunz3toare. Pentru aflarea rezultatelor dorite, pe care calculatorul o va face prin tip3rirea lor pe -Krtie sau afi6area pe ecran, se folose6te propozi5ia standard TIP!RE TE li)t / Dn construc5ia li)t ce urmeaz3 dup3 cuvKntul TIPRETE fiind trecute numele variabilelor a c3ror valori dorim s3 le afl3m. le sunt de obicei rezultatele cerute Dn problem3, specificate 6i Dn propozi5ia RE@ULTATE. &locului de atribuire dintr)o sc-em3 logic3 Di corespunde Dn Pseudocod propozi5ia standard 5"IE6 var 3= expre)ie / (ceast3 propozi5ie este folosit3 pentru a indica un calcul algebric, al e"presiei care urmeaz3 dup3 simbolul de atribuire "3A" 6i de atribuire a rezultatului ob5inut variabilei var. "presia din dreapta semnului de atribuire poate fi orice e"presie algebric3 simpl3, cunoscut3 din manualele de matematic3 din liceu 6i construit3 cu cele patru opera5ii: adunare, sc3dere, Dnmul5ire 6i Dmp3r5ire .notate prin caracterele W, ), X, respectiv 2/. Prin scrierea cuvKntului FIE Dntre paranteze drepte se indic3 posibilitatea omiterii acestui cuvKnt din propozi5ie. l s)a folosit cu gKndul ca fiecare propozi5ie s3 Dnceap3 cu un cuvKnt al limbii romKne care s3 reprezinte numele propozi5iei. :e cele mai multe ori vom omite acest cuvKnt. (tunci cKnd vom scrie succesiv mai multe propozi5ii de atribuire vom folosi cuvKntul FIE numai Dn prima propozi5ie, omi5Kndu)l Dn celelalte. :in cele scrise mai sus rezult3 c3 o variabil3 poate fi ini5ializat3 atKt prin atribuire .deci dac3 este variabila din stKnga semnului de atribuire :Q/ cKt 6i prin citire .cKnd face parte din lista propozi5iei CITETE/. J gre6eal3 frecvent3 pe care o fac Dncep3torii este folosirea variabilelor neini5ializate. vident c3 o e"presie Dn care apar variabile care nu au valori nu poate fi calculat3, ea nu este definit3. :eci 9' ,&l&2$8$ :"+$")$le 9e$9$8$"l$="%e. Pentru a marca Dnceputul descrierii unui algoritm vom folosi propozi5ia: AL#$RIT%UL nume E&TE3 f3r3 a avea o alt3 semnifica5ie. :e asemenea, prin cuvKntul SFALGORITM vom marca sfKr6itul unui algoritm. (lgoritmii care pot fi descri6i folosind numai propozi5iile prezentate mai sus se numesc algoritmi liniari. Ca e"emplu de algoritm liniar prezent3m un algoritm ce determin3 viteza v cu care a mers un autove-icul ce a parcurs distan5a D Dn timpul ". AL#$RIT%UL 78"9:A E&TE3 0 A&3 alculea% vite%a 1 0 D = Di)tan*a ()pa*iul) 1 0 " = "impul/ 7 = 7ite%a 1 CITE TE D,"/ 0 v3= )pa*iu;timp 1 "IE 73=D;"/ TIP!RE TE 7 &"AL#$RIT%

<<

1.3.' Algoritmi (u ramifi(aii ,oarte mul5i algoritmi e"ecut3 anumite calcule Dn func5ie de satisfacerea unor condi5ii. (ceste calcule sunt redate de )tructura alternativ prezentat3 Dn figura <.3.<.b, c3reia Di corespunde propozi5ia Pseudocod DAC! cond ATU)CI A ALT"EL $ &"DAC! sau varianta redus3 a ei, DAC! cond ATU)CI A &"DAC! folosit3 Dn cazul Dn care grupul de propozi5ii $ este vid. (ceste propozi5ii redau Dn Pseudocod structura alternativ3 de calcul. le cer mai DntKi verificarea condi5iei scrise dup3 cuvKntul DAC. Mn caz c3 aceast3 condi5ie este adev3rat3 se va e"ecuta grupul de propozi5ii A. Mn cazul Dn care aceast3 condi5ie este fals3 se va e"ecuta grupul de propozi5ii $, dac3 este prezent3 ramura ALTFEL. $ndiferent care dintre secven5ele A sau $ a fost e"ecutat3, se va continua cu propozi5ia urm3toare propozi5iei DAC. J generalizare a structurii alternative realizat3 de propozi5ia DAC este structura selectiv3: &ELECTEAZ! i DI)TRE v&3 A&/ v(3 A(/ ''' vn3 An &"&ELECTEAZ! structur3 ec-ivalent3 cu urm3torul te"t Pseudocod: DAC! i=v& ATU)CI A& A<"=9< DAC! i=v( ATU)CI A( A<"=9< ' ' ' DAC! i=vn ATU)CI An &"DAC! ' ' ' &"DAC! &"DAC! Cu propozi5iile prezentate pKn3 aici putem deja descrie destui algoritmi. (ce6tia se numesc algoritmi cu ramifica*ii. Ca e"emplu vom scrie un algoritm pentru rezolvarea ecua5iei de gradul al doilea. (m scris mai sus specifica5ia acestei probleme 6i am precizat semnifica5ia variabilelor respective. Pe lKng3 aceste variabile, pentru rezolvarea problemei mai avem nevoie de dou3 variabile au"iliare: delta ) pentru a re5ine discriminantul ecua5ieiN r ) pentru a re5ine valoarea radicalului folosit Dn e"primarea r3d3cinilor. (jungem u6or la algoritmul dat Dn continuare. AL#$RIT%UL 9 GRD>8 E&TE3 CITE TE a,#,c/ "IE delta3=#?#@ A?a?c/ DAC! deltaB- ATU)CI ind3=-/ r3=radical din (@ delta)/ x&3=@ #;(a,a)/ x(3=r;(a,a)/ ALT"EL ind3=&/ r3=radical din delta/ x&3=(@#@ r);(a,a)/ x(3=(@#,r);(a,a)/ &"DAC! TIP!RE TE ind, x&,x(/ &"AL#$RIT%
<=

0 Algoritmul (3 Re%olvarea 1 0 ecua*iei de gradul doi 1 0 a,#,c = oeficien*ii ecua*iei 1 0 rdcini complexe 1

0 rdcini reale 1

1.3.3 Algoritmi (i(li(i Mn rezolvarea multor probleme trebuie s3 efectu3m acelea6i calcule de mai multe ori, sau s3 repet3m calcule asem3n3toare. :e e"emplu, pentru a calcula suma a dou3 matrice va trebui s3 adun3m un element al primei matrice cu elementul de pe aceea6i pozi5ie din a doua matrice, aceast3 adunare repetKndu)se pentru fiecare pozi5ie. (lte calcule trebuiesc repetate Dn func5ie de satisfacerea unor condi5ii. Mn acest scop Dn limbajul Pseudocod e"ist3 trei propozi5ii standard: CBTTIMP/ REPET 6i PENTRU. Propozi5ia CBTTIMP are sinta"a C*TTI%P cond E+ECUT! A &"C*T i cere e"ecu5ia repetat3 a grupului de propozi5ii A, Dn func5ie de condi5ia "cond". Mai e"act, se evalueaz3 condi5ia "cond"N dac3 aceasta este adev3rat3 se e"ecut3 grupul A 6i se revine la evaluarea condi5iei. :ac3 ea este fals3 e"ecu5ia propozi5iei se termin3 6i se continu3 cu propozi5ia care urmeaz3 dup3 SFCBT. :ac3 de prima dat3 condi5ia este fals3 grupul A nu se va e"ecuta niciodat3, altfel se va repeta e"ecu5ia grupului de propozi5ii A pKn3 cKnd condi5ia va deveni fals3. :in cauz3 c3 Dnainte de e"ecu5ia grupului A are loc verificarea condi5iei, aceast3 structur3 se mai nume6te stru(tur repetiti, (on-iionat anterior. a reprezint3 structura repetitiv3 prezentat3 Dn figura <.3.<.c. Ca e"emplu de algoritm Dn care se folose6te aceast3 propozi5ie d3m algoritmul lui uclid pentru calculul celui mai mare divizor comun a dou3 numere. AL#$RIT%UL 9uclid E&TE3 0AC3 el mai mare divi%or comun1 CITE TE n&,n(/ 0 ele dou numere a cror divi%or )e cere1 "IE d3=n&/ i3=n(/ C*TTI%P i- E+ECUT! r3=d modulo i/ d3=i/ i3=r &"C*T TIP!RE TE d/ 0 d= cel mai mare divi%or comun al 1 &"AL#$RIT% 0 numerelor n& !i n( 1 Mn descrierea multor algoritmi se DntKlne6te 2%+'c%'+" +e#e%$%$:? c&91$8$&9"%? #&2%e+$&+: REPET! A P*)! C*)D cond &"REP structur3 ec-ivalent3 cu: C*TTI%P not(cond) E+ECUT! A &"C*T :eci ea cere e"ecu5ia necondi5ionat3 a lui A 6i apoi verificarea condi5iei "cond". %a avea loc repetarea e"ecu5iei lui A pKn3 cKnd condi5ia devine adev3rat3. :eoarece condi5ia se verific3 dup3 prima e"ecu5ie a grupului A aceast3 structur3 este numit3 stru(tura repetiti, (on-iionat posterior, prima e"ecu5ie a blocului A fiind necondi5ionat3. J alt3 propozi5ie care cere e"ecu5ia repetat3 a unei secven5e A este propozi5ia PE)TRU c3=li /lf 5/p6 E+ECUT! A &"PE)TRU a define6te stru(tura repetiti, pre-efinit/ c' '9 9'.?+ 1e%e+.$9"% 1e e7ec'8$$ ale grupului de propozi5ii A 6i este ec-ivalent3 cu secven5a c3=li / final3=lf / REPET! A c3=c,p P*)!C*)D (cDfinal !i pD-) )au (cBfinal !i pB-) &"REP *e observ3 c3, Dn sinta"a propozi5iei PENTRU, pasul p este Dnc-is Dntre paranteze drepte. Prin aceasta indic3m faptul c3 el este op5ional, putKnd s3 lipseasc3. Mn cazul Dn care nu este prezent, valoarea lui implicit3 este <. *emnifica5ia propozi5iei PENTRU este clar3. a cere repetarea grupului de propozi5ii A pentru toate valorile contorului c cuprinse Dntre valorile e"presiilor li 6i lf .calculate o singur3 dat3 Dnainte de Dnceperea ciclului/, cu pasul p. *e subDn5elege c3 nu trebuie s3 modific3m valorile contorului Dn nici o propozi5ie din grupul A. :e multe ori aceste e"presii sunt variabile simple, iar unii programatori modific3 Dn A valorile acestor variabile, Dnc3lcKnd semnifica5ia propozi5iei PENTRU. :eci, 9' +ec"lc'l" l$.$%ele <$ 9' .&1$,$c" :"+$")$l" 1e c$cl"+e Cc&9%&+'lD E9 $9%e+$&+'l '9e$ 2%+'c%'+$ +e#e%$%$:e PENTRUD.
<3

*3 observ3m, de asemenea, c3 prima e"ecu5ie a grupului A este obligatorie, abia dup3 modificarea contorului verificKndu)se condi5ia de continuare a e"ecu5iei lui A. Ca e"emplu, s3 descriem un algoritm care g3se6te minimul 6i ma"imul componentelor unui vector de numere reale. %om nota prin + acest vector, deci Y Q ."<, "=, ... , "n/ . *pecifica5ia problemei este urm3toarea: DATE n,(xi ,i=&,n)/ REZULTATE valmin,valmax/ iar semnifica5ia acestor variabile se Dn5elege din cele scrise mai sus. Pentru rezolvarea problemei vom e"amina pe rKnd cele n componente. Pentru a parcurge cele n componente avem nevoie de un contor care s3 precizeze pozi5ia la care am ajuns. ,ie i acest contor. #6or se ajunge la urm3torul algoritm: AL#$RIT%UL EA+E8F E&TE 0 Algoritmul G3 alculul 1 0 valorii minime !i maxime 1 CITE TE n,(xi,i=&,n)/ "IE valmin3=x&/ valmax3=x&/ PE)TRU i3=(,n E+ECUT! DAC! xiBvalmin ATU)CI valmin3=xi &"DAC! DAC! xiDvalmax ATU)CI valmax3=xi &"DAC! &"PE)TRU TIP!RE TE valmin,valmax/ &"AL#$RIT% #n rol important Dn claritatea te"tului unui algoritm Dl au denumirile alese pentru variabile. le trebuie s3 reflecte semnifica5ia variabilelor respective. :eci "le*e 1e9'.$+$ 2'*e2%$:e #e9%+' :"+$")$le , care s3 reflecte semnifica5ia lor. Mn e"emplul de mai sus denumirile valmin 6i valmax spun cititorului ce s)a notat prin aceste variabile. -.F C"lc'l'l e,ec%'"% 1e '9 "l*&+$%. ,ie +&, +(, ''', +n, variabilele ce apar Dn algoritmul A. Mn orice moment al e"ecu5iei algoritmului, fiecare variabil3 are o anumit3 valoare, sau este Dnc3 neini5ializat3. %om numi 2%"+e a algoritmului A cu variabilele men5ionate vectorul s Q . s<,s=,...,sn / format din valorile curente ale celor n variabile ale algoritmului. ste posibil ca variabila +H s3 fie Dnc3 neini5ializat3, deci s3 nu aib3 valoare curent3, caz Dn care )H este nedefinit3, lucru notat Dn continuare prin semnul Dntreb3rii I!I. Prin e"ecutarea unei anumite instruc5iuni unele variabile D6i sc-imb3 valoarea, deci algoritmul D6i sc-imb3 starea. *e nume6te c"lc'l efectuat de algoritmul A o secven53 de st3ri sC, s<, s=, ..., sm unde )- este starea ini5ial3 cu toate variabilele neini5ializate, iar )m este starea Dn care se ajunge dup3 e"ecu5ia ultimei propozi5ii din algoritm. -.G R",$9"+e E9 #"<$ 2'cce2$:$ (deseori algoritmul de rezolvare a unei probleme este rezultatul unui proces comple", Dn care se iau mai multe decizii 6i se precizeaz3 tot ceea ce ini5ial era neclar. Jbserva5ia este adev3rat3 mai ales Dn cazul problemelor complicate, dar 6i pentru probleme mai simple Dn procesul de Dnv353mKnt. ste vorba de un proces de detaliere pas cu pas a specifica5iei problemei, proces denumit 6i proiectare descendent3, sau rafinare Dn pa6i succesivi. (lgoritmul apare Dn mai multe versiuni succesive, fiecare versiune fiind o detaliere a versiunii precedente. Mn versiunile ini5iale apar propozi5ii nestandard, clare pentru cititor, dar
<9

neprecizate prin propozi5ii standard. #rmeaz3 ca Dn versiunile urm3toare s3 se revin3 asupra lor. (lgoritmul apare astfel Dn versiuni succesive, tot mai complet de la o versiune la alta. (pare aici o alt3 regul3 important3 Dn proiectarea algoritmului: amKn3 pe mai tKrziu detaliile nesemnificativeN concentreaz3)5i aten5ia la deciziile importante ale momentului.

<?

CAPITOLUL II
SUBPROGRAME C&9ce#%'l 1e SUBPROGRAM Jrice problem3 poate apare ca o subproblem3 S a unei probleme mai comple"e . (lgoritmul de rezolvare a problemei S devine Dn acest caz un *#&P@JL@(M pentru algoritmul de rezolvare a problemei . Pentru a defini un *#&P@JL@(M vom folosi propozi5ia standard &U.PR$#RA%UL nume (lpf) E&TE3 unde nume este numele *#&P@JL@(Mului definit, iar lpf este lista parametrilor formali. (ce6tia sunt forma5i din variabilele care marc-eaz3 datele de intrare .cele presupuse cunoscute/ 6i variabilele care marc-eaz3 datele de ie6ire .rezultatele ob5inute de *#&P@JL@(M/. (ceast3 propozi5ie este urmat3 de te"tul efectiv al *#&P@JL@(Mului, te"t care precizeaz3 calculele necesare rezolv3rii subproblemei corespunz3toare. :escrierea se va Dnc-eia cu cuvKntul SFSUBPROGRAM sau SF)nume. :3m ca e"emplu un *#&P@JL@(M cu numele EA+8E, care g3se6te ma"imul dintre componentele vectorului Y Q ."<,"=, ..., "n/. :atele cunoscute pentru acest *#&P@JL@(M sunt vectorul + 6i num3rul n al componentelor vectorului +. Ca rezultat vom ob5ine ma"imul cerut, pe care)l vom nota cu max. :eci lista parametrilor formali con5ine trei variabile, n, + 6i max. *#&P@JL@(Mul este dat Dn continuare. &U.PR$#RA%UL maxim(n,+,max) E&TE3 "IE max3=x&/ PE)TRU i3=(/n E+ECUT! DAC! xiDmax ATU)CI max3=xi &"DAC! &"PE)TRU &"@maxim Mn cadrul multor algoritmi este necesar calculul valorilor unei func5ii Dn diferite puncte. ste necesar s3 definim func5ia printr)un *#&P@JL@(M de tip func5ie. Pentru definirea unui SUBPROGRAM 1e %$# ,'9c8$e se folose6te un antet care precizeaz3 numele func5iei 6i variabilele de care depinde ea. *#&P@JL@(Mul are forma: "U)C/IA nume(lpf) E&TE3 0Antetul func*iei1 text 0corpul func*iei1 &"@nume 0marca de )fIr!it1 Mn corpul func5iei trebuie s3 e"iste cel pu5in o atribuire Dn care numele func5iei apare Dn partea stKng3, deci prin care func5ia prime6te o valoare. :3m ca e"emplu o func5ie numar : @ ))Z O=,3,9,?P, definit3 matematic astfel: Mn Pseudocod descrierea este urm3toarea: "U)C/IA numar(x) E&TE3 DAC! xB-'( ATU)CI numar3=( ALT"EL DAC! xB-'G ATU)CI numar3=C ALT"EL DAC! xB-'J ATU)CI numar3=A ALT"EL numar3=G &"DAC! &"DAC! &"DAC! &"@numar

<;

(m v3zut c3 defini5ia unei func5ii const3 dintr)un antet 6i dintr)un bloc care va defini ac5iunile prin care se calculeaz3 valoarea func5iei. Mn antet se precizeaz3 numele func5iei 6i lista parametrilor formali. Mn concluzie, e"ist3 dou3 categorii de *#&P@JL@(Mi: de tip ,'9c8$e 6i *#&P@JL@(Mi propriu)zi6i, c3rora li se mai spune 6i #+&ce1'+$. $mportan5a lor va fi subliniat3 prin toate e"emplele care urmeaz3 Dn acest curs. Mn Dnc-eiere men5ion3m c3 subprogramele de tip func5ie se folosesc Dn scopul definirii func5iilor, a6a cum sunt cunoscute ele din matematic3, Dn timp ce *#&P@JL@(Mii de tip procedur3 se refer3 la rezolvarea unor probleme ce apar ca subprobleme, fiind algoritmi de sine st3t3tori. A#el'l '9'$ SUBPROGRAM (m v3zut c3 un *#&P@JL@(M este dedicat rezolv3rii unei subprobleme S a unei probleme mai comple"e . (lgoritmul corespunz3tor problemei va folosi toate opera5iile necesare rezolv3rii problemei S, deci va folosi ca parte Dntregul *#&P@JL@(M conceput pentru rezolvarea subproblemei S. *punem c3 el :" "#el" acest *#&P@JL@(M. Mn Pseudocod "#el'l '9e$ ,'9c8$$ se face scriind Dntr)o e"presie numele func5iei urmat de lista parametrilor actuali. 'rebuie s3 e"iste o coresponden53 biunivoc3 Dntre parametrii actuali 6i cei formali folosi5i Dn defini5ia func5iei. :e6i denumirile variabilelor din cele dou3 liste pot s3 difere, rolul variabilelor care se corespund este acela6i. Mai e"act, parametrul formal 6i parametrul actual corespunz3tor trebuie s3 se refere la aceea6i entitate, trebuie s3 aib3 aceea6i semnifica5ie, s3 reprezinte aceea6i structur3 de date. Putem considera c3 Dn timpul e"ecu5iei algoritmului cei doi parametri devin identici. F&l&2$+e" '9'$ SUBPROGRAM Dn cadrul unui algoritm se face apelKnd acest *#&P@JL@(M prin propozi5ia standard CHEAM nume .lpa/N unde nume este numele *#&P@JL@(Mului apelat iar lpa este lista parametrilor actuali. (ceast3 list3 con5ine toate datele de intrare .cele cunoscute Dn subproblema corespunz3toare/ 6i toate rezultatele ob5inute Dn *#&P@JL@(M. 4i Dn acest caz Dntre lista parametrilor formali din defini5ia *#&P@JL@(Mului 6i lista parametrilor actuali din propozi5ia de apel trebuie s3 e"iste o coresponden53 biunivoc3, ca 6i Dn cazul func5iilor. Ca o prim3 verificare a respect3rii acestei coresponden5e, subliniem c3 num3rul parametrilor actuali trebuie s3 coincid3 cu num3rul parametrilor formali. Ca e"emplu de apelare a ,'9c8$$l&+, d3m Dn continuare un program pentru a calcula a cKta zi din anul curent este ziua curent3 .%i,luna,an/. l folose6te un subprogram de tip func5ie pentru a ob5ine num3rul zilelor lunii cu num3rul de ordine i 6i un altul pentru a verifica dac3 un an este bisect sau nu. (ceste dou3 func5ii sunt: ) FR:8<9(i) furnizeaz3 num3rul zilelor e"istente Dn luna i a unui an nebisectN ) $8S9 "(an) adev3rat3 dac3 anul dintre paranteze este bisect. (lgoritmul este urm3torul: AL#$RIT%UL F2EKRK:8<9 E&TE3 CITE TE %i, luna, an/ "IE nr3=%i/ DAC! lunaD& ATU)CI PE)TRU i3=&, <una@& E+ECUT! nr3=nr,FR:8<9(i) &"PE)TRU &"DAC! DAC! lunaD( ATU)CI DAC! $8S9 "(an) ATU)CI nr3=nr,& &"DAC! &"DAC! TIP!RE TE nr/ &"AL#$RIT% *3 observ3m c3 Dn proiectarea acestui algoritm nu este necesar s3 cunoa6tem te"tul *#&P@JL@(Milor folosi5i, ci doar specificarea acestor *#&P@JL@(Mi, numele lor 6i lista parametrilor formali. 1a acest nivel accentul trebuie s3 cad3 pe proiectarea algoritmului care apeleaz3,
<>

urmKnd s3 se revin3 ulterior la proiectarea *#&P@JL@(Milor apela5i, conform specifica5iei acestora. Mn cazul de fa53 este necesar3 descrierea func5iilor FR:8<9(i) 6i $8S9 "(an). 13s3m aceast3 descriere ca tem3 pentru cititor. Ca e"emplu de apelare a unei #+&ce1'+$ vom scrie mai jos o procedur3 care efectueaz3 suma a dou3 polinoame. #n polinom P(+) este dat prin gradul s3u, m, 6i prin vectorul coeficien5ilor P = (p-, p&, ''', pm) .prin pi s)a notat coeficientul lui +i/. Procedura S2EAP><(m,P,n,L,r,S) trebuie s3 efectueze suma *.Y/ Q P.Y/W[.Y/, unde P este un polinom de gradul m, iar L este un polinom de gradul n, date. *uma lor, S, va fi un polinom de gradul r calculat Dn *#&P@JL@(M. Pentru efectuarea ei este util3 o alt3 procedur3 care adun3 la suma S(+) un alt polinom, "(+), de grad mai mic sau egal decKt gradul polinomului S(+). J astfel de procedur3 se d3 Dn continuare. &U.PR$#RA%UL S2EAP><&(n,",r,S) E&TE3 0n r1 0S(+)3=S(+),"(+)1 PE)TRU i3=-/n E+ECUT! )i 3= )i,ti &"PE)TRU &"@S2EAP><& *#&P@JL@(Mul S2EAP>< apeleaz3 acest *#&P@JL@(M, a6a cum se poate vedea Dn continuare. &U.PR$#RA%UL S2EAP><(m,P,n,L,r,S) E&TE3 0S(+)3=P(+),L(+)1 DAC! mBn ATU)CI r3=n/ S3=L/ C0EA%! S2EAP><&(m,P,r,S) ALT"EL r3=m/ S3=P/ C0EA%! S2EAP><&(n,L,r,S) &"DAC! &"@S2EAP>< *3 observ3m c3 Dn te"tul acestui *#&P@JL@(M am e"tins semnifica5ia propozi5iei de atribuire, permi5Knd atribuirea S3=L. (cest lucru este normal DntrucKt S noteaz3 un polinom, iar L este un polinom cunoscutN prin atribuire S prime6te o valoare ini5ial3, cea dat3 de polinomul L. *ubliniem c3 atribuirea v :Q u va fi corect3 Dn cazul Dn care variabilele u 6i v reprezint3 acelea6i obiecte matematice, deci au aceea6i semnifica5ie. Al%e e7e.#le Ca un al doilea e"emplu de definire 6i folosire a *#&P@JL@(Milor, s3 consider3m urm3toarea problem3: Se dau trei mul*imi de numere3 A = 0 a&, a(, ''' , am 1 $ = 0 #&, #(, ''' , #n 1 = 0 c&, c(, ''' , cp 1 Se cere ) )e tiprea)c 4n ordine cre)ctoare elementele fiecrei mul*imi, precum !i a mul*imilor A 2 $, $ 2 , 2 A' Mn rezolvarea acestei probleme se DntKlnesc urm3toarele subprobleme: *<: *3 se citeasc3 elementele unei mul5imiN *=: *3 se efectueze reuniunea a dou3 mul5imiN *3: *3 se tip3reasc3 elementele unei mul5imiN *9: *3 se ordoneze cresc3tor elementele unei mul5imi. PresupunKnd c3 pentru rezolvarea acestor subprobleme am conceput *#&P@JL@(Mii:
<G

8"E2<(m,A)/ R92F82F9(m,A,n,$,M,R)/ "8PE2<(m,A)/ >RD>F(m,A)/ care sunt specifica5i mai jos .la locul definirii lor/ prin comentarii, algoritmul de rezolvare a problemei de mai sus este dat Dn continuare. MntrucKt opera5iile respective se folosesc de mai multe ori .de 3 ori/, am definit un *#&P@JL@(M "8P>RD>F(m,A) care ordoneaz3 mai DntKi elementele mul5imii A 6i apoi le tip3re6te. AL#$RIT%UL >P9R@E2<"8E8 E&TE3 0 AN3 S2$PR>GRAEi 1 C0EA%! 8"E2<(m,A)/ C0EA%! 8"E2<(n,$)/ C0EA%! 8"E2<(p, )/ C0EA%! "8P>RD>F(m,A)/ C0EA%! "8P>RD>F(n,$)/ C0EA%! "8P>RD>F(p, )/ C0EA%! R92F82F9(m,A,n,$,M,R)/ C0EA%! "8P>RD>F(M,R)/ C0EA%! R92F82F9(n,$,p, ,M,R)/ C0EA%! "8P>RD>F(M,R)/ C0EA%! R92F82F9(p, ,m,A,M,R)/ C0EA%! "8P>RD>F(M,R)/ &"AL#$RIT% *#&P@JL@(Mii apela5i mai sus sunt defini5i Dn continuare. &U.PR$#RA%UL 8"E2<(n,E) E&TE3 0 ite!te n !i E1 CITE TE n/ 0n=nr' elementelor mul*imii1 CITE TE (mi,i=&,n)/ 0E=mul*imea cu elementele m&,m(,''',mn1 &"@ 8"E2< &U.PR$#RA%UL >RD>F(n,E) E&TE3 REPET! "IE ind3=-/ PE)TRU i3=&/n@ & E+ECUT! DAC! miDmi,& ATU)CI "IE t 3= mi/ mi3=mi,&/ mi,&3=t/ ind3=&/ &"DAC! &"PE)TRU P*)!C*)D ind=- &"REP &"@>RD>F 0>rdonea% cre)ctor cele n1 0elemente ale mul*imii E1 0 a%ul E e)te ordonat1 0)chim# ordinea celor1 0dou elemente1 0 a%ul E nu era ordonat1

&U.PR$#RA%UL R92F82F9(m,A,n,$,M,R) E&TE3 0 R 3= A 2 $ 1 0 M = numrul elementelor mul*imii R 1 "IE M3=m/ R 3= A/ PE)TRU H3=&,n E+ECUT! "IE ind3=-/ 08pote%a #H nu e in A1 PE)TRU i3=&/m E+ECUT! DAC! #H=ai ATU)CI ind3=& 0#H e)te in A1 &"DAC! &"PE)TRU
<A

DAC! ind=- ATU)CI M3=M,&/ rM3=#H &"DAC! &"PE)TRU &"@R92F82F9 &U.PR$#RA%UL "8PE2<(n,E) E&TE3 PE)TRU i3=&/n E+ECUT! TIP!RE TE mi &"PE)TRU &"@"8PE2< &U.PR$#RA%UL "8P>RD>F(n,E) E&TE3 C0EA%! >RD>F(n,E)/ C0EA%! "8PE2<(n,E)/ &"@"8P>RD>F 0 "ipre!te cele n elemente 1 0 ale mul*imii E 1

0 >rdonea% !i tipre!te 1 0 elementele mul*imii E 1

'ot ca e"emplu de folosire a *#&P@JL@(Milor, vom scrie un algoritm pentru rezolvarea urm3toarei probleme: dirigintele unei cla)e de elevi dore!te ) o#*in un cla)ament al elevilor 4n func*ie de media general' On plu), pentru fiecare di)ciplin 4n parte dore!te li)ta primilor !a)e elevi' Mn rezolvarea acestei probleme este necesar3 g3sirea ordinii Dn care trebuiesc tip3ri5i elevii Dn func5ie de un anumit rezultat: nota la disciplina " H", sau media general3. (m identificat prin urmare dou3 subprobleme independente, referitoare la: .</ aflarea ordinii Dn care trebuie tip3rite n numere pentru a le ob5ine ordonateN .=/ tip3rirea elevilor clasei Dntr)o anumit3 ordine. Prima subproblem3 se poate specifica astfel: DIndu@ )e numerele x&, x(, ''' , xn, g)i*i ordinea o&, o(, ''', on, 4n care ace)te numere devin ordonate de)cre)ctor, adic x5o&6 x5o(6 ''' x5on6 ' Pentru rezolvarea ei vom da un *#&P@JL@(M J@:$E Dn care intervin trei parametri formali: ) n, num3rul valorilor e"istenteN ) +, vectorul acestor valoriN ) >, vectorul indicilor care dau ordinea dorit3. Primii doi parametri marc-eaz3 datele presupuse cunoscute, iar al treilea, rezultatele calculate de *#&P@JL@(M. &U.PR$#RA%UL >RD8F9(n,+,>) E&TE3 0n, numrul valorilor exi)tente1 0+, vectorul ace)tor valori1 0>, vectorul indicilor care dau ordinea dorit1 PE)TRU i3=&/ n E+ECUT! oi 3=i &"PE)TRU REPET! ind3=-/ PE)TRU i3=&/n@ & E+ECUT! DAC! x5oi6 B x5oi,&6 ATU)CI "IE ind3=&/ t3=oi,& / oi,& 3=oi/ oi 3=t/ &"DAC! &"PE)TRU PA)*C*)D ind=- &"REP &"@>RD8F9 ( doua subproblem3 se poate specifica astfel:
=C

DIndu@ )e ordinea o&,o(, ''', on, a elevilor cla)ei, numele !i mediile ace)tora, ) )e tiprea)c numele !i mediile primilor M elevi 4n ordinea )pecificat' *#&P@JL@(Mul '$P(@, dat Dn continuare, rezolv3 aceast3 problem3. &U.PR$#RA%UL "8PAR(M, F2E9, >) E&TE3 PE)TRU i3=&/M E+ECUT! "ipre!te datele elevului de rang oi' &"PE)TRU &"@"8PAR %ariabilele folosite pentru problema dat3 sunt urm3toarele: ) n reprezint3 num3rul elevilor claseiN ) m este num3rul disciplinelor la care elevii primesc noteN ) F2E9 este vectorul care re5ine numele elevilor: F2E9i este numele elevului cu num3rul de ordine iN ) F>"9 este matricea notelor elevilor, avKnd n linii 6i m coloaneN F>"9i,H este nota elevului cu numele F2E9i la disciplina cu num3rul de ordine HN F>"9'H este coloana a H)a a matricei F>"9 6i reprezint3 notele elevilor la disciplina HN ) E9D88 este vectorul mediilor generale. (lgoritmul se d3 Dn continuare: AL#$RIT%UL <ASAE9F" E&TE3 0 Algoritmul P3 >rdonare1 CITE TE m, 0numrul di)ciplinelor !i1 n, 0al elevilor1 F2E9i, i=&,n, 0numele elevilor1 F>"9i,H, H=&,m, i=&,n/ 0notele elevilor1 PE)TRU i3=&/n E+ECUT! 0 calculea% media general1 "IE S3=-/ 0a elevului i1 PE)TRU H3=&/m E+ECUT! S3=S,F>"9i,H &"PE)TRU "IE E9D88i3=S;m &"PE)TRU C0EA%! >RD8F9(n,E9D88,>)/ C0EA%! "8PAR(n,F2E9,>)/ PE)TRU H3=&/m E+ECUT! C0EA%! >RD8F9(n,F>"9'H,>)/ C0EA%! "8PAR(N,F2E9,>)/ &"PE)TRU &"@A<G>R8"E A#el +ec'+2$: Mn e"emplele date se observ3 c3 apelul unui subprogram se face dup3 ce el a fost definit. ste Dns3 posibil ca un *#&P@JL@(M s3 se apeleze pe el Dnsu6i. Mntr)un astfel de caz spunem c3 apelul este recursiv, iar *#&P@JL@(Mul respectiv este definit recursiv. Ca e"emplu, definim Dn continuare o func5ie care calculeaz3 recursiv valoarea nQ. *e va folosi formula nQ = n'(n@ &)Q Dn cazul nZC 6i faptul c3 C\Q<. @ecursivitatea const3 Dn faptul c3 Dn defini5ia func5iei "a(torial de n se folose6te aceea6i func5ie "a(torial dar de argument n)<. :eci func5ia "a(torial se apeleaz3 pe ea Dns36i. ste important ca num3rul apelurilor s3 fie finit, deci ca procedeul de calcul descris s3 se termine. "U)CTIA =actorial(n) E&TE3 DAC! n=- ATU)CI =actorial3=& ALT"EL =actorial3= n?=actorial(n@ &)
=<

&"DAC! &"@=actorial/ 'ot ca e"emplu de apel recursiv putem descrie o func5ie ce calculeaz3 ma"imul a n numere x&,x(,''',xn. a se bazeaz3 pe func5ia EA+8E( care calculeaz3 ma"imul a dou3 numere, descris3 Dn continuare. "U)C/IA EA+8E((a,#) E&TE3 DAC! aB# ATU)CI EA+8E(3=# ALT"EL EA+8E(3=a &"DAC! &"@EA+8E( ,unc5ia EA+8E, care calculeaz3 ma"imul celor n numere este urm3toarea: "U)C/IA EA+8E(n,+) E&TE3 0 alculea% maximul a n numere1 0+=vectorul cu numerele date1 DAC! n=& ATU)CI EA+8E3=x& ALT"EL EA+8E3=EA+8E(( EA+8E(n@&,+), xn) &"DAC! &"@EA+8E

==

CAPITOLUL III
METODE DE PROIECTARE A ALGORITMILOR >.- El")&+"+e" "l*&+$%.$l&+ Prin elaborarea .proiectarea/ unui algoritm Dn5elegem Dntreaga activitate depus3 de la enun5area problemei pKn3 la realizarea algoritmului corespunz3tor rezolv3rii acestei probleme. Mn elaborarea unui algoritm deosebim urm3toarele activit35i importante: B specificarea problemeiN B descrierea metodei alese pentru rezolvarea problemeiN B proiectarea propriu)zis3. a const3 Dn descompunerea problemei Dn subprobleme, ob5inerea algoritmului principal 6i a tuturor *#&P@JL@(Milor apela5i, conform metodelor prezentate Dn sec5iunile urm3toare. a se termin3 cu descrierea algoritmului principal 6i a *#&P@JL@(Milor men5iona5i, dar 6i cu precizarea denumirilor 6i semnifica5iilor variabilelor folositeN B verificarea algoritmului ob5inut. >.2 P+&$ec%"+e" "2ce91e9%? <$ #+&$ec%"+e" 1e2ce91e9%? "ist3 dou3 metode generale de proiectare a algoritmilor, a c3ror denumire provine din modul de abordare a rezolv3rii problemelor: metoda descendent3 6i metoda ascendent3. P+&$ec%"+e" 1e2ce91e9%? C%&#41&H9/ porne6te de la problema de rezolvat, pe care o descompune Dn p3r5i rezolvabile separat. :e obicei aceste p3r5i sunt subprobleme independente, care la rKndul lor pot fi descompuse Dn subprobleme. 1a prima descompunere accentul trebuie pus pe algoritmul .modulul/ principal nu asupra subproblemelor. 1a acest nivel nu ne intereseaz3 am3nunte legate de rezolvarea subproblemelor, presupunem c3 le 6tim rezolva, eventual c3 avem deja scri6i *#&P@JL@(Mi pentru rezolvarea lor. #rmeaz3 s3 consider3m pe rKnd fiecare subproblem3 Dn parte 6i s3 proiect3m .Dn acela6i mod/ un *#&P@JL@(M pentru rezolvarea ei. Mn final, se va descrie *#&P@JL@(Mul de rezolvare al fiec3rei subprobleme, dar 6i interac5iunile dintre ace6ti *#&P@JL@(Mi 6i ordinea Dn care ei sunt folosi5i. Eo5iunea de .&1'l va fi definit3 Dn sec5iunea urm3toare. :eocamdat3 Dn5elegem prin modul orice *#&P@JL@(M sau algoritmul principal. 1eg3tura dintre module se prezint3 cel mai bine sub forma unei diagrame numit3 arbore de programare. ,iec3rui modul Di corespunde Dn arborele de programare un nod, ai c3rui descenden5i sunt toate modulele apelate direct. Eodul corespunz3tor algoritmului principal este c-iar nodul r3d3cin3. Mn multe c3r5i metoda %&#41&H9 este DntKlnit3 6i sub denumirea 2%e#H$2e4+e,$9e.e9%, adic3 +",$9"+e E9 #"<$ 2'cce2$:$. ste vorba de un proces de detaliere pas cu pas a specifica5iei, denumit proiectare descendent3. (lgoritmul apare Dn diferite versiuni succesive, fiecare fiind o detaliere a versiunii precedente. *copul urm3rit este acela6i: concentrarea aten5iei asupra p3r5ilor importante ale momentului 6i amKnarea detaliilor pentru mai tKrziu. :ac3 ar fi necesar s3 le deosebim am spune c3 metoda top)do0n se refer3 la nivelul macro iar metoda rafin3rii succesive la nivel micro. 1a nivel macro se dore6te descompunerea unei probleme comple"e Dn subprobleme. 1a nivel micro se dore6te ob5inerea unui modul Dn versiune final3. Mntr)o versiune intermediar3 pot fi prezente numai p3r5ile importante ale acestuia, urmKnd s3 se revin3 asupra detaliilor Dn versiunile urm3toare .a6a cum s)a ar3tat Dn sec5iunea <.?/, dup3 ce aspectele importante au fost rezolvate. (vantajele proiect3rii top)do0n .cunoscut3 6i sub denumirea RDi,i-e et impera"/ sunt multiple. (vantajul principal const3 Dn faptul c3 ea permite programatorului s3 reduc3 comple"itatea problemei, subproblemele Dn care a fost descompus3 fiind mai simple, 6i s3 amKne detaliile pentru mai tKrziu. Mn momentul Dn care descompunem problema Dn subprobleme nu ne gKndim cum se vor rezolva subproblemele ci care sunt ele 6i cone"iunile dintre ele.
=3

Proiectarea descendent3 permite lucrul Dn ec-ipe mari. Prin descompunerea problemei Dn mai multe subprobleme, fiecare subproblem3 poate fi dat3 spre rezolvare unei subec-ipe. ,iecare subec-ip3 nu cunoa6te decKt subproblema pe care trebuie s3 o rezolve. Metoda "D$:$1e e% I.#e+"" poate fi folosit3 nu numai la Dmp3r5irea problemei Dn subprobleme ci 6i la Dmp3r5irea datelor Dn grupe mai mici de date. #n astfel de procedeu este folosit de *#&P@JL@(Mul [uicksort. Me%&1" "2ce91e9%? C)&%%&.4'#D porne6te de la propozi5iile limbajului 6i de la *#&P@JL@(Mi e"isten5i, pe care Di asambleaz3 Dn al5i *#&P@JL@(Mi pentru a ajunge Dn final la algoritmul dorit. Cu alte cuvinte, Dn cazul metodei ascendente va fi scris mai DntKi *#&P@JL@(Mul apelat 6i apoi cel care apeleaz3. Ca rezultat al proiect3rii ascendente se ajunge la o mul5ime de *#&P@JL@(Mi care se apeleaz3 Dntre ei. ste important s3 se cunoasc3 care *#&P@JL@(M apeleaz3 pe care, lucru redat printr) o diagram3 de structur3, ca 6i Dn cazul program3rii descendente. (ceast3 metod3 are marele dezavantaj c3 erorile de integrare vor fi detectate tKrziu, abia Dn faza de integrare. *e poate ajunge abia acum la concluzia c3 unii *#&P@JL@(Mi, de6i corec5i, nu sunt utili. :e cele mai multe ori nu se practic3 o proiectare ascendent3 sau descendent3 pur3 ci o combinare a lor, o #+&$ec%"+e .$7%?. >.> P+&$ec%"+e" .&1'l"+? Prin proie(tare 1programare2 mo-ular Dn5elegem metoda de proiectare .programare/ a unui algoritm pentru rezolvarea unei probleme prin folosirea modulelor. :ar ce este un modul! M&1'l'l este considerat o unitate structural3 de sine st3t3toare, fie program, fie subprogram, fie o unitate de program. #n modul poate con5ine sau poate fi con5inut Dntr)alt modul. #n modul poate fi format din mai multe submodule. (stfel, Dn Pseudocod fiecare *#&P@JL@(M 6i algoritmul principal sunt considerate module. Mn limbajele de programare cu structur3 de bloc #E$')urile pot fi considerate module. 1a compilarea separat3 un grup de subprograme compilate deodat3 constituie un modul, dar acest modul poate fi considerat ca o mul5ime de submodule din care este compus. ste Dns3 important ca fiecare modul s3)6i aib3 rolul s3u bine precizat, s3 realizeze o func5ie Dn cadrul Dntregului program. l apare Dn mod natural Dn descompunerea top)do0n. $ndiferent c3 privim modulul ca un singur *#&P@JL@(M, un grup de *#&P@JL@(Mi, sau un algoritm de sine st3t3tor ce apeleaz3 al5i *#&P@JL@(Mi, consider3m modulele relativ independente, dar cu posibilit35i de comunicare Dntre ele. (stfel, un modul nu trebuie s3 fie influen5at de maniera Dn care se lucreaz3 Dn interiorul altui modul. Jrice modificare ulterioar3 Dn structura unui program, dac3 func5ia pe care o realizeaz3 un modul E Dnc3 este necesar3, acest modul trebuie s3 fie util 6i folosit Dn continuare f3r3 modific3ri. @ezult3 c3 programarea modular3 se bazeaz3 pe descompunerea problemei Dn subprobleme 6i proiectarea 6i programarea separat3 a *#&P@JL@(Milor corespunz3tori. :e altfel, consider3m c3 Dntr)o programare serioas3 nu se poate ajunge la implementare f3r3 a avea Dn prealabil algoritmii descri6i Dntr)un limbaj de descriere .la noi Pseudocod/. :eci programarea modular3 se refer3 Dn primul rKnd la proiectarea modular3 a algoritmilor 6i apoi la traducerea lor Dn limbajul de programare ales, 5inKnd seama de specificul acestui limbaj. Programarea modular3 este strKns legat3 de programarea ascendent3 6i de programarea descendent3, ambele presupunKnd folosirea *#&P@JL@(Milor pentru toate subproblemele DntKlnite. (vantajele program3rii modulare sunt multiple. Men5ion3m Dn cele ce urmeaz3 cKteva dintre ele. :escompunerea unei probleme comple"e Dn subprobleme este un mijloc convenabil 6i eficient de a reduce comple"itatea .P+$9c$#$'l D$:$1e e% $.#e+" "c8$&9e"=? <$ E9 #+&*+"."+e/. ste evident c3 probabilitatea apari5iei erorilor Dn conceperea unui program cre6te cu m3rimea programului, lucru confirmat 6i de e"perien5a practic3. :e asemenea, rezolvKnd o problem3 mai simpl3, testarea unui modul se poate face mult mai u6or decKt testarea Dntregului algoritm.
=9

(poi, faptul c3 trebuiesc proiectate mai multe subprograme pentru subproblemele DntKlnite, permite munca mai multor programatori. *)a ajuns astfel la munca Dn ec-ip3, modalitate prin care se ajunge la scurtarea termenului de realizare a produsului program. Modulele se pot refolosi ori de cKte ori avem nevoie de ele. (stfel, s)a ajuns la compilarea separat3 a subprogramelor 6i la p3strarea subprogramelor ob5inute Dn biblioteci de subprograme, de unde ele se pot refolosi la nevoie. *unt cunoscute ast3zi multe astfel de biblioteci de subprograme. Reutili%a#ilitatea acestor subprograme este o proprietate foarte important3 Dn activitatea de programare. a duce la m3rirea productivit35ii Dn programare, dar 6i la cre6terea siguran5ei Dn realizarea unui produs corect. #neori, Dn timpul proiect3rii algoritmului sau a implement3rii lui, se ajunge la concluzia c3 proiectarea a fost incomplet3 sau c3 unele module sunt ineficiente. 6i Dn aceast3 situa5ie programarea modular3 este avantajoas3, ea permi5Knd Dnlocuirea modulului Dn cauz3 cu altul mai performant. #na din activit35ile importante Dn realizarea unui program este verificarea corectitudinii acestuia. "perien5a a ar3tat c3 modulele se pot verifica cu atKt mai u6or cu cKt sunt mai mici. (bilitatea omului de a Dn5elege 6i analiza corectitudinea unui *#&P@JL@(M este mult mai mare pentru te"te scurte. Mn unele c3r5i c-iar se recomand3 a nu se folosi *#&P@JL@(Mi mai mari decKt ?C de propozi5ii. *igur c3 o astfel de limit3 nu e"ist3, dar se recomand3 descompunerea unui *#&P@JL@(M Dn al5i *#&P@JL@(Mi oricKnd acest lucru este posibil Dn mod natural, deci ace6ti noi *#&P@JL@(Mi rezolv3 subprobleme de sine st3t3toare, sau realizeaz3 func5ii bine definite. >.F P+&*+"."+e" 2%+'c%'+"%? P+&*+"."+e" 2%+'c%'+"%? este un stil de programare ap3rut Dn urma e"perien5ei primilor ani de activitate. a cere respectarea unei discipline de programare 6i folosirea riguroas3 a cKtorva structuri de calcul. Ca rezultat se va ajunge la un algoritm u6or de urm3rit, clar 6i corect. 'ermenul programare, folosit Dn titlul acestei sec5iuni 6i consacrat Dn literatura de specialitate, este folosit aici Dn sens larg 6i nu este identic cu cel de programare propriu)zis3. ste vorba de Dntreaga activitate depus3 pentru ob5inerea unui program, deci atKt proiectarea algoritmului cKt 6i traducerea acestuia Dn limbajul de programare ales. &o-m 6i Vacopini au demonstrat c3 orice algoritm poate fi compus din numai trei structuri de calcul: B structura secven5ial3N B structura alternativ3N B structura repetitiv3. ,iecare din aceste structuri, ca parte dintr)o sc-em3 logic3, are o singur3 intrare 6i o singur3 ie6ire 6i sunt prezentate Dn figura <.3.<. ]nut- consider3 programarea structurat3 ca fiind un mijloc de a face produsele program mai u6or de citit. :e asemenea, programarea structurat3 este definit3 ca fiind programarea Dn care abordarea este top)do0n, organizarea muncii este f3cut3 pe principiul ec-ipei programatorului 6ef, iar Dn proiectarea algoritmilor se folosesc cele trei structuri de calcul definite de &o-m)Vacopini. (l5i autori consider3 programarea structurat3 nu ca o simpl3 metod3 de programare ci ansamblul tuturor metodelor de programare cunoscute. :ar programarea modular3, programarea top)do0n, sau bottom)up .ascendent3 sau descendent3/ au ap3rut Dnaintea program3rii structurate. $mportant este faptul c3 programarea structurat3 presupune o disciplin3 Dn activitatea de programare. Consider3m c3 programarea structurat3 se poate DntKlni: B la nivel micro, privind elaborarea unui *#&P@JL@(MN B la nivel macro, privind dezvoltarea Dntregului produs informatic .algoritm/. 1a nivel micro programarea structurat3 este cea Dn care autorul este atent la structura fiec3rui modul Dn parte, cerKnd claritate 6i ordine Dn scriere 6i respectarea structurilor de calcul definite mai sus.

=?

1a nivel macro programarea structurat3 presupune practicarea proiect3rii top)do0n, a program3rii modulare 6i a celorlalte metode de programare, cerKnd ordine Dn Dntreaga activitate 6i e"isten5a unei structuri clare a Dntregii aplica5ii, precizat3 prin diagrama de structur3 a aplica5iei. Mn acest scop am definit limbajul Pseudocod, care are structurile de calcul men5ionate. *c-emele logice ob5inute dintr)o descriere Dn Pseudocod a unui algoritm, conform semanticii propozi5iilor Pseudocod, se numesc D42c6e.e .de la :ijkstra/ sau 2c6e.e l&*$ce 2%+'c%'+"%e.

=;

CAPITOLUL IV
ANALI@A ALGORITMILOR J anumit3 problem3 poate fi rezolvat3 cu ajutorul calculatorului numai dac3 se g3se6te un algoritm pentru rezolvarea ei, care este dat calculatorului sub forma unui program. MntrucKt toate problemele practice pe care le DntKlnim se pot rezolva cu ajutorul calculatorului, s)ar putea crede c3 orice problem3 este rezolvabil3. (ceast3 afirma5ie este Dns3 fals3. *e 6tie c3 nu e"ist3 un program care s3 rezolve "problema termin3rii programelor": RScrie*i un program care ) decid dac un algoritm oarecare, dat, intr )au nu 4ntr@un ciclu infinitR' C-iar 6i problemele pentru care e"ist3 algoritmi corespunz3tori nu sunt neap3rat rezolvabile cu calculatorul. ste posibil ca timpul necesar e"ecu5iei acestor algoritmi, sau cantitatea de memorie necesar3, s3 nu permit3 folosirea lor Dn practic3. vident, dac3 spa5iul de memorie necesar programului este mai mare decKt cantitatea de memorie disponibil3, programul nu poate fi e"ecutat. :e asemenea, dac3 num3rul calculelor ce trebuie efectuat este foarte mare, programul poate fi inutil. $ar asta se poate DntKmpla destul de u6or Dn cazul problemelor ce trebuiesc rezolvate Dn timp real .adic3 solu5ia trebuie ob5inut3 Dnaintea unui timp critic/. $at3 cKteva motive pentru care este necesar s3 analiz3m algoritmii pe care)i concepem pentru rezolvarea unei probleme. Ee intereseaz3 s3 analiz3m un program din mai multe puncte de vedere: </ CorectitudineN =/ ficien53N 3/ Posibilitate de Dmbun3t35ireN 9/ (lte calit35i pe care le are. F.- C&+ec%$%'1$9e" #+&*+".el&+ #n program este c&+ec% dac3 el satisface specifica5iile problemei. Eu ne intereseaz3 cKt3 memorie folose6te acest program, din cKte instruc5iuni este compus, sau cKt timp de e"ecu5ie necesit3. Cu alte cuvinte, un program este corect dac3 pentru acele date de intrare care satisfac specifica5iile problemei rezultatele ob5inute Dn urma e"ecu5iei sunt corecte. Pentru orice program P deosebim trei tipuri de variabile, pe care le vom grupa Dn trei vectori +, S 6i :. Componentele vectorului + desemneaz3 variabilele de intrare, deci datele presupuse cunoscute Dn problema rezolvat3 prin programul P. Componentele vectorului : sunt variabilele care reprezint3 rezultatele cerute de problem3. Mn sfKr6it, componentele vectorului S sunt variabilele de lucru, care noteaz3 diferitele rezultate intermediare necesare Dn program. J problem3 nu are sens pentru orice date de intrare. %om folosi predicatul R.+) pentru a preciza datele pentru care problema are sens. R(+) se nume6te #+e1$c"% 1e $9%+"+e sau #+ec&91$8$e. Pentru acele valori ale lui + pentru care predicatul este adev3rat problema are sens, pentru celelalte nu are sens s3 e"ecut3m programul P. Mntre rezultatele : ale problemei 6i datele ini5iale + .cunoscute Dn problem3/ e"ist3 anumite rela5ii. %om reda aceste rela5ii prin #+e1$c"%'l 1e $e<$+e R(+,:), numit 6i #&2%c&91$8$e. (cesta este corect pentru acele valori a 6i # ale vectorilor + 6i : pentru care rezultatele problemei sunt # Dn cazul cKnd datele ini5iale sunt a 6i este fals Dn caz contrar. :eci, dac3 e"ecutKnd programul cu datele ini5iale a ob5inem rezultatele #T 6i R.a,#T/ este fals, acest fapt este un indiciu c3 rezultatele ob5inute Dn program nu sunt corecte. (pare o alt3 regul3: fie(are ,aria3il s ai3 semnifi(aia ei 6i s3 nu fie folosit3 Dn scopuri diferite.

=>

F.2 Te2%"+e" <$ 1e#"9"+e" #+&*+".el&+ Testarea programelor este activitatea prin care programatorul observ3 comportarea programului Dn urma e"ecu5iei lui cu date de test. vident, primul lucru urm3rit este corectitudinea rezultatelor ob5inute Dn urma e"ecu5iei programului cu datele de test folosite. :ar se va urm3ri 6i dac3 programul are alte caracteristici ca: utilitate, siguran53 Dn func5ionare, robuste5e, performan53. ste beneficiarul mul5umit de rezultatele care se ob5in 6i de forma sub care sunt prezentate! *unt ele ob5inute Dn timp util! :atele de test sunt date de intrare alese pentru variabilele de intrare pentru care se cunosc rezultatele, sau avem unele informa5ii despre rezultate. "ecutKnd programul cu aceste date ar trebui s3 ajungem la rezultatele cunoscute. Corectitudinea rezultatelor Dn aceste e"ecu5ii nu demonstreaz3 corectitudinea programului Dn general. 'estarea Dns3 pune adeseori Dn eviden53 erori f3cute Dn diferite faze ale program3rii. Mn privin5a aceasta d3m un citat din :ijkstra: "e)tarea programelor poate fi un miHloc eficient de a indica pre%en*a erorilor, dar din pcate, nu !i un miHloc de a demon)tra a#)en*a lor. Cu toate c3 ea nu demonstreaz3 corectitudinea programului, testarea m3re6te certitudinea corectitudinii lui 6i este deocamdat3 singura metod3 practic3 de certificare a programului. (r fi de dorit demonstrarea apriori a corectitudinii programului, dar rezultatele cunoscute Dn prezent Dn aceast3 direc5ie nu sunt aplicabile programelor comple"e. *copul test3rii programelor este depistarea 6i eliminarea erorilor. (cest lucru este f3cut prin e"ecu5ia programului cu date de test pentru care se cunosc dinainte rezultatele .sau cel pu5in se 6tie ceva despre ele/ 6i se observ3 rezultatele ob5inute Dn urma e"ecu5iei. Mn cazul Dn care rezultatele ob5inute Dn urma e"ecu5iei nu sunt cele a6teptate se vor c3uta 6i elimina erorile. (ctivitatea care urm3re6te descoperirea cauzelor erorilor 6i Dnl3turarea lor se nume6te 1e#"9"+e. *e pune problema alegerii datelor de test 6i a num3rului de e"ecu5ii ce trebuie f3cute pentru a putea considera c3 programul nu are erori. Eum3rul tuturor seturilor de date de intrare posibile este teoretic infinit c-iar 6i pentru probleme simple. :eci nu poate fi vorba de o testare e"-austiv3. *tabilirea datelor de test se poate face cel pu5in pe dou3 c3i: B 5inKnd seama de specifica5ia problemeiN B 5inKnd seama de te"tul programului. (6a cum va rezulta din cele ce urmeaz3, cea mai bun3 cale este una mi"t3, Dn care sunt combinate aceste dou3 posibilit35i. 1a %e2%"+e" 1'#? 2#ec$,$c"8$" #+&)le.e$, stabilirea datelor de test se face analizKnd specifica5ia problemei. *e recomand3 stabilirea datelor de test 5inKnd seama de specifica5ia asupra datelor de intrare 6i de specifica5ia asupra datelor de ie6ire. (ceast3 metod3 de testare este adecvat3 problemelor simple. Mn cazul unei probleme comple"e aplicarea ei este imposibil3 datorit3 num3rului foarte mare de cazuri posibile, care ar trebui testate. Mns3 problema noastr3 a fost descompus3 Dn subprobleme mai mici, invizibile Dn specifica5ie 6i a c3ror testare este mai simpl3. Privind programul ca o cutie neagr3 nu vom mai 5ine seama de aceste subprobleme. 'otu6i, testarea dup3 specifica5ia problemei r3mKne o metod3 util3 Dn testarea modulelor. Te2%"+e" 1'#? %e7%'l #+&*+".'l'$ 5ine seama, pentru a stabili datele de test, de instruc5iunile care trebuiesc e"ecutate. ConsiderKnd c3 algoritmul este descris printr)o sc-em3 logic3, o e"ecu5ie a programului Dnseamn3 parcurgerea unui drum de la *'(@' la *'JP Dn aceast3 sc-em3. :ac3 la aceast3 e"ecu5ie rezultatele ob5inute sunt corecte probabil c3 te"tul algoritmului pe acest drum este corect. (r trebui s3 verific3m toate blocurile sc-emei logice 6i mai ales toate drumurile de la *'(@' la *'JP posibile. Cu observa5ia c3 Dn cazul a dou3 drumuri ce difer3 doar prin faptul c3 o anumit3 bucl3 se e"ecut3 de n<, respectiv n= ori le vom considera ec-ivalente Dntre ele. :intre toate drumurile ec-ivalente Dntre ele vom testa un singur drum, altfel am avea o infinitate de drumuri de testat. Mn concluzie vom alege pentru fiecare drum un set de date de test, num3rul e"ecu5iilor fiind egal cu num3rul acestor drumuri. :ac3 toate e"ecu5iile au dat rezultate corecte programul se consider3 testat. :ac3 Dns3 la o singur3 e"ecu5ie am depistat erori, corectarea lor a modificat te"tul algoritmului 6i testarea trebuie reluat3 pe toate drumurile afectate de aceast3 sc-imbare.
=G

Pentru un program comple", deci pentru o sc-em3 logic3 cu un num3r foarte mare de drumuri *'(@')*'JP, testarea ar fi o activitate comple"3, constKnd dintr)un num3r foarte mare de e"ecu5ii. Mnc3 un motiv pentru a practica programarea modular3, caz Dn care testarea se face asupra unor module mai mici 6i asupra interfe5ei dintre ele, a6a cum se va men5iona mai jos. *tabilirea datelor de test dup3 te"tul programului are 6i unele dezavantaje. Mn primul rKnd, programul poate fi incomplet 6i s3 nu corespund3 specifica5iilor. Pe drumurile e"istente el este corect, dar lipsesc drumuri care, conform specifica5iilor, ar trebui s3 e"iste. 1ipsa acestor drumuri este o gre6eal3 grav3 care nu va fi descoperit3 de datele de test care ne duc doar pe drumurile e"istente. :in aceast3 cauz3 se recomand3 o testare mi"t3. Mn te"tul unui program e"ist3 6i drumuri moarte, pe care nu se poate merge oricare ar fi datele de intrare, deci nu putem g3si date de test corespunz3toare acestor drumuri. (deseori aceste drumuri scot Dn eviden53 erori prin simpla analiz3 a te"tului. (stfel, Dn succesiunea de propozi5ii Pseudocod DAC! nB( ATU)CI ' ' ' DAC! nDC ATU)CI A &"DAC! ' ' ' &"DAC! grupul A este inaccesibil oricare ar fi valoarea lui n. ste Dns3 foarte frecvent3 eroarea de omisiune a unui caracterN Dn cazul nostru tastarea num3rului = Dn loc de =C, ceea ce sc-imb3 complet sensul te"tului Pseudocod de mai sus. (desea este imposibil s3 se e"ecute programul cu toate datele de test stabilite. Mn acest caz apare problema alegerii acelei submul5imi din aceste date care s3 aib3 6ansa ma"im3 de a depista erorile prezente Dn program. 'estarea minim3 care trebuie f3cut3 const3 Dntr)un num3r de e"ecu5ii a programului care s3 ne asigure c3 fiecare instruc5iune din program a fost e"ecutat3 cel pu5in odat3. a Dnseamn3 mult mai pu5ine e"ecu5ii decKt toate drumurile *'(@')*'JP. "ist3 date de test care ne duc pe un anumit drum f3r3 a depista erori e"istente Dn instruc5iunile DntKlnite 6i alte date de test care depisteaz3 aceste erori. Mnc3 un motiv pentru care se recomand3 o testare mi"t3. Ca ordine de folosire a datelor de test Dn timpul test3rii, se recomand3 mai DntKi testarea dup3 specifica5ii 6i apoi testarea dup3 te"tul programului. ste necesar3 6i %e2%"+e" +&)'2%e8e$ programului, care Dnseamn3 buna lui comportare la date de intrare inten5ionat gre6ite, pentru care problema nu are sens. #nele programe intr3 Dn aceste condi5ii Dn ciclu infinit, altele se termin3 cu erori de e"ecu5ie. #n program robust nu trebuie s3 fie afectat de datele de intrare eronate. Comportarea cea mai normal3 Dn astfel de situa5ii ar fi semnalarea unor mesaje de eroare corespunz3toare. 1a un produs program comple" testarea este o activitate mult mai complicat3. ste necesar3 o testare separat3 a fiec3rui modul Dn parte, o testare a interfe5ei dintre module 6i o testare a produsului Dn ansamblu .testarea de integrare/. Te2%"+e" 1e $9%e*+"+e se refer3 la func5ionarea programului realizat Dn ansamblu. :up3 ce fiecare modul Dn parte a fost testat 6i corectat, deci Dn ipoteza c3 fiecare modul Dn parte este corect, e necesar s3 se verifice comportarea global3 a programului. Mn aceast3 etap3 g3sirea erorilor, Dnl3turarea cauzelor care le) a generat 6i corectarea lor, poate fi foarte dificil3, mai ales atunci cKnd ele provin dintr)o proiectare gre6it3. "ecu5ia unui program se poate termina anormal datorit3 apari5iei unor erori ca: B Dmp3r5iri la zeroN B alte erori ce provoac3 dep36iriN B neconcordan5a Dntre parametri actuali 6i formaliN B dep36irea dimensiunii tablourilor. :ar c-iar 6i la e"ecu5ia normal3 a programului putem avea erori, unele foarte grave, ob5inKnd rezultate gre6ite. Mn ambele situa5ii urmeaz3 1e#"9"+e" #+&*+".'l'$, adic3 descoperirea cauzei erorilor 6i Dnl3turarea lor.
=A

J metod3 util3 Dn depanarea programelor, Dn special pentru Dncep3tori, este inserarea Dn program a unor tip3riri au"iliare. Mai ales Dn locurile vecine cu instruc5iunile care au provocat eroarea 6i pentru variabilele implicate Dn producerea ei. Jbservarea valorilor unei variabile, a sc-imb3rilor f3cute Dn timpul e"ecu5iei, pot dezv3lui programatorului cauza erorii. Cu siguran53 Di va ar3ta c3 o anumit3 variabil3 ia alte valori decKt cele la care se a6teapt3 el. :e altfel, pe timpul test3rii unui program, sunt utile semnal3rile oric3ror semne de eroare. @ecomand3m :e+$,$c"+e" :"l&+$l&+ :"+$")$lel&+ $.e1$"% 1'#? &)8$9e+e" "ce2%&+". F.> C&.#le7$%"%e" "l*&+$%.$l&+ Mn aceast3 sec5iune ne va interesa eficien5a unui algoritm. Mai e"act, ne intereseaz3 s3 compar3m Dntre ei mai mul5i algoritmi care rezolv3 aceea6i problem3. Care dintre ei este mai bun! vident, vom compara numai algoritmi despre care 6tim c3 sunt corec5i. Putem compara doi algoritmi Dn raport cu: B cantitatea de memorie necesar3N B viteza de lucru, deci timpul necesar rezolv3rii problemei. :ac3 Dn urm3 cu dou3 decenii volumul de memorie necesar rezolv3rii unei probleme era un factor important din cauza memoriei reduse e"istente la calculatoarele din acel timp, ast3zi acest factor a devenit mai pu5in important. Calculatoarele actuale au memorie suficient de mare pentru marea majoritate a algoritmilor DntKlni5i. 'impul necesar e"ecu5iei unui program depinde de num3rul opera5iilor ce trebuiesc e"ecutate. $ar num3rul opera5iilor efectuate depinde de datele de intrare, deci se sc-imb3 de la o e"ecu5ie la alta. "ist3 Dns3 un cel mai r3u caz, pentru acele date de intrare pentru care num3rul opera5iilor efectuate este ma"im. Mn acest caz vorbim de c&.#le7$%"%e E9 cel ."$ +?' c"=. :e asemenea, putem vorbi de num3rul mediu de opera5ii efectuate Dntr)o e"ecu5ie. :ac3 num3rul e"ecu5iilor posibile este finit atunci acest num3r mediu este egal cu num3rul opera5iilor efectuate Dn toate e"ecu5iile, Dmp3r5it la num3rul e"ecu5iilor. *unt Dns3 foarte pu5ine programe cu aceast3 proprietate. Pentru aproape toate programele, cel pu5in teoretic, num3rul e"ecu5iilor posibile este infinit. F.F D&c'.e9%"+e" #+&*+".el&+ Mn paralel cu elaborarea programului trebuie elaborat3 6i o documenta5ie. (ceasta va con5ine toate deciziile luate Dn crearea programului. :ocumentarea este activitatea de prezentare a programului celor care vor fi interesa5i s3 ob5in3 informa5ii despre el. (ce6tia sunt Dn primul rKnd persoanele care au realizat programul, apoi persoanele care)l vor folosi 6i persoanele solicitate s3 fac3 Dntre5inerea acestuia. (deseori se DntKlnesc programe f3r3 nici o alt3 documenta5ie Dn afara te"tului propriu)zis al programului. Mn graba de a termina cKt mai repede, programul nu este Dnso5it de nici o documenta5ie 6i frecvent nu sunt folosite nici comentarii Dn te"tul programului. *igur c3 Dns36i te"tul programului constituie o autodocumentare. $ar comentariile prezente Dn program dau e"plica5ii suplimentare despre program. ste Dns3 necesar3 o documenta5ie complet3, scris3, care va con5ine: B enun5ul ini5ial al problemeiN B specifica5ia .vezi sec5iunea 9.</N B documenta5ia de proiectare .metoda de rezolvare aleas3 6i proiectarea algoritmilor folosi5i. Pentru fiecare algoritm va fi prezentat3 subproblema corespunz3toare, cu specifica5ia ei 6i rolul fiec3rei variabile/N B documenta5ia de programare, care va include te"tul programuluiN B datele de test folositeN B documenta5ie privind e"ploatarea programuluiN B modific3ri f3cute Dn timpul Dntre5inerii programului.
3C

Men5ion3m c3 cele mai recente produse realizate de firmele consacrate au, pe lKng3 documenta5ia scris3, 6i o autodocumenta5ie .func5ii ^ 1P/. @eferitor la autodocumentare, ,&l&2$+e" c&.e9%"+$$l&+/ "le*e+e" c' *+$0? " 1e9'.$+$$ :"+$")$lel&+/ cI% <$ cl"+$%"%e" %e7%'l'$/ &)8$9'%? #+$9 $91e9%"+e <$ *+$0? "2'#+" 2%+'c%'+$$ #+&*+".'l'$/ e2%e '%$l? nu numai pe timpul elabor3rii programului, dar mai ales pe timpul Dntre5inerii 6i modific3rilor ulterioare. De9'.$+e" :"+$")$le$ s3 fie astfel aleas3 DncKt 2? +e1e" cI% ."$ )$9e 2e.9$,$c"8$" e$. Cei care au dorit s3 refoloseasc3 programe scrise cu cKteva luni Dn urm3 Dn5eleg foarte bine diferen5a dintre un program Dnso5it de comentarii e"plicative 6i un program f3r3 nici o e"plica5ie. #itarea ac5ioneaz3 asupra oric3rei persoane 6i, c-iar dac3 este posibil3, descifrarea unui program cere timp 6i nu este o sarcin3 prea u6oar3. Comentariile sunt recomandate, fiind un mijloc de autodocumentare a programului surs3. *igur c3 prima documenta5ie a oric3rui program este te"tul surs3 propriu)zis. ste bine ca acest te"t s3 poat3 fi citit cKt mai u6or, iar programarea structurat3 duce la un program mai u6or de citit decKt unul lipsit de orice structur3. ste Dns3 nevoie 6i de o documenta5ie Dnso5itoare scris3, care constituie documentarea propriu)zis3 a programului. (ceasta trebuie s3 redea toate deciziile f3cute Dn timpul proiect3rii, s3 prezinte diagrama de structur3 a Dntregului produs 6i fiecare parte separat. Pentru fiecare modul documenta5ia va con5ine: B numele acestuiaN B datele de intrareN B datele de ie6ireN B func5ia realizat3 de modulul respectivN B variabilele folosite 6i semnifica5ia lorN B algoritmul propriu)zis. ste necesar ca aceste informa5ii s3 se afle 6i sub forma unor comentarii Dn te"tul programului. :e asemenea, documenta5ia va con5ine 6i te"tul final al programului. ste necesar3 6i o documenta5ie de folosire a produsului realizat. &eneficiarul nu este interesat de modul Dn care a fost realizat programul ci de modul Dn care Dl poate folosi. J documentare complet3 a unui program poate fi util3 nu numai pentru folosirea 6i Dntre5inerea programului. Componente ale unui produs e"istent pot fi utile 6i Dn realizarea altor produse. ste Dns3 necesar s3 se Dn5eleag3 cKt mai u6or ce func5ii realizeaz3 aceste componente 6i cu ce performan5e. ,olosirea acestor componente e"istente, testate 6i documentate, duce evident la cre6terea productivit35ii Dn realizarea noului produs. F.G S%$l E9 #+&*+"."+e ,iecare programator are stilul s3 propriu de concepere 6i redactare a unui program. ste bine ca el s3 respecte anumite reguli generale de programare, astfel DncKt programele elaborate s3 aib3 anumite calit35i. Calit35ile pe care le poate avea un program sunt urm3toarele: C&+ec%$%'1$9e Q proprietatea programului de a respecta specifica5iile 6i a da rezultate corecteN E7%e92$)$l$%"%e Q posibilitatea adapt3rii programului la unele sc-imb3ri Dn specifica5ieN R&)'2%e8e Q abilitatea de a recunoa6te situa5iile Dn care problema ce se rezolv3 nu are sens 6i de a se comporta Dn consecin53 .de e"emplu, prin mesaje de eroare corespunz3toare/N Re'%$l$=")$l$%"%e Q posibilitatea reutiliz3rii Dntregului program sau a unor p3r5i din el Dn alte aplica5iiN C&.#"%$)$l$%"%e Q u6urin5a de combinare cu alte produse programN P&+%")$l$%"%e Q posibilitatea de folosire a produsului program pe alte sisteme de calcul, diferite de cel pe care a fost conceputN E,$c$e98? Q m3sura Dn care sunt bine folosite resursele sistemului de calculN Cl"+$%"%e Q u6urin5a citirii 6i Dn5elegerii te"tului programului, a structurilor din care este compus 6i a rolului denumirilor 6i p3r5ilor sale.
3<

#n produs program este considerat de calitate dac3 are calit35ile de mai sus, dac3 lansat Dn e"ecu5ie d3 rezultate corecte, dac3 te"tul lui se poate citi 6i Dn5elege, dac3 poate fi u6or Dntre5inut 6i dac3 este terminat la data fi"at3. *tilul unui programator este dat de m3sura Dn care programul s3u are aceste calit35i 6i de vizibilitatea lor. vident, pe lKng3 aceste calit35i, vizibile 6i Dn te"t, stilul de programare este dat 6i de corectitudinea 6i robuste5ea produselor realizate. Programul trebuie s3 func5ioneze 6i la introducerea unor date gre6ite .pentru care problema nu are sens/, recunoscKnd aceast3 situa5ie 6i semnalKnd)o. Mn acela6i timp rezultatele ob5inute pentru date pentru care problema are sens trebuie s3 fie corecte. $ar corectitudinea sau incorectitudinea programului este o consecin53 a modului Dn care programatorul a respectat regulile de programare .vezi capitolul G/ 6i a e"perien5ei ob5inute Dn activitatea de programare. Privind claritatea algoritmului trebuie s3 observ3m c3 indentarea .paragrafarea/ este un alt mijloc de a m3ri claritatea scrierii. 'e"tul unui algoritm poate fi scris cuvKnt dup3 cuvKnt, completKnd tot rKndul asemeni te"tului unui roman. Claritatea lui este mic3, dup3 cum urmeaz3: PR$#RA%UL <ASAE9F" E&TE3 DATE m,n,F2E9i, i=&,n, F>"9i,H, H=&,m, i=&,n/ PE)TRU i3=&,n E+ECUT! 0calculea% media general a elevului i1 "IE S3=-/ PE)TRU H3=&,m E+ECUT! S3=S,F>"9i,H &"PE)TRU "IE E9D88i3=S;E &"PE)TRU PE)TRU H3=&,m E+ECUT! C0EA%! >RD8F9(n,F>"9H,>)/ C0EA%! "8PAR(n, F2E9, >) &"PE)TRU C0EA%! >RD8F9(n,E9D88,>)/ C0EA%! "8PAR(n,F2E9,>) &"AL#$RIT% Consider3m c3 fiecare programator trebuie s3 respecte anumite reguli de scriere a programelor, cu gKndul la claritatea te"tului. Mn unele c3r5i sunt date mai multe reguli de indentare. (stfel, Lries sugereaz3 urm3toarele reguli: ) instruc5iunile unei secven5e se vor scrie aliniate, DncepKnd toate Dn aceea6i coloan3N ) instruc5iunile unei structuri de calcul .instruc5iuni compuse/ se vor scrie DncepKnd toate din aceea6i coloan3, aflat3 cu =)9 caractere la dreapta fa53 de Dnceputul instruc5iunii compuseN ) pe o linie pot fi scrise mai multe instruc5iuni, cu condi5ia ca ele s3 aib3 ceva comun. (stfel, =)9 instruc5iuni scurte de atribuire pot fi scrise pe acela6i rKnd. (cest lucru se recomand3 Dn vederea unei scrieri compacte a programului. bine ca un program ce se poate scrie pe o pagin3, cu respectarea structurii lui, s3 nu fie Dntins pe dou3 pagini \ Consider3m c3 nu e"ist3 reguli de scriere obligatorii pentru toat3 lumea\ :ar fiecare programator trebuie s3 aib3 propriile lui reguli de scriere. 'ot privind claritatea scrierii programului, se recomand3 c" 1e9'.$+$le :"+$")$lel&+ s3 fie astfel alese DncKt 2? +e,lec%e 2e.9$,$c"8$" "ce2%&+ :"+$")$le. #n alt mijloc de a m3ri claritatea te"tului unui program const3 Dn inserarea comentariilor Dn te"t. C&.e9%"+$$le sunt te"te e"plicative Dnc-ise Dntre acolade. le au rolul de a e"plica cititorului anumite p3r5i din program. (m spus deja c3 Dn proiectarea algoritmilor folosim 6i propozi5ii nestandard care vor fi pe parcurs Dnlocuite cu propozi5ii standard. bine ca aceste propozi5ii s3 r3mKn3 Dn te"t sub form3 de comentarii. Comentariile vor fi prezente: B Dn capul programului, pentru a prezenta titlul 6i scopul programului, perioada realiz3rii lui 6i numele programatoruluiN
3=

B Dn defini5ii, pentru a descrie semnifica5ia nota5iilor folosite .a variabilelor, constantelor, *#&P@JL@(Milor etc/N B Dn dreapta unor instruc5iuni, pentru a descrie rolul acestora, sau cazul Dn care se atinge acea instruc5iuneN B Dntre p3r5ile unui modul mai lung, pentru a e"plica rolul fiec3rei p3r5i. *per3m c3 prin e"emplele date Dn acest material am prezentat un stil propriu de programare 6i am convins cititorul de necesitatea form3rii propriului s3u stil.

33

CAPITOLUL V
CLASE DE ALGORITMI utarea 6i Sortarea sunt dou3 dintre cele mai des DntKlnite subprobleme Dn programare. le constituie o parte esen5ial3 din numeroasele procese de prelucrare a datelor. Jpera5iile de c3utare 6i sortare sunt e"ecutate frecvent de c3tre oameni Dn via5a de zi cu zi, ca de e"emplu c3utarea unui cuvKnt Dn dic5ionar sau c3utarea unui num3r Dn cartea de telefon. Cutarea este mult simplificat3 dac3 datele Dn care efectu3m aceast3 opera5ie sunt )ortate .ordonate, aranjate/ Dntr)o anumit3 ordine .cuvintele Dn ordine alfabetic3, numerele Dn ordine cresc3toare sau descresc3toare/. &ortarea datelor const3 Dn rearanjarea colec5iei de date astfel DncKt un cKmp al elementelor colec5iei s3 respecte o anumit3 ordine. :e e"emplu Dn cartea de telefon fiecare element .abonat/ are un cKmp de nume, unul de adres3 6i unul pentru num3rul de telefon. Colec5ia aceasta respect3 ordinea alfabetic3 dup3 cKmpul de nume. :ac3 datele pe care dorim s3 le ordon3m, adic3 s3 le sort3m, sunt Dn memoria intern3, atunci procesul de rearanjare a colec5iei Dl vom numi sortare intern, iar dac3 datele se afl3 Dntr)un fi6ier .colec5ie de date de acela6i fel aflate pe suport e"tern/, atunci procesul Dl vom numi sortare e4tern' ,iecare element al colec5iei de date se nume6te arti(ol iar acesta la rKndul s3u este compus din unul sau mai multe componente. J (5eie este asociat3 fiec3rui articol 6i este de obicei unul dintre componente. *punem c3 o colec5ie de n articole este ordonat cre)ctor dup3 c-eia C dac3 (i) (H) pentru &iBHn, iar dac3 (i) (H) atunci 6irul este ordonat de)cre)ctor. G.- Al*&+$%.$ 1e c?'%"+e Mn acest subcapitol vom studia cKteva te-nici elementare de c3utare 6i vom presupune c3 datele se afl3 Dn memoria intern3, Dntr)un 6ir de articole. %om c3uta un articol dup3 un cKmp al acestuia pe care Dl vom considera c-eie de c3utare. Mn urma procesului de c3utare va rezulta pozi5ia elementului c3utat .dac3 acesta e"ist3/. EotKnd cu M&, M(, '''', Mn c-eile corespunz3toare articolelor 6i cu a c-eia pe care o c3ut3m, problema revine la a g3si .dac3 e"ist3/ pozi5ia p cu proprietatea a = Mp. :e obicei articolele sunt p3strate Dn ordinea cresc3toare a c-eilor, deci vom presupune c3 k< _ k= _ .... _ kn . #neori este util s3 afl3m nu numai dac3 e"ist3 un articol cu c-eia dorit3 ci 6i s3 g3sim Dn caz contrar locul Dn care ar trebui inserat un nou articol avKnd c-eia specificat3, astfel DncKt s3 se p3streze ordinea e"istent3. :eci pro#lema cutrii are urm3toarea specificare: Date a,n,(Mi, i=&,n)/ Precondi*ia3 nF, n& !i M& B M( B '''' B Mn / Re%ultate p/ Po)tcondi*ia3 (p=& !i a M&) )au (p=n,& !i a D Mn) )au (&Bpn) !i (Mp@& B a Mp)' Pentru rezolvarea acestei probleme vom descrie mai mul5i *#&P@JL@(Mi. J prim3 metod3 este c3utarea 2ec:e98$"l?, Dn care sunt e"aminate succesiv toate c-eile. &U.PR$#RA%ul autSecv(a,n,U,p) este3 0nF, n& !i1 0M& B M( B '''' B Mn1 0Se caut p a)tfel ca31 0(p=& !i a M&) )au (p=n,& !i aDMn)1 0)au (&Bpn) !i (Mp@& B a Mp)1 0 a%ul R4nc nega)itR1

"ie p3=-/

39

Da( aM& atun(i p3=& altfel Da( aDMn atun(i p3=n,& altfel Pentru i3=(/ n e4e(ut Da( (p=-) 6i (aMi) atun(i p3=i sf-a( sfpentru sf-a( sf-a( sf@ autSecv *e observ3 c3 prin aceast3 metod3 se vor e"ecuta Dn cel mai nefavorabil caz n)< compar3ri, DntrucKt contorul i va lua toate valorile de la = la n. Cele n c-ei Dmpart a"a real3 Dn nW< intervale. 'ot atKtea compar3ri se vor efectua Dn n)< din cele nW< intervale Dn care se poate afla c-eia c3utat3, deci comple"itatea medie are acela6i ordin de m3rime ca 6i comple"itatea Dn cel mai r3u caz. vident c3 Dn multe situa5ii acest algoritm face calcule inutile. (tunci cKnd a fost deja g3sit3 c-eia dorit3 este inutil a parcurge ciclul pentru celelalte valori ale lui i. Cu alte cuvinte este posibil s3 Dnlocuim ciclul PENTRU cu un ciclu CBTTIMP. (jungem la un al doilea algoritm, dat Dn continuare. &U.PR$#RA%ul autSucc(a,n,U,p) este3 0nF, n& !i1 0M& B M( B '''' B Mn1 0Se caut p a)tfel ca31 0(p=& !i a M&) )au (p=n,& !i aDMn)1 0)au (&Bpn) !i (Mp@& B a Mp)' "ie p3=&/ Da( aDM& atun(i C7ttimp pn !i aDMp e4e(ut6 p3=p,& sf(7t sf-a( sf@ autSecv J alt3 metod3, numit3 c?'%"+e )$9"+?, care este mult mai eficient3, utilizeaz3 te-nica "divide et impera" privitor la date. *e determin3 Dn ce rela5ie se afl3 c-eia articolului aflat Dn mijlocul colec5iei cu c-eia de c3utare. Mn urma acestei verific3ri c3utarea se continu3 doar Dntr)o jum3tate a colec5iei. Mn acest mod, prin Dnjum3t35iri succesive se mic6oreaz3 volumul colec5iei r3mase pentru c3utare. C3utarea binar3 se poate realiza practic prin apelul func5iei $inarySearch(a,n,U,&,n), descris3 mai jos, folosit3 Dn *#&P@JL@(Mul dat Dn continuare. &U.PR$#RA%ul aut$in(a,n,U,p) este3 0nF, n& !i M& B M( B '''' B Mn1 0Se caut p a)tfel ca3 (p=& !i a M&) )au1 0(p=n,& !i aDMn) )au (&Bpn) !i (Mp@& B a Mp)1 Da( aM& atun(i p891 altfel Da( aDMn atun(i p3=n,& altfel p3=$inarySearch(a,n,U,&,n) sf-a( sf-a( sf@ aut$in "un(ia $inarySearch (a,n,U,St,Dr) este3 Da( StDr@& atun(i $inarySearch3=Dr altfel m3=(St,Dr) Div (/ Da( aU5m6 atun(i $inarySearch3=$inarySearch(a,n,U,St,m) altfel $inarySearch3=$inarySearch(a,n,U,m,Dr) sf-a(
3?

sf-a( sf@$inarySearch Mn func5ia $inarySearch descris3 mai sus, variabilele St 6i Dr reprezint3 capetele intervalului de c3utare, iar m reprezint3 mijlocul acestui interval. *e observ3 c3 func5ia $inarySearch se apeleaz3 recursiv. *e poate Dnl3tura u6or recursivitatea, a6a cum se poate vedea Dn urm3toarea func5ie: "un(ia $inSeaFerec (a,n,U,St,Dr) este3 C7ttimp Dr@StD& e4e(ut m3=(St,Dr) Div (/ Da( aU5m6 atun(i Dr3=m altfel St3=m sf-a( sf(7t $inSeaFerec3=Dr sf@$inSeaFerec G.2 S&+%"+e $9%e+9? Prin 2&+%"+e $9%e+9? vom Dn5elege o rearanjare a unei colec5ii aflate Dn memoria intern3 astfel DncKt c-eile articolelor s3 fie ordonate cresc3tor .eventual descresc3tor/. :in punct de vedere al comple"it35ii algoritmilor problema revine la ordonarea c-eilor. :eci specificarea problemei de 2&+%"+e $9%e+9? este urm3toarea: Date n,U/ 0U=(M&,M(,''',Mn)1 Precondi*ia3 MiR, i=&,n Re%ultate UT/ Po)tcondi*ia3 UT e)te o permutare a lui U, dar ordonat cre)ctor' Deci M& M( ''' Mn' J prim3 te-nic3 numit3 "Selec*ie" se bazeaz3 pe urm3toarea idee: se determin3 pozi5ia elementului cu c-eie de valoare minim3 .respectiv ma"im3/, dup3 care acesta se va intersc-imba cu primul element. (cest procedeu se repet3 pentru subcolec5ia r3mas3, pKn3 cKnd mai r3mKne doar elementul ma"im. &U.PR$#RA%ul Selectie(n,U) este3 0Se face o permutare a celor1 0n componente ale vectorului U a)tfel1 0ca M& M( '''' Mn 1 Pentru i3=&/ n@& e4e(ut "ie ind3=i/ Pentru H3=i,&/ n e4e(ut Da( MH B Mind atun(i ind3=H sf-a( sfpentru Da( iBind atun(i t3=Mi/ Mi3=Mind/ Mind3=t sf-a( sfpentru sf@Selectie *e observ3 c3 num3rul de compar3ri este: .n)</W.n)=/W...W=W<Qn.n)</2= indiferent de natura datelor. ( treia metod3 care va fi prezentat3, numit3 "$u##leSort", compar3 dou3 cKte dou3 elemente consecutive iar Dn cazul Dn care acestea nu se afl3 Dn rela5ia dorit3, ele vor fi intersc-imbate. Procesul de comparare se va Dnc-eia Dn momentul Dn care toate perec-ile de elemente consecutive sunt Dn rela5ia de ordine dorit3.
3;

&U.PR$#RA%ul $u##leSort (n,U) este3 Repet "ie Mod3=-/ Pentru i3=(/ n e4e(ut Da( Mi@& D Mi atun(i t 3= Mi@&/ Mi@& 3= Mi/ Mi3=t/ Mod3=& sf-a( sfpentru p7n(7n- Mod=- sfrep sf@$u##leSort

08pote%a Re)te ordineR1

0F@a fo)t ordineQ1 0>rdonare1

J metod3 mai performant3 de ordonare, care va fi prezentat3 Dn continuare, se nume6te "LuicMSort" 6i se bazeaz3 pe te-nica "divide et impera" dup3 cum se poate observa Dn continuare. Metoda este prezentat3 sub forma unei proceduri care realizeaz3 ordonarea unui sub6ir precizat prin limita inferioar3 6i limita superioar3 a indicilor acestuia. (pelul procedurii pentru ordonarea Dntregului 6ir este : LuicMSort(n,U,&,n), unde n reprezint3 num3rul de articole ale colec5iei date. &U.PR$#RA%ul SortareRapid (n,U) este3 C5eam LuicMSort(n,U,&,n) sf@SortareRapid Procedura LuicMSort (n,U,St,Dr) va realiza ordonarea sub6irului MSt,MSt,&,''', MDr. (cest sub6ir va fi rearanjat astfel DncKt MSt s3 ocupe pozi5ia lui final3 .cKnd 6irul este ordonat/. :ac3 i este aceast3 pozi5ie, 6irul va fi rearanjat astfel DncKt urm3toarea condi5ie s3 fie Dndeplinit3: kj ki kl , pentru st j _ i _ l dr .J/ Jdat3 realizat acest lucru, Dn continuare va trebui doar s3 ordon3m sub6irul MSt , MSt,& , ''' ,Mi@& prin apelul recursiv al procedurii LuicMSort(n,U,St,i@&) 6i apoi sub6irul Mi,&,''', MDr prin apelul LuicMSort(i,&,Dr). :esigur ordonarea acestor dou3 sub6iruri .prin apelul recursiv al procedurii/ mai este necesar3 doar dac3 acestea con5in cel pu5in dou3 elemente. Procedura LuicMSort este prezentat3 Dn continuare : &U.PR$#RA%ul LuicMSort (n,U,St,Dr) este3 "ie i3=St/ H3=Dr/ a3=Mi/ Repet C7ttimp MH D= a !i (iBH) e4e(ut H3=H@& sf(7t Mi3= MH/ C7ttimp Mi a !i (iBH) e4e(ut i3=i,& sf(7t MH3= Mi / p7n(7n- i=H sfrep "ie Mi 3= a/ Da( St B i@ & atun(i C5eam LuicMSort(n,U,St,i@&) sf-a( Da( i,& B Dr atun(i C5eam LuicMSort(n,U,i,&,Dr) sf-a( sf@LuicMSort #n ultim algoritm care va fi prezentat se nume6te " Eerge Sort" .sortare prin interclasare/ 6i se bazeaz3 pe te-nica "divide et impera". 4irul ce urmeaz3 a fi ordonat se Dmparte Dn dou3 sub6iruri care se ordoneaz3, dup3 care acestea se vor interclasa ob5inKndu)se Dntregul 6ir ordonat. ,iecare sub6ir se va ordona tot prin desp3r5irea lui Dn dou3 sub6iruri urmat3 de interclasare 6i a6a mai departe pKn3 cKnd
3>

ordonarea unui sub6ir se poate rezolva elementar f3r3 a mai fi necesar3 desp3r5irea lui Dn alte dou3 sub6iruri .lungimea sub6irului este cel mult =/. (lgoritmul corespunz3tor este prezentat Dn sec5iunea urm3toare sub forma unei proceduri recursive care ordoneaz3 un sub6ir precizKnd limitele acestuia. G.> I9%e+cl"2"+e ,iind date dou3 colec5ii de date, ordonate cresc3tor .sau descresc3tor/ dup3 o c-eie, se cere s3 se ob5in3 o colec5ie care s3 fie de asemenea ordonat3 cresc3tor .respectiv descresc3tor/ dup3 aceea6i c-eie 6i care s3 fie format3 din articolele colec5iilor date. (cest lucru se poate ob5ine direct .f3r3 o sortare a colec5iei finale/ prin parcurgerea secven5ial3 a celor dou3 colec5ii, simultan cu generarea colec5iei cerute. Prin compararea a dou3 elemente din listele de intrare se va decide care element va fi ad3ugat Dn lista de ie6ire. :eci ne intereseaz3 un algoritm de rezolvare a problemei ce are urm3toarea specificare: Date m, (xi, i=&,m), n, (yi, i=&,n)/ Precondi*ia3 0x& x( ''' xm1 !i 0y& y( ''' yn1 Re%ultate M, (%i, i=&,M)/ Po)tcondi*ia3 0M=m,n1 !i 0%& %( ''' %M1 !i (%&,%(,''', %M) e)te o permutare a valorilor (x&, ''', xm,y&,''', yn) J solu5ie posibil3 ar fi depunerea componentelor vectorului + 6i a componentelor vectorului S Dn vectorul :, realizKnd astfel a doua parte din postcondi5ie. JrdonKnd apoi componentele vectorului : ob5inem solu5ia dorit3. (cest algoritm, de6i corect, este ineficient 6i, Dn plus, nu este util Dn sort3rile e"terne .vezi sec5iunea ?.9/. ste important ca la o singur3 trecere prin vectorii + 6i S s3 se ob5in3 vectorul :. (cest lucru este realizat de urm3torul algoritm de interclasare: &U.PR$#RA%ul 8ntercla)are(m,+,n,S,M,:) este3 0+ are cele m1 0componente ordonate nede)cre)ctor1 0<a fel S cu n componente' ele m,n valori1 0)e depun 4n :, tot ordonate nede)cre)ctor1 "ie i3=&/ H3=&/ M3=-/ C7ttimp (iB=m) !i (HB=n) e4e(ut 09xi)t componente1 Da( xiyH atun(i C5eam P2F9(i,xi,M,:) 0!i 4n +1 altfel C5eam P2F9(H,yH,M,:) 0!i 4n S1 sf-a( sf(7t C7ttimp (iB=m) e4e(ut 09xi)t componente1 C5eam P2F9(i,xi,M,:) 0numai 4n +1 sf(7t C7ttimp (HB=n) e4e(ut 09xi)t componente1 C5eam P2F9(H,yH,M,:) 0numai 4n S1 sf(7t sf@8ntercla)are (ici s)a folosit *#&P@JL@(Mul P2F9(ind,val,M,:) care pune Dn vectorul : valoarea val 6i m3re6te indicele ind cu <, subalgortim dat Dn continuare. &U.PR$#RA%ul P2F9(ind,val,M,:) este3 M3=M,&/ %M3=val/ ind3=ind,& sf@P2F9
3G

0Adaug val1 04n vectorul : cu1 0M componente !i1 0mre!te ind cu &1

(lgoritmul EergeSort de sortare bazat pe interclasare se poate vedea Dn continuare. Algoritmul EergeSort este3 0Sortare prin intercla)are1 Cite6te n/ Pentru i3=& / n e4e(ut Cite6te Ui sfpentru C5eam Sort8nter (n,U)/ Pentru i3=&/ n e4e(ut Tipre6te Ui sfpentru sf@EergeSort &U.PR$#RA%ul Sort8nter(n, ) este3 C5eam >rdon (&,n, )/ sf@Sort8nter &U.PR$#RA%ul >rdon (St,Dr,A) este3 Da( St B Dr atun(i "ie m3=(St,Dr) Div (/ C5eam >rdon (St,m,A)/ C5eam >rdon (m,&,Dr,A)/ C5eam 8nter (St,m, m,&,Dr)/ sf-a( sf@>rdon &U.PR$#RA%ul 8nter ()&,d&, )(,d() este3 0 8ntercla)are 1 "ie A3= / M3=)&@&/ C7ttimp ()&B=d&) 6i ()(B=d() e4e(ut Da( ( 5)&6B 5)(6) atun(i C5eam P2F9()&,c)& ,M,A) altfel C5eam P2F9()(,c)( ,M,A) sf-a( sf(7t C7ttimp ()&B=d&) e4e(ut C5eam P2F9()&,c)& ,M,A) sf(7t C7ttimp ()(B=d() e4e(ut C5eam P2F9()(,c)( ,M,A) sf(7t 3=A sf@8nter G.F S&+%"+e e7%e+9? J problem3 cu care ne confrunt3m adesea este sortarea unei colec5ii de date aflate pe un suport e"tern, de volum relativ mare fa53 de memoria intern3 disponibil3. Mn aceast3 sec5iune o astfel de colec5ie de date o vom numi ,$<$e+. Mn acest caz nu este posibil transferul Dntregii colec5ii Dn memoria intern3 pentru a fi ordonat3 6i apoi din nou transferul pe suport e"tern. :ac3 datele ce urmeaz3 a fi sortate ocup3 un volum de n ori mai mare decKt spa5iul de memorie intern3 de care dispunem, atunci colec5ia se va Dmp3r5i Dn n subcolec5ii ce vor fi transferate succesiv Dn memoria intern3, se vor sorta pe rKnd 6i vor fi stocate din nou pe suportul e"tern sortate. :in acest moment prin opera5ii de interclasare dou3 cKte dou3 se pot ob5ine colec5ii de dimensiuni superioare pKn3 se ob5ine toat3 colec5ia ordonat3. 1a aceste interclas3ri, pentru a efectua un num3r cKt mai mic de opera5ii de transfer se recomand3 interclasarea colec5iilor de dimensiuni minime, apoi din datele ob5inute din nou vor fi alese dou3 colec5ii de dimensiuni minime 6i a6a mai departe pKn3 se ob5ine o singur3 colec5ie care va fi colec5ia cerut3, adic3 sortat3. :up3 metodele de sortare e"tern3 folosite, se descriu trei procedee de sortare e"tern3:
3A

0Sortare prin intercla)are a1 0elementelor ASt,ASt,&,''',ADr1

B sortarea ec-ilibrat3N B sortarea polifazic3N B sortarea Dn cascad3. vident c3 sortarea depinde 6i de configura5ia calculatorului folosit, dar 6i de suportul pe care se afl3 fi6ierul de sortat 6i fi6ierele intermediare create. Principial sortarea e"tern3 presupune parcurgerea a dou3 etape importante: a/ D$:$="+e" fi6ierului de sortat =, Dn n fi6iere V&, V(, ''', Vn, cu sortarea intern3 a acestoraN b/ I9%e+cl"2"+e" acestor fi6iere sortate pentru a ajunge la fi6ierul dorit G.

9C

CAPITOLUL VI
EVOLUIA LIMBAJELOR DE PROGRAMARE #n limbaj de programare este un sistem de conven5ii adoptate pentru realizarea unei comunic3ri B Dntre programator 6i calculator . 1imbajele folosite pentru programarea unui calculator sunt e"trem de asem3n3toare limbajelor naturale . le sunt compuse din : cuvinte .rezervate/N punctua5ieN propozi5ii 6i frazeN reguli sintactice etc. (6a cum pentru Dnsu6irea unei limbi str3ine trebuie Dnv35ate cuvintele acesteia 6i regulile cu care pot fi manevrate tot a6a pentru Dnsu6irea unui limbaj de programare trebuie studiate cuvintele 6i semnele care Dl compun Dmpreun3 Dmpreun3 cu regulile de manevrare a lor. :e)a lungul timpului,oamenii au inventat masini pentru a calcula cat mai eficient.$naintea calculatoarelor performante din zilele noastre,au e"istat alte masini de calcul. Momentul ini5ial al istoriei calculatoarelor este, de obicei legat de numele matematicianului englez C-arles &abbage. l a propus Dn anul <G3C o Ea!in Analitic care a anticipat Dn mod fascinant structura calculatoarelor actuale. $deile sale au devansat cu peste <CC de ani posibilit35iile te-nologice ale vremii sale. Mnaintea a mai fost Dncerc3ri Dn acest domeniu ale lui 1eibnitz 6i Pascal .sec al Y%$$)lea/ . #rm3torul moment de referin53 este anul <A3>, cKnd ^o0ard (iken, de la #niversitatea ^arvard a propus alculatorul cu )ecven* de omand Automat, bazat pe o combina5ie Dntre ideile lui &abbage 6i calculatoarele elertromecanice, produse de firma $&M. Construc5ia acestuia a Dnceput Dn anul <A3A 6i s)a terminat Dn anul <A99, fiind denumit Mark $ . l a fost Dn principal primul calculator electromecanic, fiind alc3tuit din comutatoare 6i relee. Mnlocuirea releelor cu tuburi electronice a constituit un important pas Dnainte. @ezultatul a fost concretizat Dn calculatorul E$(C . lectronic Eumerical $ntegrator (nd Computer /, primul calculator electronic digital. l con5ine circa <G.CCC de tuburi electronice 6i e"ecuta ?.CCC de adun3ri pe secund3, avKnd o memorie de =C de numere reprezentate Dn zecimal. Programarea sa se realiza prin pozi5ionarea a circa ;.CCC de comutatoare, cu mai multe pozi5ii. J semnifica5ie aparte o are faptul c3 Dn ar-itectura calculatoarelor Mark $ 6i E$(C, intrau mai multe elemente de calcul, ce lucrau Dn paralel la o problem3 comun3, fiind dirijate de o singur3 unitate de comand3 . (ceast3 solu5ie a fost aleas3 datorit3 vitezei reduse a fiec3rei unit35i de calcul, Dn parte. 1a versiunea urm3toare s)a renun5at la aceast3 structur3 paralel3 de calcul, deoarece s)a considerat c3 viteza unei unit35i de calcul, realizat3 cu circuite electronice, este suficient3 . *olu5ia prelucr3rii paralele a fost reluat3 ulterior dup3 anii GC` pentru m3rirea performan5elor unui sistem de calculN astfel Dn <AA; ,irma $E' 1 a realizat un supercalculator ce folose6te peste >CCC de procesoare P E'$#M utilizKnd te-nica ade calcul masiv8 .utilizat pentru simularea testelor nucleare, Dn cercet3ri genetice, spa5iale, meteorologice/. :e remarcat c3 la realizarea primelor calculatoare, Dn calitate de consultant al ec-ipei, a lucrat 6i matematicianul Vo-n von Eeumann, unul dintre matematicienii importan5i ai secolului YY. :e altfel, la realizarea calculatorului :%(C . primul calculator cu circuite electronice / el a stabilit ? caracteristii principale ale calculatorului cu program memorat : 'rebuie s3 posede un mediu de intrare, prin intermediul c3ruia s3 se poat3 introduce un num3r nelimitat de operanzi 6i instruc5iuni . 'rebuie s3 posede o memorie, din care s3 se citeasc3 instruc5iunile 6i operanzii 6i Dn care s3 se poat3 memora rezultatele. 'rebuie s3 posede o )ec*iune de calcul, capabil3 s3 efectueze opera5ii aritmetice 6i logice, asupra operanzilor din memorie. 'rebuie de asemenea s3 posede un mediu de ie!ire, prin intermediul c3ruia un num3r nelimitat de rezultate s3 poat3 fi ob5inute de c3tre utilizator.
9<

'rebuie s3 aib3 o unitate de comand , capabil3 s3 interpreteze instruc5iunile ob5inute din memorie 6i capabil3 s3 selecteze diferite moduri de desf36urare a activit35ii calculatorului pe baza rezultatelor calculelor. Primul calculator comercializat a fost #E$%(C .#E$versal (utomatic Computer / realizat pe structura calculatorului :%(C, Dn anul <A?<. Mn anii <A;C a ap3rut un nou tip de calculatoare: .$9$c"lc'l"%&"+ele. (ceste ma6ini erau mai ieftine, mai mici, nu avea nevoie de aer condi5ionat 6i erau mult mai u6or de folosit .cel pu5in dup3 standardele acelor timpuri/ fa53 de mainframe)uri. Mn fa53 ereziei, preo5ii mainframe)urilor s)au Dnfiorat. :e5inerea unui mainframe era problema corpora5iei, datorit3 c-eltuielilor necesare, dar un departament putea avea propriul minicalculator, pentru c3 acesta nu necesita spa5ii speciale sau speciali6ti necesari unui mainframe. Pe scurt, minicalculatoarele erau ieftine.(ceast3 dezvoltare a dus la apari5ia unui nou personaj pe scena calculatoarelor. Minicalculatoarele au adus la Dnlocuirea programatorilor de mainframe, cura5i 6i bine Dmbr3ca5i, cu o nou3 specie de programatori. Minicalculatoarele au Dnceput s3 fie introduse Dn universit35i 6i alte institu5ii de Dnv353mKnt, pentru c3 erau ieftine. le erau accesibile 6i proiectate pentru a putea suporta modific3ri ulterioare, ceea ce a atras un grup de entuzia6ti cunoscu5i sub numele de -ackeri. (ce6ti -ackers nu sunt identici cu cei din zilele noastre. (cei -acker)i erau plini de entuziasm fa53 de calculatoare, oameni care voiau s3 fac3 programe mai bune, mai rapide 6i mai aelegante8.:in rKndurile lor s)au ridicat o parte din oameni care au f3cut revolu5ia calculatoarelor personale. Pia5a minicalculatoarelor a crescut repede. $mediat ce departamentele puteau justifica nevoia minicalculatorului, acesta era instalat. (cesta a fost momentul cKnd : C .:igital buipment Corporation/ a devenit a doua mare companie produc3toare de calculatoare din lume.Mn privin5a Dmbun3t35irilor aduse programelor, gama func5iilor care pot fi realizate a crescut. #n minicalculator poate fi folosit simultan de mai mul5i utilizatori, cu ajutorul unui procedeu de Dmp3r5ire a timpului de folosire a procesului numit time@)haring. (stfel, fiecare utilizator poate s3 prelucreze date, s3 creeze programe sau s3 utilizeze, ca 6i cKnd ar fi singurul utilizator. (cest sistem a fost introdus 6i Dn te-nologia de realizare a mainframe)urilor. *isteme sofisticate de time)s-aring, cu componente disc mai puternice 6i programe mai sofisticate, au fost dezvoltate Dn acela6i timp pentru mainframe)uri.(ceasta era pia5a calculatoarelor Dn anii c>C: mainframe)uri 6i minicalculatoare erau prezente Dn toate companiile 6i principalele departamente. Pentru sacinile pe care le puteau rezolva Dn moduri Dn care le rezolvau, erau bune. (u adus metode noi 6i eficiente Dn birouri 6i au f3cut afacirele mai eficiente. 'otu6i, au e6uat Dn m3rirea productivit35ii personale .Dn cre6terea eficien5ei personalului, nu a corpora5iilor/. A#"+$8$" c"lc'l"%&"+el&+ #e+2&9"le 1a mijlocul anilor c>C a ap3rut o nou3 te-nologie: miniproce)orul. (cesta folosea multe tranzistoare conectate pe o pastil3 de siliciu pentru a realiza un dispozitiv de calcul.Primele microprocesoare au fost, dup3 standardele actuale, destul de simple. Primul microprocesor, devine cunoscut ca 9CC9, a fost proiectat pe patru bi5i de c3tre inginerul Marcian . a'ed8 ^off de la $ntel, Dn anul <A;A. Clientul care i)a comandat lui $ntel microprocesorul a fost o firm3 japonez3, care a dat faliment Dn <A>CN dup3 aceasta $ntel nu se putea -ot3rD dac3 s3 lanseze sau nu circuitul pe pia53. 1)au lansat, 6i Dn <A>9 e"istau mai mult de <A tipuri de microprocesoare pe pia53, inclusiv $ntel GCGG, cel care va deveni trambulina actualelor calculatoare personale.Microprocesoarele au fost ini5ial folosite drept controler ) dispozitive de control B pentru ma6ini de sp3lat vesel3 6i frigidere. Produc3torii 6i proiectan5ii de calculatoare nu au pierdut ocazia dat3 de poten5ial acestor dispozitive de a fi folosite drept calculatoare. K K / @K / CP;M Primele succese ale pie5ei au fost microprocesorul $ntel GCGC 6i noul sistem de operare numit CP2M)GC scris pentru acest cercuit. CP2M)GC a fost creat Dn <A>? de Lary ]ildall, fondatorul 6i pre6edintele companiei :igital @esearc- B primul produc3tor al unui sistem de operare pentru microcalculatoare. (st3zi, compania este o divizie a lui Eovell $nc. B cea mai mare companie Dn domeniul sistemelor de operare Dn re5ea.CP2M este prescurtat de la Controlul Programului2Microcalculatorului B cel mai sugestiv nume de produs, dac3 mai e"istase unul, de pKn3 atunci. (cest sistem de operare a fost, la
9=

acea dat3, e"traordinar. :ac3 aveai un sistem GCGC sau dGC, cu sistem de operare CP2M, cu ;9 kilobi5i de @(M 6i o perec-e de unit35i de disc fle"sibil de G", aveai aultimul strig3t8 al modei calculatoarelor 6i Dl f3ceai verde de invidie pe orice pasionat. #n singur lucru le putea dep36i invidia 6i cD6tiga ura: s3 ai un disc 6i o imprimat3N ambele necesitau o c-eltuial3 e"orbitant3.:iscurile acelor timpuri merit3 pu5in3 aten5ie. Primul tip larg r3spKndit Dmpreun3 cu microcalculatoarele aveau discuri de <9" .compara5i)le cu cele de 3,?" disponibile ast3zi/ 6i un timp de acces suficient pentru o pauz3 de cafea. (pple Computer, binecunoscut3 ca avKndu)6i Dnceputurile Dntr)un garaj, a ap3rut Dn <A>;. (pple a fost fondat3 de legendarii *teve Vobs 6i *teve eozniack, 6i este recunoscut drept compania care a pus bazele industriei calculatoarelor personale. :e6i povestea lui %isilac 6i a calculatorului (pple $$ este bine cunoscut3, merit3 s3 o spunem Dnc3 o dat3, pentru c3 arat3 motivele care au generat revolu5ia calculatoarelor personale.1a mijlocul anilor f>C, dac3 doreai s3 faci Dncerc3ri de genul a6i dac38 calculKnd pe mainframe, trebuia s3 scrii un program, s3)l depanezi, s3 Dncerci un set de date, s3 verifici rezultatele, s3 Dncerci un set de date mai comple" s.a.m.d. ra un procedeu cel pu5in laborios 6i nu foarte practic, cu e"cep5ia cazului Dn care priviziunele aveau importan53 pentru corpora5ie 6i aveai suficient timp la dispozi5ie. (ceast3 situa5ie a motivat doi studen5i de la ^arvard &usiness *c-ool s3 fac3 primul program de calcul tabelar: %isicalc.(pple $$ avea la baz3 un procesor Motorola ;?C= .proiectat pe G bi5i/, pKn3 la <=G kilobi5i de @(M 6i utiliza un casetofon pentru a stoca date 6i programe. (pple a Dnc-eiat o Dn5elegere cu realizatorii lui %isicalc pentru a ob5ine e"clusivitatea programului pe (pple $$. (cestui program i se acord3 meritul de a fi catapultat (pple de la un venit de GCC.CCC de dolari Dn <A>> la pu5in sub 9G de milioane Dn <A>A.#tilizatorii cump3rau (pple $$ doar pentru a rula %isicalc, 6i o dat3 cu el un raft Dntreg de aplica5ii, care ofereau utilizatorilor, pentru prima dat3 la un pre5 rezonabil, putere de calcul accesibil3 6i dedicata IBM #+e$" c&9%+&l'l Calculatoarele despre care am vorbit, ma6inile CP2M 6i (pple, nu erau numite calculatoare personale B acesta nu a fost un termen recunoscut pKn3 Dn august <AG<, data de na6tere a calculatorului $M& PC a fost creat de pia53, datorit3 acelor sisteme de microcalculatoare care au f3cut posibil3 e"isten5a calculatorului $&M PC.:e6i microprocesorul care a stat la baz3 calculatorului $&M PC a fost produs Dn <A>9, calculatorul $&M PC a fost produs abia Dn <AG<. $ntel GCGG era un microprocesor pe <; bi5i, care putea lucra cu mai mult3 memorie 6i mai rapid decKt predecesorii s3i. $&M a delegat o companie necunoscut3, numit3 Microsoft, pentru a realiza un sistem de operare. @estul este, a6a cum o spun ei, istorie. $&M PC a devenit un standard, Dn realitate o serie de standarde care au adus la vKnzarea de apro"imativ <CC de milioane de calculatoare personale din <AG<. puterea marketing)ului $&M a dus la succesul lui $&M PC. $&M avea bani 6i pozi5ia pe pia53 astfel DncKt s3 fac3 calculatorul $&M PC acceptat Dn corpora5ii. :e6i e u6or s3 critici $&M pentru gre6elile, destul de multe, f3cute Dn dezvoltarea pie5ei calculatoarelor personale 6i lipsa de receptivitate fa53 de o pia53 care cre6tea mai rapid decKt putea acoperi $&M, f3r3 amestecul lui $&M, aceast3 pia53 ar fi crescut mult mai Dncet 6i mai fragmentat. Calculatorul $&M PC a continuat tendin5a dat3 de (pple $$, aducKnd puterea de calcul la DndemKna utilizatorilor. Posibilitatea de a)6i Dmbun3t35i 6i m3ri productivitatea personal3 a fost o atrac5ie atKt de mare, DncKt oamenii au trecut peste orice pentru a)6i cump3ra un calculator personal. i au p3c3lit bugetele departamentale cump3rKndu)le ca ma6ini de scris sau c-iar pl3tind diferen5a din propriul buzunar. Multe companii au avut re5ineri Dn a urma tendin5a de introducere a calculatoarelor personale, dar au descoperit ulterior c3 acestea erau folosite din plin de concuren5a. Mn aceste companii, de obicei, Centrul de Calcul era uluit cKnd descoperea invazia calculatoarelor personale. ,anaticii mainframe)urilor erau probabil cei mai surprin6i cKnd aflau ce se DntKmplase. (parent peste noapte, Centrul de Calcul pierdea un procent destul de mare din prelucr3rile de date ale companiei. 'eritoriul pe care credeau c3 Dl st3pKnesc era brusc invadat. Ceea ce era probabil cel mai tulbur3tor pentru ei era c3 utilizatorii de calculatoare personale vorbeau despre informa5ii 6i nu doar despre coloane de date.
93

#tilizatorii au descoperit c3 puteau combina 6i prelucra cum doresc datele. Puteau realiza rapoarte despre ceea ce Di interesa. Pe de alt3 parte, dac3 ai fi cerut la Centrul de Calcul un raport, 5i)ar fi dat doar un raport standard a6a cum le genera mainframe)ul. .@apoartele standard consumau o amic3 p3dure8 de -Krtie, cKnd to5i utilizatorii doreau doar o pagin3 /. (stfel a ap3rut o nou3 tendin53: aceea de a a)5i realiza singur calculele. (tunci cKnd utilizatorii doreau s3 fac3 simul3ri financiare de tipul a6i dac38, ei nu mai trebuiau s3 mearg3, cu p3l3ria Dn mKn3 .metamorfic vorbind/ la Centrul de Calcul. Puteau s3)6i porneasc3 calculatorul personal, s3 ruleze programul de calcul tabelar 6i s3 realizeze o duzin3 de scenarii, Dn timpul Dn care Centrul de Calcul ar fi luat Dn considerare cererea lor.:eja nu mai e"ista nici o posibilitate pentru Centrul de Calcul de a sc-imba lucrurile. Corpora5iile aveau toate motivele s3 sus5in3 noua tendin53 6i Dn acela6i timp destule motive de Dngrijorare pentru anar-ia care se crea. :istribuirea datelor prin companii, cum ve5i vedea, avea multe implica5ii 6i e"ista marele risc de a sc3pa totul de sub control. @evolu5ia calculatoarelor personale, mai mult decKt orice, a for5at Centrele de Calcul s3)6i regKndeasc3 rolul 6i te-nologia pe care o foloseau. le nu au avut cu adev3rat de ales 6i au devenit *ervicii de gestiunea de informa5ie .Management $nformation *ervice/ sau $' .$nformation 'e-nology/ sau orice altceva care con5inea cuvKntul informa5ie. :e asemenea, au trebuit s3 urmeze sau cel pu5in s3 se obi6nuiasc3 cu valul te-nologiilor aduse de calculatoarelor personale. L9ce#'%'l c&9ec%?+$$ Pe timpul CP2M)ului, pre5ul perifericilor de calitate era e"orbitant. #n disc de <9" 6i <CM&, care consuma ? amperi 6i f3cea zgomot ca un avion care decola, era tot atKt de scump ca 6i un calculator. J imprimat3 matriceal3, care nici nu se apropia de calitatea unei letter)buality, era o resurs3 pre5ioas3. Mn momentul lans3rii calculatorului $&M PC pre5urile sc3zuser3, dar erau Dnc3 destul de mari. Pe scurt, perifericele calculatoarelor personale erau ca aurul: rare 6i scumpe. Eu era practic ca fiecare calculator s3 aib3 disc 6i imprimat3, de6i f3r3 ele productivitatea calculatoarelor personale era mai mic3. J alt3 problem3 era folosirea Dn comun a datelor. :ac3 aveai nevoie de un document creat de altcineva, trebuia s3 iei disc-et3, s3)5i pui pantofii de sport 6i s3 alergi la acel microcalculator s3)l iei. :e aici, numele acestui tip de partajare a datelor: are5ea sportiv38. MRe8e"'" 2#&+%$:? (cest tip de re5ea a ridicat multe probleme. Cum puteai s3 fii sigur c3 documentele cu care lucrai erau la zi, dac3 diverse copii modificate de un num3r oarecare de oamenii circulau pe diverse disc-ete! Cum po5i opri furtul documentelor! Cum po5i opri furtul documentelor! 4i dac3 ultima versiune, 6i singura, a unui document se afl3 pe o singur3 disc-et3 folosit3 de cineva drept suport pentru cea6c3 de cafea! 4i dac3...! "istau sute de probleme cu aceast3 re5ea 6i toate eviden5iau o singur3 solu5ie: nevoia, absolut3 necesitate, de a sc-imba documentele electrice Dntre calculatoare. Combina5i cu dorin5a de a sc-imba, de a folosi Dn comun discuri 6i imprimate scumpe, 6i ave5i o problem3 la care s3 medita5i. Eevoia de a folosi Dn comun date 6i periferice a stimula crearea primei re5ele locale de calculatoare, dar a6a cum ve5i vedea, problema central3 a fost nevoia de a folosi Dn comunicatie. C&.'%"%&"+ele 1e 1"%e J modalitate de a folosi Dn comun periferice a fost folosirea unui comutator de date: un dispozitiv ce permite doar unui utilizator la un moment dat s3 foloseasc3 dispozitivul, ca e"emplu o imprimat3. :ac3 o alt3 persoan3 folosea imprimata cKnd doreai tu s3 o folose6ti, trebuia s3 a6tep5i pKn3 termina. #n comutator de date poate fi comparat cu o coad3 la banc3. Jrice persoan3 .datele ce vor vi imprimate/ care se a6eaz3 prima coad3 .comutatorul/ ajunge prima la casier .imprimanta/. @estul trebuia s3 a6tepte pKn3 ce aceasta termin3. Comutatorul de date ofer3 utilizatorului o cone"iune pe portul serial sau paralel, pe baz3 c3reia primul utilizator care cere prime6te dreptul de folosi imprimanta. Calculatorul care nu mai are nevoie de periferic trebuie s3 trimit3 o secven53 de caractere prin care spune de fapt a(m terminat8.
99

(ceste dispozitive, de6i erau bune pentru imprimant3 6i plotere .ele Dnc3 mai sunt folosite B cKteva companii Dnc3 le mai ofer3 /, nu permiteau folosirea Dn comun a discurilor. :e asemenea, necesitau o linie dedicat3 Dntre calculator 6i comutator. (ceasta devenea dificil de realizat cKnd calculatoarele erau r3spKndite pe o suprafa53 mare, 6i imposibil dac3 erau mai multe calculatoare. MA$c$ 2e+:e2c 1$2c'+$ Prima Dncercare de a realiza ceea ce ast3zi numim re5ea local3 .1(E/ a fost te-nologie, acum Dnvec-it3, numim disc server. #n disc server era un calculator, prin care, printr)o te-nic3 de comunica5ie oarecare, era legat de un grup de calculatoare numit clien5i. l rula un sistem de operare special care era proiectat astfel DncKt s3 poat3 permit3 accesul mai multor clien5i Dn acela6i timp la disc 6i la imprimat3: acest sistem se nume6te sistem de operare pentru re5ea .Eet0ork Jperating *ystem sau EJ*/. F'9c8$&9"+e" +e8ele$ Apli(aia (lient:ser,er Primele aplica5ii de re5ea erau Dn majoritate programe integrate. :e e"emplu, dac3 ofereau o baz3 de date multiutilizator ele aveau 6i partea frontal3 .front)end/ de interac5iune cu utilizatorului 6i amotorul8 bazei de date .partea de program care lucra cu fi6ierele bazei de date/ pe acela6i PC. *ingura parte care se putea afla Dn re5ea, pe server, era baza de date. Mn aceast3 configura5ie, calculatorul client realiza toat3 prelucrarea datelor .citire, c3utare a Dnregistr3rilor dorite Dntre datele citite etc./. (plica5iile acestea pot fi descrise ca avKnd doar client. *erverul era o simpl3 apomp38 de date: trimitea utilizatorului date din fi6ierele aflate pe disc sau le primea 6i le stoca pe disc. Mn ultimii ani au ap3rut un num3r mare de sisteme de baz3 de date sofisticate care pun Dn re5ea amotorul8 de acces la baza de date care se afl3 Dn parte frontal3 .front)end/ utilizatorul. (cestea se numesc )i)teme client;)erver' J dat3 cu Dmbun3t35irea performan5elor datorit3 elimin3rii supraDnc3rc3rii re5elei cu transferuri mari de date, mai e"ist3 6i avantajul faptului c3 serverul poate deservi mai mul5i clien5i Dn acela6i timp. Mntregul proces de sincronizare al accesului la baza de date, care trebuia realizat de clien5i, este acum realizat de server, ceea ce face aplica5iile mai simple 6i Dntregul sistem mai eficient. &azele de date nu sunt singurele aplica5ii care pot fi realizate Dn sistem client2server. (lte aplica5ii client2server includ servere de po6t3 electronic3, sisteme de vizualizare pe calculator a imaginilor 6i urm3rire serviciilor de re5ea. (vantajele sistemelor client2server sunt urm3toarele: securitate mai bun3, deoarece accesul la datele din baza de date server este indirect. #tilizatorii nu pot vedea fi6ierele de date decKt dac3 li se d3 acest drept Dn mod e"plicit. Performan5ele pot fi Dmbun3t35ite u6or, deoarece o mai bun3 proiectare a serverului poate duce la o mai bun3 coordonare a utilizatorilor care doresc servicii Dn acela6i timp 6i, de aici, performan5e mai bune. Mn cazul severelor de baze de date prin re5ea pentru a g3si ce Di intereseaz3N e suficient ca ele s3 trimit3 cereri c3tre server, iar serverul le va trimite doar rezultatele pe care le doresc. Cre6te raportul calitate2pre5. Clien5ii trebuie doar s3 aib3 suficient3 putere de calcul pentru a rula partea frontal3 .front)end/. .CKnd sunt necesare performan5e mai mari, serverul poate fi Dnlocuit cu un calculator personal mai performant 6i, respectiv, mai scump/. :ezavantajele sistemelor client2server: Comple"itatea: nu este simplu, de obicei, s3 configurezi 6i s3 administrezi sisteme client2server. Eecesit35i: pentru a avea mul5i utilizatori, serverul din sistemele client2server are nevoie de un calculator scump. (plica5iile de pe server au tendin5a s3 devie mai mari 6i mai comple"e 6i au nevoie de mai mult3 memorie @(M. Pre5: performan5ele serverului scad o dat3 cu cre6terea num3rului de utilizatori. Pentru a reface performan5ele, serverul de baz3 de date trebuie s3 ruleze pe o ma6in3 dedicat3 acelui server. :eci, acolo
9?

unde cKndva era un server dedicat general, care func5iona 6i ca server de baz3 de date, acum avem un server dedicat general 6i un server de baze de date dedicat, ceea ce duce cel pu5in la dublarea costului. Te5nologii -e grup 'e-nologiile de grup .group0are/ sunt un set de te-nologii care au scopul de a Dmbun3t35i productivitatea a doi sau mai mul5i utilizatori care coopereaz3 Dn realitate unor obiective comune. $deea este ca o dat3 ce re5eaua une6te utilizatorii, munca 6i comunic3rile cu privire la ea pot fi automatizate pentru Dmbun3t35irea flu"ului muncii 6i a oportunit35ilor. 'eoretic, un grup de oameni care muncesc Dmpreun3 Dntr)o activitate comun3 sau pentru obiective comune poate fi mult mai eficient decKt un grup de oameni care muncesc independent. :eoarece calculatoarele Dmbun3t35esc dialogul Dntre membrii grupului 6i urm3resc progresele lor, detaliile nu vor mai fi omise, iar desf36urarea poate fi foarte u6or de urm3rit. (ceste idei au fost aplicate la procese cum sunt planificate 6i administrate proiectelor. Planificarea Dn re5ea permite unui grup dintr)o re5ea s3)6i fac3 orare pe re5ea. CKnd vor s3)6i coordoneze activit35ile, de e"emplu s3 stabileasc3 o DntKlnire, orarul grupului poate fi e"aminat 6i poate fi g3sit momentul cKnd to5i membrii sunt disponibili. ,olosind po6ta electronic3, ace6tea pot fi ruga5i s3 va 6edin53 .sau Dn organiza5iile mai autoritate li se ordon3/. (lte caracteristici ale aplica5iei de grup: *isteme de informare .oferite Dn sisteme de po6t3 electronic3 cum ar fi cc: Mail/. &aze de date folosite Dn comun. *isteme de conducere a proiectelor. *ervicii de bibliotec3 .pentru administrarea documenta5iilor apar5inKnd unui grup/. *isteme de control al versiunii .asem3n3toare cu serviciul de bibliotec3, dar cu facilit35i de control al ar-iv3rii 6i g3sirii diverselor versiuni de fi6ierN aceste sisteme sunt de obicei folosite pentru dezvoltarea programelor/. #na dintre cele mai l3udate aplica5ii ale te-nologiilor de grup, 1otus Eotes, este un sistem de baze de date cu po6t3 electronic3. @olul lui Eotes este de a r3spKndi informa5iile de5inute Dn bazele de date ale organiza5iilor, la un num3r oarecare de utilizatori. *istemul permite duplicarea 6i sincronizarea mai multor copii de baze de date. J alt3 direc5ie principal3 a aplica5iilor de grup este posibilitatea urm3ririi flu"ului muncii. $deea este c3 grupurile de utilizatori care sunt Dntr)o re5ea pot beneficia de automatizarea activit35ilor de rutin3. Mare parte a sistemelor care se ocup3 de flu"ul muncii se bazeaz3 pe formulare. le primesc date de la o persoan3, pe care apoi le transmit, dac3 e posibil cu date suplimentarea din alte surse, celorlal5i membri. le au mecanisme pentru contabilizarea 6i urm3rirea tranzac5iilor 6i raportarea stadiului muncii. Jbiectivele vor fi mai rar uitate sau amKnate, deoarece calculatoarele sunt mai de Dncredere decKt oamenii. ,lu"ul muncii este concept atKt de important Dn re5ele, DncKt multe dintre principalele companii produc3toare de produse de re5ea au investit Dn companii care dezvolt3 te-nologii de baz3 pentru suportul flu"ului muncii. Problema cu aplica5iile de grup este c3 e greu ca oamenii s3 se obi6nuiasc3 cu ea\ .aPo5i s3 duci un cal la ap3, dar nu po5i s3)l faci s3 bea.8/. NIVELE ALE LIMBAJELOR DE PROGRAMARE 7Eivelul8 unui limbaj este apreciat prin pozi5ia pe care o ocup3 pe scara constituit3 de limbajul recunoscut de microprocesor .limbaj ma6in3/ 6i limbajul natural al programatorului .limba romKn3, limba englez3 R/ . #n limbaj de nivel sc3zut este foarte apropiat de ma6in3, el manipuleaz3 cu elemente de nivel -ard0are, fizic, cum ar fi : registru, microprocesor, loca5ie de memorie, port de intrare 2 ie6ire etc. #n limbaj de nivel Dnalt sau foarte Dnalt manipuleaz3 cu concepte apropiate de limbajul natural, concepte de nivel logic, cum ar fi: colec5ie de date, nume de opera5ie .sort, 0riteln, open/, variabile, constante . asem3n3toare ca Dn5eles cu cele din matematic3/.
9;

Cu ajutorul unui limbaj de nivel Dnalt programatorul se face mult mai u6or Dn5eles de c3tre calculator . #neori o singur3 limie de program scris3 cu un astfel de limbaj poate ec-ivala cu sute de linii de program scrise Dn limbaj ma6in3. :eci din punct de vedere al reducerii timpului de realizare a unui program 6i al siguran5ei Dn func5ionare .absen5a erorilor de programare/ este de preferat un limbaj de nivel cKt mai ridicat .Dnalt sau foarte Dnalt/. Mn sc-imb, pe m3sur3 ce limbajul are un nivel mai ridicat e"ecu5ia programului conceput cu ajutorul s3u va fi mai lent3, decKt a unui program ce realizeaz3 acelea6i opera5ii dar este scris Dn limbaj de asamblare. J alt3 diferen53 esen5ial3 Dntre cele dou3 tipuri de limbaje o reprezint3 portabilitatea, adic3 posibilitatea transfer3rii programelor pe un alt tip de ma6in3 decKt cea pe care au fost construite. :in acest punct de vedere limbajul de asamblare este neportabil deoarece el este specific microprocesorului. Programele realizate pe un tip de ma6in3 trebuie rescrise integral pentru noul tip de ma6in3 , folosind un nou set de instruc5iuni B care deobicei difer3 foarte mult. 1ucrurile stau altfel cu programele concepute cu ajutorul unui limbaj de nivel Dnalt, deoarece acestea sunt deta6ate de ma6in3. Mntre un astfel de program 6i calculator se interpune compilatorul .sau interpretorul/ care rezolv3 corect transformarea fi6ierului)surs3 Dn fi6ier ) e"ecutabil. L$.)"0e #+&ce1'+"le N 9e#+&ce1'+"le Cele dou3 tipuri de limbaje, procedurale 6i neprocedurale, se diferen5iaz3 prin nivelul de organizare .structurare/ a unui program. 1imbajele neprocedurale sunt concepute pentru a gKndi un program la nivel de instruc5iune, pe cKnd cele procedurale, oblig3 programatorul s3 conceap3 programe la nivel de bloc. Mntr)un limbaj procedural .numit 6i limbaj structurat/ programele sunt scrise instruc5iune cu instruc5iune, dar ele sunt organizate logic Dn blocuri .grupuri de instruc5iuni/ ce realizeaz3 o ac5iune bine determinat3. Mn general un bloc are un punct de intrare 6i un punct de ie6ire B nu mai multe. #n limbaj procedural ofer3 posibilitatea utiliz3rii unui nivel ridicat de concepere a unui program 6i duce la realizarea de programe coerente 6i protejate la erori. Prin contrast, limbajele neprocedurale nu favorizeaz3 programatorul Dn a se desprinde de nivelul ainstruc5iune8 6i duc deseori la programe greu de controlat B mai ales Dn cazul programelor de dimensiuni mari. 1imbajele neprocedurale sunt Dnc3 preferate de unii utilizatori datorit3 timpului foarte scurt cKt decurge Dnv35area 6i utlizarea lor. L$.)"0e &+$e9%"%e :in punctul de vedere al aplicabilit35ii unui limbaj, limbajele pot fi orientate pe o anumit3 problem3 sau concepute pentru solu5ionarea oric3rui tip de problem3 B limbaje de uz general sau altfel spus, neorientate pe o problem3. 1imbajele orientate prezint3 un grad Dnalt de specificitate pe cKnd un limbaj neorientat reprezint3 un cadru general ce permite introducerea de c3tre utilizator a conceptelor 6i prelucr3rilor dorite. :eci, diferen5a esen5ial3 dintre cele dou3 tipuri de limbaje o constitue nivelul conceptual definit. Cele specializate posed3 deja integral suportul necesar 6i permit programatorului s3 se concentreze la ansamblul problemei, pe cKnd cele nespecializate las3 Dn sarcina programatorului manevrarea nivelelor inferioare ale problemei. L$.)"0e c&9c'+e9%e #n limbaj concurent permite definirea de procese .prelucr3ri/ paralele, e"ecu5ia sa fiind ramificat3 la un anumit moment de timp. Prin contrast limbajele neconcurente .majoritatea limbajelor/ au o desf36urare liniar3, fiind activ un singur proces la un moment dat. Procesele concurente presupun Dn mod obligatoriu un sistem multi)tasking ce poate gestiona mai multe asarcini8 la un moment dat. L$.)"0e 1e 9$:el 2c?='% (ceast3 categorie de limbaje are un reprezentant autoritar 6i anume: limbajul de asamblare. :iferen5ierile care se pot face pentru limbajele de nivel sc3zut sunt urm3toarele:
9>

dup3 tipul de ma6in3N @egulile respectate de versiunile limbajului de asamblare sunt : B nou3 versiune o include complet pe cea anterioar3, B versiunea nou3 ofer3 func5ii suplimentare 6i le realizeaz3 pe cele vec-i mai rapid. dup3 mediul de programare oferit. (spectul unui limbaj poate fi sc-imbat radical de mediul de programare oferit . Pentru limbajul de asamblare e"ist3 mai multe implement3ri disponibile, DncepKnd cu pac-ete ce opereaz3 Dn mod linie 6i culminKnd cu medii integrate Dn care toate opera5iile se pot declan6a de la un acela6i pupitru de comand3 . Eu sunt luate Dn considerare decKt aceste medii integrate .denumite generic medii 'urbo/, dintre care se deta6eaz3 'urbo (samblorul firmei &orland '(*M. L$.)"0e 1e 9$:el E9"l% 9e&+$e9%"%e BASIC ( fost creat Dn <A;9 la :armoot- College .*.#.(./. :enumirea sa provine de la ini5ialele cuvintelor Beginner`s Allpurpose Symbolic Instruction Code .Cod de instruc5iuni simbolice, de uz general, destinat Dncep3torilor/. (re urm3toarele caracteristici fundamentale : B simplu de Dnv35atN instruc5iunile sale sunt cuvinte din limba englez3 sau prescurt3ri ale acestoraN B neorientat pe un anumit tip de problem3N permite construirea de aplica5iiN B este un limbaj nestructurat, ceea ce Di permite s3 fie u6or Dnv35at. :in cauz3 c3 a cunoscut o larg3 r3spKndire, au fost implementate noi versiuni de &asic: Le) &(*$C, [#$C] &(*$C, '#@&J &(*$C, %$*#(1 &(*$C .&asic for eindo0s/. FORTRAN 1imbajul ,ortran este decanul de vKrst3 al limbajelor de larg3 folosin53. ( ap3rut Dn <A?; 6i D6i datoreaz3 numele prescurt3rii cuvintelor: FORmula TRANslation .'raducere de formule/. $ni5ial reprezenta un limbaj orientat pe calcule 6tiin5ifice avKnd definite concepte precum: matrice, func5ii trigonometrice, numere reale Dn dubl3 precizie. %ersiunile ulterioare care au cunoscut o mare popularitate au e"tins posibilit35ile limbajului trasformKndu)l Dntr)un limbaj eficient, de uz general. Mn prezent e"ist3 pentru $&M)PC dou3 implement3ri mai importante ale limbajului: Microsoft ,ortran, ,ortran for eindo0s. :e6i nu poate fi considerat adep36it8 din punct de vedere conceptual .este un limbaj algoritmic B structurat/ este neindicat3 folosirea lui datorit3 absen5ei unor medii de programare performante 6i pentru c3 tendin5a actual3 Di este defavorabil3. PASCAL Conceptualizat Dn anul <A>C de c3tre Eiklaus eirt-, limbajul P(*C(1 poart3 numele matematicianului 6i filosofului &1($* P(*C(1, Dn semn de recunoa6tere a meritelor sale Dn teoretizarea ma6inilor de calcul. Creat dup3 acumularea de cuno6tiin5e temeinice Dn 6tiin5a limbajelor formale, din confruntarea cu probleme concrete ale program3rii, limbajul P(*C(1 a constituit la vremea respectiv3 un limbaj modern, men5inKndu)se ca atare 6i Dn prezent, datorit3 faptului c3 posed3 o solid3 baz3 conceptual3. 1imbajul P(*C(1 a introdus Dn versiunea sa ini5ial3 no5iunea de programare structurat3 6i ulterior no5iunile de date .structuri/ dinamice, date .structuri/ definite de utilizator. Mn prezent standardul implement3rilor P(*C(1 cuprinde urm3toarele elemente: programare structurat3 de tip algoritmicN definirea de noi func5ii sau proceduriN tipuri de date definibile de c3tre utilizatorN structuri de date dinamiceN
9G

adres3ri indirecte ale datelorN recursivitateN rutine complete de intrare 2 ie6ireN func5ii de conversie a datelor din (*C$$ Dn format intern 6i inversN set complet de func5ii matematiceN func5ii elementare de grafic3 =:N posibilitatea inser3rii direct Dn surs3 a instruc5iunilor Dn limbaj de asamblareN posibilitatea definirii de overlay)uri pentru program. %ersiunile standard ale implement3rilor P(*C(1 sunt cele oferite de Microsoft 6i &orland, cu avantaj pentru cele din urm3 .'#@&J P(*C(1 ?.C, '#@&J P(*C(1 ?.?/ datorit3 mediului de lucru performant .de tip 7'#@&J8 /. Combina5ia P(*C(1 W '#@&J a reprezentat un succes imens Dn rKndul programatorilor avKnd ca singur rival cealalt3 combina5ie: CW'#@&J. L$.)"0'l C (cest limbaj de programare , cu cel mai scurt nume , a fost creat Dn <A>< de c3tre :ennis @itc-ie 6i &rian ]ernig-am pentru dezvoltarea sistemului de operare #E$Y. Principalele caracteristici ale limbajului sunt: limbaj structurat de nivel DnaltN posed3 concepte de nivel sc3zut, ceea ce permite e"ploatarea portabil3 a caracteristicilor intime unei ma6iniN rutine de conversie a datelor foarte evoluateN tipuri de date definibile de c3tre utilizatorN gestionarea elaborat3 a datelor de tip dinamicN definirea de noi func5iiN adres3ri indirecte ale datelor , variabilelor . pointer)i /N recursivitateN set complet de func5ii matematiceN func5ii pentru realizarea de grafic3 elementar3 =:N func5ii de apel servicii :J*N posibilitatea definirii de overlay)uri pentru un programN concizie deosebit3 a limbajului. Pentru versiunile standard ale implement3rilor limbajului C e"ist3 medii de programare de tip 7'#@&J8 ce apar5in firmelor: Microsoft B produsul [#$C] C 6i firmei &orland B produsele '#@&J C. L$.)"0'l ADA ( fost creat special pentru a gestiona totalitatea aplica5iilor dezvoltate 6i utilizate de E.(.*.(. Eoutatea limbajului .de tip structurat, algoritmic/ o constitue concuren5a, deci posibilitatea lans3rii de procese paralele .sincronizate interactiv Dn finalul e"ecu5iei lor/. *altul calitativ este evident 6i desc-ide un nou domeniu Dn programare R dar nu pentru $&M)PC. %ersiunile implement3rilor limbajului (:( pe $&M)PC nu posed3 tocmai acest3 parte de concuren53, reducKnd limbajul la un simplu limbaj structurat de uz general. :eci, (:( este un limbaj ultramodern din punct de vedere teoretic dar ineficient din punct de vedere practic pentru $&M)PC)uri. L$.)"0e &+$e9%"%e #e *e2%$'9e" )"=el&+ 1e 1"%e Eecesit35ile actuale Dn practica utiliz3rii calculatoarelor se Dndreapt3 cu prec3dere spre gestionarea bazelor de date de mari dimensiuni. J e"plica5ie a acestei orient3ri e dat3 de faptul c3 o baz3 de date reprezint3 o informa5ie, iar cel ce de5ine informa5ii complete 6i rapide Dntr)o anumit3 problem3 este
9A

indiscutabil cu un pas Dnaintea celorlal5i. Concuren5a din domeniul economic poate fi numit3 pe bun3 dreptate o b3t3lie informa5ional3. #n sistem de gestionare a bazelor de date .*.L.&.:./ de tip clasic opereaz3 cu urm3torii termeni fundamentali: cKmp B o loca5ie Dn care se poate memora o informa5ie bine determinat3N Dnregistrare B mai multe cKmpuri alc3tuiesc Dmpreun3 o DnregistrareN baza de date B colec5ie de Dnregistr3ri. :eci, datele sunt gestionate prin intermediul unei structuri, organizat3 ierar-ic, la un nivel de organizare logic3. 'endin5a modern3 Dn e"ploatarea bazelor de date const3 Dn deplasarea interesului c3tre bazele de date rela5ionale. :iferen5a esen5ial3 const3 Dn definirea unui nivel logic suplimentar Dntre datele gestionate. (cestea nu mai sunt privite ca simple fi6e izolate Dntre ele ci pot fi analizate pe baza leg3turilor .rela5iilor/ ce e"ist3 Dntre ele. Eo5iunile cu care opereaz3 un *.L.&.:. rela5ional sunt urm3toarele: tabel B structur3 fundamental3 de 7depozitare8 a datelorN linie Dn tabel B ec-ivalentul unei Dnregistr3ri clasiceN coloan3 Dn tabel B ec-ivalentul unui cKmp de tip clasicN baz3 de date B o colec5ie de tabele, conectate prin valorile anumitor coloane. (ceast3 nou3 concep5ie permite definirea de structuri <:n. J 7Dnregistrare8 poate con5ine n valori pentru un 7cKmp8 anumit nu una singur3 ca Dn cazul clasic. *tructurile de tip <:n pot fi rezolvate 6i cu ajutorul unui *.L.&.:. clasic, dar Dntreaga gestiune a opera5iilor revine programatorului pe cKnd un mediu rela5ional furnizeaz3 din start servicii speciale. *pre deosebire de *.L.&.:.)urile clasice, un mediu rela5ional presupune ca cerin53 minimal3 posibilitatea manipul3rii datelor prin intermediul cone"iunilor logice stabilite. Pentru aceasta e"ist3 definit .6i impus ca standard unanim recunoscut/ limbajul de interogare *[1 .Structured Ouery Language B limbaj de cereri structurate/. Prin intermediul s3u sunt permise urm3toarele opera5ii: reg3sire date .cone"ate logic/ ce Dndeplinesc o anumit3 condi5ieN definire ordine de returnare a datelorN redefinire conect3ri logice ale datelorN e"ploatareN programare. (vantajele unui *.L.&.:. clasic sunt: simplitate Dn manevrareN deci efort de studiu redusN pot func5iona pe un sistem de calcul ce nu implic3 resurse speciale, ci doar spa5iu de stocare e"tern suficient pentru problema dat3N pre5 de cost redus fa53 de cele rela5ionale. (vantajele unui *.L.&.:. rela5ional sunt: nivel logic superior .corela5ii, structuri <:n /, prelucr3ri .reg3siri/ de date cu un Dnalt nivel de comple"itateN nivel superior de portabilitate a aplica5iilor, datelor. S.G.B.D. 4'+$ cl"2$ce d&(* $$$ Cel mai r3spKndit sistem de gestiune a bazelor de date este d&(* , Dn diversele lui versiuni. l poate fi considerat un 7&(*$C8 al bazelor de date. 1a momentul apari5iei a constituit o adev3rat3 revolu5ie Dn domeniul *.L.&.:.)urilor. Meritele sale principale care l)au impus aten5iei utilizatorilor 6i programatorilor sunt : foarte simplu de utilizatN limbaj de nivel foarte Dnalt , simplu de Dnv35atN
?C

interactivitate bun3 a sistemuluiN poate func5iona cu resurse e"trem de restrKnseN :ezavantajele principale ale d&(* )ului sunt: vitez3 de lucru e"trem de sc3zut3N limbaj de programare cu lacune greu de surmontat .nu posed3 salturi, func5ii matematice reduse, erori de implementare/N aplica5iile create slab interactiveN imposibilitateta conect3rii cu un alt limbaj. Cele mai importante implement3ri ale sale sunt: d&(* $$$ Plus 6i d&(* $%. CJ&J1 ( fost creat Dn <A?C 6i reprezenta singura posibilitate de gestionare a unei baze de date. @eprezint3 Dn primul rKnd un limbaj de programare special conceput pentru informatica de gestiune. :ac3 facem o compara5ie, sugestiv3, CJ&J1 este ec-ivalentul ,J@'@(E)ului pentru sistemele de gestiune a bazelor de date .din punct de vedere istoric 6i al performan5elor/. 1imbajul este considerat greoi 6i infle"ibil, iar pentru crearea unui program foarte simplu e nevoie de scrierea unui adev3rat eseu. *ingurul avantaj real al CJ&J1)ului este portabilitatea sa ridicat3. ,JY&(* *istemul d&(* a incintat firmele produc3toare de soft, datorit3 popularit35ii sale 6i pe de alt3 parte a calit35ilor sc3zute ale implement3rilor originale furnizate de firma (s-ton)'ate. (u ap3rut noi implement3ri ale limbajului care au Dncercat s3 furnizeze unelte profesionale pe baza acestui suport conceptual. %ersiunile ,JY&(* =.<C 6i ,JY&(* P@J se constitue Dn medii performante atKt pentru programatori cKt 6i pentru utilizatori. $*$* ste distribuit gratis de c3tre #E *CJ, ceea ce Dl face cu adev3rat interesant. Caracteristicile ce Dl fac interesant sunt: interactivitate bun3N posibilitate definire structuri <:nN suport de re5ea local3N un limbaj intern .o versiune de P(*C(1/ cu care se prelucreaz3 dateleN adaptabilitate foarte bun3. S.G.B.D. N'+$ +el"8$&9"le J@(C1 *e poate afirma f3r3 teama de a gre6i c3 J@(C1 reprezint3 cel mai performant *.L.&.:. disponibil la momentul actual. Pe lKng3 faptul c3 posed3 avantajele unui mediu de tip rela5ional J@(C1 este gKndit ca un sistem e"-austiv pentru rezolvarea problemelor de utilizare sau programare. 1imbajul intern folosit este *[1 Plus 6i este permis3 conectarea cu alte limbaje e"terne evoluate .orientate c3tre C/. Putem men5iona: vitez3 de lucru foarte bun3N e"ploatare interactiv3 la nivel *[1N limit3ri de lucru greu sau imposibil de atins .ma"im ;??3? caractere Dntr)un cKmp, num3r nelimitat de cKmpuri, de Dnregistr3ri/N e"ploatare eficient3 a spa5iului pe disc .memorarea cKmpurilor Dn format variabil/. Jracle este implementat pe majoritatea tipurilor de computere mari, ceea ce ofer3 portabilitatea aplica5iilor, dar mai ales posibilitatea conect3rii la calculatoare puternice. P(@(:JY
?<

@eprezint3 un *.L.&.:. cu adev3rat profesional. l Dndepline6te toate cerin5ele unui produs cu adev3rat modern 6i performant 6i anume: interactivitate foarte bun3N vitez3 de lucru mareN servicii 6i au"iliareN limbaj de programare evoluat .P(1 B Parado" Application Language/, dotat cu compilator. L$.)"0e &+$e9%"%e #e c"lc'l %")el"+ (plica5iile Dmpreun3 cu limbajele implementate pentru rezolvarea problemelor descrise Dn continuarea nu pot fi considerate medii de programare propriu)zise. (plica5iile de tip atabel3 de calcul8 au fost concepute Dn ajutorul func5ionarilor, pentru a prelua o parte imens3 din rutina de lucru inerent3 unor astfel de activit35i. :enumirea provine din limba englez3 6i este o traducere pentru termenul aspread)s-eet8 .spread) Dntindere, desf36urare, foaie, tabelN s-eet)sc-em3, diagram3, a acoperi cu un strat/. Mn traducere direct3 aceasta ar Dnsemna B pentru cazul de fa53 B organizarea unei foi .a unui tabel/. $at3 cum func5ioneaz3 un program de tip spread)s-eet: elementul de lucru Dl reprezint3 un tabelN un tabel este format din linii 6i coloaneN intersec5ia unei linii cu o coloan3 se c-eam3 celul3N tabelul este vizualizat pe ecran prin intermediul unei ferestreN Dn fiecare celul3 poate e"ista una din entit35ile urm3toare: te"t, numere, formule, secven5e de program, macroinstruc5iuni. Pe lKng3 aceste caracteristici specifice unui spread)s-eet cerin5ele minimale ale unui pac-et de calcul tabelar includ: posibilitatea ac3ut3rilor inverse8 .de la rezultatul unui calcul, la valorile care l)au generat/N posibilitatea de lucru multi)tabel .mai multe tabelel simultan/N func5ii de editare 6i formatare a te"tului .editor de te"te obi6nuit/N func5ii grafice .diagrame, prezent3ri/N sistem de gestiune a bazelor de date .pentru celulele unui tabel/N tip3rire de calitate .posibilitatae de a lucra cu mai multe tipuri de imprimante, e"ploatarea rezolu5iei unei imprimante laser, set bogat de fonturi/. *pre deosebire de limbajele de programare propriu)zise, cele folosite de spread)s-eet)uri sunt special concepute pentru a fi folosite de nespeciali6ti .u6or de Dnv35at, u6or de utilizat/. #n astfel de limbaj .de tip interpretor/ se constituie Dntr)un cadru general pentru rezolvarea problemelor func5ionarilor din diverse domenii de activitate. J aplica5ie realizat3 cu un spread)s-eet poate fi modificat3 6i adus3 la zi direct de c3tre utilizator, f3r3 a mai fi necesar3 interven5ia programatorului. Produsul ob5inut are fle"ibilitate ma"im3, iar efortul necesar realiz3rii lui este minim. :ezavantajele principale ale aplica5iilor realizate cu ajutorul unui spread)s-eet le constitue imposibilitatea dep36irii cadrului de aprogramare8 oferit 6i dificultatea de a realiza prelucr3ri foarte comple"e . Mns3 aceste dezavantaje sunt mai mult teoretice deoarece nu este cazul de a realiza aplica5ii cu astfel de cerin5e folosind un spread)s-eet. Programele de calcul tabelar rezolv3 Dn mod str3lucit o problem3 punctual3. Cele mai cunoscute 6i r3spKndite produse de tip acalcul tabelar8 sunt: 1J'#* <)=)3 1otus <)=)3, produs al firmei 1otus :evelopment este Dn mod sigur cel mai r3spKndit produs din aceast3 categorie. :atorit3 popularit35ii sale el s)a constituit Dntr)un adev3rat standard .neoficial/ pentru
?=

spread)s-eet)uri. 1a nivel de ansamblu, 1J'#* se preuint3 ca o aplica5ie cu bun3 interactivitate. @epro6urile ce i se pot aduce sunt: meniurile .uneori stufoase 6i nelogic ramificate/ 6i -elp)ul care nu totdeauna este la obiect. [#('@J P@J =.C *pread)s-eet)ul [#('@J, realizat de firma &orland este cel mai nou 6i puternic produs din categoria sa. l combin3 Dntr)un mod fericit tot ceea ce este pozitiv la rivalii s3i ad3ugKnd 6i multe facilit35i proprii. YC 1 Produsul firmei Microsoft, YC 1 este o aplica5ie care func5ioneaz3 sub eindo0s. :e aici rezult3 Dn mod direct unele din caracteristicile sale .utilizare mai comod3, meniuri foarte clare 6i standardizate, func5ii grafice deosebit de puternice, vitez3 de lucru inferioar3 lui [uatro/. CKteva specifica5ii te-nice pentru YC 1 ar fi: tabel3 cu dimensiunea ma"im3 de <;3G " =?; celuleN l35imea ma"im3 a unei coloane este de =?? caractereN tabelele 6i grafica pot e"ista pe foi distincteN func5ioneau3 dup3 principiul eg*$egLN se pot folosi ma"im 9 fonturi la un moment datN limbaj de programare puternic 6i fle"ibilN posibilitatea definirii de macroinstruc5iuniN nu posed3 func5ie de salvare automat3N con5ine suport de func5ionare Dn re5eaN detecteaz3 prezen5a coprocesorului matematic 6i face uz de facilit35ile acestuiaN lucreaz3 cu memoria e"pandat3. Al%e l$.)"0e &+$e9%"%e 1imbaje orientate pe calcul matematic simbolic *peciali6tii din domeniul cercet3rii matematice au la dispozi5ie unelte de lucru e"trem de utile pentru eliminarea calculului matematic rutinier. Mn acest scop au fost create limbaje de programare care pot recunoa6te 6i rezolva formule sau ecua5ii matematice comple"e. "presiile manevrate pot con5ine opera5ii algebrice elementare, operatori de derivare, de integrare, operatori diferen5iali care sunt recunoscu5i de sistem ca atare. Mn plus sunt oferite instruc5iuni absolut necesare pentru a controla un program. Cele mai importante produse de acest gen sunt @ :#C , *gMEJE, M('^C(:, M('^ M('$C(, M('^1(&. L$.)"0e &+$e9%"%e #e #+&*+"."+e" $9%el$*e98e$ "+%$,$c$"le (cest tip de limbaje difer3 esen5ial de cele algoritmice. Modalitatea de programare este descriptiv3 6i are inten5ia declarat3 de simulare a ra5ionamentului uman. Pentru rezolvarea unei probleme sunt furnizate seturile de reguli 6i informa5ii necesare, iar apoi se descrie Dn ce const3 problema ca atare. 1imbajul este capabil s3 opereze deduc5iile .deciziile/ necesare pentru a rezolva problema Dntr)un caz particular ce apare Dn practic3. (6adar, aceste limbaje descriu problema de rezolvat .Dn termenii deduc5iilor logice/ pe cKnd limbajele de tip algoritmic descriu metoda de rezolvare a problemei. :omeniile de aplicabilitate pentru limbajele de programare a inteligen5ei artificiale sunt cu predilec5ie: realizarea de sisteme e"pert .programe ce Dnlocuiesc e"per5ii umani/, computerizarea procesului de produc5ie, robotic3, tratarea limbajelor naturale. Cele mai importante limbaje de acest tip sunt: P@J1JL .PROgramming in LOGic/ creat Dn <A>3 6i implementat pe PC)uri abia Dn <AG; de firma &orland sub forma 'urbo)Prolog.
?3

1$*P .LISt Processing language/ conceput Dn <A>; 6i implementat pe PC)uri de firma Microsoft sub forma Mu1$*P. GENERAII DE CALCULATOARE Ge9e+"8$" I C-PFQ4-PGQD c"+"c%e+$="%? #+$93 ^ard0are: relee, tuburi electroniceN *oft0are: programe cablate, cod ma6in3, limbaj de asamblareN Capacitate de memorie: = ]octe5iN %itez3 de operare: <C.CCC de opera5ii2sec.N Calulatoare: E$(C, #E$%(C, $&MN Ge9e+"8$" " IIN" C-PG!4-PQ>D ."+c"%? 1e "#"+$8$" %+"9=$2%&+'l'$ ^ard0are: tranzistoare, memorii cu ferite, cablaj imprimatN *oft0are: limbaj de nivel Dnalt . (lgol, ,ortan/ Memorie: 3= ]octe5iN %iteza: =CC.CCC de instruc5iuni2sec Calculatoare: $&M >C9C, EC@?C<N Ge9e+"8$" " IIIN" C-PQF4 -PK-D c"+"c%e+$="%? #+$93 ^ard0are: circuite integrate .la Dnceput pe scar3 redus3, apoi pe scar3 medie 6i larg3N scara de integrare se refer3 la num3rul de componente electronice pe unitatea de suprafa53/, cablaje imprimate multistrat, discuri magnetice, aparari5ia primelor microprocesoareN *oft0are: limbaje de nivel foarte Dnalt, programare orientat3 pe obiecte &.Pascal, programare structurat3 1$*P, primele programe pentru grafic3 6i baze de date . Memorie: <h= Mocte5i N %iteza: ?.CCC.CCC de opera5ii2secN Calculatoare: $&M 3>C, , 1$Y Comunica5ii: Primele comunica5ii prin satelit, transmisia de date prin fibr3 optic3. Ge9e+"8$" " IV4" C-PK24-PKPD c"+"c%e+$="%? #+$93 ^ard0are: circuite integrate pe scar3 foarte mare .%1*$/, sisteme distribuite de calcul, apar microprocesoarele de <;23= bi5i, primele elemente optice .discurile optice/N *oft0are: Pac-ete de programe de larg3 utilizare, sisteme e"pert, sisteme de operare, se perfec5ioneaza limbajele de programare orientate pe obiect, baze de date rela5ionaleN Memorie: Gh<C Mocte5iN %iteza: 3C de milioane de instruc5iuni2secN Caculatoare: $E: P E: E', CJ@(1, $&M .apar mai multe versiuni/ Ge9e+"8$" " V4" C-PP-42 2D E9 c'+2 1e 1e=:&l"%"+e ^ard0are: circuite integrate pe scar3 ultralarg3 #1*$ .proiectare circuite integrate 3:/, ar-itecturi paralele, alte solu5ii ar-itecturale noi .re5ele neurale etc./, proiectele galiu)arsen. *oft0are: limbaje concurente, programare func5ional3, prelucrare simbolic3, baze de cuno6tiin5e, sisteme e"pert evoluate, programe de realitate virtual3, acum apar 6i sistemele de operare 0indo0s. (ceast3 perioad3 este marcat3 de apari5ia internetului 6i e"tinderea rapid3 a acestei re5ele mondiale. Memorie: de la zeci, sute de Mocte5i pKn3 la Locte5iN %iteza: <L de instruc5iuni 2sec B 3 L de instruc5iuni2sec Comunica5iile: au atins un nivel nemaiDntKlnit, emisiile radio de ordinul L^z, re5ele globale pe fibr3 optic3, re5ele de comunicare prin satelit. Calculatoare: o gam3 foarte larg3 de calculatoare.

?9

CAPITOLUL VII
LIMBAJUL VISUAL BASIC !.- P+&*+"."+e" "#l$c"8$$l&+ R$91&H2 Pentru realizarea unei aplica5ii pot fi avute Dn vedere dou3 te-nologii de programare 6i anume: B programare procedural3 B programare orientat3 spre obiecte 6i dirijat3 de evenimente. Mn programarea procedural3, o aplica5ie este constituit3 din unul sau mai multe programe care se vor e"ecuta Dntr)o anumit3 ordine, fiecare program fiind constituit dintr)o secven53 de instruc5uni scrise Dntr)un limbaj de programare. (cesta era modul clasic de realizare a aplica5iilor 6i sistemelor informatice 6i are o serie de dezavantaje printre care: productivitate sc3zut3 Dn realizarea programelor, efort mare pentru realizarea programelor 6i mai ales a interfe5elor etc. (pari5ia te-nologiei orientate obiect, a mediilor visuale de programare 6i a sistemului de operare eindo0s a condus la apari5ia 6i dezvoltarea unei noi te-nologii de programare a aplica5iilor 0indo0s 6i anume programarea orientat3 pe obiecte 6i dirijat3 de evenimente, te-nologie ce va fi prezentat3 Dn cele ce urmeaz3 Dn cadrul limbajului %isual &asic. J aplica5ie eindo0s afi6eaz3 unul sau mai multe ecrane care con5in obiecte cu care va interac5iona utilizatorul pentru a controla evolu5ia programului. Mntr)un mediu de programare vizual, obiectele principale sunt formele 6i controalele desenate Dn forme .form3 Q o fereastr3/ (ceste obiecte pot fi create prin selec5ie 6i depunere folosind barele de instrumente ale mediului respectiv. *pre e"emplu, bara cu instrumente %isual &asic permite crearea unei variet35i de obiecte printre care: forme, butoane, casete cu list3, casete derulante combinate, casete de validare, butoane radio .butoane de op5iune/, etc. ,iecare din aceste obiecte are un comportament predefinit. *pre e"emplu cKnd se e"ecut3 click pe un buton acesta trece Dn pozi5ia ap3sat 6i apoi revine Dn pozi5ia normal3. Pentru a sc-imba comportamentul obiectului acestuia trebuie s3)i ata6a5i cod de program .instruc5iuni/ corespunz3tor, cod ce se va e"ecuta atunci cKnd are loc un anumit eveniment .spre e"emplu Dn cazul butonului evenimentul este click/. venimentele se produc ca urmare a unei ac5iuni a utilizatorului .e". evenimentul click corespunde ap3s3rii butonului stKng al mouse)ului pe obiectul respectiv/, sau Dn urma e"ecu5iei codului programului, sau pot fi declan6ate de c3tre sistem. Majoritatea obiectelor vor r3spunde unui anumit num3r de evenimente generate de c3tre utilizator printre care click)uri, dublu click)uri, ap3s3ri de taste sau trageri 6i eliber3ri ale obiectului. 1imbajul %isual &asic pune la dispozi5ia utilizatorului un mediu de dezvoltare care permite crearea de programe orientate spre obiecte 6i conduse de evenimente. Pentru lucrul cu obiecte conduse de evenimente se parcurg urm3toarele etape: B se creeaz3 o nou3 form3 c3reia i se d3 un numeN B se deseneaz3 6i se denumesc obiectele ce urmeaz3 a fi afi6ate Dn forma respectiv3N B se ata6eaz3 fiec3rui obiect codul ce va fi e"ecutat ca r3spuns la evenimente generate de utilizator sau de sistem. %a rezulta o interfa53 grafic3 cu care interac5ioneaz3 utilizatorul pentru a controla evolu5ia programului. @ezumKnd putem spune c3 Dn programarea orientat3 spre obiecte 6i dirijat3 de evenimente, obiectele au un comportament predefinit care poate fi modificat de utilizator prin ata6are de cod corespunz3tor 6i aceste obiecte r3spund la evenimente declan6ate fie ca urmare a ac5iunii utilizatorului asupra obiectelor, fie ca urmare a e"ecu5iei codului ata6at, fie declan6ate de sistem.

??

!.2 P+&#+$e%?8$ <$ .e%&1e #n obiect este definit de un set de propriet35i cum ar fi: dimensiune, culoare, pozi5ie pe ecran, comportament .e". dac3 un buton radio este activ sau nu la un moment dat etc./. J metod3 este o procedur3 .succesiune de instruc5iuni/ asociat3 unei anumite ac5iuni a unui obiect. *pre e"emplu Dn %isual &asic e"ist3 o metod3 Move asociat3 majorit35ii obiectelor .permite mutarea obiectelor/. :eci propriet35ile descriu obiectele iar metodele definesc ac5iunile obiectelor, iar pe de alt3 parte propriet35ile reprezint3 date iar metodele reprezint3 cod .instruc5iuni/. (stfel Dn gramatica program3rii orientate spre obiecte : B obiectele sunt substantiveN B propriet35ile sunt adjectiveN B metodele sunt verbe. #tilizarea nota5iei cu punct pentru referirea propriet35ilor 6i metodelor @eferirea unei propriet35i se face astfel: Jbiect . Proprietate Q %aloare "emplu ) fie forma frm,orma< 6i variabila dColor Dn care memor3m culoarea de fond a formei dColor Q frm,orma<.&ackColor .cite6te culoarea curent3 6i o depune Dn dColor/ frm,orma<.&ackColor Q [&Color .&lue/ B stabile6te noua culoare de fond a formei la valoarea &lue. @eferirea metodelor se face asem3n3tor cu referirea propriet35ilor, Dns3 Dn plus metodele pot necesita precizarea unor informa5ii suplimentare. "emplu ) pentru mutarea obiectului &uton< Dn col5ul din stKnga sus al formei curente se apeleaz3 metoda Move 6i se precizeaz3 coordonatele col5ului din stKnga sus: &uton<.Move C,C *tabilire propriet35i 6i e"ecutare metode Propriet35ile unui obiect pot fi setate Dn faza de proiectare .atunci cKnd se deseneaz3 sau se modific3 formele/ utilizKnd fi6a Properties a formei sau obiectului din form3 .fi6a este automat vizualizat3 la selec5ia obiectului respectiv: forma, buton, etc./. :e asemenea fi6a Properties poate fi vizualizat3 prin click dreapta 6i selec5ie Properties. Propriet35ile pot fi modificate 6i prin program Dn momentul e"ecu5iei formei, dac3 codul de program asociat con5ine instruc5iuni care refer3 6i seteaz3 propriet35i .ca Dn e"emplul de mai sus Dn care sc-imb3m culoarea fondului formei/. *pre deosebire de propriet35i, metodele pot fi e"ecutate numai Dn momentul e"ecu5iei programului .eventual Dn momentul depan3rii programului utilizKnd facilitatea :ebugger a programului %isual &asic/. :enumirea obiectelor Jrice obiect are propriet35ile: Eame ) numele utilizat Dn scrierea codului Capture ) numele dat obiectului pentru a putea fi identificat de utilizator. %isal &asic d3 nume implicite obiectelor. ste indicat ca utilizatorul s3 dea nume obiectelor .Eame/ utilizKnd urm3toarea conven5ie: B un prefi" format din 3 litere mici .e". frm pentru form3, cmd pentru buton de comand3, etc./ B un 6ir de caractere care identific3 obiectul .e". ,orma<, cran<, &uton<, etc./. Mn tabelul urm3tor sunt prezentate conven5iile de denumire a obiectelor din %isual &asic: O)$ec% ,orm3 &uton de comand3 Caset3 de te"t P+e,$7 ,rm cmd, btn '"t
?;

E7e.#l' frm,orma< cmd&uton, btnJ] t"tCaseta<

O)$ec% &are de derulare - orizontal3 - vertical3 Meniu Caset3 de validare Caset3 cu lista Cadru $magine &uton de op5iune .radio/ !.> I92%+'c8$'9$le VBA Ge9e+"l$%?8$

P+e,$7 -sb vsb Mnu C-k 1st ,ra $mg Jpt

E7e.#l'

mnuMeniuPrinc

opt&J<

E7$2%? %+e$ c"%e*&+$$ 1e $92%+'c8$'9$ V$2'"l B"2$c3 instruc5iuni de declarare .prezentate la declararea variabilelor/ prin care se denumesc 6i se declar3 tipul pentru variabile, constante 6i proceduriN instruc5iuni de atribuire .prezentate Dn continuare/ prin care se atribuie valori variabilelor sau constantelorN instruc5iuni e"ecutabile .prezentate Dn continuare/ care ini5iaz3 ac5iuni: e"ecut3 metode sau proceduri, controleaz3 flu"ul e"ecu5iei codului. Mn mediul de dezvoltare %&(, sinta"a instruc5iunilor este verificat3 automat dup3 ce se trece la instruc5iunea urm3toare .prin nter/. C&9%$9'"+e" $92%+'c8$'9$l&+ J instruc5iune poate s3 fie scris3 pe mai multe linii prin utilizarea caracterului de continuare a liniei "i" precedat de un spa5iu. :e e"emplu, crearea prin program a unui tabel Dntr)un document eord: (ctive:ocument.'ables.(dd @ange:Q*election.@ange, i Eum@o0s:Q3, i EumColumns:Q 3 unde, pe lKng3 continuarea liniilor se va remarca utilizarea argumentelor numite la apelul metodei de ad3ugare a unui nou tabel la colec5ia de tabele a documentului. :ou3 instruc5iuni pot fi scrise pe o aceea6i linie dac3 sunt separate cu caracterul ":". E%$c6e%"+e" l$9$$l&+ J linie poate fi identificat3: printr)o etic-et3: orice nume, care respect3 regulile generale, care Dncepe Dn prima coloan3 a liniei 6i se termin3 cu caracterul ":" printr)un num3r: orice combina5ie de cifre, care Dncepe Dn prima coloan3 a liniei 6i este unic Dn modulul respectiv. $dentificatorii de linii pot fi utiliza5i Dn instruc5iuni de control, desi codul astfel construit nu respect3 regulile program3rii structurate. C&.e9%"+$$ 'e"tele e"plicative .necesare document3rii codului/ pot fi introduse pe linii separate sau Dn continuarea liniei de cod. J linie de comentariu Dncepe cu un apostrof .I/ sau cu cuvKntul Re. urmat de un spa5iu.
?>

Comentariul de pe aceea6i linie cu o instruc5iune se introduce printr)un apostrof urmat de comentariu. O#e+"%&+$ Mn formarea e"presiilor de diverse tipuri, operatorii sunt cei utiliza5i aproape general Dn limbajele de programare de nivel Dnalt. Pentru fi"area termenilor 6i nota5iilor sunt totu6i prezenta5i, pe categorii, Dnso5i5i, acolo unde este cazul de scurte e"plica5ii. $peratori aritmeti(i O#e+"%&+ j X Se.9$,$c"8$e @idicarea la putere Mnmul5irea O)2e+:"8$$ rezultatul este Dou#le sau 7ariant(Dou#le) cu e"cep5ia: dac3 un operand este Full, rezultatul este tot Full rezultatul este dat de cel "mai precis" factor, ordinea cresc3toare a "preciziei" fiind, pentru Dnmul5ire, $yte, 8nteger, <ong, Single, urrency, Dou#le 6i Decimal. :ac3 o e"presie este Full, rezultatul este Full. J e"presie 9mpty este considerat3 ca C. Pentru e"cep5ii se va studia Velp B X(operator). rezultatul este, Dn general, Dou#le sau 7ariant(Dou#le). :ac3 o e"presie este Full, rezultatul este Eull. J e"presie mpty este considerat3 ca C. Pentru e"cep5ii se va studia Velp B 2 (operator). Dnainte de Dmp3r5ire, operanzii sunt rotunji5i la $yte, 8nteger sau <ong. @ezultatul este $yte, 7ariant($yte), 8nteger, 7ariant (8nteger), <ong, sau 7ariant(<ong). :ac3 o e"presie este Full, rezultatul este Full. J e"presie 9mpty este considerat3 ca C. operanzii sunt rotunji5i la Dntregi 6i se ob5ine restul Dmp3r5irii. @ezultatul este $yte, 7ariant($yte), 8nteger, 7ariant (8nteger), <ong, sau 7ariant(<ong). :ac3 o e"presie este Full, rezultatul este Full. J e"presie 9mpty este considerat3 ca C. Dn general, operanzi numerici produc adunarea, iar operanzi 6iruri produc concatenarea. Mn cazul numeric, rezultatul este de tipul cel "mai precis" al operanzilor, ordinea de "precizie" fiind pentru adunare 6i sc3dere: $yte, 8nteger, <ong, Single, :ouble, urrency 6i Decimal. :eoarece operanzii pot fi orice e"presie, pentru o informare complet3 .de e"emplu operanzi 7ariant/ se va studia Velp B W(operator). operanzii pot fi doar numerici. @ezultatul este de tipul cel "mai precis" al operanzilor, ordinea de "precizie" fiind pentru adunare 6i sc3dere: $yte, 8nteger, <ong, Single, Dou#le, urrency 6i Decimal. :ac3 o e"presie este Full, rezultatul este Full. J e"presie 9mpty este considerat3 ca C. Pentru e"cep5ii se va studia Velp B )(operator).

Mmp3r5irea

Mmp3r5irea Dntreag3

Mod

@estul Dmp3r5irii

(dunarea numeric3 sau concatenarea 6irurilor

*c3derea sau inversarea semnului

?G

$peratori -e (omparare @ela5iile care e"ist3 Dntre diferite tipuri de entit35i se pot eviden5ia prin compara5ii avKnd una dintre formele urm3toare: result Q e"pression< c&.#"+$2&9&#e+"%&+ e"pression= result Q object< I2 object= result Q string L$Se pattern unde re)ult este o variabil3 numeric3 expre))ion este o e"presie oarecare compari)onoperator este un operator rela5ional o#Hect este un nume de obiect )tring este o e"presie 6ir oarecare pattern este o e"presie *tring sau un domeniu de caractere. Jperatorii de comparare sunt cei uzuali: _ .mai mic/, _Q .mai mic sau egal/, Z .mai mare/, ZQ .mai mare sau egal/, Q .egal/, _Z .diferit, neegal/. @ezultatul este 'rue .dac3 este adev3rat3 rela5ia/, ,alse .dac3 rela5ia este neadev3rat3/, Eull .dac3 cel pu5in un operand este Eull/. Jperatorul I2 produce 'rue dac3 variabilele se refer3 la acela6i obiect 6i ,alse Dn caz contrar. Jperatorul L$Se compar3 dou3 6iruri cu observa5ia c3 al doilea tremen este un 6ablon. Prin urmare rezultatul este 'rue dac3 primul 6ir operand este format dup3 6ablon, ,alse Dn caz contrar. (tunci cKnd un operand este Eull, rezultatul este tot Eull. Comportarea operatorului 1ike depinde de instruc5iunea Jption Compare, care poate fi: Jption Compare &inary, ordinea este cea a reprezent3rii interne binare, determinat3 Dn eindo0s de codul de pagin3. Jption Compare 'e"t, compararea este insenzitiv3 la capitalizarea te"tului, ordinea este determinat3 de set3rile locale ale sistemului. Construc5ia 6ablonului poate cuprinde caractere 0ildcard, liste de caractere, domenii de caractere: un caracter oarecare oricKte caractere .c-iar nici unul/ + o cifr3 oarecare .CBA/. Fc-arlistH oricare dintre caracterele enumerate Dn list3, un domeniu de litere poate fi dat prin utilizarea cratimei. F\c-arlistH orice caracter care nu este Dn list3 O)2e+:"8$e. Pentru a utiliza Dn 6ablon caracterele speciale cu valoare de 0ildcard se vor utiliza construc5ii de tip list3: FFH, F!H etc. Paranteza dreapta va fi indicat3 singur3: H. Pentru alte observa5ii utile se va studia ^elp B 1ike operator. $peratori -e (on(atenare Pentru combinarea 6irurilor de caractere se pot utiliza operatorii l 6i W. Mn sinta"a e"pression< l e"pression= unde operanzii sunt e"presii oarecare, rezultatul este: de tip *tring, dac3 ambii operanzi sunt *tring de tip %ariant.*tring/ Dn celelalte cazuri Eull, dac3 ambii operanzi sunt Eull. Mnainte de concatenare, operanzii care nu sunt 6iruri se convertesc la %ariant.*tring/. "presiile Eull sau mpty sunt tratate ca 6iruri de lungime zero .""/.

?A

$peratori logi(i Pentru opera5iile logice sunt utiliza5i urm3torii operatori, uzuali Dn programare. O#e+"%&+ Se.9$,$c"8$e O)2e+:"8$$ (nd conjunc5ia logic3 Full cu =al)e d3 =al)e, Full cu "rue sau cu Full d3 Full. Jperatorul And realizeaz3 6i opera5ia de conjunc5ie bit cu bit pentru e"presii numerice. ec-ivalen5a logic3 :ac3 o e"presie este Full, rezultatul este Full. 9Wv realizeaz3 6i compararea bit cu bit a dou3 e"presii numerice, pozi5ionKnd cifrele binare ale rezultatului dup3 regulile de calcul ale ec-ivalen5ei logice: C 9Wv C este < etc. implica5ia logic3 "rue 8mp Full este Full, =al)e 8mp X este "rue, Full 8mp "rue este "rue, Full 8mp =al)e .sau Full/ este Full. Jperatorul 8mp realizeaz3 6i compararea bit cu bit a dou3 e"presii numerice, pozi5ionKnd cifrele binare ale rezultatului dup3 regulile de calcul ale implica5iei logice: < 8mp C este C, Dn rest rezultatul este <. nega5ia logic3 Fot Full este Full. Prin operatorul Fot se poate inversa bit cu bit valorile unei variabile, pozi5ionKndu)se corespunz3tor un rezultat numeric.

bv

$mp

Eot

Jr

disjunc5ia logic3 Full >r "rue este "rue, Full cu =al)e .sau Full/ este Full. Jperatorul >r realizeaz3 6i o compara5ie bit cu bit a dou3 e"presii numerice pozi5ionKnd bi5ii corespunz3tori ai rezultatului dup3 regulile lui >r logic. disjunc5ia e"clusiv3 :ac3 un operand este Full, atunci rezultatul este Full. *e poate efectua opera5ia de sau e"clusiv 6i bit cu bit pentru dou3 e"presii numerice Fb<Wb=.mod =/H.

Yor

I92%+'c8$'9$ 1e "%+$)'$+e (tribuirea se poate efectua prin instruc5iunea 1et .pentru valori atribuite variabilelor 6i propriet35ilor/, *et .pentru atribuirea de obiecte la o variabil3 de tip obiect/, 1set 6i @set .pentru atribuiri speciale de 6iruri sau tipuri definite de utilizator/. Instru(iunea Let (tribuie valoarea unei e"presii la o variabil3 sau proprietate. TLe%U varname A e"pression unde varname este nume de variabil3 sau de proprietate. ste de remarcat forma posibil3 .6i de fapt general utilizat3/ f3r3 cuvKntul 1et. O)2e+:"8$$. %aloarea e"presiei trebuie s3 fie compatibil3 ca tip cu variabila .sau proprietatea/: valori numerice nu pot fi atribuite variabilelor de tip *tring 6i nici reciproc. %ariabilele %ariant pot primi valori numerice sau *tring, reciproc nu este valabil decKt dac3 valoarea e"presiei %ariant poate fi interpretat3 compatibil3 cu tipul variabilei: orice %ariant poate fi atribuit unei variabile de tip *tring .cu e"cep5ia Eull/, doar %ariant care poate fi interpretat nuric poate fi atribuit unei variabile de tip numeric. 1a atribuirea valorilor numerice pot avea loc conversii la tipul numeric al variabilei. (tribuirea valorilor de tip utilizator poate fi efectuat3 doar dac3 ambii termeni au acela6i tip definit. Pentru alte situa5ii se va utiliza instruc5iunea 1set. Eu se poate utiliza 1et .cu sau f3r3 cuvKntul 1et/ pentru legarea de obiecte la variabile obiect. *e va utiliza Dn aceast3 situa5ie instruc5iunea *et.
;C

Instru(iunea L&et Copie, cu aliniere la stKnga, un 6ir de caractere .valoarea e"presiei din dreapta/ Dntr)o variabila de tip *tring. :eoarece copierea este binar3, poate fi utilizat3 pentru atribuiri Dntre tipuri utilizator diferite .rezultatul este impredictibil deoarece nu se face nici o verificare de tipuri2componente ale valorilor de tip record/. *inta"a este LSe% stringvar A string LSe% varname< A varname= unde )tringvar, )tring reprezint3 variabila de tip *tring 6i e"presia de acela6i tip implicate Dntr)o atribuire de 6iruri. varname&, varname( sunt denumiri de variabile, de tipuri definite de utilizator .vezi instruc5iunea 'ype/ diferite. dona de memorie alocat3 celei de a doua variabile este copiat3 .aliniat3 la stKnga/ Dn zona de memorie a primei variabile. Caracterele care r3mKn neocupate se completeaz3 cu spa5ii, iar dac3 zona de unde se copie este mai mare, caracterele din dreapta se pierd .sunt trunc-iate/. Instru(iunea L&et Copie, cu aliniere la dreapta, un 6ir de caractere .valoarea e"presiei din dreapta/ Dntr)o variabila de tip *tring. *inta"a este RSe% stringvar A string Caracterele r3mase neocupate Dn variabil3 sunt completate cu spa5ii. $nstruc5iunea @*et nu se poate utiliza .analog lui 1*et/ pentru tipuri definite de utilizator. I92%+'c8$'9$ e7ec'%")$le "ecu5ia unui program are loc, Dn lipsa oric3rui control, instruc5iune cu instruc5iune, de la stKnga la dreapta 6i de sus Dn jos. (cest sens poate fi modificat, Dntr)o oarecare m3sur3, prin ordinea de preceden53 a opera5iilor Dn evaluarea e"presiilor. ste evident c3 o asemenea structur3 simpl3 nu poate cuprinde toate aspectele program3rii 6i din acest motiv necesitatea structurilor de control a flu"ului e"ecu5iei. #nele instruc5iuni au fost p3strate doar din motive de compatibilitate cu versiunile ini5iale ale limbajului, Dn locul lor fiind preferate structuri mai evoluate sau similare altor limbaje de programare. I92%+'c8$'9$ 1e %+"92,e+ CG&S')VRe%'+9/ G&T&/ O9E++&+/ O9VG&S')/ O9VG&T&D (ceast3 categorie cuprinde instruc5iunile prin care controlul e"ecu5iei este transferat la o alt3 instruc5iune din procedur3. Mn general, utilizarea acestor comenzi nu produce programe foarte structurate .Dn sensul program3rii structurate/ 6i prin urmare, pentru o mai mare claritate a codului, pot fi Dnlocuite cu alte structuri de programare. G&S')RRe%'+9 Mn cadrul unei proceduri un grup de instruc5iuni poate fi organizat ca o subrutin3 .similar unei proceduri on)line, nenumite/ identificat3 prin linia de Dnceput. 'ransferul controlului la acest grup de instruc5iuni 6i revenirea la locul apelului se poate efectua prin Lo*ubR@eturn cu sinta"a G&S') line ... line ... Re%'+9 unde line este o etic-et3 de linie sau un num3r de linie din aceea6i procedur3. Pot e"ista mai multe instruc5iuni @eturn, prima e"ecutat3 produce saltul la instruc5iunea care urmeaz3 celei mai recente instruc5iuni Lo*ub e"ecutate.

;<

#oTo @ealizeaz3 tranferul controlului e"ecu5iei la o linie din aceea6i procedur3. G&T& line unde line este o etic-et3 de linie sau un num3r de linie din aceea6i procedur3. $n Error Permite controlul erorilor prin transferul controlului la rutine de tratare. O)2e+:"8$e. ste prezentat3 Dn sec5iunea dedicat3 controlului erorilor. $n;#o&u3< $n;#oTo Permit o ramificare multipl3, dup3 valoarea unei e"presii. *e recomand3, pentru claritatea codului, utilizarea structurii *elect Case Dn locul acestor structuri. O9 e"pression G&S') destinationlist O9 e"pression G&T& destinationlist unde expre))ion este o e"presie numeric3 avKnd valoare Dntreag3 .dup3 o eventual3 rotunjire/ Dntre C 6i =?? inclusiv. de)tinationli)t este o list3 de etic-ete de linii sau numere de linii, separate prin virgule .elementele pot fi de ambele categorii/, din aceea6i procedur3 cu instruc5iunea. :ac3 valoarea e"presiei este negativ3 sau mai mare decKt =?? se produce o eroare. :ac3 valoarea e"presiei, fie ea M, este Dn domeniul rangurilor listei, atunci se transfer3 controlul la linia identificat3 de al M)lea element al listei. :ac3 valoarea e"presiei este C sau mai mare decKt num3rul de elemente din list3, transferul se efectueaz3 la linia care urmeaz3 instruc5iunea Jn...Lo*ub sau Jn...Lo'o. I92%+'c8$'9$ 1e %e+.$9"+e 2"' &#+$+e " #+&*+".'l'$ CD&E:e9%2/ E91/ E7$%/ S%&#D 'erminarea e"ecu5iei programului sau oprirea temporar3 .pauza/ se pot realiza prin instruc5iunile enumerate aici. DoE,ents :e6i nu este o instruc5iune %&( ci este o func5ie, includerea ei este natural3 prin aceea c3 permite cedarea controlului c3tre sistemul de operare, care poate astfel s3 func5ioneze Dn regim de multitasking. (c5iunea poate fi realizat3 6i prin alte te-nici .de e"emplu utilizarea unui 'imer etc./. *inta"a este D&E:e9%2. / ,unc5ia returneaz3, Dn general, valoarea C. Controlul este redat programului dup3 ce sistemul de operare a terminat procesarea evenimentelor din coada de evenimente, ca 6i procesarea tuturor caracterelor din coada *end]eys. O)2e+:"8$e. Pentru alte observa5ii se va studia documenta5ia comenzii :o vents. En'ermin3 e"ecu5ia unei proceduri .sub forma prezentat3 aici/ sau indic3 sfKr6itul codului unei structuri de tip bloc .cum ar fi nd ,unction, nd $f etc., prezentate la structurile respective/. *inta"a, Dn ipostaza opririi e"ecu5iei, este: E91 Prin aceast3 instruc5iune, care poate fi plasat3 oriunde Dn program, e"ecu5ia este terminat3 imediat, f3r3 a se mai e"ecuta eventualele instruc5iuni scrise pentru tratarea unor evenimente specifice sfKr6itului de program .#nload, 'erminate etc./. ,i6ierele desc-ise prin Jpen sunt Dnc-ise 6i toate variabilele sunt eliberate. Jbiectele create din modulele clas3 sunt distruse, iar referin5ele din alte aplica5ii la asemenea obiecte sunt invalidate. Memoria este eliberat3.

;=

E4it Prin instruc5iunea "it, sub una din multiplele ei forme, se Dntrerupe o ramur3 de e"ecu5ie .cum ar fi o procedur3, o structur3 iterativ3 etc./ pentru a se continua nivelul apelant. *inta"a este E7$% D& E7$% F&+ E7$% F'9c%$&9 E7$% P+&#e+%W E7$% S') 6i efectele sunt prezentate la structurile respective. Eu trebuie confundat3 cu instruc5iunea nd. &top fectul instruc5iunii este dependent de modul de e"ecu5iei a programului. :ac3 se e"ecut3 varianta compilat3 a programului .fi6ierul .e"e/ atunci instruc5iunea este similar3 instruc5iunii nd .suspend3 e"ecu5ia 6i Dnc-ide fi6ierele desc-ise/. :ac3 e"ecu5ia este din mediul %&(, atunci se suspend3 e"ecu5ia programului, dar nu se Dnc-id fi6ierele desc-ise 6i nu se 6terge valoarea variabilelor. "ecu5ia poate fi reluat3 din punctul de suspendare. S%&# $nstruc5iunea este similar3 introducerii unui punct de oprire .&reakpoint/ Dn codul surs3. S%+'c%'+$ $%e+"%$:e CD&...L&&#/ F&+...Ne7%/ F&+ E"c6...Ne7%/ R6$le...Re91/ R$%6D Prin intermediul construc5iilor de tip bloc prezentate Dn aceast3 sec5iune se poate repeta, Dn mod controlat, un grup de instruc5iuni. Mn cazul unui num3r nedefinit de repeti5ii, condi5ia de oprire poate fi testat3 la Dnceputul sau la sfKr6itul unui ciclu, prin alegerea structurii adecvate. Do;Loop *e vor utiliza structuri :oR1oop pentru a e"ecuta un grup de instruc5iuni de un num3r de ori nedefinit aprioric. :ac3 se cunoa6te num3rul de cicluri, se va utiliza structura ,orREe"t. Mnainte de continuare se va testa o condi5ie .despre care se presupune c3 poate fi modificat3 Dn instruc5iunile e"ecutate/. :iferitele variante posibile pentru :oR1oop difer3 dup3 momentul evalu3rii condi5iei 6i decizia luat3.
Do [{While | Until} condition] [statements] [Exit Do] [statements] Loop

sau

Do [statements] [Exit Do] [statements] Loop [{While | Until} condition]

unde condition este o e"presie care valoare de adev3r 'rue sau ,alse. J condi5ie care este Eull se consider3 ,alse. )tatement) sunt instruc5iounile care se repet3 atKta timp .0-ile/ sau pKn3 cKnd .until/ condi5ia devine 'rue. :ac3 decizia este de a nu continua ciclarea, atunci se va e"ecuta prima instruc5iune care urmeaz3 Dntregii structuri .deci de dup3 linia care Dncepe cu 1oop/. *e poate abandona ciclarea oriunde Dn corpul structurii prin utilizarea comenzii "it :o .cu aceast3 sinta"3/. :ac3 apare o comand3 "it :o se poate omite c-iar 6i condi5ia din enun5 DntrucKt e"ecu5ia se va termina prin aceast3 decizie.

;3

*tructurile :o pot fi inserate .dar complet/ unele Dn altele. J terminare .prin orice metod3/ a unei bucle transfer3 controlul la nivelul :o imediat superior. "ecu5ia structurilor este e"plicat3 Dn tabelul urm3tor :o e-ileR1oop 'esteaz3 condi5ia la Dnceputul buclei, e"ecut3 bucla numai dac3 rezultatul este "rue 6i continu3 astfel pKn3 cKnd o nou3 evaluare produce =al)e. 'esteaz3 condi5ia la Dnceputul buclei, e"ecut3 bucla numai dac3 rezultatul este =al)e 6i continu3 astfel pKn3 cKnd o nou3 evaluare produce "rue. *e e"ecut3 Dntotdeauna bucla o dat3, se testeaz3 condi5ia la sfKr6itul buclei 6i se repet3 bucla atKt timp cKt condi5ia este "rue. Jprirea este pe condi5ie fals3. *e e"ecut3 Dntotdeauna bucla o dat3, se testeaz3 condi5ia la sfKr6itul buclei 6i se repet3 bucla atKt timp cKt condi5ia este =al)e. Jprirea este pe condi5ie adev3rat3.

:o #ntilR1oop

:oR1oop e-ile

:oR1oop #ntil

"or;)e4t (tunci cKnd se cunoa6te num3rul de repet3ri ale unui bloc de instruc5iuni, se va folosi structura ,orREe"t. *tructura utilizeaz3 o variabil3 contor, a c3rei valoare se modific3 la fiecare ciclu, oprirea fiind atunci cKnd se atinge o valoare specificat3. *inta"a este:
For counter = start To end [Step step] [statements] [Exit For] [statements] Next [counter]

unde counter este variabila contor .num3r3 repet3rile/, de tip numeric. Eu poate fi de tip &oolean sau element de tablou. )tart este valoarea ini5ial3 a contorului. end este valoarea final3 a contorului. )tep este cantitatea care se adun3 la contor la fiecare pas. Mn cazul Dn care nu se specific3 este implicit <. Poate fi 6i negativ3. )tatement) sunt instruc5iunile care se repet3. :ac3 nu se specific3, atunci singura ac5iune este cea de modificare a contorului de un num3r specificat de ori. (c5iunea este dictat3 de pasul de incrementare 6i rela5ia dintre valoarea ini5ial3 6i cea final3. $nstruc5iunile din corpul structurii se e"ecut3 dac3 counter _Q end pentru step ZQ C sau counter ZQ end pentru step _ C. :up3 ce toate instruc5iunile s)au e"ecutat, valoarea step este ad3ugat3 la valoarea contorului 6i instruc5iunile se e"ecut3 din nou dup3 acela6i test ca 6i prima dat3, sau bucla ,orREe"t este terminat3 6i se e"ecut3 prima instruc5iune de dup3 linia Ee"t. *pecificarea numelui contorului Dn linia Ee"t poate clarifica te"tul surs3, mai ales Dn cazul cKnd e"ist3 structuri ,orREe"t Dmbricate. Corpul unei bucle ,orREe"t poate include .complet/ o alt3 structur3 ,orREe"t. Mn asemenea situa5ii, structurile Dmbricate trebuie s3 aib3 variabile contor diferite.
;9

$nstruc5iunile "it ,or pot fi plasate oriunde Dn corpul unei bucle 6i provoac3 abandonarea cicl3rii. Controlul e"ecu5iei se transfer3 la prima instruc5iune de dup3 linia Ee"t. "or Ea(5;)e4t *imilar3 structurii ,orREe"t, structura ,or ac-REe"t repet3 un grup de instruc5iuni pentru fiecare element dintr)o colec5ie de obiecte sau dintr)un tablou .cu e"cep5ia celor de un tip utilizator/. ste util3 atunci cKnd nu se cunoa6te num3rul de elemente sau dac3 se modific3, Dn timpul e"ecu5iei, con5inutul colec5iei. *inta"a este: F&+ E"c6 element I9 group TstatementsU TE7$% F&+U TstatementsU Ne7% TelementU unde element este variabila utilizat3 pentru parcurgerea elementelor. :ac3 se parcurge o colec5ie de obiecte, atunci element poate fi %ariant, o variabil3 generic3 de tip Jbject, sau o variabil3 obiect specific3 pentru biblioteca de obiecte referit3. Pentru parcurgerea unui tablou, element poate fi doar o variabil3 de tip %ariant. group este numele colec5iei de obiecte sau al tabloului. )tatement) este grupul de istruc5iuni e"ecutate pentru fiecare element. "ecu5ia unei structuri ,or ac-REe"t este: *e define6te element ca numind primul element din grup .dac3 nu e"ist3 nici un element, se transfer3 controlul la prima instruc5iune de dup3 Ee"t B se p3r3se6te bucla f3r3 e"ecutarea instruc5iunilor/. *e e"ecut3 instruc5iunile din corpul buclei ,or. *e testeaz3 dac3 element este ultimul element din grup. :ac3 r3spunsul este afirmatif, se p3r3se6te bucla. *e define6te element ca numind urm3torul element din grup. *e repet3 pa6ii = pKn3 la 9. $nstruc5iunile "it ,or sunt e"plicate la ,orREe"t. &uclele ,or ac-...Ee"t pot fi Dmbricate cu condi5ia ca elementele utilizate la iterare s3 fie diferite. O)2e+:"8$e. Pentru 6tergerea tuturor obiectelor dintr)o colec5ie se va utiliza ,orREe"t 6i nu ,or ac-R Ee"t. *e va utiliza ca num3r de obiecte colec*ie'Count. =5ile;=en"ecut3 un grup de instruc5iuni atKt timp cKt este adev3rat3 o condi5ie. *inta"a R6$le condition TstatementsU Re91 ste recomandat s3 se utilizeze o structur3 :oR1oop Dn locul acestei structuri. =it5 Programarea orientat3 pe obiecte produce, datorit3 calific3rilor succesive, construc5ii foarte comple"e atunci cKnd se numesc propriet35ile unui obiect. Mn cazul modific3rilor succesive ale mai multor propriet35i ale aceluia6i obiect, repetarea zonei de calificare poate produce erori de scriere 6i conduce la un te"t greu de citit. Codul este simplificat prin utilizarea structurii eit-R nd eit-. J asemenea structur3 e"ecut3 o serie de instruc5iuni pentru un obiect sau pentru o variabil3 de tip utilizator. *inta"a este: R$%6 object TstatementsU
;?

E91 R$%6 unde o#Hect este numele unui obiect sau a unui tip definit de utilizator )tatement) sunt instruc5iunile care se e"ecut3 pentru entitatea precizat3. Permi5Knd omiterea recalific3rilor din referin5ele la obiectul precizat, orice construc5ie de tipul ".nume" este interpretat3 Dn instruc5iunile structurii drept "o#Hect.nume". Mntr)un bloc eit- nu se poate sc-imba obiectul procesat. 1a plasarea unui bloc eit- Dn interiorul altui bloc eit-, obiectul e"tern este mascat complet, deci calific3rile eventuale la acest obiect vor fi efectuate. Eu se recomand3 saltul Dn 6i dintr)un bloc eit-. *tructuri de decizie .$fR'-enR lse, *elect Case/ @amificarea firului e"ecu5iei dup3 rezultatul verific3rii unei condi5ii este o necesitate frecvent3 Dn orice implementare. Pe lKng3 structurile prezentate, se pot utiliza trei func5ii care realizeaz3 alegeri Dn mod liniarizat .pe o linie de cod/: C-oose./, $if./, *0itc-./. If;T5en;Else J asemenea structur3, DntKlnit3 de altfel Dn toate limbajele de programare, e"ecut3 un grup de instruc5iuni ca r3spuns la Dndeplinirea unei condi5ii .compus3 sau nu din mai multe condi5ii testate secven5ial/. *inta"a permite o mare varietate de forme: I, condition T6e9 TstatementsU TEl2e elsestatementsU sau I, condition T6e9 TstatementsU TEl2eI, condition)n T6e9 TelseifstatementsU ... TEl2e TelsestatementsUU E91 I, unde condition are una din formele: e"presie numeric3 sau 6ir care se poate evalua 'rue sau ,alse .Eull este interpretat ,alse/N e"presie de forma TW#eO, o#Hectname I2 o#Hecttype, evaluat3 'rue dac3 objectname este de tipul obiect specificat Dn objecttype. )tatement), el)e)tatement), el)eif)tatement) sunt blocurile de instruc5iuni e"ecutate atunci cKnd condi5iile corespunz3toare sunt 'rue. 1a utilizarea primei forme, f3r3 clauza lse, este posibil s3 se scrie mai multe instruc5iuni, separate de ":", pe aceea6i linie. %erificarea condi5iilor implic3 evaluarea tuturor sube"presiilor, c-iar dac3 prin jocul operanzilor 6i operatorilor rezultatul poate fi precizat mai Dnainte .de e"emplu J@ cu primul operand 'rue/. &ele(t Case $nstruc5iunea *elect Case se poate utiliza Dn locul unor instruc5iuni lse$f multiple .dintr)o structur3 $fR'-enR lse$f/ atunci cKnd se compar3 aceea6i e"presie cu mai multe valori, diferite Dntre ele. $nstruc5iunea *elect Case furnizeaz3, prin urmare, un sistem de luare a deciziilor similar instruc5iunii $fR'-enR lse$f. 'otu6i, *elect Case produce un un cod mai eficient 6i mai inteligibil. *inta"a este: Selec% C"2e teste"pression TC"2e e"pressionlist)n Tstatements)nUU ... TC"2e El2e TelsestatementsUU
;;

E91 Selec% unde te)texpre))ion este o e"presie numeric3 sau 6ir. expre))ionli)t@n este lista, separat3 prin virgule, a uneia sau mai multe e"presii de forma: e7#+e22$&9. e7#+e22$&9 T& e7#+e22$&9. CuvKntul T& introduce un interval de valori, valoarea minim3 fiind prima specificat3. I2 c&.#"+$2&9&#e+"%&+ e7#+e22$&9. *e va utiliza I2 cu operatori de comparare .e"ceptKnd I2 6i L$Se/ pentru a specifica un domeniu de valori. )tatement)@n reprezint3 una sau mai multe instruc5iuni care se vor e"ecuta dac3 te)texpre))ion este egal3 cu un element din expre))ionli)t@n. el)e)tatement) reprezint3 una sau mai multe instruc5iuni care se vor e"ecuta dac3 te)texpre))ion nu este egal3 cu nici un element din listele liniilor Case. :ac3 teste"pression se potrive6te cu un element dintr)o list3 Case, se vor e"ecuta instruc5iunile care urmeaz3 aceast3 clauz3 Case pKn3 la urm3toarea clauz3 Case, sau pKn3 la nd *elect. Control e"ecu5iei trece apoi la instruc5iunea care urmeaz3 liniei finale nd *elect. @ezult3 c3 dac3 teste"pression se reg3se6te Dn mai multe liste, doar prima potrivire este considerat3. Clauza Case lse are semnifica5ia uzual3 "altfel, Dn rest, Dn caz contrar etc.", adic3 introduce instruc5iunile care se e"ecut3 atunci cKnd e"presia de test nu se potrive6te nici unui element din listele clauzelor lse. :ac3 aceasta este situa5ia 6i nu este specificat3 o clauz3 Case lse, atunci e"ecu5ia urmeaz3 cu prima instruc5iune de dup3 nd *elect. $nstruc5iunile *elect Case pot fi scufundate unele Dn altele, structurile interioare fiind complete .fiecare structur3 are nd *elect propriu, includerea este complet3/. A#el'+$ 1e #+&ce1'+$ <$ #+&*+".e Mn aceast3 sec5iune se prezint3 doar func5ia *-ell./, deoarece despre proceduri 6i apelul lor s)a discutat Dn capitolul <. "un(ia &5ell12 "ecut3 un program e"ecutabil 6i returneaz3 un %ariant.:ouble/ reprezentKnd $:)ul de task al programului Dn caz de succesN Dn caz contrar returneaz3 zero. *inta"a este S6ellCpat-nameT,0indo0styleUD unde pathname este %ariant .*tring/. Con5ine numele programului care se e"ecut3, argumentele necesare 6i poate da calea complet3 .dac3 este nevoie/. XindoX)tyle este %ariant .$nteger/ 6i precizeaz3 stilul ferestrei Dn care se va e"ecuta programul .implicit este minimizat, cu focus/. %alorile posibile pentru argumentul 0indo0style sunt C&92%"9%" 9'.$%? V"l&"+e" Se.9$,$c"8$" %b^ide C ,ereastra este ascuns3 iar focus)ul este pe fereastra ascuns3. %bEormal,ocus < ,ereastra are focus)ul 6i este dimensionat3 6i pozi5ionat3 normal. %bMinimized,ocus = ,ereastra este afi6at3 ca o icoan3 .minimizat3/ dar are focus)ul. %bMa"imized,ocus 3 ,ereastr3 ma"imizat3, cu focus. %bEormalEo,ocus 9 ,ereastra este normal3 .restaurat3 la m3rimea 6i pozi5ia cea mai recent3/ dar nu are focus)ul. ,ereastra activ3 curent3 D6i p3streaz3 focus)ul. %bMinimizedEo,ocu ; ,ereastr3 minimizat3, f3r3 focus. ,ereastra activ3 curent3 D6i p3streaz3 s focus)ul.

;>

:ac3 func5ia *-ell nu poate porni programul specificat se va semnala eroare. Programul pornit prin *-ell se e"ecut3 asincron, deci nu e"ist3 certitudinea c3 acest program se termin3 Dnainte de e"ecu5ia instruc5iunilor care urmeaz3 liniei *-ell.

;G

CAPITOLUL VIII
REGULI IMPORTANTE PRIVIND ALEGEREA UNUI LIMBAJ DE PROGRAMARE Prezent3m Dn continuare mai multe reguli importante, majoritatea dintre ele prezente 6i e"plicate Dn sec5iunile anterioare. -. De,$9e<%e c&.#le% #+&)le.". (ceast3 indica5ie, foarte important3 Dn activitatea de programare, pare f3r3 sens pentru unii cititori. :ar nu se poate rezolva o problem3 dac3 nu se cunoa6te aceast3 problem3. *pecificarea corect3 6i complet3 a problemei nu este o sarcin3 trivial3, ci una foarte important3 6i adeseori c-iar dificil3. Programul trebuie s3 respecte aceast3 specifica5ie, s3 fie construit avKnd tot timpul Dn fa53 aceast3 specifica5ie, s3 i se demonstreze corectitudinea Dn raport cu aceast3 specifica5ie, s3 fie testat 6i validat 5inKnd seama de aceast3 specifica5ie. 2. GI91e<%e ."$ E9%I$/ #+&*+".e"=? #e '+.?. MncepKnd cu scrierea specifica5iilor problemei, trebuie pus3 Dn prim plan gKndirea. ste specifica5ia problemei corect3! Mntre metodele de rezolvare posibile, care ar fi cea mai potrivit3 scopului urm3rit! Mn paralel cu proiectarea algoritmului demonstreaz3 corectitudinea lui. %erific3 corectitudinea fiec3rui pas Dnainte de a merge mai departe. >. N' ,&l&2$ :"+$")$le 9e$9$8$"l$="%e. ste vorba de prezen5a unei variabile Dntr)o e"presie f3r3 ca Dn prealabil aceast3 variabil3 s3 fi primit valoare. ste o eroare foarte frecvent3 a programatorilor Dncep3tori .dar nu numai a lor/. :estule compilatoare permit folosirea variabilelor neini5ializate, neverificKnd dac3 o variabil3 a fost ini5ializat3 Dnaintea folosirii ei. (lte compilatoare ini5ializeaz3 automat variabilele numerice cu valoarea zero. Cu toate acestea nu e bine s3 ne baz3m pe o asemenea ini5ializare ci s3 atribuim singuri valorile ini5iale corespunz3toare variabilelor. Programul realizat trebuie s3 fie portabil, s3 nu se bazeze pe specificul unui anumit compilator. F. Ve+$,$c? :"l&"+e" :"+$")$le$ $.e1$"% 1'#? &)8$9e+e" "ce2%e$". :ac3 o variabil3 Dntreag3 trebuie s3 ia valori Dntr)un subdomeniu c <..c= verific3 respectarea acestei propriet35i. Jrice Dnc3lcare a ei indic3 o eroare care trebuie Dnl3turat3. %aloarea variabilei poate fi calculat3 sau introdus3 de utilizator. Mn primul caz, verificarea trebuie f3cut3 dup3 calcul, Dn al doilea caz se recomand3 ca verificarea s3 urmeze imediat dup3 citirea valorii respectivei variabile. G. C'9&"<%e <$ ,&l&2e<%e .e%&1ele 1e #+&*+"."+e. ste vorba de programarea 'op):o0n, @afinarea Dn pa6i succesivi, :ivide et impera FLriesG?H/, &ottom)up 6i mi"t3, programarea modular3, programarea structurat3 6i celelalte metode prezentate Dn acest curs, sau alte metode ce vor fi asimilate ulterior. (ceste metode Dncurajeaz3 reutilizarea, reducKnd costul realiz3rii programelor. :e asemenea, folosirea unor componente e"istente .deci testate/ m3re6te gradul de fiabilitate a produselor soft realizate 6i scurteaz3 perioada de realizare a acestora. vident, dac3 o parte din *#&P@JL@(Mii necesari programului sunt deja scri6i 6i verifica5i, viteza de lucru va cre6te prin folosirea lor. ,olose6te deci bibliotecile de componente reutilizabile e"istente 6i construie6te singur astfel de biblioteci, care s3 Dnglobeze e"perien5a proprie.
;A

J bun3 programare modular3 elimin3 leg3turile Dntre dou3 module prin variabile globale. *e recomand3 ca fiecare modul s3 realizeze o activitate bine definit3 6i independent3 de alt modul. Comunicarea Dntre dou3 module trebuie s3 se realizeze numai prin mecanismul parametrilor formali) actuali. Q. A.I9? #e ."$ %I+=$' 1e%"l$$le 9e2e.9$,$c"%$:e. (ceast3 regul3 stabile6te priorit35ile de realizare a componentelor unui programN Dn primul rKnd se acord3 aten5ie aspectelor esen5iale, DncepKnd cu modulul principal. Mn fiecare faz3 d3 aten5ie lucrurilor importante. :e e"emplu, este inutil s3 se piard3 timp cu scrierea unor p3r5i de program pentru tip3rirea rezultatelor 6i a constata ulterior c3 rezultatele nu sunt cele dorite, sau nu sunt corecte. Eu uita Dns3 c3 pentru beneficiar "De%"l$$le 9e2e.9$,$c"%$:e 2'9% 2e.9$,$c"%$:e". &eneficiarii 5in foarte mult la forma rezultatelor 6i, adeseori, judec3 programatorii dup3 aceast3 form3. p3cat de munca depus3 dac3 tip3rirea rezultatelor las3 o impresie proast3 asupra beneficiarului. !. E:$%? "+%$,$c$$le. Prin folosirea artificiilor Dn programare, a prescurt3rilor 6i simplific3rilor se pierde adesea din claritatea programului 6i, mult mai grav, uneori se ajunge c-iar la introducerea unor erori. Mn plus se poate pierde portabilitatea programului. "ist3 Dns3 situa5ii Dn care prin anumite artificii se cK6tig3 eficien53 Dn e"ecu5ie sau se face economie de memorie. :ac3 acest fapt este important atunci artificiile sunt binevenite, Dn caz contrar nu se recomand3 folosirea lor. K. F&l&2e<%e c&92%"9%e 2$.)&l$ce. ,olosirea intensiv3 a constantelor simbolice este recomandat3 oriunde Dn te"tul surs3 trebuie scris un num3r .la declararea tablourilor, la precizarea limitelor de varia5ie a unor variabile, etc./. Prin utilizarea acestor constante se m3re6te gradul de generalitate a te"tului scris, iar Dn situa5ia Dn care valoarea unei constante trebuie sc-imbat3, modificarea este mult mai u6oar3 .doar la locul defini5iei constantei/ 6i nu duce la erori. a implic3 numai defini5ia constantei, nu modificarea valorii concrete Dn toate instruc5iunile programului. P. Ve+$,$c? c&+ec%$%'1$9e" "l*&+$%.'l'$ <$ #+&*+".'l'$ E9 ,$ec"+e e%"#? " el")&+?+$$ l&+. :etectarea 6i eliminarea unei erori imediat dup3 comiterea ei duce la cre6terea vitezei de realizare a produsului, evitKndu)se activit35i inutile de depanare. *e recomand3 demonstrarea corectitudinii fiec3rui algoritm folosit, DntrucKt erorile semnalate Dn timpul test3rii sunt adeseori greu de descoperit 6i, cKteodat3, imposibil de eliminat altfel decKt prin rescrierea modulului sau programului respectiv. #rmeaz3 testarea fiec3rui subprogram imediat dup3 ce a fost scris .codificat/. (cest lucru se potrive6te codific3rii bottom) up 6i sugereaz3 o abordare sistematic3 a activit35ii de codificare. :ac3 pentru proiectare se pot folosi oricare dintre metodele indicate, Dn codificare .6i testarea aferent3 codific3rii/, abordarea de jos Dn sus este esen5ial3. *uger3m ca aceast3 testare s3 se fac3 independent de programul Dn care se va folosi subprogramul testat. ste adev3rat c3 activitatea de testare necesit3 un anumit timp, dar ea este util3 cel pu5in din trei puncte de vedere: B scoate Dn eviden53 erorile provocate de proiectarea algoritmului sau codificarea neadecvat3 a acestuiaN B faciliteaz3 detectarea erorilor, deoarece dimensiunea problemei este mai mic3N Dn fapt nu se pierde timp cu scrierea unui program de test, ci se cK6tig3 timp, deoarece la fiecare nivel de detaliere se vor folosi numai componente testate dejaN ceea ce r3mKne de testat la nivelul respectiv este gestiunea corect3 a apelurilor respectivelor componenteN
>C

B oblig3 implementatorul s3 gKndeasc3 Dnc3 o utilizare .cel pu5in/ a respectivului subprogram, independent3 de cea pentru care a fost ini5ial conceput. - . F&l&2e<%e 1e9'.$+$ 2'*e2%$:e #e9%+' $1e9%$,$c"%&+$$ '%$l$="8$ E9 #+&*+".. ,iecare identificator .nume de variabil3, de tip de date, de constante, de subprograme/ D6i are rolul 6i semnifica5ia lui Dntr)un program. bine ca denumirea s3 reflecte aceast3 semnifica5ie, m3rind astfel claritatea te"tului programului. #nii programatori e"agereaz3 Dns3, folosind identificatori lungi, ob5inu5i prin concatenarea mai multor cuvinte. clar c3 denumirea ales3 red3 semnifica5ia variabilei, dar claritatea te"tului scade, lungimea programului cre6te 6i citirea lui devine greoaie. --. C'9&"<%e <$ +e2#ec%? 2e.9$,$c"8$" ,$ec?+e$ :"+$")$le. ,iecare variabil3 are o semnifica5ie. Mn demonstrarea corectitudinii algoritmului aceast3 semnifica5ie se reflect3, de cele mai multe ori, printr)un predicat invariant. J gre6eal3 frecvent3 f3cut3 de unii programatori const3 Dn folosirea unei variabile Dn mai multe scopuri. -2. F&l&2e<%e :"+$")$le "'7$l$"+e 9'."$ "c&l& '91e e2%e 2%+$c% 9ece2"+. ,iecare variabil3 trebuie s3 aib3 o semnifica5ie proprie, iar Dn demonstrarea corectitudinii programului, acesteia i se ata6eaz3 un invariant, care trebuie verificat. ,olosirea necontrolat3 a mai multor variabile au"iliare, ruperea unor e"presii c-iar lungi Dn sube"presii cu diferite denumiri, pot duce la reducerea clarit35ii programului. ->. P+$9 2c+$e+e +e1? cI% ."$ ,$1el 2%+'c%'+" #+&*+".'l'$. $mportan5a indent3rii 6i spa5ierii pentru claritatea programului au fost ar3tate anterior. ,iecare programator trebuie s3 aib3 propriile reguli de scriere, care s3 scoat3 cKt mai bine Dn eviden53 structura programului 6i func5iile fiec3rei p3r5i a acestuia. -F. N' '$%" 2? %e2%e=$ #+&*+".'l c6$"+ 1"c? "$ 1e.&92%+"% c&+ec%$%'1$9e" l'$. *unt cunoscute demonstra5ii gre6ite pentru unele teoreme celebre din matematic3. 4i o demonstra5ie a corectitudinii unui program poate fi gre6it3. :ar, c-iar dac3 demonstrarea corectitudinii algoritmului este valid3, programul poate con5ine gre6eli de codificare, de introducere .tastare/ sau pot fi alte cauze care genereaz3 erori. -G. N' +ec"lc'l" l$.$%ele <$ 9' .&1$,$c" :"+$")$l" 1e c$cl"+e E9 $9%e+$&+'l '9e$ 2%+'c%'+$ +e#e%$%$:e 1"%? #+$9 #+&#&=$8$" P2e'1&c&1 PENTRU. J astfel de practic3 poate duce la erori greu de detectat 6i Dncalc3 regulile program3rii structurate. (tunci cKnd este necesar3 sc-imbarea variabilei de ciclare sau a limitelor se recomand3 folosirea uneia din structurile repetitive @ P 'T sau CU''$MP. -Q. N' $e<$ ,&+8"% 1$9 c&+#'l '9e$ 2%+'c%'+$ +e#e%$%$:e +e1"%? #+$9 #+&#&=$8$" P2e'1&c&1 PENTRU . $nstruc5iunea Pseudocod P E'@# corespunde unui num3r cunoscut de e"ecu5ii ale corpului ciclului. Mn situa5ia cKnd corpul con5ine 6i testarea condi5iei de continuare a cicl3rii, recomand3m a se folosi structurile @ P 'T sau CU''$MP 6i nu P E'@#.

><

-!. El")&+e"=? 1&c'.e9%"8$" #+&*+".'l'$ E9 #"+"lel c' +e"l$="+e" l'$. (6a cum s)a ar3tat Dn mai multe locuri din acest material, pe durata de via53 a unui program se iau mai multe decizii. bine ca aceste decizii s3 r3mKn3 consemnate Dmpreun3 cu rezultatul final al fiec3rei faze din via5a programului .specificarea problemei, proiectarea algoritmilor, programul propriu)zis, datele de test folosite/. %or rezulta documenta5ii de analiz3, proiectare, implementare 6i e"ploatare. Primele trei sunt necesare la Dntre5inerea aplica5iei, trebuind a fi actualizate ori de cKte ori se produc modific3ri, iar ultima este necesar3 celor care e"ploateaz3 aplica5ia. Pe lKng3 acestea, un program bun va trebui s3 posede 6i o component3 de asisten53 on)line .func5ie help/, care contribuie la asigurarea a ceea ce am numit interfa* prietenoa). -K. F&l&2e<%e c&.e9%"+$$le. @olul comentariilor a fost e"plicat Dn sec5iunea 9.9. ste foarte greu s3 descifr3m un program lipsit de comentarii, c-iar dac3 este vorba de propriuN program scris Dn urm3 cu cKteva luni sau ani de zile. Jrice program sau modul trebuie s3 fie Dnso5it de comentarii e"plicative dac3 dorim s3)l refolosim 6i nu trebuie s3 scriem programe care s3 nu poat3 fi refolosite. Minimum de comentarii Dntr)un modul trebuie s3 con5in3 specificarea acestui modul 6i semnifica5ia fiec3rei variabile.

>=

CAPITOLUL I(
METODA BACXTRACXING 1a dispozi5ia celor care rezolv3 probleme cu ajutorul calculatorului e"ist3 mai multe metode. :intre acestea cel mai des utilizate sunt: B metoda GreedyN B metoda Divide et impera/ B metoda $ranch and $ound/ B metoda $acMtracMing/ Me%&1" )"cS%+"cS$9* se aplic3 problemelor Dn care solu5ia poate fi reprezentat3 sub forma unui vector B " Q ."<, "=, "3, R"k,R "n/ m *, unde * este mul5imea solu5iilor problemei 6i * Q *< " *= "R " *n, 6i *i sunt mul5imi finite avKnd s elemente si "i m si , .n/i Q <..n. Pentru fiecare problem3 se dau rela5ii Dntre componentele vectorului ", care sunt numite condi5ii interneN solu5iile posibile care satisfac condi5iile interne se numesc solu5ii rezultat. Metoda de generare a tuturor solu5iilor posibile si apoi de determinare a solu5iilor rezultat prin verificarea Dndeplinirii condi5iilor interne necesit3 foarte mult timp. Me%&1" )"cS%+"cS$9* evit3 aceast3 generare 6i este mai eficient3. lementele vectorului ", primesc pe rKnd valori Dn ordinea cresc3toare a indicilor, "FkH va primi o valoare numai daca au fost atribuite valori elementelor "<.. "Fk)<H. 1a atribuirea valorii lui "FkH se verifica Dndeplinirea unor condi5ii de continuare referitoare la "<R"Fk)<H. :aca aceste condi5ii nu sunt Dndeplinite, la pasul k, acest lucru Dnseamn3 ca orice valori i)am atribui lui "FkW<H, "FkW<H, .. "FnH nu se va ajunge la o solu5ie rezultat. Metoda backtracking construie6te un vector solu5ie Dn mod progresiv DncepKnd cu prima component3 a vectorului 6i mergKnd spre ultima cu eventuale reveniri asupra atribuirilor anterioare. Metoda se aplica astfel : </ se alege prima valoare sin *< si $ se atribuie lui "< N =/ se presupun generate elementele "<R"Fk)<H, cu valori din *<..*Fk)<HN pentru generarea lui "FkH se alege primul element din *FkH disponibil si pentru valoarea aleasa se testeaz3 Dndeplinirea condi5iilor de continuare. Pot ap3rea urm3toarele situa5ii : a/ "FkH Dndepline6te condi5iile de continuare. :aca s)a ajuns la solu5ia final3 .k Q n/ atunci se afi6eaz3 solu5ia ob5inut3. :aca nu s)a ajuns la solu5ia final3 se trece la generarea elementului urm3tor B " Fk)<HN b/ "FkH nu Dndepline6te condi5iile de continuare. *e Dncearc3 urm3toarea valoare disponibila din *FkH. :aca nu se g3se6te nici o valoare Dn *FkH care s3 Dndeplineasc3 condi5iile de continuare, se revine la elementul "Fk)<H 6i se reia algoritmul pentru o nou3 valoare a acestuia. (lgoritmul se Dnc-eie cKnd au fost luate in considerare toate elementele lui *<. Problemele rezolvate prin aceast3 metod3 necesit3 timp mare de e"ecu5ie, de aceea este indicat sa se foloseasc3 metoda numai daca nu avem alt algoritm de rezolvare. :ac3 mul5imile *<,*=,R*n au acela6i num3r k de elemente, timpul necesar de e"ecu5ie al algoritmului este k la n. :ac3 mul5imile *<, *=.. *n nu au acela6i num3r de elemente, atunci se noteaz3 cu am8 minimul cardinalelor mul5imilor *<R*n si cu aM8, ma"imul. 'impul de e"ecu5ie este situat Dn intervalul Fm la n .. M la nH. Metoda backtracking are comple"itatea e"ponen5ial3, in cele mai multe cazuri fiind ineficient3. a insa nu poate fi Dnlocuit3 cu alte variante de rezolvare mai rapide Dn situa5ia Dn care se cere determinarea tuturor solu5iilor unei probleme. Ge9e+"+e" #e+.'%?+$l&+. *e cite6te un num3r natural n. *3 se genereze toate permut3rile mul5imii O<, =, 3, R,nP. Lenerarea permut3rilor se va face 5inKnd cont c3 orice permutare va fi alc3tuit3 din elemente distincte ale mul5imii (. :in acest motiv, la generarea unei permut3ri, vom urm3ri ca numerele s3 fie distincte.
>3

Prezent3m algoritmul corespunz3tor cazului nQ3: < < < 3 < = < = = < = 3 < 3 < = < = < 3 3 < = = = = < 3 = < < = < 3 =

< 3 < < < =

= 3 =

se Dncarc3 Dn stiv3 pe nivelul < valoarea <N Dnc3rcarea valorii < pe nivelul al =)lea nu este posibil3, DntrucKt aceast3 valoare se g3se6te 6i pe nivelul < al stiveiN Dnc3rcarea valorii = pe nivelul al =)lea este posibil3, deoarece aceast3 valoare nu mai este DntKlnit3N valoarea < din nivelul al 3)lea se reg3se6te pe nivelul <N valoarea = din nivelul al 3)lea se reg3se6te pe nivelul al =)leaN valoarea 3 pe nivelul al 3)lea nu e DntKlnit3 pe nivelurile anterioareN DntrucKt nivelul 3 este completat corect. 'ip3rim: < = 3 RR (lgoritmul continu3 pKn3 cKnd stiva devine vid3. Programul sursa este urmatorul:
Private Sub CommandButton14_Click() cit_n "n = ", n back_perm End Sub Sub back_perm() im k !s "nte#er k = 1 $%ile k & ' o succesor am_suc, st, k "( am_suc = )rue )%en valid1 ev, st, k End "( *oop +ntil (,ot am_suc) -r (am_suc !nd ev) "( am_suc )%en "( solutie(k) )%en tipar_r Else k = k . 1 init k, st End "( Else k = k / 1 End "( $end
>9

End Sub Sub valid1(ev !s Boolean, st !s stiva, k !s "nte#er) ev = )rue 0or i = 1 )o k / 1 "( (st1ss(i) = st1ss(k)) )%en ev = 0alse End "( ,e2t End Sub Sub tipar_r() im i !s "nte#er, b !s Strin# b = " " 0or i = 1 )o n b = b . Str3(st1ss(i)) . "," ,e2t 4s#Bo2 b End Sub Sub succesor(am_suc !s Boolean, st !s stiva, k !s "nte#er) "( st1ss(k) 5 n )%en am_suc = )rue st1ss(k) = st1ss(k) . 1 Else am_suc = 0alse End "( End Sub

&ti,a este a(ea form -e organi>are a -atelor 1stru(tur -e -ate2 (u proprietatea ( operaiile -e intro-u(ere 6i s(oatere a -atelor se fa( ?n ,7rful ei. *tivele se pot simula utilizKnd vectori. ,ie *'.i/ un vector. *'.</, *'.=/, ..., *'.n/ pot re5ine numai litere sau numai cifre. J variabil3 ] indic3 Dn permanent3 vKrful stivei. "emplific3m, Dn continuare, modul de lucru cu stiva:
( & (

Mn stiva ini5ial vid3 se introduce litera (, vKrful stivei va fi la nivelul < .k)</N introducem Dn stiv3 litera &, deci k va lua valoarea =N scoatem din stiv3 pe & .( nu poate fi scos/N scoatem din stiv3 pe (N stiva r3mKne vid3

Mn mod practic la scoaterea unei variabile din stiv3, scade cu < valoarea variabilei ce indic3 vKrful stivei, iar atunci cKnd scriem ceva Dn stiv3, o eventual3 valoare rezidual3 se pierde: Pe un anumit nivel se retine, de regul3, o singur3 informa5ie .liter3 sau cifr3/, Dns3 este posibilN a6a cum va rezulta din e"emplele, prezentate Dn lucrare, s3 avem mai multe informa5ii, caz Dn care avem de a face cu stive duble, triple, etc. Mntreaga teorie a recursivit35ii se bazeaz3 pe structura de tip stiv3.
>?

Pre>entarea te5ni(ii .a(@tra(@ing (ceast3 te-nic3 se folose6te Dn rezolvarea problemelor care Dndeplinesc simultan urm3toarele condi5ii: B solu5ia lor poate fi pus3 sub forma unui vector *Q" <,"=, ...,"n, cu "< m (<, "= m (= R, "n m (n B mul5imile (<, (= , R., (n sunt mul5imi finite, iar elementele lor se consider3 c3 se afl3 Dntr)o rela5ie de ordine bine stabilit3N B nu se dispune de o alt3 metod3 de rezolvare, mai rapid3 B "< "= R, "n pot fi la rKndul lor vectoriN B (<, (= R, (n pot coincide. 1a DntKlnirea unei astfel de probleme, dac3 nu cunoa6tem aceast3 te-nic3, suntem tenta5i s3 gener3m toate elementele produsului cartezian (<,(= R,(n si fiecare element s3 fie testat dac3 este solu5ie. @ezolvKnd problema Dn acest mod, timpul de e"ecu5ie este atKt de mare, DncKt poate fi considerat infinit, algoritmul neavKnd nici o valoare practic3. :e e"emplu, dac3 dorim s3 gener3m toate permut3rile unei mul5imi finite (, nu are rost s3 gener3m produsul cartezian ("("....."(, pentru ca apoi, s3 test3m, pentru fiecare element al acestuia, dac3 este sau nu permutare .nu are rost s3 gener3m <.<,<.......<, pentru ca apoi s3 constat3m c3 nu am ob5inut o permutare, cKnd de la a doua cifr3 < ne puteam da seama c3 cifrele nu sunt distincte/. 'e-nica .a(@tra(@ing are la baz3 un principiu e"trem de simplu: B se construie6te solu5ia pas cu pas: "<, "= R,"n B dac3 se constat3 c3, pentru o valoare aleas3, nu avem cum s3 ajungem la solu5ie, se renun53 la acea valoare 6i se reia c3utarea din punctul Dn care am r3mas. Concret: B se alege primul element ", ce apar5ine lui (N B presupunKnd generate elementele "<,"= R,"k , apar5inKnd mul5imilor (<, (= R,(k, se alege .dac3 e"ist3/ "kW<, primul element disponibil din mul5imea (kW<, apar dou3 posibilit35i: </ Eu s)a g3sit un astfel de element, caz Dn care caz Dn care se reia c3utarea considerKnd generate elementele "<,"= R,"kW< , iar aceasta se reia de la urm3torul element al mul5imii (k r3mas netestatN =/ ( fost g3sit, caz Dn care se testeaz3 dac3 acesta Dndepline6te anumite condi5ii de continuare ap3rKnd astfel dou3 posibilit35i: Dndepline6te, caz Dn care se testeaz3 dac3 s)a ajuns la solu5ie si apar din nou dou3 posibilit35i: ) s)a ajuns la solu5ie, se tip3re6te solu5ia si se reia algoritmul considerKnd generate elementele "<,"= R,"k, .se caut3 Dn continuare, un alt element al mul5imii ( k, r3mas netestat/N ) nu s)a ajuns la solu5ie, caz Dn care se reia algoritmul considerKnd generate elementele "<,"= R,"k , si se caut3 un prim element "kW= m (k. nu le Dndepline6te caz Dn care se reia algoritmul considerKnd generate elementele " <,"= R, "k , iar elementul "k)< se caut3 Dntre elementele mul5imii (, r3mase netestate. (lgoritmii se termin3 atunci cKnd nu e"ist3 nici un element "< m (< netestat. O)2e+:"8$e3 te-nica .a(@tra(@ing are ca rezultat ob5inerea tuturor solu5iilor problemei. Mn cazul Dn care se cere o sigur3 solu5ie se poate for5a oprirea, atunci cKnd a fost g3sit3. (m ar3tat c3 orice solu5ie se genereaz3 sub form3 de vector. %om considera c3 generarea solu5iilor se face intr)o stiv3. (stfel, "< m (<, se va g3si pe primul nivel al stivei, " = m (= se va g3si pe al doilea nivel al stivei,... "k m (k se va g3si pe nivelul k al stivei. Mn acest fel, stiva .notat3 *'/ va ar3ta astfel:

>;

... "k
R

"=
*' Eivelul kW< al stivei trebuie ini5ializat .pentru a alege, Dn ordine, elementele mul5imii kW< /. $ni5ializarea trebuie f3cut3 cu o valoare aflat3 .Dn rela5ia de ordine considerat3, pentru mul5imea (kW< / Dnaintea tuturor valorilor posibile din mul5ime. :e e"emplu, pentru generarea permut3rilor mul5imii O<,=.....nP, orice nivel al stivei va lua valori de la < la n. $ni5ializarea unui nivel .oarecare/ se face cu valoarea C. Procedura de ini5ializare o vom numi INIT 6i va avea doi parametri: k .nivelul care trebuie ini5ializat si *' .stiva//. L3sirea urm3torului element al mul5imii ( k .element care a fost netestat/ se face cu ajutorul procedurii SUCCESOR .(*,*',]/. Parametrul (* .am succesor/ este o variabil3 boolean3. Mn situa5ia Dn care am g3sit elementul, acesta este pus Dn stiv3 6i (* ia valoarea TRUE, contrar .nu a r3mas un element netestat/ (* ia valoarea ,(1* .. Jdat3 ales un element, trebuie v3zut dac3 acesta Dndepline6te condi5iile de continuare .altfel spus, dac3 elementul este valid/. (cest test se face cu ajutorul procedurii AALID . %,*',]/. 'estul dac3 s)a ajuns sau nu la solu5ia final3 se face cu ajutorul func5iei SOLUTIE.k/ iar o solu5ie se tip3re6te cu ajutorul procedurii TIPAR. Prezent3m Dn continuare rutina .a(@tra(@ing:
k6=17 C!** init(1,st)7 8%ile k&' do C!** succesor (as, st, k) 7 i( as t%en C!**valid(ev,st,k) t%en loop until (not as) or (as and ev) 7 i( as t%en i( solutie(k) t%en C!** tipar else k6=k.l7 C!** init ( k, st )7 end7 else k6=k/1 8end

"<

O)2e+:"8$e3 Problemele rezolvate prin aceast3 metod3 necesit3 un timp Dndelungat. :in acest motiv, este bine s3 utiliz3m metoda numai atunci cKnd nu avem la dispozi5ie un alt algoritm mai eficient. Cu toate c3 e"ist3 probleme pentru care nu se pot elabora al5i algoritmi mai eficien5i, te-nica 3a(@tra(@ing trebuie aplicat3 numai Dn ultim3 instan53. ,iind dat3 o tabl3 de 6a-, de dimensiune n, " n, se cer toate solu5iile de aranjare a n dame, astfel DncKt s3 nu se afle dou3 dame pe aceea6i linie, coloan3 sau diagonal3 .dame s3 nu se atace reciproc/. E7e.#l'3 PresupunKnd c3 dispunem de o tabl3 de dimensiune 9"9, o solu5ie ar fi urm3toarea:
>>

: : : :

Jbserv3m c3 o dam3 trebuie s3 fie plasat3 singur3 pe linie. Plas3m prima dam3 pe linia <, coloana <. :

( doua dam3 nu poate fi a6ezat3 decKt Dn coloana 3. : :

Jbserv3m c3 a treia dam3 nu poate fi plasat3 Dn linia 3. Mncerc3m atunci plasarea celei de)a doua dame Dn coloana 9. : :

( treia dam3 nu poate fi plasat3 decKt Dn coloana =.

>G

: : :

Mn aceast3 situa5ie dama a patra nu mai poate fi a6ezat3. MncercKnd s3 avans3m cu dama a treia, observ3m c3 nu este posibil s3 o plas3m nici Dn coloana 3, nici Dn coloana 9, deci o vom scoate de pe tabl3. :ama a doua nu mai poate avansa, deci 6i ea este scoas3 de pe tabl3. (vans3m cu prima dam3 Dn coloana =. :

( doua dam3 nu poate fi a6ezat3 decKt Dn coloana 9. : :

:ama a treia se a6eaz3 Dn prima coloan3. : : :

>A

(cum este posibil s3 plas3m a patra dam3 Dn coloana 3 si astfel am ob5inut o solu5ie a problemei. : : : :

(lgoritmul continu3 Dn acest mod pKn3 cKnd trebuie scoas3 de pe tabl3 prima dam3. Pentru reprezentarea unei solu5ii putem folosi un vector cu n componente .avKnd Dn vedere c3 pe fiecare linie se g3se6te o singur3 dam3/. "emplu pentru solu5ia g3sit3 avem vectorul *' ce poate fi asimilat unei stive. :ou3 dame se g3sesc pe aceea6i diagonal3 dac3 si numai dac3 este Dndeplinit3 condi5ia: ost.i/)st.j/o Qoi)jo . diferen5a, Dn modul, Dntre linii si coloane este aceea6i/. Mn general *'.i/Qk semnific3 faptul c3 pe linia i dama ocup3 pozi5ia k. > F 2 E7e.#l': Dn tabla 9 "9 avem situa5ia: : : : : sau situa5ia : : : : st.</ Q 3 i Q < st.3/ Q < j Q 3 ost.i/ ) st.j/o Q o3 B <o Q = oi B jo Q o< B 3o Q =
GC

*'.9/ *'.3/ *'.=/ *'.</

st.</Q < i Q < st.3/Q 3 j Q 3 ost.</ ) st.3/o Q o< B 3o Q = oi B jo Q o< B 3o Q =

MntrucKt doua dame nu se pot g3si Dn aceea6i coloan3, rezult3 c3 o solu5ie este sub form3 de permutare. J prim3 idee ne conduce la generarea tuturor permut3rilor si la e"tragerea solu5iilor pentru problema ca dou3 dame s3 nu fie plasate Dn aceea6i diagonal3. ( proceda astfel, Dnseamn3 c3 lucr3m conform strategiei 3a(@tra(@ing. (ceasta presupune ca imediat ce am g3sit dou3 dame care se atac3, s3 relu3m c3utarea. $at3 algoritmul, conform strategiei generate de 3a(@tra(@ing: B Mn prima pozi5ie a stivei se Dncarc3 valoarea <, cu semnifica5ia c3 Dn linia unu se a6eaz3 prima dam3 Dn coloan3. B 1inia = se Dncearc3 a6ezarea damei Dn coloana <, acest lucru nefiind posibil DntrucKt avem doua dame pe aceea6i coloan3. B Mn linia = se Dncearc3 a6ezarea damei Dn coloana = , Dns3 acest lucru nu este posibil, pentru c3 damele se g3sesc pe aceia6i diagonal3 .ost.</)st.=/oQo<)=o/N B (6ezarea damei = Dn coloana 3 este posibil3. B Eu se poate plasa dama 3 Dn coloana <, DntrucKt Dn liniile <)3 damele ocupa acela6i coloan3. B 4i aceast3 Dncercare e6ueaz3 DntrucKt damele de pe = 6i 3 sunt pe aceea6i diagonal3. B :amele de pe =)3 se g3sesc pe aceea6i coloan3. B :amele de pe =)3 se g3sesc pe aceea6i diagonal3. B (m coborKt Dn stiv3 mutKnd dama de pe linia = 6i coloana 3 Dn coloana 9. (lgoritmul se Dnc-eie atunci cKnd stiva este vid3. *emnifica5ia procedurilor utilizate este urm3toarea: INIT ) nivelul k al stivei este ini5ializat cu CN SUCCESOR ) m3re6te cu < valoarea aflat3 pe nivelul k al stivei Dn situa5ia Dn care aceasta este mai mic3 decKt n 6i atribuie variabilei % valoarea '@# , Dn caz contrar, atribuie variabilei % valoarea ,(1* N VALID ) valideaz3 valoarea pus3 pe nivelul k al stivei, verificKnd dac3 nu avem dou3 dame pe aceea6i linie .st.k/Qst.i//, sau dac3 nu avem dou3 dame pe aceea6i diagonal3 .st.k/)st.i/Qok)io/caz Dn care variabilei % i se atribuie ,(1* N Dn caz contrar, variabilei % i se atribuie '@# N SOLUTIE ) verific3 dac3 stiva a fost completat3 pKn3 la nivelul n inclusivN TIPAR ) tip3re6te o solu5ie. *ubprogramele prezentate in limbajul %isual &asic sunt descrise mai jos:
9lobal n !s "nte#er, am_suc !s Boolean, ev !s Boolean ):pe stiva ss(1'') !s "nte#er End ):pe 9lobal st !s stiva Sub init(k !s "nte#er, st !s stiva) st1ss(k) = ' End Sub Sub succesor(am_suc !s Boolean, st !s stiva, k !s "nte#er) "( st1ss(k) 5 n )%en am_suc = )rue st1ss(k) = st1ss(k) . 1 Else am_suc = 0alse End "( End Sub

G<

Sub valid(ev !s Boolean, st !s stiva, k !s "nte#er) ev = )rue 0or i = 1 )o k / 1 "( (st1ss(i) = st1ss(k)) -r (!bs(st1ss(i) / st1ss(k)) = !bs(k / i)) )%en ev = 0alse End "( ,e2t End Sub 0unction solutie(k !s "nte#er) !s "nte#er "( k = n )%en solutie = )rue Else solutie = 0alse End "( End 0unction Sub tipar() im i !s "nte#er, b !s Strin# b = " " 0or i = 1 )o n b = b . "(" . Str3(i) . "," . Str3(st1ss(i)) . ")," ,e2t 4s#Bo2 b End Sub Sub back() im k !s "nte#er k = 1 $%ile k & ' o succesor am_suc, st, k "( am_suc = )rue )%en valid ev, st, k End "( *oop +ntil (,ot am_suc) -r (am_suc !nd ev) "( am_suc )%en "( solutie(k) )%en tipar Else k = k . 1 init k, st End "( Else k = k / 1 End "( $end End Sub Sub Button;_Click() n = "nputBo2("n=", ib_title) back End Sub

P+&1'2'l c"+%e=$"9 " 9 .'l8$.$. *e dau mul5imile de mai jos 6i se cere produsul cartezian al lor. (< Q O<, =, 3, R, k<P
G=

(= Q O<, =, 3, R, k=P RRRRRRRRR (n Q O<, =, 3, R, knP "emplu: (< Q O<, =P (= Q O<, =, 3P (3 Q O<, =, 3P (< (= (3 Q O.<, <, </, .<, <, =/, .<, <, 3/, .<, =, </, .<, =, =/, .<, =, 3/, .<, 3, </, .<, 3, =/, .<, 3, 3/, .=, <, </, .=, <, =/, .=, <, 3/, .=, =, </, .=, =, =/, .=, =, 3/, .=, 3, </, .=, 3, =/, .=, 3, 3/P. Pentru rezolvare, se folosesc stiva *' 6i un vector ( ce re5ine numerele k <, k=, Rkn. #tiliz3m metoda backtracking, u6or modificat3 din urm3toarele motive: a/ Jrice element aflat la nivelul k al stivei este valid, motiv pentru care procedura valid nu face altceva decKt s3 atribuie variabilei ev valoarea '@# . b/ 1imita superioar3 pe nivelul k al stivei este dat3 de (.k/. Modul de concepere a algoritmului rezult3 din cele ce urmeaz3: < < < = = < < 3 = < 3 < = < < 3 < < < 3 < = < = 3 < < = < 3 3 <

O)2e+:"8$$3 (lgoritmul prezentat aici este de tip backtracking! Mntrebarea are sens pentru c3 este absent mecanismul de Dntoarcere. %om admite c3 6i aceasta este backtracking, dar adegenerat8.
Private Sub CommandButton1<_Click() im a !s vector cit_n "n=", n cit_date "a", n, a tipar " multimile sunt 6 ", n, a back_prod_cart End Sub Sub cit_n(mes !s Strin#, nnn !s "nte#er) o nnn = "nputBo2(mes, :) *oop +ntil n & ' !nd n 5 1'' End Sub Sub cit_date(mes !s Strin#, n !s "nte#er, a !s vector) 0or i = 1 )o n a1v(i) = "nputBo2(mes . "(" . Str3(i) . ")=", :) ,e2t End Sub
G3

Sub tipar(mes sir = "" 0or i = 1 )o sir = sir . ,e2t 4s#Bo2 mes . End Sub

!s Strin#, n !s "nte#er, a !s vector) n Str3(a1v(i)) . "," " " . sir

Sub back_prod_cart() im k !s "nte#er k = 1 init k, st $%ile k & ' o succesor_prod am_suc, st, k "( am_suc = )rue )%en valid_prod ev, st, k End "( *oop +ntil (,ot am_suc) -r (am_suc !nd ev) "( am_suc )%en "( solutie(k) )%en tipar_r Else k = k . 1 init k, st End "( Else k = k / 1 End "( $end End Sub Sub valid_prod(ev !s Boolean, st !s stiva, k !s "nte#er) ev = )rue End Sub 0unction solutie(k !s "nte#er) !s Boolean "( k = n )%en solutie = )rue Else solutie = 0alse End "( End 0unction Sub succesor_prod(am_suc !s Boolean, st !s stiva, k !s "nte#er) "( st1ss(k) 5 a1v(k) )%en am_suc = )rue st1ss(k) = st1ss(k) . 1 Else am_suc = 0alse End "( End Sub Sub init(k !s "nte#er, st !s stiva) st1ss(k) = ' End Sub

Ge9e+"+e" "+"90".e9%el&+. *e citesc n 6i p. *3 se genereze toate aranjamentele de n luate cKte p.


G9

:in analiza problemei rezult3 urm3toarele: B stiva are Dn3l5imea pN B fiecare nivel ia valori Dntre < 6i nN B elementele plasate pe diverse niveluri trebuie s3 fie distincte. (lgoritmul este asem3n3tor cu cel de la permut3ri, cu deosebirea c3 aici stipa are Dn3l5imea p.
Private Sub CommandButton1=_Click() cit_n "n = ", n cit_n "p = ", p back_aran> End Sub Sub back_aran>() im k !s "nte#er k = 1 init k, st $%ile k & ' o succesor am_suc, st, k "( am_suc = )rue )%en valid1 ev, st, k End "( *oop +ntil (,ot am_suc) -r (am_suc !nd ev) "( am_suc )%en "( solutie1(k) )%en tipar_rr Else k = k . 1 init k, st End "( Else k = k / 1 End "( $end End Sub Sub valid1(ev !s Boolean, st !s stiva, k !s "nte#er) ev = )rue 0or i = 1 )o k / 1 "( (st1ss(i) = st1ss(k)) )%en ev = 0alse End "( ,e2t End Sub Sub tipar_rr() im i !s "nte#er, b !s Strin# b = " " 0or i = 1 )o p b = b . Str3(st1ss(i)) . "," ,e2t 4s#Bo2 b End Sub 0unction solutie1(k !s "nte#er) !s Boolean "( k = p )%en
G?

solutie1 = )rue Else solutie1 = 0alse End "( End 0unction Sub succesor(am_suc !s Boolean, st !s stiva, k !s "nte#er) "( st1ss(k) 5 n )%en am_suc = )rue st1ss(k) = st1ss(k) . 1 Else am_suc = 0alse End "( End Sub Sub init(k !s "nte#er, st !s stiva) st1ss(k) = ' End Sub

Ge9e+"+e" c&.)$9?+$l&+. *e citesc n 6i p numere naturale, np. *e cere s3 se genereze toate submul5imile cu p elemente ale mul5imii O<, =, 3, R, nP. Pentru rezolvarea problemei trebuie 5inut cont de urm3toarele: B stiva are Dn3l5imea pN B elementele aflate pe niveluri diferite ale stivei trebuie s3 fie distincteN B pentru a evita repeti5ia elementele se a6eaz3 Dn ordine cresc3toare: pe nivelul k se va afla o valoare mai mare decKt pe nivelul k)< 6i mai mic3 sau egal3 cu n)pWk.
Private Sub CommandButton1?_Click() cit_n "n = ", n cit_n "p = ", p back_comb End Sub Sub back_comb() im k !s "nte#er k = 1 init k, st $%ile k & ' o succesor_c am_suc, st, k "( am_suc = )rue )%en valid_c ev, st, k End "( *oop +ntil (,ot am_suc) -r (am_suc !nd ev) "( am_suc )%en "( solutie1(k) )%en tipar_rr Else k = k . 1 init k, st End "( Else k = k / 1 End "( $end End Sub
G;

Sub succesor_c(am_suc !s Boolean, st !s stiva, k !s "nte#er) "( st1ss(k) 5 n / p . k )%en am_suc = )rue st1ss(k) = st1ss(k) . 1 Else am_suc = 0alse End "( End Sub Sub valid_c(ev !s Boolean, st !s stiva, k !s "nte#er) im i !s "nte#er ev = )rue 0or i = 1 )o k / 1 "( (st1ss(i) = st1ss(k)) )%en ev = 0alse End "( ,e2t "( k & 1 )%en "( st1ss(k) 5 st1ss(k / 1) )%en ev = 0alse End "( End "( End Sub 0unction solutie1(k !s "nte#er) !s Boolean "( k = p )%en solutie1 = )rue Else solutie1 = 0alse End "( End 0unction Sub tipar_col() im i !s "nte#er, b !s Strin# b = " " 0or i = 1 )o n b = b . ")ara = " . Str3(i) . "7 culoarea " . Str3(st1ss(i)) . " " ,e2t 4s#Bo2 b End Sub

P+&)le." c&.$24:&$"0&+'l'$. #n comis voiajor trebuie s3 viziteze un num3r n de ora6e. $ni5ial, el se afl3 Dntr)unul dintre ele, notat <. Comis B voiajorul dore6te s3 nu treac3 de dou3 ori prin acela6i ora6, iar la Dntoarcere s3 revin3 Dn ora6ul <. CunoscKnd leg3turile e"istente Dntre ora6e, se cere s3 se tip3reasc3 toate drumurile posibile pe care le poate efectua comis B voiajorul.

E7e.#l': Mn figura al3turat3 sunt simbolizate cele ; ora6e, precum 6i drumurile e"istente Dntre ele. =
G>

<

Comis ) voiajorul are urm3toarele posibilit35i de parcurgere: <, =, 3, 9, ?, ;, <N <, =, ?, 9, 3, ;, <N <, ;, 3, 9, ?, =, <N <, ;, ?, 9, 3, =, <N 1eg3turile e"istente Dntre ora6e sunt date Dn matricea (n,n. lementele matricei ( pot fi C sau < .matricea este binar3/. <, dac3 e"ist3 drum Dntre ora6ele i 6i jN (.i,j/ Q C , altfel *e observ3 c3 (.i,j/ Q (.j,i/, oricare ar fi i,j O<, =, 3, R, nP B matricea este simetric3. Pentru rezolvarea problemei folosim stiva st. la baza stivei .nivelul </ se Dncarc3 num3rul <. Prezent3m Dn continuare modul de rezolvare a problemei. = < = = < 3 = < :e la ora6ul < la ora6ul = e"ist3 drum, deci se va urca Dn stiv3N

Jra6ul = se mai g3se6te Dn stiv3, deci nu este acceptatN

:e la ora6ul = la ora6ul 3 se g3se6te drumN prin ora6ul 3 nu s)a mai trecut, deci ora6ul 3 este acceptat.

(lgoritmul continu3 Dn acest mod pKn3 se ajunge din nou la nivelul <, caz Dn care algoritmul se Dnc-eie. #n succesor, Dntre = 6i n, aflat pe nivelul k al stivei, este considerat valid dac3 sunt Dndeplinite urm3toarele condi5ii: B nu s)a mai trecut prin ora6ul simbolizat de succesor, deci acesta nu se reg3se6te Dn stiv3N B e"ist3 drum Dntre ora6ul aflat la nivelul k)< 6i cel aflat la nivelul kN B dac3 succesorul se g3se6te la nivelul n, s3 e"iste drum de la el la ora6ul <. O)2e+:"8$$3 <. Problemele rezolvate prin aceast3 metod3 necesit3 un timp Dndelungat de e"ecu5ie. :in acest motiv este bine s3 utiliz3m metoda atunci numai atunci cKnd nu mai avem la dispozi5ie un alt algoritm mai eficient =. Men5ion3m c3 nu e"ist3 probleme pentru care nu se cunosc algoritmi eficien5i de rezolvare, deci backtracking este indicat3.
GG

3. @ezolvarea iterativ3 Dncalc3 principiul stivei atunci cKnd verific3m condi5iile de continuare, sau atunci cKnd tip3rim solu5ia g3sit3, pentru c3 acces3m orice nivel al stivei. Consider c3 o structur3 trebuie folosit3 ca atare atunci cKnd este strict necesar. :e e"emplu, c-iar 6i segmentul de stiv3 al calculatorului poate fi accesat oriunde. (sta nu Dnseamn3 c3 acolo nu se utilizeaz3 din plin amecanismul8 stivei.
Sub back_comis() im k !s "nte#er k = 1 init k, st $%ile k & ' o succesor_col am_suc, st, k "( am_suc = )rue )%en valid_col ev, st, k End "( *oop +ntil (,ot am_suc) -r (am_suc !nd ev) "( am_suc )%en "( solutie(k) )%en tipar_col Else k = k . 1 init k, st End "( Else k = k / 1 End "( $end End Sub Sub succesor_comis(am_suc !s Boolean, st !s stiva, k !s "nte#er) "( st1ss(k) 5 n )%en am_suc = )rue st1ss(k) = st1ss(k) . 1 Else am_suc = 0alse End "( End Sub Sub valid_comis(ev !s Boolean, st !s stiva, k !s "nte#er) ev = )rue 0or i = 1 )o k / 1 "( (st1ss(i) = st1ss(k)) !nd (mat1m(i, k) = 1) )%en ev = 0alse End "( ,e2t End Sub Sub tipar_comis() im i !s "nte#er, b !s Strin# b = " " 0or i = 1 )o n b = b . ")ara = " . Str3(i) . "7 vi@itat " . Str3(st1ss(i)) . " " ,e2t 4s#Bo2 b End Sub

GA

PROBLEMA COLORRII HRILOR 9nun*3 ,iind dat3 o -art3 cu n 53ri, se cer toate solu5iile de colorare a -3r5ii, utilizKnd cel mult patru culori, astfel DncKt dou3 53ri de frontier3 comun3 s3 fie colorate diferit. ste demonstrat faptul c3 sunt suficiente numai patru culori pentru ca orice -art3 s3 poat3 fi colorat3. Re%olvare3 Pentru e"emplificare, vom considera urm3toarea -art3 unde 53rile sunt numerotate cu cifre cuprinse Dntre < 6i ?:
< 9 = 3 ?

F$*'+" P.- ^arta 53rilor J solu5ie a acestei probleme este urm3toarea: 5ara < B culoarea < 5ara = B culoarea = 5ara 3 B culoarea < 5ara 9 B culoarea 3 5ara ? B culoarea 9 ^arta este furnizat3 programului cu ajutorul unei matrice (n,n <, dac3 5ara i se Dnvecineaz3 cu 5ara jN (.i,j/ Q C , altfel Matricea ( este simetric3. Pentru rezolvarea problemei se utilizeaz3 stiva st, unde nivelul k al stivei simbolizeaz3 5ara k, iar stFkH culoarea ata6at3 53rii k. *tiva are Dn3l5imea n 6i pe fiecare nivel ia valori Dntre < 6i 9.
Sub back_col() im k !s "nte#er k = 1 init k, st $%ile k & ' o succesor_col am_suc, st, k "( am_suc = )rue )%en valid_col ev, st, k End "( *oop +ntil (,ot am_suc) -r (am_suc !nd ev) "( am_suc )%en "( solutie(k) )%en tipar_col Else k = k . 1 init k, st End "(
AC

Else k = k / 1 End "( $end End Sub Sub succesor_col(am_suc !s Boolean, st !s stiva, k !s "nte#er) "( st1ss(k) 5 4 )%en am_suc = )rue st1ss(k) = st1ss(k) . 1 Else am_suc = 0alse End "( End Sub Sub valid_col(ev !s Boolean, st !s stiva, k !s "nte#er) ev = )rue 0or i = 1 )o k / 1 "( (st1ss(i) = st1ss(k)) !nd (mat1m(i, k) = 1) )%en ev = 0alse End "( ,e2t End Sub Sub tipar_col() im i !s "nte#er, b !s Strin# b = " " 0or i = 1 )o n b = b . ")ara = " . Str3(i) . "7 culoarea " . Str3(st1ss(i)) . " " ,e2t 4s#Bo2 b End Sub Sub tipar_rr() im i !s "nte#er, b !s Strin# b = " " 0or i = 1 )o p b = b . Str3(st1ss(i)) . "," ,e2t 4s#Bo2 b End Sub

A<

CAPITOLUL (
METODA DIAIDE ET I%PERA Metoda de programare :$%$: ' $MP @( consta in impartirea problemei initiale de dimensiuni FnH in doua sau mai multe probleme de dimensiuni reduse. $n general se e"ecuta impartirea in doua subprobleme de dimensiuni apro"imativ egale si anume Fn2=H. $mpartirea in subprobleme are loc pana cand dimensiunea acestora devine suficient de mica pentru a fi rezolvate in mod direct.cazul de baza/. :upa rezolvarea celor doua subprobleme se e"ecuta faza de combinare a rezultatelor in vederea rezolvarii intregii probleme. Metoda :$%$: ' $MP @( se poate aplica in rezolvarea unei probleme care indeplineste urmatoarele conditii: se poate descompune in .doua sau mai multe/ suproblemeN aceste suprobleme sunt independente una fata de alta .o subproblema nu se rezolva pe baza alteia si nu se foloseste rezultate celeilalte/N aceste subprobleme sunt similare cu problema initialaN la randul lor subproblemele se pot descompune .daca este necesar/ in alte subprobleme mai simpleN aceste subprobleme simple se pot solutiona imediat prin algoritmul simplificat. :eoarece putine probleme indeplinesc conditiile de mai sus ,aplicarea metodei este destul de rara. :upa cum sugereaza si numele "desparte si stapaneste "etapele rezolvarii unei probleme .numita problema initiala/ in :$%$: ' $MP @( sunt : descompunerea problemei initiale in subprobleme independente, smilare problemei de baza, de dimensiuni mai miciN descompunerea treptata a subproblemelor in alte subprobleme din ce in ce mai simple, pana cand se pot rezolva imediata ,prin algoritmul simplificatN rezolvarea subproblemelor simpleN combinarea solutiilor gasite pentru construirea solutiilor subproblemelor de dimensiuni din ce in ce mai mariN combinarea ultimelor solutii determina obtinerea solutiei problemei initiale Metoda :$%$: ' $MP @( admite o implementare recursiva, deorece subproblemele sunt similare problemei initiale, dar de dimensiuni mai mici. Principiul fundamental al recursivitatii este autoapelarea unui subprogram cand acesta este activN ceea ce se intampla la un nivel, se intampla la orice nivel, avand grija sa asiguram conditia de terminare ale apelurilor repetate. (semanator se intampla si in cazul metodei :$%$' ' $MP @(N la un anumit nivel sunt doua posibilitati: s)a ajuns la o .sub/problema simpla ce admite o rezolvare imediata caz in care se rezolva .sub/problema si se revine din apel .la subproblema anterioara, de dimensiuni mai mari/N s)a ajuns la o .sub/problema care nu admite o rezolvare imediata, caz in care o descompunem in doua sau mai multe subprobleme si pentru fiecare din ele se continua apelurile recursive .ale procedurii sau functiei/. $n etapa finala a metodei :$%$: ' $MP @( se produce combinarea subproblemelor .rezolvate deja/ prin secventele de revenire din apelurile recursive. tapele metodei :$%$: ' $MP @( .prezentate anterior/ se pot reprezenta prin urmatorul subprogram general .procedura sau functie /recursiv e"primat in limbaj natural: *ubprogram :$%$MP .P@J&/N :aca P@J&1 M( P@J& este simpla (tunci se rezolva si se obtine solutia *J1 (ltfel pentru iQ<,k e"ecuta :$%$MP.P@J&/ si se obtine *J1<N
A=

*e combina solutiile *J1 <,... ,*J1 ] si se obtine *J1N *farsitisubprogramN :eci, subprogramul :$%$MP se apeleaza pentru problema initiala P@J&N aceasta admite descompunerea in ] subprobleme simpleN pentru acestea se reapeleaza recursiv subprogramulN in final se combina solutiile acestor ] subprobleme. :e obicei problema initiala se descompune in doua subprobleme mai simpleN in acest caz etapele generale ale metodei :$%$: ' $MP @( se pot reprezenta concret, in limbaj pseudocod, printr)o procedura recursiva astfel: Procedura :$%$MP.li,ls,sol/N :aca ..ls)li/_Qeps/ (tunci @ dJ1%( .li,ls,sol/N (ltfel :$%$: .li,m,ls/N :$%$MP.li,msol</N :$%$MP.m,ls,sol=/N CJM&$E(.sol<,sol=,sol/N *farsitiproceduraN Procedura :$%$MP se apeleaza pentru problema initiala care are dimensiunea intre limita inferioara .li/ si limita inferioara.ls/N daca .sub/problema este simpla .ls)li_Qeps/, atunci procedura @ dJ1%( ii afla solutia imediat si se produce intoarcerea din apelul recursivN daca .sub/problema este .inca/ comple"a, atunci procedura :$%$: o imparte in doua subprobleme, alegand pozitia m intre limitele li si lsN pentru fiecare din cele doua subprobleme se reapeleaza recursiv procedura :$%$MPN in final, la intoarcerile din apeluri se produce combinarea celor doua soluitii sol< si sol= prin apelul procedurii CJM&$E(. PROBLEMA TURNURILOR DIN HANOI P+e=e9%"+e" "l*&+$%.'l'$ +e=&l:"+$$ ,ie trei tije verticale notate (,&,C. Pe tija ( se gasesc asezate n discuri de diametre diferite, in ordinea crescatoare a diametrelor, privind de sus in jos. $nitial, tijele & si C sunt goale. *a se afiseze toate mutarile prin care discurile de pe tija ( se muta pe tija &, in aceeasi ordine, folosind ca tija de manevra C si resspectand urmatoarele reguli: B la fiecare pas se muta un singur discN B un disc se poate aseza numai peste un disc cu diametrul mai mare. @ezolvarea acestei probleme se bazeaza pe urmatoarele considerente logice: B daca nQ<, atunci mutarea este immediata (& .mut discul de pe ( pe &/N B daca nQ=, atunci sirul mutarilor este: (C,(&,C&N B daca nZ= procedam astfel : ) mut .n)</ discuri (CN ) mut un disc (&N ) mut cele .n)</ discuri C&. Jbservam ca problema initiala se descompune in trei subprobleme mai simple, similare problemei initiale: mut .n)</discuri (C, mut ultimul disc pe &, mut cele .n)</discuri C))Z&. :imensiunile acestor subprobleme sunt: n)<,<,n)<. (ceste subprobleme sunt independente, deoarece tijele initial .pe care sunt dispuse discurile/, tijele finale si tijele intermediare sunt diferite. Eotam ^.n,(,&,C/Qsirul mutarilor a n discuri de pe ( pe &, folosind C. P E'@# nQ< (& nZ< ^.n,(,&,C/Q ^.n)<,(,C,&/,(&, ^.n)<,C,&,(/
A3

S&+%"+e +"#$1" CY'$cS2&+%D #n tablou % se completeaza cu n elemente numere reale .*a se ordoneze crescator folosind metoda de sortare rapida . *olutia problemei se bazeaza pe urmatoarele etape implementate in programul principal: se apeleaza procedura 7buick8 cu limita inferioara liQ< si limita superioara lsQnN functia8poz8 realizeaza mutarea elementului vFiH e"act pe pozitia ce o va ocupa acesta in vectorul final ordonat N functia8poz8 intoarce .in k / pozitia ocupata de acest elementN in acest fel , vectorul % se imparte in doua parti: li Rk)< si kW<RlsN pentru fiecare din aceste parti se reapeleaza procedura 8buick8, cu limitele modificate corespunzatorN in acest fel, primul element din fiecare parte va fi pozitionat e"act pe pozitia finala ce o va ocupa in vectorul final ordonat .functia8poz8/N fiecare din cele doua parti va fi, astfel, inpartita in alte doua partiN procesul continua pana cand limitele partilor ajung sa se suprapuna ,ceea ce indica ca toate elementele vectorului au fost mutate e"act pe pozitiile ce le vor ocupa in vectorul final Ndeci vectorul este ordonat N in acest moment se produc intoarcerile din apelurile recursive si programul isi termina e"ecutia. O)2e+:"8$$3 B daca elementul se afla in stanga, atunci se compara cu elementele din dreapta lui si se sar .j:Qj)</ elementele mai mari decat elN B daca elementul se afla in dreapta, atunci se compara cu elemente din stanga lui si se sar .i:QiW</ elementele mai mici decat el. S&+%"+e #+$9 $9%e+cl"2"+eC.e+*e2&+%D 'abloul unidimensional % se completeaza cu n numere reale. *a se ordoneze crescator folosind sortare prin interclasare. *ortarea prin interclasare se bazeaza pe urmatoarea logica: B vectorul % se imparte, prin injumatatiri succesive,in vectori din ce in ce mai miciN B cand se ating vectorii de ma"im doua elemente, fiecare dintre acestia se ordoneaza printr)o simpla comparare a elementelorN B cate doi astfel de mini)vectori ordonati se interclaseaza succesiv pana se ajunge iar la vectorul %. O)2e+:"8$$3 B mecanismul general de tip :ivide et $mpera se gaseste implementat in procedura 7divi8N B astfel de abordare a problemei sortarii unii vector conduce la economie de timp de calcul, deoarece operatia de interclasare a doi vectori deja ordonati este foarte rapida, iar ordonarea independenta celor doua jumatati .mini)vectori/ consuma in total apro"imativ a doua parte din timpul care ar fi necesar ordonarii vectorului luat ca intreg . CONCLU@II LA TEHNICA DIAIDE ET I%PERA S&+%"+e #+$9 $92e+%$e )$9"+" *a se ordoneze crescator un tablou unidimensional % de n numere reale, folosind sortarea prin insertie binara. Pentru fiecare element vFiH se procedeaza in patru pasi: <. se considera ordonate elementele vF<H,vF=H,R.,vFi)<HN =. se cauta pozitia k pe care urmeaza s)o ocupe vFiH intre elementele vF<H,vF=H,R,vFi)<H .procedura 7poz8 prin cautare binara/N 3. se deplaseaza spre dreapta elementele din pozitiile k,kW<,R,n .procedura 7deplasare8/N
A9

9. insereaza elementul vFiH in pozitia k .procedura8deplasare8/N *e obtine o succesiune de kW< elemente ordonate crescator. A9"l$=" " c&.#le7$%"%$$ %$.# #e9%+' "l*&+$%.$$ D$:$1e e% I.#e+" (lgoritmii de tip :ivide et $mpera au buna comportare in timp, daca se indeplinesc urmatoarele conditii: B dimensiunile subprogramelor .in care se imparte problema initiala/ sunt apro"imativ egale .7principiul balansarii8/N B lipsesc fazele de combinare a solutiilor subproblemelor .cautare binara/.

A?

CAPITOLUL (I
METODA #REEDB --.- Al*&+$%.$ *+ee1W Pusi in fata unei probleme pentru care trebuie sa elaboram un algoritm, de multe ori 7nu stim cum sa incepem8. Ca si in orice alta activitate, e"ista cateva principii generale care ne pot ajuta in aceasta situatie. Ee propunem sa prezentam in urmatoarele capitole te-nicile fundamentale de elaborare a algoritmilor. Cateva din aceste metode sunt atat de generale, incat le folosim frecvent, c-iar daca numai intuitiv, ca reguli elementare in gandire. --.2 Te69$c" *+ee1W (lgoritmii greedy .greedy Q lacom/ sunt in general simpli si sunt folositi la probleme de optimizare, cum ar fi: sa se gaseasca cea mai buna ordine de e"ecutare a unor lucrari pe calculator, sa se gaseasca cel mai scurt drum intr)un graf etc. $n cele mai multe situatii de acest fel avem: multime de candidati .lucrari de e"ecutat, varfuri ale grafului etc/ o functie care verifica daca o anumita multime de candidati constituie o )olutie po)i#ila o functie care verifica daca o multime de candidati este fe%a#ila, adica daca este posibil sa completam aceasta multime astfel incat sa obtinem o solutie posibila, nu neaparat optima, a problemei o functie de )electie care indica la orice moment care este cel mai promitator dintre candidatii inca nefolositi o functie o#iectiv care da valoarea unei solutii .timpul necesar e"ecutarii tuturor lucrarilor intr)o anumita ordine, lungimea drumului pe care l)am gasit etc/N aceasta este functia pe care urmarim sa o optimizam .minimizam2ma"imizam/ Pentru a rezolva problema noastra de optimizare, cautam o solutie posibila care sa optimizeze valoarea functiei obiectiv. #n algoritm greedy construieste solutia pas cu pas. $nitial, multimea candidatilor selectati este vida. 1a fiecare pas, incercam sa adaugam acestei multimi cel mai promitator candidat, conform functiei de selectie. :aca, dupa o astfel de adaugare, multimea de candidati selectati nu mai este fezabila, eliminam ultimul candidat adaugatN acesta nu va mai fi niciodata considerat. :aca, dupa adaugare, multimea de candidati selectati este fezabila, ultimul candidat adaugat va ramane de acum incolo in ea. :e fiecare data cand largim multimea candidatilor selectati, verificam daca aceasta multime nu constituie o solutie posibila a problemei noastre. :aca algoritmul greedy functioneaza corect, prima solutie gasita va fi totodata o solutie optima a problemei. *olutia optima nu este in mod necesar unica: se poate ca functia obiectiv sa aiba aceeasi valoare optima pentru mai multe solutii posibile. :escrierea formala a unui algoritm greedy general este: ,'9c%$&9 greedy. / Sp O este multimea candidatilorP OS este multimea in care construim solutiaP

H6$le 9&% )olutie.S/ "91 r q 1& x p un element din care ma"imizeaza2minimizeaza )elect.x/ p k OxP $, fe%a#il.S OxP/ %6e9 S p S OxP $, )olutie.S/ %6e9 +e%'+9 S el2e +e%'+9 7nu e"ist3 solu5ie8

A;

ste de inteles acum de ce un astfel de algoritm se numeste 7lacom8 .am putea sa)i spunem si 7nec-ibzuit8/. 1a fiecare pas, procedura alege cel mai bun candidat la momentul respectiv, fara sa)i pese de viitor si fara sa se razgandeasca. :aca un candidat este inclus in solutie, el ramane acoloN daca un candidat este e"clus din solutie, el nu va mai fi niciodata reconsiderat. (semenea unui intreprinzator rudimentar care urmareste castigul imediat in dauna celui de perspectiva, un algoritm greedy actioneaza simplist. 'otusi, ca si in afaceri, o astfel de metoda poate da rezultate foarte bune tocmai datorita simplitatii ei. ,unctia )elect este de obicei derivata din functia obiectivN uneori aceste doua functii sunt c-iar identice. #n e"emplu simplu de algoritm greedy este algoritmul folosit pentru rezolvarea urmatoarei probleme. *a presupunem ca dorim sa dam restul unui client, folosind un numar cat mai mic de monezi. $n acest caz, elementele problemei sunt: candidatii: multimea initiala de monezi de <, ?, si =? unitati, in care presupunem ca din fiecare tip de moneda avem o cantitate nelimitata solutie posibila: valoarea totala a unei astfel de multimi de monezi selectate trebuie sa fie e"act valoarea pe care trebuie sa o dam ca rest multime fezabila: valoarea totala a unei astfel de multimi de monezi selectate nu este mai mare decat valoarea pe care trebuie sa o dam ca rest functia de selectie: se alege cea mai mare moneda din multimea de candidati ramasa functia obiectiv: numarul de monezi folosite in solutieN se doreste minimizarea acestui numar *e poate demonstra ca algoritmul greedy va gasi in acest caz mereu solutia optima .restul cu un numar minim de monezi/. Pe de alta parte, presupunand ca e"ista si monezi de <= unitati sau ca unele din tipurile de monezi lipsesc din multimea initiala de candidati, se pot gasi contrae"emple pentru care algoritmul nu gaseste solutia optima, sau nu gaseste nici o solutie cu toate ca e"ista solutie. vident, solutia optima se poate gasi incercand toate combinarile posibile de monezi. (cest mod de lucru necesita insa foarte mult timp. #n algoritm greedy nu duce deci intotdeauna la solutia optima, sau la o solutie. ste doar un principiu general, urmand ca pentru fiecare caz in parte sa determinam daca obtinem sau nu solutia optima. --.> M$9$.$="+e" %$.#'l'$ .e1$' 1e "2%e#%"+e J singura statie de servire .procesor, pompa de benzina etc/ trebuie sa satisfaca cererile a n clienti. 'impul de servire necesar fiecarui client este cunoscut in prealabil: pentru clientul i este necesar un timp ti, < s i s n. :orim sa minimizam timpul total de asteptare .timpul de asteptare pentru clientul i/ ceea ce este acelasi lucru cu a minimiza timpul mediu de asteptare, care este "2n. :e e"emplu, daca avem trei clienti cu t< Q ?, t= Q <C, t3 Q 3, sunt posibile sase ordini de servire. $n primul caz, clientul < este servit primul, clientul = asteapta pana este servit clientul < si apoi este servit, clientul 3 asteapta pana sunt serviti clientii <, = si apoi este servit. 'impul total de asteptare a celor trei clienti este 3G. O+1$9e" < = 3 < 3 = = < 3 = 3 < 3 < = 3 = < " ?W.?W<C/W.?W<CW3/ ?W.?W3/W.?W3W<C/ <CW.<CW?/W.<CW?W3/ <CW.<CW3/W.<CW3W?/ 3W.3W?/W.3W?W<C/ 3W.3W<C/W.3W<CW?/
A>

Q Q Q Q Q Q

3G 3< 93 9< =A 39

p optim

(lgoritmul greedy este foarte simplu: la fiecare pas se selecteaza clientul cu timpul minim de servire din multimea de clienti ramasa. %om demonstra ca acest algoritm este optim. ,ie 8 Q .i< i= ... in/ o permutare oarecare a intregilor O<, =, ..., nP. :aca servirea are loc in ordinea 8, avem

Presupunem acum ca 8 este astfel incat putem gasi doi intregi a _ # cu $ntersc-imbam pe ia cu i# in 8N cu alte cuvinte, clientul care a fost servit al #@lea va fi servit acum al a@lea si invers. Jbtinem o noua ordine de servire Y, care este de preferat deoarece

Prin metoda greedy obtinem deci intotdeauna planificarea optima a clientilor. Problema poate fi generalizata pentru un sistem cu mai multe statii de servire. Inter(lasarea optima a sirurilor or-onate *a presupunem ca avem doua siruri S< si S= ordonate crescator si ca dorim sa obtinem prin interclasarea lor sirul ordonat crescator care contine elementele din cele doua siruri. :aca interclasarea are loc prin deplasarea elementelor din cele doua siruri in noul sir rezultat, atunci numarul deplasarilor este +S< W +S=. Leneralizand, sa consideram acum n siruri S<, S=, ..., Sn, fiecare sir Si, < s i s n, fiind format din Wi elemente ordonate crescator .vom numi Wi lungimea lui Si/. Ee propunem sa obtinem sirul S ordonat crescator, continand e"act elementele din cele n siruri. %om realiza acest lucru prin interclasari succesive de cate doua siruri. Problema consta in determinarea ordinii optime in care trebuie efectuate aceste interclasari, astfel incat numarul total al deplasarilor sa fie cat mai mic. "emplul de mai jos ne arata ca problema astfel formulata nu este banala, adica nu este indiferent in ce ordine se fac interclasarile. ,ie sirurile S<, S=, S3 de lungimi W< Q 3C, W= Q =C, W3 Q <C. :aca interclasam pe S< cu S=, iar rezultatul il interclasam cu S3, numarul total al deplasarilor este .3CW=C/W.?CW<C/Q<<C. :aca il interclasam pe S3 cu S=, iar rezultatul il interclasam cu S<, numarul total al deplasarilor este .<CW=C/W.3CW3C/QAC. (tasam fiecarei strategii de interclasare cate un arbore binar in care valoarea fiecarui varf este data de lungimea sirului pe care il reprezinta. :aca sirurile S<, S=, ..., S; au lungimile W< Q 3C, W= Q <C, W3 Q =C, W9 Q 3C, W? Q ?C, W; Q <C, doua astfel de strategii de interclasare sunt reprezentate prin arborii din ,igura <<.<.

F$*'+" --.- @eprezentarea strategiilor de interclasare. Jbservam ca fiecare arbore are ; varfuri terminale, corespunzand celor ; siruri initiale si ? varfuri neterminale, corespunzand celor ? interclasari care definesc strategia respectiva. Eumerotam varfurile in
AG

felul urmator: varful terminal i, < s i s ;, va corespunde sirului Si, iar varfurile neterminale se numeroteaza de la > la << in ordinea obtinerii interclasarilor respective .,igura <<.=/.

F$*'+" --.2 Eumerotarea varfurilor arborilor din ,igura <<.< *trategia greedy apare in ,igura <<.<b si consta in a interclasa mereu cele mai scurte doua siruri disponibile la momentul respectiv. $nterclasand sirurile S<, S=, ..., Sn, de lungimi W<, W=, ..., Wn, obtinem pentru fiecare strategie cate un arbore binar cu n varfuri terminale, numerotate de la < la n, si nB< varfuri neterminale, numerotate de la nW< la =nZ<. :efinim, pentru un arbore oarecare A de acest tip, lungimea externa ponderata:

unde ai este adancimea varfului i. *e observa ca numarul total de deplasari de elemente pentru strategia corespunzatoare lui A este c-iar <.A/. *olutia optima a problemei noastre este atunci arborele .strategia/ pentru care lungimea e"terna ponderata este minima. P+&#+$e%"%e" --.- Prin metoda greedy se obtine intotdeauna interclasarea optima a n siruri ordonate, deci strategia cu arborele de lungime e"terna ponderata minima. De.&92%+"%$e3 :emonstram prin inductie. Pentru n Q <, proprietatea este verificata. Presupunem ca proprietatea este adevarata pentru nZ< siruri. ,ie A arborele strategiei greedy de interclasare a n siruri de lungime W< s W= s ... Wn. ,ie $ un arbore cu lungimea e"terna ponderata minima, corespunzator unei strategii optime de interclasare a celor n siruri. $n arborele A apare subarborele

reprezentand prima interclasare facuta conform strategiei greedy. $n arborele $, fie un varf neterminal de adancime ma"ima. Cei doi fii ai acestui varf sunt atunci doua varfuri terminale WH si WM. ,ie $T arborele obtinut din $ sc-imband intre ele varfurile W< si WH, respectiv W= si WM. vident, <.$T/ s <.$/. :eoarece $ are lungimea e"terna ponderata minima, rezulta ca <.$T/ Q <.$/. liminand din $T varfurile W< si W=, obtinem un arbore $R cu nB< varfuri terminale W&WW(, W3, ..., Wn. (rborele $T are lungimea e"terna ponderata minima si <.$T/ Q <.$R/ W W&WW(. @ezulta ca si $R are lungimea e"terna ponderata minima. (tunci, conform ipotezei inductiei, avem <.$R/ Q <.AT/, unde AT este arborele strategiei greedy de interclasare a sirurilor de lungime W&WW(, W3, ..., Wn. Cum A se obtine din AT atasand la varful W&WW( fiii W< si W=, iar $T se obtine in acelasi mod din $R, rezulta ca <.A/ Q <.$T/ Q <.$/. Proprietatea este deci adevarata pentru orice n.
AA

1a scrierea algoritmului care genereaza arborele strategiei greedy de interclasare vom folosi un min)-eap. ,iecare element al min)-eap)ului este o perec-e . W, i/ unde i este numarul unui varf din arborele strategiei de interclasare, iar W este lungimea sirului pe care il reprezinta. Proprietatea de min) -eap se refera la valoarea lui W. (lgoritmul interopt va construi arborele strategiei greedy. #n varf i al arborelui va fi memorat in trei locatii diferite continand: <2FiH Q lungimea sirului reprezentat de varf S"FiH Q numarul fiului stang DRFiH Q numarul fiului drept #+&ce1'+e interopt.LF< .. nH/ Oconstruieste arborele strategiei greedy de interclasare a sirurilor de lungimi LFiH Q Wi, < s i s nP V p min)-eap vid ,&+ i p < %& n 1& .LFiH, i/ QZ V Oinsereaza in min)-eapP <2FiH p LFiHN S"FiH p CN DRFiH p C ,&+ i p nW< %& =nN< 1& .), H/ _Q V Oe"trage radacina lui VP .r, M/ _Q V Oe"trage radacina lui VP S"FiH p HN DRFiH p MN <2FiH p )Wr .<2FiH, i/ QZ V Oinsereaza in min)-eapP $n cazul cel mai nefavorabil, operatiile de inserare in min)-eap si de e"tragere din min)-eap necesita un timp in ordinul lui log n. @estul operatiilor necesita un timp constant. 'impul total pentru interopt este deci in >.n log n/. Co-uri 0uffman J alta aplicatie a strategiei greedy si a arborilor binari cu lungime e"terna ponderata minima este obtinerea unei codificari cat mai compacte a unui te"t. #n principiu general de codificare a unui sir de caractere este urmatorul: se masoara frecventa de aparitie a diferitelor caractere dintr)un esantion de te"t si se atribuie cele mai scurte coduri, celor mai frecvente caractere, si cele mai lungi coduri, celor mai putin frecvente caractere. (cest principiu sta, de e"emplu, la baza codului Morse. Pentru situatia in care codificarea este binara, e"ista o metoda eleganta pentru a obtine codul respectiv. (ceasta metoda, descoperita de ^uffman .<A?=/ foloseste o strategie greedy si se numeste codificarea Vuffman. J vom descrie pe baza unui e"emplu. ,ie un te"t compus din urmatoarele litere .in paranteze figureaza frecventele lor de aparitie/: * .<C/, $ .=A/, P .9/, J .A/, ' .?/ Conform metodei greedy, construim un arbore binar fuzionand cele doua litere cu frecventele cele mai mici. %aloarea fiecarui varf este data de frecventa pe care o reprezinta.

tic-etam muc-ia stanga cu < si muc-ia dreapta cu C. @earanjam tabelul de frecvente: * .<C/, $ .=A/, J .A/, OP, 'P .9t? Q A/ Multimea OP, 'P semnifica evenimentul reuniune a celor doua evenimente independente corespunzatoare aparitiei literelor P si '. Continuam procesul, obtinand arborele
<CC

$n final, ajungem la arborele din ,igura <<.3, in care fiecare varf terminal corespunde unei litere din te"t. Pentru a obtine codificarea binara a literei P, nu avem decat sa scriem secventa de C)uri si <)uri in ordinea aparitiei lor pe drumul de la radacina catre varful corespunzator lui P: <C<<. Procedam similar si pentru restul literelor: * .<</, $ .C/, P .<C<</, J .<CC/, ' .<C<C/ Pentru un te"t format din n litere care apar cu frecventele f<, f=, ..., fn, un ar#ore de codificare este un arbore binar cu varfurile terminale avand valorile f<, f=, ..., fn, prin care se obtine o codificare binara a te"tului. #n arbore de codificare nu trebuie in mod necesar sa fie construit dupa metoda greedy a lui ^uffman, alegerea varfurilor care sunt fuzionate la fiecare pas putandu)se face dupa diverse criterii. 1ungimea e"terna ponderata a unui arbore de codificare este:

F$*'+" --.> (rborele de codificare ^uffman. unde ai este adincimea varfului terminal corespunzator literei i. *e observa ca lungimea e"terna ponderata este egala cu numarul total de caractere din codificarea te"tului considerat. Codificarea cea mai compacta a unui te"t corespunde deci arborelui de codificare de lungime e"terna ponderata minima. *e poate demonstra ca arborele de codificare ^uffman minimizeaza lungimea e"terna ponderata pentru toti arborii de codificare cu varfurile terminale avand valorile f<, f=, ..., fn. Prin strategia greedy se obtine deci intotdeauna codificarea binara cea mai compacta a unui te"t. (rborii de codificare pe care i)am considerat in acesta sectiune corespund unei codificari de tip special: codificarea unei litere nu este prefi"ul codificarii nici unei alte litere. J astfel de codificare este de tip prefix. Codul Morse nu face parte din aceasta categorie. Codificarea cea mai compacta a unui sir de caractere poate fi intotdeauna obtinuta printr)un cod de tip prefi". :eci, concentrandu)ne atentia asupra acestei categorii de coduri, nu am pierdut nimic din generalitate. --.F A+)&+$ #"+8$"l$ 1e c&2% .$9$. ,ie G Q _7, ED un graf neorientat cone", unde 7 este multimea varfurilor si E este multimea muc-iilor. ,iecare muc-ie are un co)t nenegativ .sau o lungime nenegativa/. Problema este sa gasim o submultime A E, astfel incat toate varfurile din 7 sa ramina conectate atunci cand sunt folosite doar muc-ii din A, iar suma lungimilor muc-iilor din A sa fie cat mai mica. Cautam deci o submultime A de cost total minim. (ceasta problema se mai numeste si pro#lema conectarii ora)elor cu co)t minim, avand numeroase aplicatii.
<C<

Lraful partial _7, AZ este un arbore si este numit ar#orele partial de co)t minim al grafului G .minimal )panning tree/. #n graf poate avea mai multi arbori partiali de cost minim si acest lucru se poate verifica pe un e"emplu. %om prezenta doi algoritmi greedy care determina arborele partial de cost minim al unui graf. $n terminologia metodei greedy, vom spune ca o multime de muc-ii este o )olutie, daca constituie un arbore partial al grafului G, si este fe%a#ila, daca nu contine cicluri. J multime fezabila de muc-ii este promitatoare, daca poate fi completata pentru a forma solutia optima. J muc-ie atinge o multime data de varfuri, daca e"act un capat al muc-iei este in multime. #rmatoarea proprietate va fi folosita pentru a demonstra corectitudinea celor doi algoritmi. P+&#+$e%"%e" --.2 ,ie G Q _7, ED un graf neorientat cone" in care fiecare muc-ie are un cost nenegativ. ,ie [ 7 o submultime stricta a varfurilor lui G si fie A E o multime promitatoare de muc-ii, astfel incat nici o muc-ie din A nu atinge [. ,ie m muc-ia de cost minim care atinge [. (tunci, A OmP este promitatoare. De.&92%+"%$e3 ,ie $ un arbore partial de cost minim al lui G, astfel incat A $ .adica, muc-iile din A sunt continute in arborele $/. #n astfel de $ trebuie sa e"iste, deoarece A este promitatoare. :aca m $, nu mai ramane nimic de demonstrat. Presupunem ca m $. (daugandu)l pe m la $, obtinem e"act un ciclu. $n acest ciclu, deoarece m atinge [, trebuie sa mai e"iste cel putin o muc-ie mT care atinge si ea pe [ .altfel, ciclul nu se inc-ide/. liminandu)l pe mT, ciclul dispare si obtinem un nou arbore partial $T al lui G. Costul lui m este mai mic sau egal cu costul lui mT, deci costul total al lui $T este mai mic sau egal cu costul total al lui $. :e aceea, $T este si el un arbore partial de cost minim al lui G, care include pe m. Jbservam ca A $T deoarece muc-ia mT, care atinge [, nu poate fi in A. :eci, A OmP este promitatoare. Multimea initiala a candidatilor este E. Cei doi algoritmi greedy aleg muc-iile una cate una intr)o anumita ordine, aceasta ordine fiind specifica fiecarui algoritm. Algoritmul lui Crus@al (rborele partial de cost minim poate fi construit muc-ie, cu muc-ie, dupa urmatoarea metoda a lui ]ruskal .<A?;/: se alege intai muc-ia de cost minim, iar apoi se adauga repetat muc-ia de cost minim nealeasa anterior si care nu formeaza cu precedentele un ciclu. (legem astfel + 7Z< muc-ii. ste usor de dedus ca obtinem in final un arbore. ste insa acesta c-iar arborele partial de cost minim cautat! $nainte de a raspunde la intrebare, sa consideram, de e"emplu, graful din ,igura <<.9a. Jrdonam crescator .in functie de cost/ muc-iile grafului: O<, =P, O=, 3P, O9, ?P, O;, >P, O<, 9P, O=, ?P, O9, >P, O3, ?P, O=, 9P, O3, ;P, O?, >P, O?, ;P si apoi aplicam algoritmul. *tructura componentelor cone"e este ilustrata, pentru fiecare pas, in 'abelul <<.<.

F$*'+" --.F #n graf si arborele sau partial de cost minim.


<C=

P"2'l initializare < = 3 9 ? ; >

M'c6$" c&92$1e+"%" u O<, =P O=, 3P O9, ?P O;, >P O<, 9P O=, ?P O9, >P

C&.#&9e9%ele c&9e7e "le 2')*+",'l'$ Z7, A5 O<P, O=P, O3P, O9P, O?P, O;P, O>P O<, =P, O3P, O9P, O?P, O;P, O>P O<, =, 3P, O9P, O?P, O;P, O>P O<, =, 3P, O9, ?P, O;P, O>P O<, =, 3P, O9, ?P, O;, >P O<, =, 3, 9, ?P, O;, >P respinsa .formeaza ciclu/ O<, =, 3, 9, ?, ;, >P

T")el'l --.- (lgoritmul lui ]ruskal aplicat grafului din ,igura <<.9a. Multimea A este initial vida si se completeaza pe parcurs cu muc-ii acceptate .care nu formeaza un ciclu cu muc-iile deja e"istente in A/. $n final, multimea A va contine muc-iile O<, =P, O=, 3P, O9, ?P, O;, >P, O<, 9P, O9, >P. 1a fiecare pas, graful partial _7, AZ formeaza o padure de componente cone"e, obtinuta din padurea precedenta unind doua componente. ,iecare componenta cone"a este la randul ei un arbore partial de cost minim pentru varfurile pe care le conecteaza. $nitial, fiecare varf formeaza o componenta cone"a. 1a sfarsit, vom avea o singura componenta cone"a, care este arborele partial de cost minim cautat .,igura <<.9b/. Ceea ce am observat in acest caz particular este valabil si pentru cazul general, din Proprietatea <<.= rezultand: P+&#+$e%"%e" --.> $n algoritmul lui ]ruskal, la fiecare pas, graful partial _ 7, AZ formeaza o padure de componente cone"e, in care fiecare componenta cone"a este la randul ei un arbore partial de cost minim pentru varfurile pe care le conecteaza. $n final, se obtine arborele partial de cost minim al grafului G. Pentru a implementa algoritmul, trebuie sa putem manipula submultimile formate din varfurile componentelor cone"e. ,olosim pentru aceasta o structura de multimi disjuncte si procedurile de tip find si merge. $n acest caz, este preferabil sa reprezentam graful ca o lista de muc-ii cu costul asociat lor, astfel incat sa putem ordona aceasta lista in functie de cost. $ata algoritmul: ,'9c%$&9 Uru)Mal.G Q _7, EZ/ OinitializareP sorteaza E crescator in functie de cost n p +7 Apq Ova contine muc-iile arborelui partial de cost minimP initializeaza n multimi disjuncte continand fiecare cate un element din 7 Obucla greedyP +e#e"% Ou, vP p muc-ia de cost minim care inca nu a fost considerate ucomp p find.u/ vcomp p find.v/ $, ucomp r vcomp %6e9 merge.ucomp, vcomp/ A p A OOu, vPP '9%$l +A Q n@< +e%'+9 A

<C3

Pentru un graf cu n varfuri si m muc-ii, presupunand ca se folosesc procedurile find3 si merge3, numarul de operatii pentru cazul cel mai nefavorabil este in: >.m log m/ pentru a sorta muc-iile. :eoarece m s n.nB</2=, rezulta >.m log m/ >.m log n/. Mai mult, graful fiind cone", din n@< s m rezulta si >.m log n/ >.m log m/, deci >.m log m/ Q >.m log n/. >.n/ pentru a initializa cele n multimi disjuncte. Cele cel mult =m operatii find3 si nB< operatii merge3 necesita un timp in >..=mWn) </ lgX n/. :eoarece >.lgX n/ >.log n/ si n)< s m, acest timp este si in >.m log n/. >.m/ pentru restul operatiilor. :eci, pentru cazul cel mai nefavorabil, algoritmul lui ]ruskal necesita un timp in >.m log n/. J alta varianta este sa pastram muc-iile intr)un min)-eap. Jbtinem astfel un nou algoritm, in care initializarea se face intr)un timp in >.m/, iar fiecare din cele nZ< e"trageri ale unei muc-ii minime se face intr)un timp in >.log m/ Q >.log n/. Pentru cazul cel mai nefavorabil, ordinul timpului ramane acelasi cu cel al vec-iului algoritm. (vantajul folosirii min)-eap)ului apare atunci cand arborele partial de cost minim este gasit destul de repede si un numar considerabil de muc-ii raman netestate. $n astfel de situatii, algoritmul vec-i pierde timp, sortand in mod inutil si aceste muc-ii. Algoritmul lui Prim Cel de)al doilea algoritm greedy pentru determinarea arborelui partial de cost minim al unui graf se datoreaza lui Prim .<A?>/. $n acest algoritm, la fiecare pas, multimea A de muc-ii alese impreuna cu multimea 2 a varfurilor pe care le conecteaza formeaza un arbore partial de cost minim pentru subgraful _2, AZ al lui G. $nitial, multimea 2 a varfurilor acestui arbore contine un singur varf oarecare din 7, care va fi radacina, iar multimea A a muc-iilor este vida. 1a fiecare pas, se alege o muc-ie de cost minim, care se adauga la arborele precedent, dand nastere unui nou arbore partial de cost minim .deci, e"act una dintre e"tremitatile acestei muc-ii este un varf in arborele precedent/. (rborele partial de cost minim creste 7natural8, cu cate o ramura, pina cand va atinge toate varfurile din 7, adica pina cand 2 Q 7. ,unctionarea algoritmului, pentru e"emplul din ,igura <<.9a, este ilustrata in 'abelul <<.=. 1a sfarsit, A va contine aceleasi muc-ii ca si in cazul algoritmului lui ]ruskal. ,aptul ca algoritmul functioneaza intotdeauna corect este e"primat de urmatoarea proprietate, pe care o puteti demonstra folosind Proprietatea <<.=. P"2'l initializare < = 3 9 ? ; M'c6$" c&92$1e+"%" u O=, <P O3, =P O9, <P O?, 9P O>, 9P O;, >P U O<P O<, =P O<, =, 3P O<, =, 3, 9P O<, =, 3, 9, ?P O<, =, 3, 9, ?, ;P O<, =, 3, 9, ?, ;, >P

T")el'l --.2 (lgoritmul lui Prim aplicat grafului din ,igura <<.9a. P+&#+$e%"%e" --.F $n algoritmul lui Prim, la fiecare pas, _2, AZ formeaza un arbore partial de cost minim pentru subgraful _2, AZ al lui G. $n final, se obtine arborele partial de cost minim al grafului G. :escrierea formala a algoritmului este data in continuare. ,'9c%$&9 Prim@formal.G Q _7, EZ/ OinitializareP A pq Ova contine muc-iile arborelui partial de cost minimP 2 p Oun varf oarecare din 7P Obucla greedyP H6$le 2 r 7 1&
<C9

gaseste Ou, vP de cost minim astfel ca u 7 k 2 si v 2 A p A OOu, vPP 2 p 2 OuP +e%'+9 A Pentru a obtine o implementare simpla, presupunem ca: varfurile din 7 sunt numerotate de la < la n, 7 Q O<, =, ..., nPN matricea simetrica da costul fiecarei muc-ii, cu Fi, HH Q W , daca muc-ia Oi, HP nu e"ista. ,olosim doua tablouri paralele. Pentru fiecare i 7 k 2, vecinFiH contine varful din 2, care este conectat de i printr)o muc-ie de cost minimN minco)tFiH da acest cost. Pentru i 2, punem minco)tFiH Q B <. Multimea 2, in mod arbitrar initializata cu O<P, nu este reprezentata e"plicit. lementele vecinF<H si minco)tF<H nu se folosesc. ,'9c%$&9 Prim. F< .. n, < .. nH/ OinitializareN numai varful < este in 2P Apq ,&+ i p = %& n 1& vecinFiH p < minco)tFiH p Fi, <H Obucla greedyP +e#e"% nZ< %$.e2 min p W ,&+ H p = %& n 1& $, C _ minco)tF HH _ min %6e9 min p minco)tF HH MpH ApA OOM, vecinFMHPP minco)tFMH p B< Oadauga varful M la 2P ,&+ H p = %& n 1& $, FM, HH _ minco)tF HH %6e9 minco)tF HH p FM, HH vecinF HH p M +e%'+9 A &ucla principala se e"ecuta de nZ< ori si, la fiecare iteratie, buclele ,&+ din interior necesita un timp in >.n/. (lgoritmul Prim necesita, deci, un timp in >.n=/. (m vazut ca timpul pentru algoritmul lui ]ruskal este in >.m log n/, unde m = +E. Pentru un graf den) .adica, cu foarte multe muc-ii/, se deduce ca m se apropie de n.nZ</2=. $n acest caz, algoritmul Uru)Mal necesita un timp in >.n= log n/ si algoritmul Prim este probabil mai bun. Pentru un graf rar .adica, cu un numar foarte mic de muc-ii/, m se apropie de n si algoritmul Uru)Mal necesita un timp in >.n log n/, fiind probabil mai eficient decat algoritmul Prim. --.G Cele ."$ 2c'+%e 1+'.'+$ c"+e #le"c" 1$9 "cel"2$ #'9c% ,ie G Q _7, ED un graf orientat, unde 7 este multimea varfurilor si E este multimea muc-iilor. ,iecare muc-ie are o lungime nenegativa. #nul din varfuri este desemnat ca varf )ur)a. Problema este sa determinam lungimea celui mai scurt drum de la sursa catre fiecare varf din graf. %om folosi un algoritm greedy, datorat lui :ijkstra .<A?A/. Eotam cu multimea varfurilor disponibile .candidatii/ si cu S multimea varfurilor deja selectate. $n fiecare moment, S contine acele varfuri a caror distanta minima de la sursa este deja cunoscuta, in timp ce multimea contine toate celelalte varfuri. 1a inceput, S contine doar varful sursa, iar in final S contine toate varfurile grafului. 1a fiecare pas, adaugam in S acel varf din a carui distanta de la sursa este cea mai mica. *punem ca un drum de la sursa catre un alt varf este )pecial, daca toate varfurile intermediare de)a lungul drumului apartin lui S. (lgoritmul lui :ijkstra lucreaza in felul urmator. 1a fiecare pas al
<C?

algoritmului, un tablou D contine lungimea celui mai scurt drum special catre fiecare varf al grafului. :upa ce adaugam un nou varf v la S, cel mai scurt drum special catre v va fi, de asemenea, cel mai scurt dintre toate drumurile catre v. Cand algoritmul se termina, toate varfurile din graf sunt in S, deci toate drumurile de la sursa catre celelalte varfuri sunt speciale si valorile din D reprezinta solutia problemei. Presupunem, pentru simplificare, ca varfurile sunt numerotate, 7 Q O<, =, ..., nP, varful < fiind sursa, si ca matricea < da lungimea fiecarei muc-ii, cu <Fi, HH Q W , daca muc-ia .i, H/ nu e"ista. *olutia se va construi in tabloul DF= .. nH. (lgoritmul este: ,'9c%$&9 DiHM)tra.<F< .. n, < .. nH/ OinitializareP p O=, 3, ..., nP OS Q 7 k e"ista doar implicitP ,&+ i p = %& n 1& DFiH p <F<, iH Obucla greedyP +e#e"% nZ= %$.e2 v p varful din care minimizeaza DFvH p k OvP Osi, implicit, S p S OvPP ,&+ fiecare X 1& DFXH p min.DFXH, DFvHW<Fv, XH/ +e%'+9 D Pentru graful din ,igura <<.?, pasii algoritmului sunt prezentati in 'abelul <<.3.

F$*'+" --.G #n graf orientat. P"2'l initializare < = 3 v u ? 9 3 O=, 3, 9, ?P O=, 3, 9P O=, 3P O=P D F?C, 3C, <CC, <CH F?C, 3C, =C, <CH F9C, 3C, =C, <CH F3?, 3C, =C, <CH

T")el'l --.> (lgoritmul lui :ijkstra aplicat grafului din ,igura <<.?. Jbservam ca D nu se sc-imba daca mai efectuam o iteratie pentru a)l scoate si pe O=P din aceea, bucla greedy se repeta de doar n)= ori. *e poate demonstra urmatoarea proprietate: . :e

P+&#+$e%"%e" --.G. $n algoritmul lui :ijkstra, daca un varf i i) este in S, atunci DFiH da lungimea celui mai scurt drum de la sursa catre iN ii) nu este in S, atunci DFiH da lungimea celui mai scurt drum special de la sursa catre i. 1a terminarea algoritmului, toate varfurile grafului, cu e"ceptia unuia, sunt in S. :in proprietatea precedenta, rezulta ca algoritmul lui :ijkstra functioneaza corect.
<C;

:aca dorim sa aflam nu numai lungimea celor mai scurte drumuri, dar si pe unde trec ele, este suficient sa adaugam un tablou PF= .. nH, unde PFvH contine numarul nodului care il precede pe v in cel mai scurt drum. Pentru a gasi drumul complet, nu avem decat sa urmarim, in tabloul P, varfurile prin care trece acest drum, de la destinatie la sursa. Modificarile in algoritm sunt simple: B initializeaza PFiH cu <, pentru = s i s n B continutul buclei ,&+ cea mai interioara se inlocuieste cu $, DFXH Z DFvH W <Fv, XH %6e9 DFXH p DFvH W <Fv, XH P FX H p v B bucla +e#e"% se e"ecuta de n @< ori *a presupunem ca aplicam algoritmul DiHM)tra asupra unui graf cu n varfuri si m muc-ii. $nitializarea necesita un timp in >.n/. (legerea lui v din bucla +e#e"% presupune parcurgerea tuturor varfurilor continute in la iteratia respectiva, deci a n @<, n @=, ..., = varfuri, ceea ce necesita in total un timp in >.n=/. &ucla ,&+ interioara efectueaza n)=, n)3, ..., < iteratii, totalul fiind tot in >.n=/. @ezulta ca algoritmul :ijkstra necesita un timp in >.n=/. $ncercam sa imbunatatim acest algoritm. %om reprezenta graful nu sub forma matricii de adiacenta <, ci sub forma a n liste de adiacenta, continand pentru fiecare varf lungimea muc-iilor care pleaca din el. &ucla ,&+ interioara devine astfel mai rapida, deoarece putem sa consideram doar varfurile X adiacente lui v. (ceasta nu poate duce la modificarea ordinului timpului total al algoritmului, daca nu reusim sa scadem si ordinul timpului necesar pentru alegerea lui v din bucla +e#e"%. :e aceea, vom tine varfurile v din intr)un min)-eap, in care fiecare element este de forma .v, DFvH/, proprietatea de min) -eap referindu)se la valoarea lui DFvH. Eumim algoritmul astfel obtinut DiHM)tra@modificat. *a il analizam in cele ce urmeaza. $nitializarea min)-eap)ului necesita un timp in >.n/. $nstructiunea 7 p k OvP8 consta in e"tragerea radacinii min)-eap)ului si necesita un timp in >.log n/. Pentru cele nZ= e"trageri este nevoie de un timp in >.n log n/. Pentru a testa daca 7DFXH Z DFvHW<Fv, XH8, bucla ,&+ interioara consta acum in inspectarea fiecarui varf X din adiacent lui v. ,iecare varf v din este introdus in S e"act o data si cu acest prilej sunt testate e"act muc-iile adiacente luiN rezulta ca numarul total de astfel de testari este de cel mult m. :aca testul este adevarat, trebuie sa il modificam pe DFXH si sa operam un percolate cu X in min)-eap, ceea ce necesita din nou un timp in >.log n/. 'impul total pentru operatiile percolate este deci in >.m log n/. $n concluzie, algoritmul DiHM)tra@modificat necesita un timp in >.ma".n, m/ log n/. :aca graful este cone", atunci m v n si timpul este in >.m log n/. Pentru un graf rar este preferabil sa folosim algoritmul DiHM)tra@modificat, iar pentru un graf dens algoritmul DiHM)tra este mai eficient. ste usor de observat ca, intr)un graf G neorientat cone", muc-iile celor mai scurte drumuri de la un varf i la celelalte varfuri formeaza un ar#ore partial al celor mai )curte drumuri pentru G. :esigur, acest arbore depinde de alegerea radacinii i si el difera, in general, de arborele partial de cost minim al lui G. Problema gasirii celor mai scurte drumuri care pleaca din acelasi punct se poate pune si in cazul unui graf neorientat. --.Q E'+$2%$c" *+ee1W Pentru anumite probleme, se poate accepta utilizarea unor algoritmi despre care nu se stie daca furnizeaza solutia optima, dar care furnizeaza rezultate 7acceptabile8, sunt mai usor de implementat si mai eficienti decat algoritmii care dau solutia optima. #n astfel de algoritm se numeste euri)tic. #na din ideile frecvent utilizate in elaborarea algoritmilor euristici consta in descompunerea procesului de cautare a solutiei optime in mai multe subprocese succesive, fiecare din aceste subprocese constand dintr)o optimizare. J astfel de strategie nu poate conduce intotdeauna la o solutie optima, deoarece alegerea unei solutii optime la o anumita etapa poate impiedica atingerea in final a unei solutii optime a intregii problemeN cu alte cuvinte, optimizarea locala nu implica, in general, optimizarea globala.
<C>

@egasim, de fapt, principiul care sta la baza metodei greedy. #n algoritm greedy, despre care nu se poate demonstra ca furnizeaza solutia optima, este un algoritm euristic. %om da doua e"emple de utilizare a algoritmilor greedy euristici. 11.D.1 Colorarea unui graf ,ie G Q _7, ED un graf neorientat, ale carui varfuri trebuie colorate astfel incat oricare doua varfuri adiacente sa fie colorate diferit. Problema este de a obtine o colorare cu un numar minim de culori. ,olosim urmatorul algoritm greedy: alegem o culoare si un varf arbitrar de pornire, apoi consideram varfurile ramase, incercand sa le coloram, fara a sc-imba culoarea. Cand nici un varf nu mai poate fi colorat, sc-imbam culoarea si varful de start, repetand procedeul.

F$*'+" --.Q #n graf care va fi colorat. :aca in graful din ,igura <<.; pornim cu varful < si il coloram in rosu, mai putem colora tot in rosu varfurile 3 si 9. (poi, sc-imbam culoarea si pornim cu varful =, colorandu)l in albastru. Mai putem colora cu albastru si varful ?. :eci, ne)au fost suficiente doua culori. :aca coloram varfurile in ordinea <, ?, =, 3, 9, atunci se obtine o colorare cu trei culori. @ezulta ca, prin metoda greedy, nu obtinem decat o solutie euristica, care nu este in mod necesar solutia optima a problemei. :e ce suntem atunci interesati intr)o astfel de rezolvare! 'oti algoritmii cunoscuti, care rezolva optim aceasta problema, sunt e"ponentiali, deci, practic, nu pot fi folositi pentru cazuri mari. (lgoritmul greedy euristic propus furnizeaza doar o solutie 7acceptabila8, dar este simplu si eficient. #n caz particular al problemei colorarii unui graf corespunde celebrei pro#leme a colorarii hartilor: o -arta oarecare trebuie colorata cu un numar minim de culori, astfel incat doua tari cu frontiera comuna sa fie colorate diferit. :aca fiecarui varf ii corespunde o tara, iar doua varfuri adiacente reprezinta tari cu frontiera comuna, atunci -artii ii corespunde un graf planar, adica un graf care poate fi desenat in plan fara ca doua muc-ii sa se intersecteze. Celebritatea problemei consta in faptul ca, in toate e"emplele intalnite, colorarea s)a putut face cu cel mult 9 culori. (ceasta in timp ce, teoretic, se putea demonstra ca pentru o -arta oarecare este nevoie de cel mult ? culori. Problema colorarii unui graf poate fi interpretata si in conte"tul planificarii unor activitati. :e e"emplu, sa presupunem ca dorim sa e"ecutam simultan o multime de activitati, in cadrul unor sali de clasa. $n acest caz, varfurile grafului reprezinta activitati, iar muc-iile unesc activitatile incompatibile. Eumarul minim de culori necesare pentru a colora graful corespunde numarului minim de sali necesare. 11.D.' Pro3lema (omisE,oiaForului *e cunosc distantele dintre mai multe orase. #n comis)voiajor pleaca dintr)un oras si doreste sa se intoarca in acelasi oras, dupa ce a vizitat fiecare din celelalte orase e"act o data. Problema este de a minimiza lungimea drumului parcurs. *i pentru aceasta problema, toti algoritmii care gasesc solutia optima sunt e"ponentiali. Problema poate fi reprezentata printr)un graf neorientat, in care oricare doua varfuri diferite ale grafului sunt unite intre ele printr)o muc-ie, de lungime nenegativa. Cautam un ciclu de lungime minima, care sa se inc-ida in varful initial si care sa treaca prin toate varfurile grafului.
<CG

Conform strategiei greedy, vom construi ciclul pas cu pas, adaugand la fiecare iteratie cea mai scurta muc-ie disponibila cu urmatoarele proprietati: nu formeaza un ciclu cu muc-iile deja selectate .e"ceptand pentru ultima muc-ie aleasa, care completeaza ciclul/ nu e"ista inca doua muc-ii deja selectate, astfel incat cele trei muc-ii sa fie incidente in acelasi varf L"3 = 3 9 ? ;

De l"3 < 3 <C << > =? = ; <= G =; 3 A 9 =C 9 ? <? ? <G T")el'l --.F Matricea distantelor pentru problema comis)voiajorului. :e e"emplu, pentru sase orase a caror matrice a distantelor este data in 'abelul <<.9, muc-iile se aleg in ordinea: O<, =P, O3, ?P, O9, ?P, O=, 3P, O9, ;P, O<, ;P si se obtine ciclul .<, =, 3, ?, 9, ;, </ de lungime ?G. (lgoritmul greedy nu a gasit ciclul optim, deoarece ciclul .<, =, 3, ;, 9, ?, </ are lungimea ?;.

<CA

CAPITOLUL (II
STUDII DE CA@ N APLICAII

<<C

-. S? 2e 1e%e+.$9e %&"%e 9'.e+ele #e+ec6$le 1e 9'.e+e *e.e9e #"9" l" & "9'.$%" :"l&"+e 9. D&'? 9'.e+e 2'9% *e.e9e 1"c? 2'9% ".)ele #+$.e <$ 1$,e+e98" 1$9%+e cel ."$ ."+e <$ cel ."$ .$c e2%e 2.
Private Sub CommandButton1_Click() im rad !s "nte#er, n !s "nte#er, p !s "nte#er, i !s "nte#er, > !s "nte#er cit_n "n = ", n 0or i = A )o n p = 1 rad = "nt(SBr(i . ;)) 0or > = ; )o "nt(rad) "( i 4od > = ' -r (i . ;) 4od > = ' )%en prim = ' > = "nt(rad) End "( ,e2t "( p )%en 4s#Bo2 "(" . Str3(i) . "," . Str3(i . ;) . ")" . C%r(1A) End "( ,e2t End Sub

2. S? 2e c$%e"2c? & :"l&"+e 9"%'+"l" 9 c' :"l&+$ c'#+$92e $9%+e - <$ Sub cit_n(mes !s Strin#, nnn !s "nte#er) o nnn = "nputBo2(mes, :) *oop +ntil n & ' !nd n 5 1'' End Sub

>. C$%$+e" '9'$ :ec%&+ c' 9 c&.#&9e9%e


Sub cit_date(mes !s Strin#, n !s "nte#er, a !s vector) 0or i = 1 )o n
<<<

a1v(i) = "nputBo2(mes . "(" . Str3(i) . ")=", :) ,e2t End Sub

F. T$#?+$+e" '9'$ %")l&' c' 9 c&.#&9e9%e


Sub tipar(mes sir = "" 0or i = 1 )o sir = sir . ,e2t 4s#Bo2 mes . End Sub !s Strin#, n !s "nte#er, a !s vector) n Str3(a1v(i)) . "," " " . sir

G. Ge9e+"+e" #e+.'%?+$l&+ '%$l$=?91 .e%&1" )"cS%+"cS$9*


Private Sub CommandButton14_Click() cit_n "n = ", n back_perm End Sub

Q. Ge9e+"+e" #+&1'2'l'$ c"+%e=$"9 " 9 .'l8$.$ '%$l$=I91 .e%&1" )"cS%+"cS$9*


Private Sub CommandButton1<_Click() im a !s vector cit_n "n=", n cit_date "a", n, a tipar " multimile sunt 6 ", n, a back_prod_cart End Sub

!. Ge9e+"+e" #e+.'%?+$l&+ '%$l$=?91 .e%&1" )"cS%+"cS$9*


Private Sub CommandButton1=_Click() cit_n "n = ", n cit_n "p = ", p back_aran> End Sub

K. P+&)le." cel&+ 9 1".e '%$l$=?91 .e%&1" )"cS%+"cS$9*


Private Sub CommandButton1C_Click() cit_n "n = ", n back End Sub

P. Ge9e+"+e" c&.)$9?+$l&+ C1e 9 l'"%e cI%e .D '%$l$=?91 .e%&1" )"cS%+"cS$9*


Private Sub CommandButton1?_Click() cit_n "n = ", n cit_n "p = ", p back_comb End Sub

- . Ge9e+"+e" #"+%$8$$l&+ '9e$ .'l8$.$ '%$l$=?91 .e%&1" )"cS%+"cS$9*


Private Sub CommandButton1D_Click()
<<=

cit_n "n=", n back_partitii End Sub

--. C?'%"+e" )$9"+? '%$l$=I91 .e%&1" D$:$1e e% I.#e+" #e9%+' 2&+%"+e" '9'$ <$+ 1e 9'.e+e
Private Sub CommandButton;_Click() im n !s "nte#er, 2 !s "nte#er, a !s vector cit_n "n = ", n cit_date "a", n, a tipar "sirul dat este 6 ", n, a divimp 1, n, a E4s#Bo2 "Sirul a sortat este" tipar "Sirul a sortat este", n, a 2 = "nputBo2(" 2 = ", :) st = 1 dr = n l = )rue $%ile st 5= dr !nd l = )rue pp = (st . dr) F ; "( a1v(pp) = 2 )%en l = 0alse 4s#Bo2 "numarul 2 = " . Str3(2) . " se a(la printre elementele vectorului a" End "( "( a1v(pp) 5 2 )%en st = pp . 1 Else dr = p / 1 End "( $end "( l = )rue )%en 4s#Bo2 "numarul 2 = " . Str3(2) . " nu se (ala in sir " End "( End Sub

-2. Re"l$="+e" '9e$ 2')+'%$9e #e9%+' 2&+%"+e" +"#$1? O'$cS2&+%


Sub sort(p !s "nte#er, B !s "nte#er, a !s vector) im m !s "nte#er "( a1v(p) & a1v(B) )%en m = a1v(p) a1v(p) = a1v(B) a1v(B) = m End "( End Sub

->. S&+%"+e" Me+*e4S&+% '%$l$=I91 .e%&1" D$:$1e e% $.#e+"


Sub interc(p !s "nte#er, B !s "nte#er, m !s "nte#er, a !s vector) im b !s vector, i, >, k !s "nte#er i = p > = m . 1 k = 1 $%ile (i 5= m) !nd (> 5= B) "( a1v(i) 5= a1v(>) )%en b1v(k) = a1v(i)
<<3

i = i . 1 k = k . 1 Else b1v(k) = a1v(>) > = > . 1 k = k . 1 End "( $end "( i 5= m )%en 0or > = i )o m b1v(k) = a1v(>) k = k . 1 ,e2t Else 0or i = > )o B b1v(k) = a1v(i) k = k . 1 ,e2t End "( k = 1 0or i = p )o B a1v(i) = b1v(k) k = k . 1 ,e2t End Sub

-F. S&+%"+e" +"#$1? '%$l$=I91 .e%&1" D$:$1e e% $.#e+"


Sub divimp(p !s "nte#er, B !s "nte#er, a !s vector) im m !s "nte#er "( (B / p) 5= 1 )%en sort p, B, a Else m = "nt((p . B) F ;) divimp p, m, a divimp m . 1, B, a interc p, B, m, a End "( End Sub

-G. P+&)le." c&l&+?+$$ 6?+8$l&+ '%$l$=I91 .e%&1" )"cS%+"cS$9*


Private Sub CommandButton;'_Click() im mat !s matrice cit_n " n = ", n cit_mat "a", n, n, mat tipar_mat "a", n, n, mat 0or i = 1 )o n 0or > = 1 )o n mat1m(>, i) = mat1m(i, >) ,e2t ,e2t back_col End Sub

<<9

-Q. I9%e+cl"2"+e" " 2 <$+'+$ &+1&9"%e c+e2c?%&+


Private Sub CommandButtonA_Click() im n !s "nte#er, 2 !s "nte#er, a !s vector, m !s "nte#er, b !s vector, k !s "nte#er, c !s vector cit_n "n = ", n cit_date "a", n, a tipar "sirul dat este 6 ", n, a divimp 1, n, a E4s#Bo2 "Sirul a sortat este" tipar "Sirul a sortat este", n, a cit_n "m = ", m cit_date "a", m, b tipar "sirul dat este 6 ", m, b divimp 1, m, b E4s#Bo2 "Sirul a sortat este" tipar "Sirul b sortat este", m, b i = 1 > = 1 k = ' $%ile i 5= n !nd > 5= m "( a1v(i) 5 b1v(>) )%en k = k . 1 c1v(k) = a1v(i) i = i . 1 Else "( a1v(i) = b1v(>) )%en k = k . 1 c1v(k) = a1v(i) i = i . 1 > = > . 1 Else k = k . 1 c1v(k) = b1v(>) > = > . 1 End "( End "( $end "( i 5= n )%en 0or l = i )o n k = k . 1 c1v(k) = a1v(l) ,e2t End "( "( > 5= m )%en 0or l = > )o m k = k . 1 c1v(k) = b1v(l) ,e2t End "( tipar "! + B = ", k, c End Sub

-!. S&+%"+e" S6ell4S&+% '%$l$=I91 .e%&1" G+ee1W


Private Sub CommandButton4_Click() im n !s "nte#er, k !s "nte#er, a !s vector
<<?

cit_n "n = ", n cit_date "a", n, a tipar "sirul dat este 6 ", n, a k = n o k = k F ; o b = 1 0or i = 1 )o n / k "( a1v(i) & a1v(i . k) )%en 2 = a1v(i) a1v(i) = a1v(i . k) a1v(i . k) = 2 b = ' End "( ,e2t *oop +ntil ,ot (b = ') *oop +ntil ,ot (k 5& 1) E4s#Bo2 "Sirul a sortat este" tipar "Sirul a sortat este", n, a End Sub

-K. C$%$+e" 2$ 2c+$e+e" '9e$ ."%+$c$ #e ec+"9


Private Sub CommandButtonC_Click() im n !s "nte#er, m !s "nte#er, a !s matrice, b !s matrice, p !s "nte#er, c !s matrice cit_n "n = ", n cit_n "m = ", m cit_mat "a", n, m, a tipar_mat "a", n, m, a End Sub

-P. C$%$+e" '9e$ ."%+$c$ 1e #e 1$2#&=$%$:'l 1e $9%+"+e


Sub cit_mat(mes !s Strin#, n !s "nte#er, m !s "nte#er, a !s matrice) 0or i = 1 )o n 0or > = 1 )o m a1m(i, >) = "nputBo2(mes . "(" . Str3(i) . "," . Str3(>) . ")=", :) ,e2t ,e2t End Sub

2 . Sc+$e+e" '9e$ ."%+$c$ #e ec+"9


Sub tipar_mat(mes !s Strin#, n !s "nte#er, m !s "nte#er, a !s matrice) sir = mes . C%r(1') 0or i = 1 )o n 0or > = 1 )o m sir = sir . Str3(a1m(i, >)) . " " ,e2t sir = sir . C%r(1') ,e2t 4s#Bo2 sir
<<;

End Sub

2-. P+&1'2'l " 1&'? ."%+$c$


Private Sub CommandButton<_Click() im n !s "nte#er, m !s "nte#er, a !s matrice, b !s matrice, p !s "nte#er, c !s matrice cit_n "n = ", n cit_n "m = ", m cit_mat "a", n, m, a tipar_mat "a", n, m, a cit_n "p = ", p Ecit_n "m = ", m cit_mat "b", m, p, b tipar_mat "m", m, p, b prod_mat n, m, p, a, b, c tipar_mat "a2b=", n, p, c End Sub Sub prod_mat(n !s "nte#er, m !s "nte#er, p !s "nte#er, a !s matrice, b !s matrice, c !s matrice) 0or i = 1 )o n 0or > = 1 )o p c1m(i, >) = ' 0or k = 1 )o m c1m(i, >) = c1m(i, >) . a1m(i, k) G b1m(k, >) ,e2t ,e2t ,e2t End Sub

22. P+&*+".'l #+$9c$#"l #e9%+' "1'9"+e" " 1&'? ."%+$c$


Private Sub CommandButton=_Click() im n !s "nte#er, m !s "nte#er, a !s matrice, b !s matrice, p !s "nte#er, c !s matrice cit_n "n = ", n cit_n "m = ", m cit_mat "a", n, m, a tipar_mat "a", n, m, a Ecit_n "p = ", p Ecit_n "m = ", m cit_mat "b", n, m, b tipar_mat "b", n, m, b ad_mat n, m, a, b, c tipar_mat "a.b=", n, m, c End Sub

2>. S')+'%$9" #e9%+' "1'9"+e" " 1&'? ."%+$c$


Sub ad_mat(n !s "nte#er, m !s "nte#er, a !s matrice, b !s matrice, c !s matrice) 0or i = 1 )o n 0or > = 1 )o m c1m(i, >) = a1m(i, >) . b1m(i, >) ,e2t ,e2t
<<>

End Sub

2F. P+&*+".'l #+$9c$#"l #e9%+' 2c?1e+e" " 1&'? ."%+$c$


Private Sub CommandButton?_Click() im n !s "nte#er, m !s "nte#er, a !s matrice, b !s matrice, p !s "nte#er, c !s matrice cit_n "n = ", n cit_n "m = ", m cit_mat "a", n, m, a tipar_mat "a", n, m, a Ecit_n "p = ", p Ecit_n "m = ", m cit_mat "b", n, m, b tipar_mat "b", n, m, b scad_mat n, m, a, b, c tipar_mat "a/b=", n, m, c End Sub

2G. S')+'%$9" #e9%+' "1'9"+e" " 1&'? ."%+$c$


Sub scad_mat(n !s "nte#er, m !s "nte#er, a !s matrice, b !s matrice, c !s matrice) 0or i = 1 )o n 0or > = 1 )o m c1m(i, >) = a1m(i, >) / b1m(i, >) ,e2t ,e2t End Sub

2Q. P+&*+".'l #+$9c$#"l #e9%+' +$1$c"+e" '9e$ ."%+$c$ l" & #'%e+e #
Private Sub CommandButtonD_Click() im n !s "nte#er, m !s "nte#er, a !s matrice, b !s matrice, p !s "nte#er, c !s matrice, k !s "nte#er ESub scad_mat(n !s "nte#er, m !s "nte#er, a !s matrice, b !s matrice, c !s matrice) Econst t as vector =H',A1,;?,A1,A',A1,A',A1,A',A1,A',A1,A'I cit_n "n = ", n Ecit_n "m = ", m cit_mat "a", n, n, a tipar_mat "a", n, n, a cit_n "putere = ", k Ecit_n "m = ", m Ecit_mat "b", n, m, b Etipar_mat "b", n, m, b putere_mat n, a, k, c tipar_mat "aJp=", n, n, c End Sub

2!. S')#+&*+".'l #e9%+' +$1$c"+e" '9e$ ."%+$c$ l" & #'%e+e #


Sub putere_mat(n !s "nte#er, a !s matrice, k !s "nte#er, c !s matrice) im b !s matrice, c1 !s matrice 0or i = 1 )o n 0or > = 1 )o n
<<G

c1m(i, >) = ' c11m(i, >) = ' ,e2t ,e2t 0or i = 1 )o n c1m(i, i) = 1 c11m(i, i) = 1 ,e2t E,e2t $%ile k & ' "( k 4od ; = 1 )%en prod_mat n, n, n, c1, a, c End "( 0or i = 1 )o n 0or > = 1 )o n c11m(i, >) = c1m(i, >) Ec11m(i, >) = ' ,e2t ,e2t prod_mat n, n, n, a, a, b k = "nt(k F ;) 0or i = 1 )o n 0or > = 1 )o n a1m(i, >) = b1m(i, >) Ec11m(i, >) = ' ,e2t ,e2t $end 0or i = 1 )o n 0or > = 1 )o n c1m(i, >) = c11m(i, >) Ec11m(i, >) = ' ,e2t ,e2t End Sub

2K. S')+'%$9" 1e $9$8$"l$="+e " 2%$:e$ #e9%+' .e%&1" )"cS%+"cS$9*


Sub init(k !s "nte#er, st !s stiva) st1ss(k) = ' End Sub

2P. S')+'%$9" 2'cce22&+ #e9%+' #+&)le." cel&+ 9 1".e


Sub succesor(am_suc !s Boolean, st !s stiva, k !s "nte#er) "( st1ss(k) 5 n )%en am_suc = )rue st1ss(k) = st1ss(k) . 1 Else am_suc = 0alse End "( End Sub

> . S')+'%$9" 2'cce22&+ #e9%+' *e9e+"+e" c&.)$9?+$l&+


Sub succesor_c(am_suc !s Boolean, st !s stiva, k !s "nte#er) "( st1ss(k) 5 n / p . k )%en
<<A

am_suc = )rue st1ss(k) = st1ss(k) . 1 Else am_suc = 0alse End "( End Sub

>-. S')+'%$9" 2'cce2&+ #e9%+' #+&)le." #+&1'2'l'$ c"+%e=$"9 " 9 .'l8$.$ '%$l$=I91 .e%&1" )"cS%+"cS$9*
Sub succesor_prod(am_suc !s Boolean, st !s stiva, k !s "nte#er) "( st1ss(k) 5 a1v(k) )%en am_suc = )rue st1ss(k) = st1ss(k) . 1 Else am_suc = 0alse End "( End Sub

>2. S')+'%$9" 2'cce22&+ #e9%+' c&l&+"+e" 6?+8$l&+


Sub succesor_col(am_suc !s Boolean, st !s stiva, k !s "nte#er) "( st1ss(k) 5 4 )%en am_suc = )rue st1ss(k) = st1ss(k) . 1 Else am_suc = 0alse End "( End Sub

>>. S')+'%$9" :"l$1 #e9%+' #+&)le." cel&+ 9 1".e


Sub valid(ev !s Boolean, st !s stiva, k !s "nte#er) ev = )rue 0or i = 1 )o k / 1 "( (st1ss(i) = st1ss(k)) -r (!bs(st1ss(i) / st1ss(k)) = !bs(k / i)) )%en ev = 0alse End "( ,e2t End Sub

>F. S')+'%$9" :"l$1 #e9%+' c&l&+"+e" 6?+8$l&+


Sub valid_col(ev !s Boolean, st !s stiva, k !s "nte#er) ev = )rue 0or i = 1 )o k / 1 "( (st1ss(i) = st1ss(k)) !nd (mat1m(i, k) = 1) )%en ev = 0alse End "( ,e2t End Sub Sub valid_c(ev !s Boolean, st !s stiva, k !s "nte#er) im i !s "nte#er ev = )rue 0or i = 1 )o k / 1
<=C

"( (st1ss(i) = st1ss(k)) )%en ev = 0alse End "( ,e2t "( k & 1 )%en "( st1ss(k) 5 st1ss(k / 1) )%en ev = 0alse End "( End "( End Sub

>G. S')+'%$9" :"l$1 #e9%+' #+&1'2 c"+%e=$"9 " 9 .'l8$.$


Sub valid_prod(ev !s Boolean, st !s stiva, k !s "nte#er) ev = )rue End Sub

>Q. S')+'%$9" 2&l'8$e #e9%+' *e9e+"+e" #e+.'%?+$l&+


0unction solutie(k !s "nte#er) !s Boolean "( k = n )%en solutie = )rue Else solutie = 0alse End "( End 0unction

>!. S')+'%$9" 2&l'8$e #e9%+' *e9e+"+e" "+"90".e9%el&+ 2"' c&.)$9?+$l&+


0unction solutie1(k !s "nte#er) !s Boolean "( k = p )%en solutie1 = )rue Else solutie1 = 0alse End "( End 0unction

>K. S')+'%$9" %$#?+$+e #e9%+' #+&)le." cel&+ 9 1".e


Sub tiparr() im i !s "nte#er, b !s Strin# b = " " 0or i = 1 )o n b = b . "(" . Str3(i) . "," . Str3(st1ss(i)) . ")," ,e2t 4s#Bo2 b End Sub

>P. S')+'%$9" %$#?+$+e #e9%+' c&l&+"+e" 6?+8$l&+


Sub tipar_col() im i !s "nte#er, b !s Strin# b = " " 0or i = 1 )o n b = b . ")ara = " . Str3(i) . "7 culoarea " . Str3(st1ss(i)) . " " ,e2t
<=<

4s#Bo2 b End Sub

F . S')+'%$9" )"cS #e9%+' #+&)le." cel&+ 9 1".e


Sub back() im k !s "nte#er k = 1 init k, st $%ile k & ' o succesor am_suc, st, k "( am_suc = )rue )%en valid ev, st, k End "( *oop +ntil (,ot am_suc) -r (am_suc !nd ev) "( am_suc )%en "( solutie(k) )%en tiparr Else k = k . 1 init k, st End "( Else k = k / 1 End "( $end End Sub

F-. P+&*+".'l #+$9c$#"l #e9%+' #+&)le." cel&+ 9 1".e


Sub Button;_Click() n = "nputBo2("n=", ib_title) back End Sub

F2. S')+'%$9" )"cS #e9%+' *e9e+"+e" #e+.'%?+$l&+


Sub back_perm() im k !s "nte#er k = 1 init k, st $%ile k & ' o succesor am_suc, st, k "( am_suc = )rue )%en valid1 ev, st, k End "( *oop +ntil (,ot am_suc) -r (am_suc !nd ev) "( am_suc )%en "( solutie(k) )%en tipar_r Else k = k . 1 init k, st End "( Else
<==

k = k / 1 End "( $end End Sub

F>. S')+'%$9" )"cS #e9%+' *e9e+"+e" "+"90".e9%el&+


Sub back_aran>() im k !s "nte#er k = 1 init k, st $%ile k & ' o succesor am_suc, st, k "( am_suc = )rue )%en valid1 ev, st, k End "( *oop +ntil (,ot am_suc) -r (am_suc !nd ev) "( am_suc )%en "( solutie1(k) )%en tipar_rr Else k = k . 1 init k, st End "( Else k = k / 1 End "( $end End Sub

FF. S')+'%$9" :"l$1 #e9%+' .e%&1" )"cS%+"cS$9*


Sub valid1(ev !s Boolean, st !s stiva, k !s "nte#er) ev = )rue 0or i = 1 )o k / 1 "( (st1ss(i) = st1ss(k)) )%en ev = 0alse End "( ,e2t End Sub

FG. S')+'%$9" %$#"+ #e9%+' .e%&1" )"cS%+"cS$9*


Sub tipar_r() im i !s "nte#er, b !s Strin# b = " " 0or i = 1 )o n b = b . Str3(st1ss(i)) . "," ,e2t 4s#Bo2 b End Sub

FQ. S')+'%$9" %$#"+ #e9%+' .e%&1" )"cS%+"cS$9*


Sub tipar_rr() im i !s "nte#er, b !s Strin#
<=3

b = " " 0or i = 1 )o p b = b . Str3(st1ss(i)) . "," ,e2t 4s#Bo2 b End Sub

F!. S')+'%$9" )"cS #e9%+' *e9e+"+e" c&.)$9?+$l&+


Sub back_comb() im k !s "nte#er k = 1 init k, st $%ile k & ' o succesor_c am_suc, st, k "( am_suc = )rue )%en valid_c ev, st, k End "( *oop +ntil (,ot am_suc) -r (am_suc !nd ev) "( am_suc )%en "( solutie1(k) )%en tipar_rr Else k = k . 1 init k, st End "( Else k = k / 1 End "( $end End Sub

FK. S')+'%$9" )"cS #e9%+' *e9e+"+e" #+&1'2'l'$ c"+%e=$"9 " 9 .'l%$.$


Sub back_prod_cart() im k !s "nte#er k = 1 init k, st $%ile k & ' o succesor_prod am_suc, st, k "( am_suc = )rue )%en valid_prod ev, st, k End "( *oop +ntil (,ot am_suc) -r (am_suc !nd ev) "( am_suc )%en "( solutie(k) )%en tipar_r Else k = k . 1 init k, st End "( Else k = k / 1 End "( $end
<=9

End Sub

FP. S')+'%$9" )"cS #e9%+' *e9e+"+e" #"+%$8$$l&+ '9e$ .'l8$.$


Sub back_partitii() im k !s "nte#er k = 1 init k, st $%ile k & ' o succesor_part am_suc, st, k "( am_suc = )rue )%en valid_prod ev, st, k End "( *oop +ntil (,ot am_suc) -r (am_suc !nd ev) "( am_suc )%en "( solutie(k) )%en tipar_part Else k = k . 1 init k, st End "( Else k = k / 1 End "( $end End Sub

G . S')+'%$9" %$#"+$+e #e9%+' #+&)le." *e9e+"+e #"+%$8$$ " '9e$ .'l8$.$


Sub tipar_part() im i !s "nte#er, ma2 !s "nte#er, > !s "nte#er, sir !s Strin# sir = "" ma2 = st1ss(1) 0or i = ; )o n "( ma2 5 st1ss(i) )%en ma2 = st1ss(i) End "( ,e2t sir = " P!K)")"" " 0or > = 1 )o ma2 0or i = 1 )o n "( st1ss(i) = > )%en sir = sir . Str3(i) . " " End "( ,e2t sir = sir . C%r(1') ,e2t 4s#Bo2 sir End Sub

G-. S')+'%$9" 2'cce2&+ #e9%+' #+&)le." *e9e+"+e #"+%$8$$ " '9e$ .'l8$.$
Sub succesor_part(am_suc !s Boolean, st !s stiva, k !s "nte#er) im i !s "nte#er, ma2 !s "nte#er "( k = 1 )%en ma2 = 1
<=?

Else ma2 = st1ss(1) 0or i = ; )o k / 1 "( ma2 5 st1ss(i) )%en ma2 = st1ss(i) End "( ,e2t End "( "( st1ss(k) 5 ma2 . 1 !nd st1ss(k) 5 k )%en am_suc = )rue st1ss(k) = st1ss(k) . 1 Else am_suc = 0alse End "( End Sub

G2. S')+'%$9" )"cS #e9%+' c&l&+"+e" 6?+8$l&+


Sub back_col() im k !s "nte#er k = 1 init k, st $%ile k & ' o succesor_col am_suc, st, k "( am_suc = )rue )%en valid_col ev, st, k End "( *oop +ntil (,ot am_suc) -r (am_suc !nd ev) "( am_suc )%en "( solutie(k) )%en tipar_col Else k = k . 1 init k, st End "( Else k = k / 1 End "( $end End Sub Public s !s Strin#

G>. F'9c8$" #e9%+' " :e+$,$c" 1"c? '9 9'.?+ 9"%'+"l 9 e2%e #+$. 2"' 9'
0unction prim(n !s "nte#er) !s Boolean b = )rue 0or i = ; )o "nt(SBr(n)) "( n 4od i = ' )%en b = 0alse i = "nt(SBr(n)) End "( ,e2t prim = b End 0unction

GF. P+&*+".'l #+$9c$#"l #e9%+' $9:e+2"+e" '9'$ 9'.?+ 9"%'+"l 9


<=;

Sub buton1_Click() im n !s "nte#er, ninv !s "nte#er, n1 !s "nte#er, sir !s Strin# o n = "nputBo2(" n = ", :) *oop +ntil n & ' n1 = n ninv = ' sir = "" $%ile n 5& ' sir = sir . *)rim(K)rim(Str3(n 4od 1'))) ninv = ninv G 1' . n 4od 1' n = "nt(n F 1') $end 4s#Bo2 " numarul initial este 6 " . Str3(n1) . " numarul inversat este6 " . sir End Sub

GG. Al*&+$%.'l l'$ E'cl$1 #e9%+' c"lc'l"+e" CMMDC " 1&'? 9'.e+e 9"%'+"le #&=$%$:e
Private Sub Buton1'_Click() im a !s "nte#er, b !s "nte#er, c !s "nte#er o a = "nputBo2("a = ", :) b = "nputBo2("b = ", :) a1 = a b1 = b *oop +ntil a & ' !nd b & ' !nd a & b c = euclid;(a, b) "( c = 1 )%en 4s#Bo2 " nr1 sunt prime intre ele (" . Str3(a1) . "," . Str3(b1) . ")" Else 4s#Bo2 "Cmmdc (" . Str3(a1) . "," . Str3(b1) . ")=" . Str3 (euclid;(a, b)) End "( End Sub

GQ. S&+%"+e" '9'$ 2$+ c' 9 c&.#&9e9%e '%$l$=I91 .e%&1" )'lel&+


Private Sub Buton11_Click() im n !s "nte#er, a !s vector cit_n "n = ", n cit_date "a", n, a tipar "vectorul initial a este ", n, a bule n, a tipar "vectorul a sortat este 6 ", n, a End Sub

G!. S')+'%$9" #e9%+' 2&+%"+e" #+$9 .e%&1" )'lel&+


Sub bule(n !s "nte#er, a !s vector) o k = ' 0or i = 1 )o n / 1 "( a1v(i) & a1v(i . 1) )%en 2 = a1v(i)
<=>

a1v(i) = a1v(i . 1) a1v(i . 1) = 2 k = 1 End "( ,e2t *oop +ntil k = ' End Sub

GK. S&+%"+e" '9'$ 2$+ c' 9 c&.#&9e9%e '%$l$=I91 .e%&1" 2elec8$e$ 1$+ec%e
Private Sub Buton1;_Click() im n !s "nte#er, a !s vector cit_n "n = ", n cit_date "a", n, a tipar "vectorul initial a este ", n, a selectie n, a tipar "vectorul a sortat este 6 ", n, a End Sub

GP. S')+'%$9" #e9%+' 2&+%"+e" #+$9 .e%&1" 2elec8$e$ 1$+ec%e


Sub selectie(n !s "nte#er, a !s vector) 0or i = 1 )o n / 1 min = a1v(i) k = i 0or > = i . 1 )o n "( min & a1v(>) )%en min = a1v(>) k = > End "( ,e2t "( k 5& i )%en 2 = a1v(i) a1v(i) = a1v(k) a1v(k) = 2 End "( ,e2t End Sub

Q . S&+%"+e" '9'$ 2$+ c' 9 c&.#&9e9%e '%$l$=I91 .e%&1" #+$9 9'.?+"+e


Private Sub Buton14_Click() im n !s "nte#er, a !s vector cit_n "n = ", n cit_date "a", n, a tipar "vectorul initial a este ", n, a numarare n, a tipar "vectorul a sortat este 6 ", n, a End Sub

Q-. S'." c$,+el&+ '9'$ 9'.?+ 9"%'+"l 1"% 9


Sub buton;_Click() im n !s "nte#er, s !s *on#, n1 !s "nte#er o n = "nputBo2(" n = ", :) *oop +ntil n & '
<=G

n1 = n s = ' $%ile n 5& ' s = s . n 4od 1' n = "nt(n F 1') $end 4s#Bo2 " suma ci(relor numarului n = " . Str3(n1) . " este 6 " . Str3(s) End Sub

Q2. Ve+$,$c"+e" '9'$ 9'."+ 9"%'+"l 9 1"c" e2%e #+$. 2"' 9'
Sub butonA_Click() im n !s "nte#er, s !s *on#, n1 !s "nte#er o n = "nputBo2(" n = ", :) *oop +ntil n & ' n1 = n b = )rue 0or i = ; )o "nt(SBr(n)) "( n 4od i = ' )%en b = 0alse i = "nt(SBr(n)) End "( ,e2t "( b = )rue )%en 4s#Bo2 "numarul n = " . Str3(n) . " este prim" Else 4s#Bo2 "numarul n = " . Str3(n) . " nu este prim" End "( End Sub

Q>. De%e+.$9"+e" 9'.e+el&+ #+$.e ."$ .$c$ 2"' e*"le c' 9 '%$l$=I91 .e%&1" 1$+ec%?
Sub buton4_Click() im n !s "nte#er, s !s *on#, n1 !s "nte#er, i !s "nte#er o n = "nputBo2(" n = ", :) *oop +ntil n & ' n1 = n "( n = ; )%en 4s#Bo2 "numerele prime sunt 6 ;" Else sir = ";," i = A $%ile i 5= n "( prim(i) = )rue )%en sir = sir . Str3(i) . "," End "( i = i . ; $end End "( 4s#Bo2 "numere prime sunt 6 " . sir End Sub

QF. C$'+'l l'$ E+"%&2%e9e


<=A

Sub butonC_Click() im n !s "nte#er, a !s vector, sir !s Strin# o n = "nputBo2(" n = ", :) *oop +ntil n & ' 0or i = 1 )o n a1v(i) = i ,e2t 0or i = ; )o "nt(SBr(n)) "( a1v(i) 5& ' )%en > = ; G i $%ile > 5= n > = > . i a1v(>) = ' $end End "( ,e2t sir = "" 0or i = ; )o n "( a1v(i) 5& ' )%en sir = sir . Str3(i) . "," End "( ,e2t 4s#Bo2 ",umerele prime sunt 6 " . sir End Sub

QG. De2c&.#'9e+e" '9'$ 9'."+ $9 ,"c%&+$ #+$.$


Sub buton<_Click() im n !s "nte#er, a !s vector, sir !s Strin#, n1 !s "nte#er o n = "nputBo2(" n = ", :) *oop +ntil n & ' i = ; n1 = n l = ' sir = "" o (m = ' $%ile n 4od i = ' (m = (m . 1 l = 1 n = "nt(n F i) $end "( (m 5& ' )%en sir = sir . Str3(i) . "J" . Str3((m) . "G" End "( i = i . 1 *oop +ntil n = 1 "( l = ' )%en sir = Str3(n) . "J1" End "( 4s#Bo2 Str3(n1) . "=" . sir End Sub

QQ. Sc+$e+e" '9'$ 9'.?+ c" 2'." " 1&'? c')'+$


<3C

Sub buton=_Click() im n !s "nte#er, a !s vector, sir !s Strin#, n1 !s "nte#er o n = "nputBo2(" n = ", :) *oop +ntil n & ' n1 = n 0or n = 1 )o n1 4a2 = "nt(n F ;) nr = ' 0or i = 1 )o 4a2 0or > = i )o 4a2 "( i G i G i . > G > G > = n )%en "( nr = ' )%en i1 = i >1 = > Else i; = i >; = > End "( nr = nr . 1 End "( ,e2t ,e2t "( nr & 1 )%en 4s#Bo2 Str3(n) . "=" . Str3(i1) . "J" . Str3(>1) . "." . Str3 (i;) . "J" . Str3(>;) End "( ,e2t End Sub

Q!. CMMDC " 1&'? 9'.e+e '%$l$=I91 +ec'+2$:$%"%e"


Sub buton?_Click() im a !s "nte#er, b !s "nte#er, c !s "nte#er o a = "nputBo2("a = ", :) b = "nputBo2("b = ", :) a1 = a b1 = b *oop +ntil a & ' !nd b & ' !nd a & b c = euclid(a, b) "( c = 1 )%en 4s#Bo2 " nr1 sunt prime intre ele (" . Str3(a1) . "," . Str3(b1) . ")" Else 4s#Bo2 "Cmmdc (" . Str3(a1) . "," . Str3(b1) . ")=" . Str3 (euclid(a, b)) End "( End Sub

QK. F'9c8$" e'cl$1


0unction euclid(a !s "nte#er, b !s "nte#er) !s "nte#er im r !s "nte#er o r = a 4od b 4s#Bo2 r
<3<

a = b b = r *oop +ntil ,ot (r = ' !nd r = 1) "( r = 1 )%en euclid = 1 Else euclid = a End "( End 0unction

QP. CMMDC " 1&'? 9'.e+e '%$l$=I91 2c?1e+$ +e#e%"%e


Private Sub ButonD_Click() im a !s "nte#er, b !s "nte#er, c !s "nte#er o a = "nputBo2("a = ", :) b = "nputBo2("b = ", :) a1 = a b1 = b *oop +ntil a & ' !nd b & ' !nd a & b c = euclid1(a, b) "( c = 1 )%en 4s#Bo2 " nr1 sunt prime intre ele (" . Str3(a1) . "," . Str3(b1) . ")" Else 4s#Bo2 "Cmmdc (" . Str3(a1) . "," . Str3(b1) . ")=" . Str3 (euclid1(a, b)) End "( End Sub

! . F'9c8$" E'cl$1 '%$l$=I91 2c?1e+$ +e#e%"%e


0unction euclid1(a !s "nte#er, b !s "nte#er) !s "nte#er "( a & b )%en euclid1 = euclid1(a / b, b) Else "( a 5 b )%en euclid1 = euclid1(a, b / a) Else euclid1 = a End "( End "( End 0unction

!-. F'9c8$" E'cl$1 '%$l$=I91 2c?1e+$ +e#e%"%e


0unction euclid;(a !s "nte#er, b !s "nte#er) !s "nte#er "( b = ' )%en euclid; = a Else euclid; = euclid;(b, a 4od b) End "( End 0unction

!2. 7 [ W '%$l$=I91 '9 9'.?+ .$9$. 1e E9.'l8$+$


<3=

Sub Button1C_Click() im 2 !s "nte#er, : !s "nte#er, @ !s "nte#er, t !s Strin#, bb !s vector im 22 !s "nte#er o 2 = "nputBo2("a=", ib_title) : = "nputBo2("b=", ib_title) *oop +ntil (2 & ') !nd (: & ') !nd (2 &= :) ba@a1 2, :, bb, 22 t = "" 4s#Bo2 "n = " . Str3(22) 0or @ = 22 )o 1 Step /1 t = t . Str3(bb1v(@)) ,e2t 4s#Bo2 t End Sub

!>. Ve+$,$c? 1"c? '9 9'.?+ 9"%'+"l e2%e #"l$91+&.e 2"' 9'
Sub Button1<_Click() im n !s *on#, m !s *on# o n = "nputBo2("n=", ib_title) *oop +ntil (n & ') m = n "( palindrom(n) = )rue )%en 4s#Bo2 "n=" . Str3(m) . " este plaindrom" Else 4s#Bo2 "n=" . Str3(m) . " nu este plaindrom" End "( End Sub

!F. B"=" l" e7#&9e9%


Sub Button1=_Click() im 2 !s ouble, : !s B:te, @ !s ouble, t !s B:te o 2 = "nputBo2("ba@a=", ib_title) : = "nputBo2("e2ponent=", ib_title) *oop +ntil (2 & ') !nd (: & ') @ = putere(2, :, t) 4s#Bo2 Str3(@) . " " . Str3(t / 1) End Sub

!G. O'$cS2&+%
Sub Button1?_Click() im n !s "nte#er, a !s vector cit_n "n = ", n cit_date "a", n, a E4s#Bo2 "Sirul a este" tipar "Sirul a este", n, a divimp 1, n, a E4s#Bo2 "Sirul a sortat este" tipar "Sirul a sortat este", n, a End Sub
<33

!Q. M$9$.'l 1$9%+4'9 <$+ 1e 9'.e+e '%$l$=I91 1$:$1e e% $.#e+"


Sub Button1D_Click() im n !s "nte#er, a !s vector cit_n "n=", n cit_date "a", n, a E4s#Bo2 "Sirul a este" tipar "sirul dat este ", n, a 4s#Bo2 "minimul in Sirul a este" . Str3(minim(1, n)) End Sub

!!. T'+9'+$le 1$9 H"9&$


Sub Button;'_Click() im n !s "nte#er, a !s sir, b !s sir, c !s sir d = "" a1s = "!" b1s = "B" c1s = "C" n = "nputBo2("n=", ib_title) %anoi n, a, b, c 4s#Bo2 d End Sub

!K. S')+'%$9" H"9&$


Sub %anoi(n !s "nte#er, a !s sir, b !s sir, c !s sir) "( n = 1 )%en d = d . "(" . a1s . "/&" . b1s . ")," Else %anoi n / 1, a, c, b d = d . "(" . a1s . "/&" . b1s . ")," %anoi n / 1, c, b, a End "( End Sub

!P. S')+'%$9" )"cS #e9%+' #e+.'%?+$


Sub back_perm() im k !s "nte#er k = 1 init k, st $%ile k & ' o succesor am_suc, st, k "( am_suc = )rue )%en valid1 ev, st, k End "( *oop +ntil (,ot am_suc) -r (am_suc !nd ev) "( am_suc )%en "( solutie(k) )%en tipar_r Else k = k . 1 init k, st End "( Else
<39

k = k / 1 End "( $end End Sub

K . C"lc'l'l 2'.e$ -4-/-4-4-/VVVV./-4-4-4-4-4-4-VV.4Private Sub ButttonA_Click() im n !s "nte#er, ss !s Strin# cit_n "n = ", n ss = "" i = ' > = 1 $%ile (i 5 n) ss = ss . " 1" i = i . 1 k = 1 $%ile k 5= > !nd i 5 n ss = ss . " /1" i = i . 1 k = k . 1 $end > = > . 1
$end 4s#Bo2 ss End Sub

<3?

.i3liografie
F<.H &rassard, L., &ratley, P. \Algorithmic) @ "heory and Practice] , Prentice)^all, ngle0ood Cliffs, <AGG. F=.H Cormen, '.^., 1eiserson, C. ., @ivest, @.1. \8ntroduction to Algorithm)], '-e M$' Press, Cambridge, Mass-usetts, <AA= .eig-t- printing/. F3.H llis, M., *troustrup, &. \"he Annotated ,, Reference Eanual] , (ddison)eesley, @eading, <AA<. F9.H Lra-am, @.1., ]nut-, :. ., Patas-nik, J. \ oncrete Eathematic)], (ddison)eesley, @eading, <AGA. F?.H ^oro0itz, ., *a-ni, *. \=undamental) of omputer Algorithm)], Computer *cience Press, @ockville, <A>G. F;.H ]nut-, :. . \"ratat de programarea calculatoarelor' Algoritmi fundamentali], ditura 'e-nica, &ucuresti, <A>9. F>.H ]nut-, :. . \"ratat de programarea calculatoarelor' Sortare )i cautare], ditura 'e-nica, &ucuresti, <A>;. FG.H 1ippman, *. &. \ ,, Primer], (ddison)eesley, @eading, <AGA. FA.H 1ivovsc-i, 1., Leorgescu, ^. \Sinte%a )i anali%a algoritmilor], ditura *tiintifica si nciclopedica, &ucuresti, <AG;. F<C.H Morariu E, 1imbaje de programare, curs $:,=CC3 F<<.H *edge0ick, @. \Algorithm)], (ddison)eesley, @eading, <AGG. F<=.H *edge0ick, @. \Algorithm) in ], (ddison)eesley, @eading, <AAC. F<3.H *et-i, @. \Programming <anguage)' oncept) and on)truct)], (ddison)eesley, @eading, <AGA. F<9.H *mit-, V.^. \De)ign and Analy)i) of Algorithm)], Pe*)] E' Publis-ing Company, &oston, <AGA. F<?.H *tandis-, '.(. \Data Structure "echniWue)], (ddison)eesley, @eading, <A>A. F<;.H *troustrup, &. \"he ,, Programming <anguage], (ddison)eesley, @eading, <AA<. F<>.H *troustrup, &. \"he De)ign and 9volution of ,,], (ddison)eesley, @eading, <AA9. F<G.H -ttp:22t-or.info.uaic.ro2wdlucanu2

<3;

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