Sunteți pe pagina 1din 13

DESCRIEREA ALGORITMILOR Observatie.

Negru obligatoriu Rosu opional

2.1 Algoritm, program, programare Apariia primelor calculatoare electronice a constituit un salt uria n direcia automatizrii activitii umane. Nu exist astzi domeniu de activitate n care calculatorul s nu-i arate utilitatea. Calculatoarele pot fi folosite pentru a rezolva probleme, numai dac pentru rezolvarea acestora se concep programe corespunztoare de rezolvare. Termenul de program (programare) a suferit schimbri n scurta istorie a informaticii. Prin anii '60 problemele rezolvate cu ajutorul calculatorului erau simple i se gseau algoritmi nu prea complicai pentru rezolvarea lor. Prin program se nelegea rezultatul scrierii unui algoritm ntr-un limbaj de programare. Din cauza creterii complexitii problemelor, astzi pentru rezolvarea unei probleme adesea vom concepe un sistem de mai multe programe. Dar ce este un algoritm? O definiie matematic, riguroas, este greu de dat, chiar imposibil fr a introduce i alte noiuni. Vom ncerca n continuare o descriere a ceea ce se nelege prin algoritm. Ne vom familiariza cu aceast noiune prezentnd mai multe exemple de algoritmi i observnd ce au ei n comun. Cel mai vechi exemplu este algoritmul lui Euclid, algoritm care determin cel mai mare divizor comun a dou numere naturale. Evident, vom prezenta mai muli algoritmi, cei mai muli fiind legai de probleme accesibile absolvenilor de liceu. Vom constata c un algoritm este un text finit, o secven finit de propoziii ale unui limbaj. Din cauz c este inventat special n acest scop, un astfel de limbaj este numit limbaj de descriere a algoritmilor. Fiecare propoziie a limbajului precizeaz o anumit regul de calcul, aa cum se va observa atunci cnd vom prezenta limbajul Pseudocod. Oprindu-ne la semnificaia algoritmului, la efectul execuiei lui, vom observa c fiecare algoritm definete o funcie matematic. De asemenea, din toate seciunile urmtoare va reiei foarte clar c un algoritm este scris pentru rezolvarea unei probleme. Din mai multe exemple se va observa ns c, pentru rezolvarea aceleai probleme, exist mai muli algoritmi. Pentru fiecare problem P exist date presupuse cunoscute (date iniiale pentru algoritmul corespunztor, A) i rezultate care se cer a fi gsite (date finale). Evident, problema s-ar putea s nu aib sens pentru orice date iniiale. Vom spune c datele pentru care problema P are sens fac parte din domeniul D al algoritmului A. Rezultatele obinute fac parte dintr-un domeniu R, astfel c executnd algoritmul A cu datele de intrare xD vom obine rezultatele rR. Vom spune c A(x)=r i astfel algoritmul A definete o funcie A : D ---> R .

Algoritmii au urmtoarele caracteristici: generalitate, finitudine i unicitate. Prin generalitate se nelege faptul c un algoritm este aplicabil pentru orice date iniiale xD. Deci un algoritm A nu rezolv problema P cu nite date de intrare, ci o rezolv n general, oricare ar fi aceste date. Astfel, algoritmul de rezolvare a unui sistem liniar de n ecuaii cu n necunoscute prin metoda lui Gauss, rezolv orice sistem liniar i nu un singur sistem concret. Prin finitudine se nelege c textul algoritmului este finit, compus dintr-un numr finit de propoziii. Mai mult, numrul transformrilor ce trebuie aplicate unei informaii admisibile xD pentru a obine rezultatul final corespunztor este finit. Prin unicitate se nelege c toate transformrile prin care trece informaia iniial pentru a obine rezultatul rR sunt bine determinate de regulile algoritmului. Aceasta nseamn c fiecare pas din execuia algoritmului d rezultate bine determinate i precizeaz n mod unic pasul urmtor. Altfel spus, ori de cte ori am executa algoritmul, pornind de la aceeai informaie admisibil xD, transformrile prin care se trece i rezultatele obinute sunt aceleai. n descrierea algoritmilor se folosesc mai multe limbaje de descriere, dintre care cele mai des folosite sunt: - limbajul schemelor logice; - limbajul Pseudocod. n continuare vom folosi pentru descrierea algoritmilor limbajul Pseudocod care va fi definit n cele ce urmeaz. n ultima vreme schemele logice sunt tot mai puin folosite n descrierea algoritmilor i nu sunt deloc potrivite n cazul problemelor complexe. Prezentm ns i schemele logice, care se mai folosesc n manualele de liceu, ntruct cu ajutorul lor vom preciza n continuare semantica propoziiilor Pseudocod. 2.2 Scheme logice Schema logic este un mijloc de descriere a algoritmilor prin reprezentare grafic. Regulile de calcul ale algoritmului sunt descrise prin blocuri (figuri geometrice) reprezentnd operaiile (paii) algoritmului, iar ordinea lor de aplicare (succesiunea operaiilor) este indicat prin sgei. Fiecrui tip de operaie i este consacrat o figur geometric (un bloc tip) n interiorul creia se va nscrie operaia din pasul respectiv. Prin execuia unui algoritm descris printr-o schem logic se nelege efectuarea tuturor operaiilor precizate prin blocurile schemei logice, n ordinea indicat de sgei. n descrierea unui algoritm, deci i ntr-o schem logic, intervin variabile care marcheaz att datele cunoscute iniial, ct i rezultatele dorite, precum i alte rezultate intermediare necesare n rezolvarea problemei. ntruct variabila joac un rol central n programare este bine s definim acest concept. Variabila definete o mrime care i poate schimba valoarea n timp. Ea are un nume i, eventual, o valoare. Este posibil ca variabila nc s nu fi primit valoare, situaie n care vom spune c ea este neiniializat. Valorile pe care le poate lua variabila aparin unei mulimi D pe care o vom numi domeniul variabilei. Variabila este folosit cu un anumit scop, ea noteaz o anumit mrime, cu o anumit semnificaie. n concluzie o variabil este cunoscut prin (nume, domeniul D, valoare, semnificaie) unde valoare aparine mulimii D {nedefinit}. Pentru claritatea textului unui algoritm este important s se cunoasc semnificaia fiecrei variabile, s fie menionat expres aceast semnificaie. n nici un caz nu se recomand s se foloseasc acelai nume pentru

variabile cu semnificaii diferite, caz care provoc confuzii i chiar erori grave. Vom enuna acestea sub forma unor reguli cu care e bine s ne obinuim i s le respectm n activitatea de programare. R1. Cunoate i respect semnificaia fiecrei variabile. R2. Folosete denumiri diferite pentru variabile cu semnificaii diferite. Sau altfel spus, nu folosi aceeai denumire cu semnificaii diferite. Blocurile delimitatoare Start i Stop (Fig.2.2.1.a i 2.2.1.b) vor marca nceputul respectiv sfritul unui algoritm dat printr-o schem logic. Descrierea unui algoritm prin schem logic va ncepe cu un singur bloc Start i se va termina cu cel puin un bloc Stop. Blocurile de intrare/ieire Citete i Tiprete (Fig. 2.2.1.c i d) indic introducerea unor date de intrare respectiv extragerea unor rezultate finale. Ele permit precizarea datelor iniiale cunoscute n problem i tiprirea rezultatelor cerute de problem. Blocul Citete iniializeaz variabilele din lista de intrare cu valori corespunztoare, iar blocul Tiprete va preciza rezultatele obinute (la execuia pe calculator cere afiarea pe ecran a valorilor expresiilor din lista de ieire).

Fig.2.2.1. Blocurile schemelor logice

Blocurile de atribuire (calcul) se utilizeaz n descrierea operaiilor de atribuire (:=). Printr-o astfel de operaie, unei variabile var i se atribuie valoarea calculat a unei expresii expr (Fig.2.2.1.e). Evident c expresia din partea dreapt a semnului de atribuire trebuie s poat fi calculat, deci toate variabilele care apar n ea trebuie s aib o valoare, s fie iniializate. Una dintre greelile frecvente fcute de nceptori e folosirea unor variabile pe care uit s le iniializeze. Deci: R3. Nu folosi variabile neiniializate.

Blocurile de decizie marcheaz punctele de ramificaie ale algoritmului n etapa de decizie. Ramificarea poate fi dubl (blocul logic, Fig.2.2.1.f) sau tripl (blocul aritmetic, Fig. 2.2.1.g). Blocul de decizie logic indic ramura pe care se va continua execuia algoritmului n funcie de ndeplinirea (ramura Da) sau nendeplinirea (ramura Nu) unei condiii. Condiia care se va nscrie n blocul de decizie logic va fi o expresie logic a crei valoare poate fi una dintre valorile "adevrat" sau "fals". Blocul de decizie aritmetic va hotr ramura de continuare a algoritmului n funcie de semnul valorii expresiei aritmetice nscrise n acest bloc, care poate fi negativ, nul sau pozitiv. Blocurile de conectare marcheaz ntreruperile sgeilor de legtur dintre blocuri, dac din diverse motive s-au efectuat astfel de ntreruperi (Fig.2.2.1.h). Pentru exemplificare vom da n continuare dou scheme logice, corespunztoare unor algoritmi pentru rezolvarea problemelor P2.2.1 i P2.2.2. P2.2.1. S se rezolve ecuaia de grad doi aX2+bX+c=0 (a,b,cR i a0). Metoda de rezolvare a ecuaiei de gradul doi este cunoscut. Ecuaia poate avea rdcini reale, respectiv complexe, situaie recunoscut dup semnul discriminantului d = b2 - 4ac Algoritmul de rezolvare a problemei va citi mai nti datele problemei, marcate prin variabilele a, b i c. Va calcula apoi discriminantul d i va continua n funcie de valoarea lui d, aa cum se poate vedea n fig.2.2.2.

Fig.2.2.2. Algoritm pentru rezolvarea ecuaiei de gradul doi.

P2.2.2. S se calculeze suma elementelor pozitive ale unui ir de numere reale dat. Schema logic (dat n Fig.2.2.3) va conine imediat dup blocul START un bloc de citire, care precizeaz datele cunoscute n problem, apoi o parte care calculeaz suma cerut i un bloc de tiprire a sumei gsite, naintea blocului STOP. Partea care calculeaz suma S cerut are un bloc pentru iniializarea cu 0 a acestei sume, apoi blocuri pentru parcurgerea numerelor x1, x2, ... , xn i adunarea celor pozitive la suma S. Pentru aceast parcurgere se folosete o variabil contor i, care este iniializat cu 1 i crete mereu cu 1 pentru a atinge valoarea n, indicele ultimului numr dat. Schemele logice dau o reprezentare grafic a algoritmilor cu ajutorul unor blocuri de calcul. Execuia urmeaz sensul indicat de sgeat, putnd avea loc reveniri n orice punct din schema logic. Din acest motiv se poate obine o schem logic nclcit, greu de urmrit. Rezult importana compunerii unor scheme logice structurate (Dscheme, dup Djikstra), care s conin numai anumite structuri standard de calcul i n care drumurile de la START la STOP s fie uor de urmrit.

Fig.2.2.3. Algoritm pentru calculul unei sume. 2.3. Limbajul PSEUDOCOD

Limbajul Pseudocod este un limbaj inventat n scopul proiectrii algoritmilor i este format din propoziii asemntoare propoziiilor limbii romne, care corespund structurilor de calcul folosite n construirea algoritmilor. Acesta va fi limbajul folosit de noi n proiectarea algoritmilor i va fi definit n cele ce urmeaz. innd seama c obinerea unui algoritm pentru rezolvarea unei probleme nu este ntotdeauna o sarcin simpl, c n acest scop sunt folosite anumite metode pe care le vom descrie n capitolele urmtoare, n etapele intermediare din obinerea algoritmului vom folosi propoziii curente din limba romn. Acestea sunt considerate elemente nefinisate din algoritm, asupra crora trebuie s se revin i le vom numi propoziii nestandard. Deci limbajul Pseudocod are dou tipuri de propoziii: propoziii standard, care vor fi prezentate fiecare cu sintaxa i semnificaia (semantica) ei i propoziii nestandard. Aa cum se va arta mai trziu, propoziiile nestandard sunt texte care descriu pri ale algoritmului nc incomplet elaborate, nefinisate, asupra crora urmeaz s se revin. Ele se recunosc prin faptul c ncep ntotdeauna cu semnul '@' i se termin cu punctul obinuit (caracterul '.'). Pe lng aceste propoziii standard i nestandard, n textul algoritmului vom mai introduce propoziii explicative, numite comentarii. Pentru a le distinge de celelalte propoziii, comentariile vor fi nchise ntre acolade. Rolul lor va fi explicat puin mai trziu. Propoziiile standard ale limbajului Pseudocod folosite n aceast lucrare, corespund structurilor de calcul prezentate n figura 2.3.1 i vor fi prezentate n continuare. Fiecare propoziie standard ncepe cu un cuvnt cheie, aa cum se va vedea n cele ce urmeaz. Pentru a deosebi aceste cuvinte de celelalte denumiri, construite de programator, n acest capitol vom scrie cuvintele cheie cu litere mari. Menionm c propoziiile simple se termin cu caracterul ';' n timp ce propoziiile compuse, deci cele n interiorul crora se afl alte propoziii, au un marcaj de sfrit propriu. De asemenea, menionm c propoziiile limbajului Pseudocod vor fi luate n seam n ordinea ntlnirii lor n text, asemenea oricrui text al limbii romne. Prin execuia unui algoritm descris n Pseudocod se nelege efectuarea operaiilor precizate de propoziiile algoritmului, n ordinea citirii lor (de sus n jos i de la stnga spre dreapta). n figura 2.3.1, prin A, B s-au notat subscheme logice, adic secvene de oricte structuri construite conform celor trei reguli menionate n continuare. Structura secvenial (fig.2.3.1.a) este redat prin concatenarea propoziiilor, simple sau compuse, ale limbajului Pseudocod, care vor fi executate n ordinea ntlnirii lor n text. Propoziiile simple din limbajul Pseudocod sunt CITETE, TIPARETE, FIE i apelul de subprogram. Propoziiile compuse corespund structurilor alternative i repetitive. Structura alternativ (fig.2.3.1.b) este redat n Pseudocod prin propoziia DAC, prezentat n seciunea 2.3.2, iar structura repetitiv din fig.2.3.1.c este redat n Pseudocod prin propoziia CTTIMP, prezentat n seciunea 2.3.3. Bohm i Jacopini [Bohm66] au demonstrat c orice algoritm poate fi descris folosind numai aceste trei structuri de calcul. Propoziiile DATE i REZULTATE sunt folosite n faza de specificare a problemelor, adic enunarea riguroas a acestora.

Figura 2.3.1. Structurile elementare de calcul Propoziia DATE se folosete pentru precizarea datelor iniiale, deci a datelor considerate cunoscute n problem (numite i date de intrare) i are sintaxa: DATE list ; unde list conine toate numele variabilelor a cror valoare iniial este cunoscut. n general, prin list se nelege o succesiune de elemente de acelai fel desprite prin virgul. Deci n propoziia DATE, n dreapta acestui cuvnt se vor scrie acele variabile care marcheaz mrimile cunoscute n problem. Pentru precizarea rezultatelor dorite se folosete propoziia standard REZULTATE list ; n construcia "list" ce urmeaz dup cuvntul REZULTATE fiind trecute numele variabilelor care marcheaz (conin) rezultatele cerute n problem. Acum putem preciza mai exact ce nelegem prin cunoaterea complet a problemei de rezolvat. Evident, o problem este cunoscut atunci cnd se tie care sunt datele cunoscute n problem i ce rezultate trebuiesc obinute. Deci pentru cunoaterea unei probleme este necesar precizarea variabilelor care marcheaz date considerate cunoscute n problem, care va fi reflectat printr-o propoziie DATE i cunoaterea exact a cerinelor problemei, care se va reflecta prin propoziii REZULTATE. Variabilele prezente n aceste propoziii au anumite semnificaii, presupuse cunoscute. Cunoaterea acestora, scrierea lor explicit, formeaz ceea ce vom numi n continuare specificarea problemei. Specificarea unei probleme este o activitate foarte important dar nu i simpl. De exemplu, pentru rezolvarea ecuaiei de gradul al doilea, specificarea problemei, scris de un nceptor, poate fi: DATE a,b,c; REZULTATE x1,x2; { Coeficienii ecuaiei } { Rdcinile ecuaiei }

Aceast specificaie este ns incomplet. Nu ntotdeauna ecuaia are rdcini reale. n cazul n care rdcinile sunt complexe putem nota prin x1, x2 partea real, respectiv partea imaginar a rdcinilor. Sau pur i simplu, nu ne intereseaz valoarea rdcinilor n acest caz, ci doar faptul c ecuaia nu are rdcini reale. Cu alte cuvinte avem nevoie de un mesaj care s ne indice aceast situaie (vezi schema logic 2.2.2), sau de un

indicator, fie el ind. Acest indicator va lua valoarea 1 dac rdcinile sunt reale i valoarea 0 n caz contrar. Deci specificaia corect a problemei va fi { Coeficienii ecuaiei } {ind=1 pt. rdcini reale, 0 pt complexe} {Rdcinile ecuaiei, n cazul ind=1, respectiv} {partea real i cea imaginar n cazul ind=0} Evident c specificarea problemei este o etap important pentru gsirea unei metode de rezolvare i apoi n proiectarea algoritmului corespunztor. Nu se poate rezolva o problem dac aceasta nu este bine cunoscut, adic nu avem scris specificarea problemei. Cunoate complet problema este prima regul ce trebuie respectat pentru a obine ct mai repede un algoritm corect pentru rezolvarea ei. Deci R4. Cunoate complet problema ce se dorete a fi rezolvat. 2.3.1. Algoritmi liniari Propoziiile CITETE i TIPRETE sunt folosite pentru iniializarea variabilelor de intrare cu datele cunoscute n problem, respectiv pentru tiprirea (aflarea) rezultatelor obinute. n etapa de programare propriu-zis acestor propoziii le corespund ntr-un limbaj de programare instruciuni de intrare-ieire. Propoziia CITETE se folosete pentru precizarea datelor iniiale, deci a datelor considerate cunoscute n problem (numite i date de intrare) i are sintaxa: CITETE list ; unde list conine toate numele variabilelor a cror valoare iniial este cunoscut. Deci n propoziia CITETE, n dreapta acestui cuvnt se vor scrie acele variabile care apar n propoziia DATE n specificarea problemei. Se subnelege c aceste variabile sunt iniializate cu valorile cunoscute corespunztoare. Pentru aflarea rezultatelor dorite, pe care calculatorul o va face prin tiprirea lor pe hrtie sau afiarea pe ecran, se folosete propoziia standard TIPRETE list ; n construcia list ce urmeaz dup cuvntul TIPRETE fiind trecute numele variabilelor a cror valori dorim s le aflm. Ele sunt de obicei rezultatele cerute n problem, specificate i n propoziia REZULTATE. Blocului de atribuire dintr-o schem logic i corespunde n Pseudocod propoziia standard [FIE] var := expresie ; Aceast propoziie este folosit pentru a indica un calcul algebric, al expresiei care urmeaz dup simbolul de atribuire ":=" i de atribuire a rezultatului obinut variabilei var. Expresia din dreapta semnului de atribuire poate fi orice expresie algebric simpl, cunoscut din manualele de matematic din liceu i construit cu cele patru operaii: adunare, scdere, nmulire i mprire (notate prin caracterele +, -, *, respectiv /). DATE a,b,c; REZULTATE ind, x1,x2;

Prin scrierea cuvntului FIE ntre paranteze drepte se indic posibilitatea omiterii acestui cuvnt din propoziie. El s-a folosit cu gndul ca fiecare propoziie s nceap cu un cuvnt al limbii romne care s reprezinte numele propoziiei. De cele mai multe ori vom omite acest cuvnt. Atunci cnd vom scrie succesiv mai multe propoziii de atribuire vom folosi cuvntul FIE numai n prima propoziie, omindu-l n celelalte. Din cele de mai sus rezult c o variabil poate fi iniializat att prin atribuire (deci dac este variabila din stnga semnului de atribuire :=) ct i prin citire (cnd face parte din lista propoziiei CITETE). O greeal frecvent pe care o fac nceptorii este folosirea variabilelor neiniializate. Evident c o expresie n care apar variabile care nu au valori nu poate fi calculat, ea nu este definit. Deci nu folosii variabile neiniializate. Pentru a marca nceputul descrierii unui algoritm vom folosi propoziia: ALGORITMUL nume ESTE: fr a avea o alt semnificaie. De asemenea, prin cuvntul SFALGORITM vom marca sfritul unui algoritm. Algoritmii care pot fi descrii folosind numai propoziiile prezentate mai sus se numesc algoritmi liniari. Ca exemplu de algoritm liniar prezentm un algoritm ce determin viteza v cu care a mers un autovehicul ce a parcurs distana D n timpul T. ALGORITMUL VITEZA ESTE: CITETE D,T; FIE V:=D/T; TIPRETE V SFALGORITM 2.3.2 Algoritmi cu ramificaii Foarte muli algoritmi execut anumite calcule n funcie de satisfacerea unor condiii. Aceste calcule sunt redate de structura alternativ prezentat n figura 2.3.1.b, creia i corespunde propoziia Pseudocod DAC cond ATUNCI A ALTFEL B SFDAC sau varianta redus a ei, DAC cond ATUNCI A SFDAC folosit n cazul n care grupul de propoziii B este vid. Aceste propoziii redau n Pseudocod structura alternativ de calcul. Ele cer mai nti verificarea condiiei scrise dup cuvntul DAC. n caz c aceast condiie este adevrat se va executa grupul de propoziii A. n cazul n care aceast condiie este fals se va executa grupul de propoziii B, dac este prezent ramura ALTFEL. Indiferent { A1: Calculeaz viteza } { D = Distana (spaiul) } { T = Timpul; V = Viteza } { v:= spaiu/timp }

care dintre secvenele A sau B a fost executat, se va continua cu propoziia urmtoare propoziiei DAC. O generalizare a structurii alternative realizat de propoziia DAC este structura selectiv: SELECTEAZ i DINTRE v1: A1; v2: A2; ... vn: An SFSELECTEAZ structur echivalent cu urmtorul text Pseudocod: DAC i=v1 ATUNCI A1 ALTFEL DAC i=v2 ATUNCI A2 ALTFEL . . . DAC i=vn ATUNCI An SFDAC ... SFDAC SFDAC Cu propoziiile prezentate pn aici putem deja descrie destui algoritmi. Acetia se numesc algoritmi cu ramificaii. Ca exemplu vom scrie un algoritm pentru rezolvarea ecuaiei de gradul al doilea. Am scris mai sus specificaia acestei probleme i am precizat semnificaia variabilelor respective. Pe lng aceste variabile, pentru rezolvarea problemei mai avem nevoie de dou variabile auxiliare: delta - pentru a reine discriminantul ecuaiei; r - pentru a reine valoarea radicalului folosit n exprimarea rdcinilor. Ajungem uor la algoritmul dat n continuare. ALGORITMUL ECGRDOI ESTE: CITETE a,b,c; FIE delta:=b*b-4*a*c; DAC delta<0 ATUNCI ind:=0; @r:=radical din (-delta); x1:=-b/(a+a); x2:=r/(a+a); ALTFEL ind:=1; @r:=radical din delta; x1:=(-b-r)/(a+a); x2:=(-b+r)/(a+a); SFDAC TIPRETE ind, x1,x2; SFALGORITM { Algoritmul 2: Rezolvarea } { ecuaiei de gradul doi } { a,b,c = coeficienii ecuaiei } {Cazul rdcini complexe }

{cazul rdcini reale }

2.3.3 Algoritmi ciclici n rezolvarea multor probleme trebuie s efectum aceleai calcule de mai multe ori, sau s repetm calcule asemntoare. De exemplu, pentru a calcula suma a dou matrice va trebui s adunm un element al primei matrice cu elementul de pe aceeai poziie din a doua matrice, aceast adunare repetndu-se pentru fiecare poziie. Alte calcule trebuiesc repetate n funcie de satisfacerea unor condiii. n acest scop n limbajul Pseudocod exist trei propoziii standard: CTTIMP, REPET i PENTRU. Propoziia CTTIMP are sintaxa CTTIMP cond EXECUT A SFCT i cere execuia repetat a grupului de propoziii A, n funcie de condiia "cond". Mai exact, se evalueaz condiia "cond"; dac aceasta este adevrat se execut grupul A i se revine la evaluarea condiiei. Dac ea este fals execuia propoziiei se termin i se continu cu propoziia care urmeaz dup SFCT. Dac de prima dat condiia este fals grupul A nu se va executa niciodat, altfel se va repeta execuia grupului de propoziii A pn cnd condiia va deveni fals. Din cauz c nainte de execuia grupului A are loc verificarea condiiei, aceast structur se mai numete structur repetitiv condiionat anterior. Ea reprezint structura repetitiv prezentat n figura 2.3.1.c. Ca exemplu de algoritm n care se folosete aceast propoziie dm algoritmul lui Euclid pentru calculul celui mai mare divizor comun a dou numere. ALGORITMUL Euclid ESTE: CITETE n1,n2; FIE d:=n1; i:=n2; CTTIMP i0 EXECUT r:=d modulo i; d:=i; i:=r SFCT TIPRETE d; SFALGORITM {A3: Cel mai mare divizor comun} {Cele dou numere a cror divizor se cere}

{ d= cel mai mare divizor comun} {al numerelor n1 i n2 }

n descrierea multor algoritmi se ntlnete structura repetitiv condiionat posterior: REPET A PNCND cond SFREP structur echivalent cu: A CTTIMP not(cond) EXECUT A SFCT Deci ea cere execuia necondiionat a lui A i apoi verificarea condiiei "cond". Va avea loc repetarea execuiei lui A pn cnd condiia devine adevrat. Deoarece condiia se verific dup prima execuie a grupului A aceast structur este numit structura repetitiv condiionat posterior, prima execuie a blocului A fiind necondiionat.

Ca exemplu de algoritm n care se folosete aceast propoziie vom scrie un algoritm pentru aproximarea numrului e cu o precizie dat de numrul eps pozitiv, folosindu-ne de dezvoltarea n serie: e = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n! + ... Specificaia problemei n limbajul Pseudocod este: DATE eps ; { eps>0 } REZULTATE ve; { aproximarea seriei cu o eroare < eps } { deci r=e-ve<eps } Pentru rezolvarea problemei trebuie s tim c restul rn din scrierea e = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n! + ... + rn = sn este mai mic dect ultimul termen adunat la sn, deci rn<tn, unde tn=1/n!. Variabilele auxiliare folosite n descrierea algoritmului sunt: n - precizeaz ultima fracie adunat; t - este valoarea acestei fracii. ALGORITMUL NRE ESTE: { A4:Calculul lui e cu precizia eps } CITETE eps; { eps > 0 } FIE ve:=2.5; t:=0.5; n:=2; REPET n:=n+1 t:=t/n; ve:=ve+t; PNCND t<eps SFREP TIPRETE ve; SFALGORITM O alt propoziie care cere execuia repetat a unei secvene A este propoziia PENTRU c:=li ;lf [;p] EXECUT A SFPENTRU Ea definete structura repetitiv predefinit, cu un numr determinat de execuii ale grupului de propoziii A i este echivalent cu secvena c:=li ; final:=lf ; REPET A c:=c+p PNCND (c>final i p>0) sau (c<final i p<0) SFREP Se observ c, n sintaxa propoziiei PENTRU, pasul p este nchis ntre paranteze drepte. Prin aceasta indicm faptul c el este opional, putnd s lipseasc. n cazul n care nu este prezent, valoarea lui implicit este 1. Semnificaia propoziiei PENTRU este clar. Ea cere repetarea grupului de propoziii A pentru toate valorile contorului c cuprinse ntre valorile expresiilor li i lf (calculate o singur dat nainte de nceperea ciclului), cu pasul p. Se subnelege c nu trebuie s modificm valorile contorului n nici o propoziie din grupul A. De multe ori aceste expresii sunt variabile simple, iar unii programatori modific n A valorile acestor variabile, nclcnd semnificaia propoziiei PENTRU. Deci,

R5. Nu recalcula limitele i nu modifica variabila de ciclare (contorul) n interiorul unei structuri repetitive PENTRU. S observm, de asemenea, c prima execuie a grupului A este obligatorie, abia dup modificarea contorului verificndu-se condiia de continuare a execuiei lui A. Ca exemplu, s descriem un algoritm care gsete minimul i maximul componentelor unui vector de numere reale. Vom nota prin X acest vector, deci X = (x1, x2, ... , xn) Specificaia problemei este urmtoarea: DATE n,(xi ,i=1,n); REZULTATE valmin,valmax; iar semnificaia acestor variabile se nelege din cele scrise mai sus. Pentru rezolvarea problemei vom examina pe rnd cele n componente. Pentru a parcurge cele n componente avem nevoie de un contor care s precizeze poziia la care am ajuns. Fie i acest contor. Uor se ajunge la urmtorul algoritm: ALGORITMUL MINMAX ESTE: CITETE n,(xi,i=1,n); FIE valmin:=x1; valmax:=x1; PENTRU i:=2,n EXECUT DAC xi<valmin ATUNCI valmin:=xi SFDAC DAC xi>valmax ATUNCI valmax:=xi SFDAC SFPENTRU TIPRETE valmin,valmax; SFALGORITM Un rol important n claritatea textului unui algoritm l au denumirile alese pentru variabile. Ele trebuie s reflecte semnificaia variabilelor respective. Deci alege denumiri sugestive pentru variabile, care s reflecte semnificaia lor. Putem formula astfel regula R6. Alege denumiri sugestive pentru variabile n exemplul de mai sus denumirile valmin i valmax spun cititorului ce s-a notat prin aceste variabile. { Algoritmul 5: Calculul } { valorii minime i maxime }

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