Sunteți pe pagina 1din 49

Laborator - Algoritmi

ALGORITMI
Scopul: Prezentarea metodelor de alctuire a algoritmilor i de rezolvare a problemelor cu ajutorul acestora. Obiective: Partea I-a - Definiia algoritmilor. Reprezentarea algoritmilor. Clasificare. - Algoritmi secveniali. - Algoritmi ramificai. - Algoritmi repetitivi. - Algoritmi pentru prelucrarea tablourilor de date(unidimensionale i bidimensionale) Partea a II-a - Algoritmi de sortare? - Algoritmi specifici metodelor numerice Partea a III-a ( facultativ) - Tehnici de programare. ?Algoritmi specifici?. Partea I-a 1. ALGORITM: DEFINIIE, REPREZENTARE, CLASIFICARE. 1.1 Definiie: Algoritmul poate fi definit ca o succesiunea finita de pai care trebuie parcurs pentru a obine, pornind de la datele iniiale (numite i date de intrare) informaiile pe care dorim s le determinm prin calcul (date de ieire). Algoritmul se obine prin completarea modelului matematic cu operaiile necesare rezolvrii complete a problemei (introducerea datelor, verificarea corectitudinii datelor de intrare, verificarea altor condiii impuse de modelul matematic i necesare parcurgerii acestuia, afiarea rezultatelor, apelarea unor funcii predefinite n limbajul de programare ales etc.). Obs. Alctuirea algoritmului precede n mod obligatoriu scrierea programului de calcul. 1.2 Etapele alctuirii algoritmului de rezolvare a unei probleme Pentru o alctuire corect ma algoritmului de rezolvare a unei probleme este necesar s se parcurg urmtoarele etape: - nelegerea textului problemei; - precizarea mrimilor (datelor) care sunt cunoscute (date iniiale sau date de intrare); - precizarea mrimilor cerute,a cror valoare se calculeaz (date de ieire);
1

Laborator - Algoritmi

- stabilirea relaiei(lor) de calcul pentru fiecare mrime cutat,eventual i pentru mrimi intermediare(modelul matematic); alegerea identificatorului(numelui) pentru fiecare variabil care intervine n modelul matematic; - reprezentarea algoritmului (pseudocod i organigram); - verificarea algoritmului prin parcurgerea tabelului de verificare i compararea rezultatelor cu valorile obinute prin rezolvarea direct a problemei. 1.3 Reprezentarea algoritmilor Modalitile de codificare a algoritmilor sunt diverse. Cele mai folosite dintre acestea sunt:pseudocodul i schema logic. a. Pseudocodul este o reprezentare semantic a operaiilor. Aceast form este cea mai apropiat de programul de calcul. b. Schema logic (organigrama) este reprezentarea algoritmului sub forma unei succesiuni de simboluri grafice interconectate.Fiecare operaie este indicat printr-un simbol grafic distinct. Facem observaia c operaia de codificare a algoritmilor nu este nc complet standardizat. De aceea n unele cri s-ar putea gsi alte variante dect acelea folosite n cadrul acestui referat. 1.4 Clasificarea algoritmilor Organizarea unui algoritm este determinat de: problema de rezolvat, modelul matematic ales, limbajul de programare folosit pentru implementare. Cea mai utilizat form de alctuire este aceea a evidenierii n cadrul algoritmului numai a unor blocuri de operaii tip. Aceste se numesc structuri fundamentale (tip)i sunt: - structura secvenial; - structura de decizie; - structura repetitiv (cu cele trei variante: contorizare, test anterior, test posterior ). Algoritmii organizai numai sub forma structurilor tip interconectate se numesc algoritmi structurai. Deoarece n toate limbajele de programare exist instruciuni care codific direct structurile tip menionate mai sus, n prezent pentru alctuirea programelor de calcul se folosesc numai algoritmi structurai. 2. CODIFICAREA ALGORITMILOR 2.1. Structura secvenial include operaiile de: - citirea date de intrare; - calculul valorii unei/unor expresii i atribuirea valorii unei/unor variabile; - afiarea rezultatelor;

Laborator - Algoritmi

n figura 1 se indic reprezentarea unui algoritm secvenial sub forma de pseudocod (1.a) i schem logic (1.b)

Reprezentarea unui algoritm secvenial Ex. 1.S-a depus la o banc suma de b lei pe termen de 6 luni. Cunoscnd c dobnda anual oferit de banc este de 23%, s se determine suma aflat n cont la sfritul termenului de depunere. Etapele rezolvrii problemei a) Definirea datelor de intrare/ieire Date de intrare : - suma iniial de bani b [n lei] - dobnda anual db=23% - termenul de depunere n=6 luni Date de ieire: - Suma final n cont bf [n mii lei] b) Modelul matematic 23 - dobnda lunar dl = % 12 dl dl = b1 + - suma n cont dup prima lun s1 = b + b 100 100 - suma final dup n luni este obinut din relaia anterioar, n 1 dl b1 + considernd creterea lunar a valorii aflate n cont bf = 1000 100 Tem S se demonstreze formula de calcul a lui bf. c) Reprezentarea algoritmului:

Laborator - Algoritmi

Codificarea algoritmului sub form de program de calcul i execuia programului vor fi prezentate n lucrarea de laborator nr. 4 Observaii 1. Se observ c n etapele a i b se aleg identificatorii mrimilor cu care se opereaz n rezolvarea problemei(b,db,n). 2. Este de dorit ca aceste nume s fie scrise numai cu litere mici. 3. n etapele a, b se precizeaz care sunt mrimile cu care opereaz programul: - datele iniiale(b,db,n) - datele finale(bf) - datele intermediare, dac este necesar(dl,s1) De asemenea se precizeaz care sunt mrimile : - constante - variabile Constantele pot fi introduse direct prin valorile lor(12,100,etc)sau printr-un identificator propriu(db=23). Variabilele se definesc i se folosesc n alctuirea expresiilor de calcul numai prin intermediul identificatorilor(b,n,dl). 4. Alegerea valorilor datelor iniiale i alctuirea expresiilor de calcul implic i precizarea unitilor de msur. 5. Se observ c alctuirea algoritmului este condiionat n primul rnd de posibilitatea alctuirii unor relaii de calcul pentru mrimile care se determin (variabile intermediare sau de ieire)
Ex. 2. Fie z1=a1+b1i, z2=a2+b2i dou numere complexe. Se cere s se calculeze z=z1*z2. Etapele rezolvrii problemei a) Definirea datelor de intrare/ieire Date de intrare : - a1,b1,a2,b2
4

Laborator - Algoritmi

Date de ieire: - Rezultatul operatiei matematice z=z1*z2 b) Modelul matematic z1=a1+b1i, z2=a2+b2i z=z1*z2=zre+zimi Forma general a unui numr complex. Prin nmulirea a dou numere complexe se obine tot un numr complex. z=z1*z2=(a1+b1i)*(a2+b2i)=a1a2+a1b2i+a2b1i+b1b2i*i=a1a2+a1b2i+a2b1i-b1b2= (a1a2- b1b2)+(a1b2 + a2b1)i Identificm, zre=a1a2- b1b2 zim= a1b2 + a2b1 c) Reprezentarea algoritmului:
Mai nti se aleg variabilele pentru fiecare data (de intrare, ieire sau auxiliar): Date Identificatori de variabile corespunztori a1 a1 b1 b1 a2 a2 b2 b2 zre zre zim zim

Laborator - Algoritmi

d) Tabel de verificare:
Instruciuni Citete a1,b1,a2,b2 Afieaz a1,b1,a2,b2 zre=a1a2-b1b2 zim=a1b2+ a2b1 Afieaz zre+izim STOP Pas a1=2 b1=1 a2=5,b2=-1 2 1 5 -1 zre=2*5-1*(-1)=11 zim=2*(-1)+5*1=-2+5=3 11+i3 STOP

Observaii

1. Se observ c n etapele a i b se aleg identificatorii mrimilor cu care se opereaz n rezolvarea problemei(a1,b1,a2,b2,zre,zim...). 2. Este de dorit ca aceste nume s fie scrise numai cu litere mici. Se observ c n reprezentarea algoritmului nu s-au folosit indici pentru variabile(cu ar fi a1,b1,a2,b2,zre,zim). Motivul este c n programarea reala n orice limbaj (C, Pascal, ADA, Prolog, etc), nu se pot folosi indici pentru variabile. Ca atare este recomandat ca i n alctuirea algoritmilor(scheme logice, pseudocod) s nu se foloseasc astfel de notaii pentru a nu crea confuzii cnd se vor scrie programele, mai ales de ctre nceptori. 3. n etapele a, b se precizeaz care sunt mrimile cu care opereaz programul: - datele iniiale(a1,b1,a2,b2) - datele finale(zre,zim) 4. Se observ ca la afiarea rezultatului se scrie +i. Pentru calculator i nu exist(nu se poate face radical dintr-un numr negativ). Textul dintre ghilimele va fi afisat pe ecran exact asa cum a fost scris. Presupunnd ca zre=4 si zim=2 pe ecran va aprea mesajul: 4+i2 5. Concluzie : variabilele care primesc valori nu se afiseaz ntre ghilimele, pe cnd mesajele care se doresc a fi afiate pe ecran se scriu ntre ghilimele.

Laborator - Algoritmi

2.2 Structura de decizie (se mai numete i structur alternativ sau structur ramificat) introduce n algoritm operaia de ramificare, adic evaluarea unei condiii (notat test n cele ce urmeaz), stabilirea valorii adevrat sau fals a acesteia i adoptarea unei decizii privind modul n care se continu calculele. Definirea structurii instruciunii de decizie: n fig.2 este prezentat reprezentarea unei structuri de decizie care se bazeaz pe verificarea condiiei test ? n pseudocod (2.a), respectiv schem logic(2.b)

1.a pseudocod Fig. 2

2.b schem logic

Structura instruciunii de decizie: Structura obligatorie a secvenei de decizie este: - o condiie notat test ? - dou subblocuri de instruciuni (notate aciune 1 , aciune 2) a cror interpretare este decis de valoarea logic a condiiei DA/NU; (adevrat/fals; true/false). Niciodat nu se pot interpreta i executa ambele subblocuri. Condiia de test poate fi o expresie : - relaional (x>4) ; (x<=-7) ; - logic ((x>= -1) and (x<1)) ; ((x<-1) or (x>=1)) . Expresiile logice includ :operatori relaionali (<,>,>=,<=,=,) i/sau operatori logici : intersecia (produs logic, and, i) ; reuniunea (suma logic, or, sau) respectiv negarea logic( not ). Interpretarea instruciunii de decizie: Interpretarea structurii ramificate presupune efectuarea urmtoarelor operaii : - evaluarea condiiei de decizie (test?); - executarea subblocului de instruciuni corespunztoare valorii logice obinute n urma evalurii testului (aciune 1 sau aciune 2); - continuarea algoritmului cu instruciunea imediat urmtoare structurii de selecie, respectiv aciune 3.

Laborator - Algoritmi

Instruciunea de ramificare poate avea i urmtoarele variante de alctuire: - subblocurile de instruciuni pot conine i numai o singur instruciune; - se neglijeaz subblocul de instruciuni corespunztor ramurii neselectate; - exist posibilitatea ca secvena de decizie s fie alctuit dintr-un singur subbloc de instruciuni (fig. 3 unde lipsete subblocul aciune 2).

3.a pseudocod Fig. 3

3.b schem logic

Ex. 3. S se rezolve ecuaia de gradul I (a*x + b = 0)n ipoteza considerrii tuturor variantelor posibile ale datelor de intrare. a) Definirea datelor de intrare/ieire Date de intrare : a,b Date de ieire: x b) Modelul matematic. Ecuaia de gradul I este ax+b=0.Sub aceast form rezolvarea ecuaiei nu poate fi efectuat printr-un program de calcul. Algoritmul de calcul nu poate include dect relaii de calcul pentru mrimile necunoscute. Deci se alctuiete b relaia: x = . a b daca a0 atunci x = a dac a=0, atunci avem 2 cazuri: dac b=0, ecuaia devine 0*x+0=0, ecuaia are o infinitate de soluii. dac b0, ecuaia nu are soluii (este o imposibilitate).

Laborator - Algoritmi

c)Reprezentarea algoritmului

d)Tabel de verificare
operaii citete a citete b a=0? DA b=0? DA NU x=-b/a afieaz x afi. Ec. are o inf. sol afi. Ec. nu are sol Stop x=-2/4 -0,5 NU a=4 b=2 4=0? Nu -

Stop

2.3. Structura repetitiv: Problemele rezolvate cu ajutorul SC necesit parcurgerea repetat a unor grupuri de instruciuni de calcul i de decizie. Pentru o programare mai convenabil n limbajele de programare s-au definit structurile repetitive.
9

Laborator - Algoritmi

n toate limbajele de programare sunt definite trei structuri tip pentru secvena repetitiv(fig.4a,4b i 4c): structura cu, contorizare; structura cu test iniial (anterior); structura cu test final (posterior).

Fig. 4 Structurile repetitive Din fig.4 rezult c algoritmii celor trei tipuri de structuri repetitive au urmtoarele elemente comune: corpul ciclului sau blocul de instruciuni care se repet; evaluarea variabilelor care definesc condiia de oprire; testul de oprire (condiia). De aceea, printr-o reaezare a algoritmului exist posibilitatea trecerii la o alt form a structurii repetitive. n acelai timp se atrage atenia c, de la un limbaj de programare la altul se pot ntlni unele diferene n ceea ce privete sintaxa i execuia instruciunilor prin care sunt codificate structurile repetitive. 2.3.1. Structura repetitiv cu contorizare Aceast structur este avantajoas pentru rezolvarea problemelor n care se cunoate cu exactitate numrul de parcurgeri (pai) repetate ale instruciunilor din corpul ciclului. Se pot defini structuri repetitive controlate de un singur contor( bucl simpl) sau de dou sau mai multe contoare(cicluri suprapuse).Structurile cu contorizare sunt folosite n special n problemele care prelucreaz tablouri de date.

10

Laborator - Algoritmi

n figura 5 este reprezentat structura repetitiv cu contorizare simpl.

5a pseudocod

5b organigrama

Fig. 5 Structura repetitiv cu contorizare are urmtoarele elemente: - o variabil contor i de preferin cu valori ntregi; - un interval nchis ( [iiniial , ifinal]); - condiia de test; - subblocul aciune 1 care conine instruciunile care se repet; - ipas reprezint pasul cu care se va modifica variabila i dup fiecare ciclare.De regul ipas = 1 (incrementare / decrementare).n acest caz valoarea ipas=1 nu este reprezentat exlicit n pseudocod(fig.5.a). Interpretare: - se iniializeaz variabila cu valoarea iiniial; - se verific condiia de test i [i initial , i final ] ; - dac testul are valoarea DA(adevrat) se execut aciune 1; - se modific valoarea variabilei i cu pasul ales; - se revine automat al verificarea testului; - pentru valoarea NU(fals) a testului se ncheie secvena repetitiv , iar programul se continu cu instruciunea imediat urmtoare structurii ciclice(aciune 2). Obs. - Instruciunea este cu test anterior; - dac i nu aparine intervalului ales, instruciunile din corpul buclei (aciune 1) nu se vor executa. - instruciunile de iniializare, cretere i verificare a contorului sunt incluse automat n program de ctre SC.Deci, dei sunt reprezentate n algoritm, aceste instruciuni nu apar explicit n programul de calcul; - introducerea de ctre programator a unor instruciuni de modificare a contorului duce la o execuie eronat a testului, nesemnalizat de ctre SC; - acelai efect l are includerea n algoritm a condiiei de test printr-o instruciune de decizie.

11

Laborator - Algoritmi

Ex. 4 Sa se determine valoarea expresiei S = i 3


i =1

a) Date de intrare : n b) Date de ieire: S c) Model matematic:


S = 1 + 2 + 3 + ............. + n = i 3
3 3 3 3 i =1 n

d) Reprezentarea algoritmului :

pseudocod
Obs.

schema logic

- Instruciunea s=0 este obligatorie. n absenta acesteia valoarea finala obinut pentru suma s este eronat(s se explice aceasta ?) ; - instruciunea s=s+i3 se interpreteaz astfel: suma (s) ce este calculat la momentul actual se obine din suma (s) calculat la momentul anterior la care se adaug i3 (i fiind valoarea curent a pasului). Verificarea corectitudinii unui algoritm se face prin alegerea unui set de valori pentru datele de intrare i alctuirea tabelului de verificare.

12

Laborator - Algoritmi

e) Tabel de verificare
instruciune citete n afieaz n s=0 i=1 i<=n? DA s=s+i3 i=i+1 afieaz s PAS 1 n=3 3//ecou s=0 i=1 1<=3 ? DA s=0+13=1 i=1+1=2 PAS 2 PAS 3

Tabelul 2
PAS 4

Instruc. repetitiv

2<=3 ? DA s=1+23=9 i=2+1=3

3<=3 ? DA s=9+33=36

4<=3 ?

NU i=3+1=4 36
n i

Ex. 5 Sa se calculeze valoarea sumei duble S = i j 2


i =1 j =1

a) Date de intrare : n b) Date de ieire: s c) Model matematic:


S =

i
i =1

j2

j =1

d) Reprezentarea algoritmului :

13

Laborator - Algoritmi

Obs.

- Instruciunea s=0 este obligatorie i permite reiniializarea variabilei care memoreaz valoarea j2 pentru fiecare pas al contorului i . e) Tabelul de verificare Tabelul 3
instruciune citete n afieaz n S=0 i=1 i<=n? DA j=1 j<=i? DA NU s=s+i*j j=j+1 i=i+1 afieaz s PAS 1 n=2 3//ecou S=0 i=1 1<=2 j=1 1<=1 S=0+1*1 j=2 i=2 PAS 2 PAS 3 PAS 4 PAS 5 PAS 6

Instruc. Repetitive

2<=2 2<=1 j=1 1<=2 S=1+2*1 j=2 2<=2 S=3+2*2 j=3 i=3 3<=2

3<2

Obs. Algoritmul unei structuri duble cu contorizare este corect alctuit dac: - sunt definite dou variabile contor; - ciclul exterior(primul deschis) cuprinde n totalitate ciclul interior.Altfel spus,primul ciclul deschis este ultimul nchis. - contorul ciclului exterior(i) nu este modificat n ciclul interior.nvers,n afar ciclului interior contorul acestuia(j) poate fi redefinit. 2.3.2. Structura repetitiv cu test anterior (iniial) Exist algoritmi repetitivi pentru care utilizatorul nu poate aprecia numrul de repetri(reluri)a secvenei ciclice . n aceste cazuri pentru controlul interpretrii secvenei ciclice este necesar s se defineasc o variabil de control i o expresia relaional. Dup modul n care este amplasat condiia de test se definesc secvene ciclice cu test iniial respectiv final. Comparativ cu structura cu contorizare ,n acest caz trebuiesc respectate urmtoarele condiii: - este necesar iniializarea explicit,prin program, a variabilelor care alctuiesc condiia de test. n caz contrar se va interpreta coninutul locaiei de memorie rezervate respectivei variabile ( v. i lucr. de lab. nr. 1), ceea ce va compromite executarea respectivei secvene ciclice; - pe parcursul ciclului trebuie s existe cel puin o instruciune prin care se recalculeaz valorile acestor variabile.n caz contrar secvena repetitiv poate deveni un ciclu infinit; - exist posibilitatea ca instruciunile din corpul ciclului s nu fie parcurse nici mcar o singur dat. Algoritmii repetitivi cu test iniial sunt specifici problemelor de:

14

Laborator - Algoritmi

aritmetica numerelor(divizibilitate, transformri de baz, etc) sau de validare a datelor de intrare. n fig. 5 se reprezint pseudocodul i organigrama unei secvene repetitive cu test anterior.

a) pseudocod

b) organigram Fig. 6

Sintaxa algoritmului . Blocurile care alctuiesc secvena repetitiv au urmtoarele semnificaii: - iniializarea valorii variabilelor care definesc condiia care verific incheierea execuiei repetate (cond ?); - cond ? - condiia care verific ncheierea execuiei repetate:expresie relaional (x <=5) sau logic ((x >= -1) I (x<=1)) ; - aciune 1 secvena de instruciuni care se repet; - instruciunea prin care se modific valorile care definesc cond ? Interpretarea secvenei repetitive cu test iniial: - se efectueaz testul de la nceputul buclei; - pentru cond=DA (adevrat) se execut instruciunile din corpul buclei; - pentru cond=NU (fals ) se abandoneaz bucla i se trece la instruciunea imediat urmtoare secvenei repetitive (aciune 2). Ex. 6 Sa se tabeleze valorile funciei f ( x) = x 2 9 pentru x [xi, xf] cu pasul de modificare a variabilei independente xp. a) Date de intrare : xi, xf, xp b) Date de ieire: f (valoarea funciei determint pentru o anumit valoare x) c) Model matematic:
f ( x) = x 2 9

OBS. Fiecare valoare calculat este imediat tiprit.n acest mod locaia din MO desemnat prin f este eliberat pentru nscrierea urmtoarei valori calculate. d) Reprezentarea algoritmului:

program tabelare;

15

Laborator - Algoritmi

citete xi, xf, xp; afieaz xi, xf, xp; f=0; x = x i; ct timp x< xf t=x2-9; dac (t>=0) f= t ; afieaz x , f; sf. dac x=x+xp; sf. ct timp; sf. program.
Obs. Variabila t permite verificarea domeniului de definiie. Pentru t<0 se afieaz mesajul indicat i respectiva valoare a lui x. Acest caz se nscrie n problemele cu funcii pentru care conteaz domeniul de definiie. e)Tabelul de verificare a algoritmului n continuare este prezentat un exemplu n care intervalul ales pentru valorile lui x este [0, 7], iar pasul 2. Tabelul 4 Operaii
citete xi citete xf citete xp f=0 x=xi ct timp x<=xf t=x2-9 Dac (t>=0) NU f= t DA afi. f x=x+xp Pas

Pas 0
xi=0 xf=7 xp=2 f=0 x=0 0<=7 t=-9 -9>=0 NU x=2 0

Pas 1

Pas 2

Pas 3

Pas 4

2<=7 t=-5 -5>=0 NU x=4 1

4<=7 t=7 7>=0 f= 7 2.64 x=6 2

6<=7 t=27 27>=0 f= 27 5.19 x=8 3

8<=7

struct. repetit.

STOP

2.3.3Structura repetitiv cu test posterior (final) Structura repetitiv cu test posterior (final) se deosebete de varianta anterioar numai prin aceea c instruciunile din corpul ciclului sunt executate cel puin o dat. Acest tip de algoritm este folosit n special de algoritmi specifici metodelor numerice( determinarea soluiei reale a unei ecuaii

16

Laborator - Algoritmi

transcendente, calculul valorii radicalului,determinarea valorii unei serii cu numr infinit de termeni etc). n figura 6 se reprezint instruciunea repetitiv cu test anterior n pseudocod i organigram

7a Pseudocod

7b organigram Fig. 7

Sintaxa algoritmului repetitiv cu test final Algoritmul este corect alctuit dac: - exist marcat nceputul secvenei care trebuie repetat prin cuvntul execut (n limbajele de programare acest marcaj este reprezentat diferit: cuvntul repeat sau do) ; - exist marcat finalul secvenei de operaii (comenzi,instruciuni) care se repet prin cuvntul ct timp i condiia ataat acestuia ( n limbajele de programare ncheierea secvenei repetate este indict prin repeat sau while); - printre instruciunile care se repet exist i o operaie prin care se recalculeaz valorile variabilelor care definesc condiia de test .n acest mod se elimin posibilitatea existenei unei executri fr sfrit a ciclului(bucl infinit). n fig.6 s-au reprezentat i blocurile de operaii: - aciune 1 care precede secvena repetitiv; - aciune 2 respectiv secvena care se interpreteaz repetat; - aciune 3 adic instruciunile care se execut dup ncheierea secvenei repetitive. Interpretarea algoritmului Spre deosebire de varianta anterioar,cnd testarea condiiei cond ? se face la nceputul buclei, n cazul de fa instruciunile din corpul buclei (aciune 2) se execut cel puin o dat. Executarea instruciunii se face astfel: - se interpreteaz instruciunile din blocul aciune 2; - se verific condiia de test. Dac aceasta are valoarea de adevrat se reia aciune 2. n caz contrar se trece la interpretarea instruciunii imediat
17

Laborator - Algoritmi

urmtoare secvenei repetitive (aciune 3).


Ex. 7 S se calculeze media aritmetic a numerelor pozitive introduse de la tastatur care au valori n intervalul [a,b]. Calculul se ncheie prin introducerea unui numr negativ. Obs. Se presupune c ntotdeauna primul numr introdus este pozitiv.n caz contrar algoritmul nu mai asigur rezolvarea corect a problemei. a) Date de intrare : a,b, x-variabila care memoreaz numerele introduse b) Date de ieire: a media aritmetic c) Model matematic: Ma = S/n n = numrul de numere d) Reprezentarea algoritmului :

18

Laborator - Algoritmi

e) Tabel de verificare
instruciune citete a,b afieaz a,b S=0 n=0 citeste x Daca (x>=0 si x>=a si x<=b) DA NU S=S+x n=n+1 cat timp x>=0 Daca n0 NU DA Ma=S/n Afiseaza Ma Afiseaza Date necorespunzatoare STOP PAS 1 2 9 2 9 S=0 n=0 5 5>=0 si 5>=2 si 5<=9 ? Da S=0+5 n=1 5>=0 PAS 2 PAS 3 PAS 4

Instruc. Repetitiv

1 1>=0 si 1>=2 si 1<=9 ? Nu 1>=0

3 3>=0 si 3>=2 si 3<=9 ? Da S=5+3 n=2 3>=0

-8 -8>=0 si -8>=2 si -8<=9? Nu -8>=0? NU n0? Da Ma=8/2=4 4 STOP

Partea a II-a 1. Operaii asupra tablourilor de date Tablourile sau ariile de date se definesc i se folosesc n programele de calcul atunci cnd: este necesar s se pstreze(memoreze) toate valorile succesive calculate pentru o variabil n timpul executrii programului; probleme care se rezolv se refer la vectori, matrice sau alte tipuri de date organizate sub form de tabele(de exemplu tabelul numelor studenilor dintr-o grup). Rezult de aici c un tablou de date poate fi i element propriu algoritmului i implicit al programului, definit de utilizator n scopul obinerii unei forme mai eficiente sau elegante a acestora. Caracteristica principal a algoritmilor care conin ariile de date este prezena secvenei repetitive cu contorizare. 1.1. Prelucrarea irurilor unidimensionale(vectori) 1.1.1. Operaii simple cu iruri unidimensionale

19

Laborator - Algoritmi

Obs. Pentru o mai uoar alctuire i urmrire a programului elementele respective se vor nscrie n MO sub forma unui vector,pe care l denumim x .

Ex. 8 Calculul mediei aritmetice a unui numr n elemente cuprinse intr-un anumit interval [yi, yf].

a) Date de intrare: n nr. de elemente din vector x[i] elementele vectorului yi, yf capetele intervalului b) Date de ieire: ma media aritmetica c) Model matematic:
ma = x[0] + x[1] + x[2] + x[3] + .................... + x[n 1] n

d) Algoritm de calcul: program medie citeste n citeste yi,yf pentru i=0,n-1 execut //citirea vectorului citeste x[i] sf. pentru s=0 ma=0 p=0 pentru i=0,n-1 execut dac (x[i]>=yi) AND (x[i]=<yf) s=s+x[i] p=p+1 sf. daca sf. pentru daca p=0 afiseaza Nu exist solutie altfel ma=s/p afieaz ma sf. dac sf. program 1.1.2. Algoritmi de ordonare (sortare) Ex. 9 S se ordoneze (sorteze) cresctor un vector x de dimensiune n. Metoda I- metoda bulelor Descrierea metodei :
20

Laborator - Algoritmi

Se compar dou cte dou elemente consecutive ale vectorului, interschimbndu-le n cazul nendeplinirii criteriului de ordonare (xi > xi+1). Dup o parcurgere integral a vectorului procesul se reia, ncepnd tot cu primul element. Comparaia se oprete atunci cnd, dup o parcurgere complet, a vectorului nu s-a mai produs nici o interschimbare. Pentru evidenierea n algoritm a efecturii unei interschimbri s-a declarat variabila flag (steag). Aceasta are rol de "semafor" indicnd prin valoarea 1 dac a avut loc o interschimbare. Deci, atunci cnd la o parcurgere complet a vectorului flag-ul rmne cu valoarea 0 nseamn c irul este ordonat. Algoritmul cuprinde dou secvene ciclice suprapuse: Secvena repetitiv exterioar este realizat cu o instruciune repetitiv cu test final (do-while). Acest ciclu este controlat de variabila "semafor" (flag) i evideniaz finalizarea ordonrii ciclice. Secvena repetitiv interioar utilizeaz o secven repetitiv cu contorizare i are rolul de a verifica ndeplinirea criteriului de ordonare pentru dou elemente adiacente ale vectorului (n cazul de fa xi < xi+1) . La fiecare reluare a ciclului exterior,dup parcurgerea complet a unui ciclu interior, se reiniializeaz variabila flag cu 0.

21

Laborator - Algoritmi

22

Laborator - Algoritmi

Obs.

- variabila aux este necesar pentru interschimbarea poziiei elementelor; - contorul ciclului intern nu poate depi valoarea (n-2). n caz contrar se va prelua un element din afara vectorului,adic dintr-o locaie a MO care nu aparine vectorului x.n acest mod sunt introduse n calcul valori ntmpltoare ,ceea ce determin afiarea unor rezultate eronate. Aceast eroare nu este semnalizat de ctre SC. Metoda II a) Descrierea metodei : Se afl minimul dintre elementele vectorului i se duce pe prima poziie.n continuare se afl minimul dintre cele n-1 elemente rmase i se duce pe a doua poziie .a.m.d. b) Reprezentarea algoritmului:
program sortare; citete n afieaz n pentru i=0,n-1 execut citete x[i]; sf. pentru pentru i=0, n-2 execut pentru j=i+1,n-1 execut dac x[i]>x[j] atunci aux=x[i] x[i]=x[j] x[j] =aux sf. dac sf. pentru sf. pentru sf. program Obs.

- Dac i ar varia pn la n, atunci j=i+1 ar determina o depire de domeniu. - n cazul n care se dorete ordonarea descresctore, este de ajuns s schimbm semnul mai mare n mai mic n instruciunea de decizie.

23

Laborator - Algoritmi

1.1.3. Operaii asupra mulimilor de numere. Reamintim c o mulime de numere are proprietatea c elementele sale sunt unice. Ex. 10 Se d un vector de n numere. Se cere s se determine mulimea numerelor care se pot obine din acestea. a) Date de intrare n-numrul de elemente a[]- vectorul n care se afl cele n elemente b) Date de ieire b[] mulimea de elemente,care se determin parcurgnd algoritmul de calcul. c) Reprezentarea algoritmului program mulime citete n pentru i=0,n-1 execut Citirea datelor de intrare citete a[i] sf. pentru //ecou k=0; - k va reine cte numere sunt n mulime b[k]=a[1] pentru i=0,n-1 execut flag=0 - reine dac un numr a fost ales deja(flag=1) pentru j=0,k execut dac a[i]= b[j] atunci flag=1 sf. dac sf. pentru dac flag=0 atunci Dac flag=0 nseamn c a[i] k=k+1 nu este nc n mulimea b b[k]=a[i] Se va introduce acum. sf. dac sf. pentru pentru i=0,k execut Afiarea datelor de afieaz b[i] ieire(mulimea b) sf. pentru sf. program

24

Laborator - Algoritmi

Ex. 11 Se dau dou mulimi de numere. S se determine intersecia acestora. a) Date de intrare n, m numrul de elemente al celor dou mulimi a[], b[] cele dou mulimi b) Date de ieire c[] mulimea rezultat: a intersectat cu b c) Reprezentarea algoritmului Obs. Se presupune c cele dou mulimi sunt corect introduse (adic au elemente unice) program intersecie citete n pentru i=0,n-1 execut citete a[i] Citirea datelor de intrare sf. pentru Observm c nu conteaz citete m pentru i=0,m-1 execut numele variabile contor citete b[i] sf. pentru //ecou k=1 pentru i=0,n-1 execut pentru j=0,m-1 execut dac a[i]= b[j] atunci c[k]=a[i] k=k+1 sf. dac sf. pentru sf. pentru pentru i=0,k-1 execut Afiarea datelor de ieire: vectorul cu mulimea afieaz c[i] elementelor comune lui a i b sf. pentru sf. program Obs. n unele exemple, pentru economie de spaiu, nu se va include secvena de afiare a datelor iniiale (ecoul).

25

Laborator - Algoritmi

1.2. Prelucrarea tablourilor bidimensionali (matrice) 1.2.1 Operaii simple cu matrice Ex. 12 S se ntocmeasc algoritmul de adunare a dou matrice avnd n linii i m coloane. a) Date de intrare: - dimensiunile matricelor, - matricele a i b . b) Date de ieire: - matricea c c) Algoritm de calcul: Este necesar ca algoritmul s includ dou secvene ciclice suprapuse pentru:citirea datelor iniiale,efectuarea adunrii celor dou matrice,afiarea matricei rezultat(c). program adunare citeste n,m pentru i=0,n-1 executa pentru j=0,m-1 executa citeste a[i,j] sf. pentru sf. pentru // ecoul pentru matricea a* pentru i=0,n-1 executa pentru j=0,m-1 executa citeste b[i,j] sf. pentru sf. pentru // ecoul pentru matricea b* pentru i=0,n-1 executa pentru j=0,m-1 executa c[i,j]=a[i,j]+b[i,j] sf. pentru sf. pentru pentru i=0,n-1 executa pentru j=0,m-1 executa afiseaza c[i,j] sf. pentru sf. pentru sf. program Obs: - *) s se completeze algoritmul cu secvena necesar afirii matricelor a respective b .
26

Laborator - Algoritmi

- n sintaxa limbajul C/C++ elementele unei matrice se scriu a[i][j]; - algoritmul nu este aplicabil dac operanzii nu au aceleai dimensiuni. De regul,pentru a se evita erorile de calcul,n algoritm se include i o secven de instruciuni prin care se verific aceasta(un bloc de decizie sau repetitiv cu test iniial) .S se completeze algoritmul cu o astfel de secven.
1.2.2 nmulirea a dou matrice Ex. 13 S se ntocmeasc algoritmul de nmulire a dou matrice: c(n,p) = a(n,m) * b(m,p) Obs. Dimensiunile operanzilor sau ales astfel nct operaia s fie posibil din punct de vedere algebric. a) Date de intrare: - dimensiunile matricelor n , m , p ; - matricele a , b b) Date de ieire: - matricea c c) Algoritm de calcul: Pentru a putea ca dou matrice s poat fi nmulit, trebuie s ca numrul de coloane din prima matrice s fie egal cu numrul de linii din a doua matrice. program nmulire citete m,n,p pentru i=0,n-1 execut pentru j=0,m-1 execut Matricea a citete a[i,j] sf. pentru sf. pentru //ecou citete p pentru i=0,m-1 execut pentru j=0,p-1 execut citete b[i,j] Matricea b sf. pentru sf. pentru //ecou pentru i=0,n-1 execut pentru j=0,p-1 execut Iniial matricea rezultat este 0 s=0 pentru k=0,n-1 execut s= s+a[i,k]*b[k,j] sf. pentru c[i][j] = s sf. pentru sf. pentru
27

Laborator - Algoritmi

28

Laborator - Algoritmi

pentru i=0,n-1 execut Afiarea datelor de ieire pentru j=0,p-1 execut afieaz c[i][j] sf. pentru sf. pentru sf. program Observaii La nmulire se procedeaz astfel: o Cte instruciuni repetitive sunt necesare pentru o matrice? 2. Deci cum nmulim dou matrice vom avea nevoie de 2*2=4 instruciuni pentru. o Dar, tim c numrul de linii din matricea b este egal cu numrul de coloane din matricea a, deci pentru acestea putem folosi o singur instruciune pentru n loc de dou. Deci vom folosi 3 instruciuni repetitive cu contorizare. De ce a[i,k] sau b[k,j]? Ce dimensiuni au matricele a i b? Ce variabile contor merg de la 1 la dimensiunea respectiv? De ce la a[i,k]*b[k,j]mai adunm nc un c[i,j]? Cum se face nmulirea a dou matrice? Elementul c[1,1]=a[1,1]*b[1,1]+a[1,2]*b[2,1]+.. se observ ca dup fiecare nmulire se face cte o adunare. Deci trebuie s reinem undeva rezultatele intermediare, i anume chiar n matricea c. 1.2.3 Transpusa unei matrice Ex. 14 S se determine transpusa unei matrice. a) Date de intrare: - dimensiunea matricei, - matricea a b) Date de ieire: - matricea b=at c) Algoritm de calcul: Fie a[m,n] Matricea final va avea dimensiunile b[n,m]. Reamintim c transpusa unei matrice nseamn schimbarea liniilor cu, coloanele.

29

Laborator - Algoritmi

program transpusa citete m,n pentru i=0,m-1 execut pentru j=0,n-1 execut citete a[i,j] sf. pentru sf. pentru //ecou pentru i=0,m-1 execut pentru j=0,n-1 execut b[j,i]= a[i,j] sf. pentru sf. pentru pentru i=0,n-1 execut pentru j=0,m-1 execut afieaz b[i,j] sf. pentru sf. pentru sf. program

Matricea a

Afiarea datelor de ieire

d) Tabel de vetificare
instruciuni
citete m,n i=0 i<m? Nu Da j=0 j<n? Nu Da citeste a[i,j] J=j+1 I=i+1 i=0

Pas 0
m=2 n=2
i=0 0<2? Da j=0 0<2? Da a[0,0]=-2 j=1

Pas 1

Pas 2

Pas 3
1<2 Da j=0

Pas 4

Pas 5

Pas 6
2<2 NU

1<2? Da a[0,1]=7 j=2

2<2? Nu

0<2? Da a[1,0]=3 j=1

1<2? Da a[1,1]=8 j=2

2<2? NU

i=1

i=2 i=0

instruciuni (continuare)
i<m? Nu j=0 j<n? Nu Da b[j,i]= a[i,j] J=j+1 I=i+1 //afiseaza b[i][j] Da

Pas 7
0<2 Da j=0 0<2 Da b[0,0]=-2 j=1

Pas 8

Pas 9

Pas 10
1<2 Da j=0

Pas 11

Pas 12

Pas 13
2<2 NU

1<2? Da b[1,0]=7 j=2

2<2? Nu

0<2? Da b[0,1]=3 j=1

1<2? Da b[1,1]=8 j=2

2<2? NU

i=1

i=2

30

Laborator - Algoritmi

OBS.

Afiarea matricei b ramne ca tem! Matricea initiala (a) va arata astfel:


2 7 3 8

Matricea final (b) va arta astfel:


2 3 7 8

2. Metode numerice Metodele numerice se folosesc atunci cnd nu exist posibilitatea definirii unor expresii prin care s[ fie posibil calculul exact al valorilor care se determin. n astfel de cazuri se folosesc relaii de calcul recurente,care permit determinarea iterativ a unor valori apriximative. Obs. - din punct de vedere tehnic principala dificultate a acestui tip de calcul este alegerea convenabil,de ctre utilizator, a nivelului de eroare ( max) pentru care se poate accepta c valoarea obinut prin calcul este tehnic corect. O valoare max = 1 % se consider suficient; - pentru a se evita parcurgerea infinit a secvenei repetitive algortmul se completeaz cu un bloc de verificare a numrului maxim de iteraii efectuate. Pentru cele mai multe exemple acest nr_max = 100 .Aceste situaii sunt semnalizate prin mesajul soluie divergent. Ex. 15 S se alctuiasc algoritmul pentru calculul valorii lui ex. a) Date de intrare: x, eps_max, nr_max b) Date de ieire: s c) Model matematic: o Determinarea relaiei de recuren:

xi Ti = i!
Deci: Ti +1 Ti =

x i +1 Ti +1 = (i + 1)!
x (i + 1) deci Ti +1 = Ti
x , iar T0 = 1; (i + 1)

o Calculul sumei:

S = S + Ti+1 o Stabilirea valorilor iniiale: i = 0, S = 1, Ti = T0=1 o Stabilirea condiiei de convergen:

31

Laborator - Algoritmi

Ti +1 100 < max S


o max = 1%,

numarul maxim de iteratii = 20

d) Reprezentarea algoritmului:
program calcul valoare citete x, eps_max, nr_max; //ecou s=1; ti=1; i=0; execut x tc = ti i +1 s =s+ tc

tc 100 s i = i +1 dac (i > nr_max) atunci afieaz "Soluie divergent" STOP sfrit dac t i = tc ct timp (eps > eps_max) afieaz s sfrit program eps =

32

Laborator - Algoritmi

33

Laborator - Algoritmi

e) Tabel de verificare
Operaii
citete x citete eps_max citete nr_max S=0 Ti=1 i=0 executa
tc = ti x i +1 s =s+ tc tc 100 s i = i +1 eps =

Pas 0
3 50 9 0 1 0
t c = 1 s=3 eps = i =1 3 100 3 3 1

Pas 1

Pas 2

tc = 3

3 2 s = 3 + 4.5 4.5 100 7.5

t c = 4.5

3 3 s = 7.5 + 4.5 = 12 4.5 100 12

eps = i=2

eps = i=3

struct. repetit.

dac (i > nr_max) da

1>2 NU

2>2 NU

3>9 NU

afieaz "Soluie divergent" STOP

t i = tc
Cat timp eps > eps_max Afis S

ti =3
100>50 DA
0

ti =4.5
60>50? DA

ti =4.5
37.5>50 NU 12 Stop n

Pas

Ex. 16 S se alctuiasc algoritmul pentru calculul valorii lui

xc

a) Date de intrare: n b) Date de ieire: xc c)Model matematic:


xi = 1 n x i 1 + 2 x i 1

d)

34

Laborator - Algoritmi

unde x0=1; i=1,n

35

Laborator - Algoritmi

e) Reprezentarea algoritmului:
program calcul citete n citeste eps_max //ecou xi=1; dac (n <0) atunci afieaz "Radical din nr. negativ" STOP sfrit dac executa
1 n x c = xi + 2 xi

eps=|xc*xc-n| xi=xc cat timp(eps>eps_max) afieaz xc sfrit program

f) Tabel de verificare:
Operaii Pas 0 Pas 1

citete n 2 citete eps_max 0.1 1 xi=1 2<0 n<0 nu nu da Afis NR. NRGATIV 1 2 1 n x c = xi + x c = 1 + 2 1 2 xi

1 2 xc = 1,5 + 2 1,5

eps=|xc*xc-n|

xi=xc Eps>eps_max
Afis xc Pas

eps=|1,5-2| xi=1,5 0,25>0,1 DA

Eps=0 xi=1,41 0,02>0,1 NU


1,41

36

Laborator - Algoritmi

Ex 17. Determinarea radacinii reale a unei ecuatii algebrice de ordin superior sau transcendente care se gsete pe un interval cunoscut. Fie ecuatia : f(x) = x3+5x2- 30=0. Sa se determine radacina reala aflata pe intervalul [ 2 , 3] { f(2) * f(3) < 0 } Se va folosi metoda injumatatirii. a) Date de intrare: a, b, eps_max, b) Date de iesire: xsol , care este considerat corect dac |f(xsol) |<eps_max c) Modelul matematic: Presupunind ca ecuatia f(x) = 0 are o radacina in intervalul [a,b], atunci, conform unei proprietati a lui Darboux f(a)*f(b)<0. In aceste coditii, pentru a gasi punctul pentru care f(xsol)=0, sau un punct foarte aproape de acesta (|f(xsol)|<eps) parcurgem urmatorii pasi: a. x=(a+b)/2 b. |f(x)|<eps_max? daca NU : testam daca f(a)*f(x)<0. Daca da b=x; Daca Nu a =x; c. reluam punctul a. d) Algoritmul:
Program calcul_ec2 citeste a,b,eps; fa=a*a*a+5*a*a-1; fb=b*b*b+5*b*b-1; executa x=(a+b)/2; f=x*x*x+5*x*x-1; daca (fa*f<0) atunci b=x; altfel a=x; fa=a*a*a+5*a*a-1; sf. daca cat timp (|f|>eps_max); xsol=x; afisaza xsol; sfarsit program

Tema 1. Sa se alcatuiasca schema logica la problemele 12,13. 2. Sa se alcatuiasca tabelul de verificare la problemele 12,13

37

Laborator - Algoritmi

Partea a III-a Complemente asupra algoritmilor Tehnici de programare Prin tehnici de programare se neleg procedee speciale de rezolvare cu ajutorul programelor de calcul a unor probleme complexe. n continuare vom prezenta cteva metode de rezolvare a unor probleme folosind urmtoarele tipuri de algoritmi: - greedy - divide et impera - backtracking Din punct de vedere al alctuirii programului de calcul aceste metode se bazeaz pe dou concepte. - noiunea de funcie - apelul prin recursivitate 1. Funcia utilizator ntr-un program de calcul o funcie reprezint un grup de instruciuni care constituie o entitate independent . Utilizarea unei funcii(funcie apelat) nu se poate face dect prin intermediul unei funcii apelante.Aceasta transfer ctre funcia apelat un set de date de intrare. Dup ncheierea executrii instruciunilor funciei apelate, valorile calculate(rezultatele) sunt transferate n sens invers ,de la funcia apelat ctre funcia apelant. Transferul datelor de intrare se face automat n momentul apelului funciilor. Comunicarea rezultatelor ctre programul apelant este determinat de executarea instruciunii return. Exist dou feluri de funcii: - cu parametri; - fr parametri. n programul apelant se precizeaz numai numele funciei urmat de parametri, dac este cazul. Structura sintactic a unei funcii este de forma:

funcie numefuncie(parametri de intrare; parametri de ieire) // corpul funciei returneaz rezultat // dac este cazul sf. funcie. La funciile fr parametri este necesar ca variabilele folosite s fie cunoscute oriunde n program. Acestea se numesc variabile globale. La funciile cu parametri exist dou tipuri de apeluri a funciei: - prin valoare; - prin referin.

38

Laborator - Algoritmi

Apelul prin valoare se face prin scrierea numelui funciei urmat de numele variabilelor ale cror valori se comunic n acest mod funciei apelate. Apelul prin referin se face prin scrierea numelui funciei urmat de lista adreselor variabilelor ale cror valori sunt calculate n cuprinsul funciei.Acestea sunt variabilele prin intermediul crora se transfer valorile numerice de la funcia apelat ctre funcia apelant. Ex. n limbajele de programare pentru calculul radicalului exist funcia predefinit sqrt(x). Deci f(x)=sqrt(x).n figura 7 este prezentat modul de apelare a funciei sqrt(x).
sqrt(x) x=5 a=sqrt(x) return y

funcie apelant

funcie apelat

Fig. 7 n Lucrarea de laborator 9 se vor prezenta i exemplifica toate elementele necesare folosirii funciilor n C/C++. 2. Funcii recursive Recursivitatea este proprietatea unei funcii de a se autoapela. Aceasta nseamn c instruciunile unei funcii,deci din interiorul acesteia se face apel chiar la aceeai funcie. Autoapelarea este posibil datorit modului n care se organizeaz datele n memoria operativ. Este obligatoriu ca n corpul funciei apelate s se includ i o condiie de oprire a apelurilor repetate. n caz contrar execuia programului devine necontrolabil,n cele mai multe cazuri aceasta determinnd n final abandonarea execuiei programului. Dup atingerea condiiei de oprire operaiile se vor parcurge n sens invers de la ultimul apel ctre programul apelant. n fig. 8 se exemplific modul de realizare a apelului recursiv . S-a presupus c dup trei apeluri condiia de oprire este ndeplinit i deci ncepe parcurgerea drumului n sens invers,ctre programul apelant.
primul apel al II-le apel al III-lea apel

3
return

6
funcia apelant funcia apelat

5
funcia apelat

4
funcia apelat

Fig. 8

39

Laborator - Algoritmi

Ex. 18. S se calculeze n!. Exist mai muli algoritmi de calcul. Cel clasic este prezentat mai jos. ... p=1 pentru i=1,n execut p=p*i sf. pentru ... Dar mai exist i alte metode. Una dintre ele este aceea recursiv. a) Date de intrare n-numrul pt. care calculm n! b) Date de ieire rezultatul calculului, valoarea lui n! c) Modelul matematic f=1*2*3**n d) Reprezentarea algoritmului funcie factorial( n ) dac n=0 atunci returneaz 1 altfel returnez n*factorial(n-1) // autoapelul funciei sf. funcie e) Tabel de verificare Vom considera ca date de intrare n=3 Operaie Pas 0 Pas 1 Pas2 Pas 3 n n=3 factorial(n) factorial(3) factorial(2) factorial(1) factorial(0) n=0? 3=0? 2=0? 1=0? 0=0? DA NU NU NU NU DA 1 1 n*factorial(n-1) 3*factorial(2) 2*factorial(1) 1*factorial(0) 3*2 =6 2*1=2 1*1=1 rezultat final 6

40

Laborator - Algoritmi

3. Metoda greedy (lacom) Aceast metod se aplic problemelor ce presupun o organizare cresctoare (sau descresctoare) a datelor dup anumite criterii pentru ca, mai apoi,s se aleag dintre ele anumite elemente (cele mai mici/mari) care sunt soluii ale problemei. Se aplic n general n probleme de optimizare. Ex. 13 Se dorete ncarcarea ct mai mult posibil a unui sac care suport o greutate maxima g_max. n magazie exist n obiecte de greuti :g1,g2,...gn. Se cere s se determine care sunt obiectele ce trebuiesc luate astfel nct s se ncarce n sac ct mai multe obiecte. a) Date de intrare: g_max, n g[i], i=1,n Obs. Se presupune c suma greutilor obiectelor este mai mare dect g_max. b) Date de ieire: greutile obiectelor ce pot fi luate c) Modul de rezolvare: Matematic se poate demonstra c se asociaz numrul maxim de obiecte prin considerarea corpurilor n ordinea cresctoare a greutii lor. Deci: - pentru a lua ct mai multe obiecte vom ordona cresctor vectorul g. - vom pune n sac attea obiecte cte suport sacul. d) Reprezentarea algoritmului: Obs. NU vom scrie ntreg algoritmul. Partea de ordonare sau de citire a unui vector se consider a fi cunoscute. program houl citete g_max,n citete vectorul g // a se vedea problema 5 ordonarea vectorului g // a se vedea problema 6 s=0 // s va reine greutatea deja pus n sac. i=0; ct timp (s<=g_max) execut //introducem n sac s=s+g[i] i=i+1 sf. ct timp dac s>g_max atunci // Verificm dac ultimul obiect depete g_max i=i-1 //scoatem din sac ultimul obiect introdus s=s-g[i] sf. dac pentru j=1,i execut //afiarea rezultatelor afieaz g[j] sf. pentru sf. program

41

Laborator - Algoritmi

4. Metoda divide et impera O alt tehnic este cea a metodei divide et impera. Problemele care se pot rezolva cu aceast metod sunt diverse, dar presupun un mod de tratare aparte: pentru a aplica metoda divide et impera este necesar ca datele s fie ordonate dup diverse criterii (n funcie de cerinele problemei). Metoda presupune 3 etape: a) mprirea problemelor n subprobleme, b) rezolvarea fiecrei subprobleme i aflarea soluiilor pariale, c) reunirea soluiilor pariale, obinndu-se soluia final. Aceast metod poate fi implementat numai printr-un algoritm recursiv. Datorit faptului c recursivitatea salveaz datele pariale n stiv de date i la sfrit le extrage n sens invers, metoda nu trebuie descris explicit de programator, ea fcndu-se automat. Ex. 14 Se d un vector ordonat. S se determine dac un numr x se gsete ntre elementele unui vector. Obs. Este posibil verificarea pas cu pas adic element cu element . Dar ce se ntmpl dac vectorul este foarte mare i elementul x se afl pe ultima poziie? Se vor face un numr foarte mare de teste i se va pierde timp. Prin metoda divide et impera cutarea se realizeaz mult mai rapid. a) Date de intrare: n, x g[i], i=1,n b) Date de ieire: poziia n care se afl x, sau mesaj c nu este n vector c) Modul de funcionare: - vom mpri vectorul n dou i vom verifica dac x este n stnga sau n dreapta. Apoi procedeul se aplic recursiv. d) Reprezentarea algoritmului: Obs. NU vom scrie ntreg algoritmul. Partea de citire a vectorului se consider a fi cunoscute. program divide_et_impera funcie recursiv (st,dr) mij=(st+dr)/2 dac v[mij]=x atunci returneaz mij //mij este poziia lui x n vector altfel dac st<dr atunci dac v[mij]>x atunci dr=mij recursiv(st,dr) altfel st=mij recursiv(st,dr)
42

Laborator - Algoritmi

sf. dac altfel afieaz x nu este vector sf. dac sf. dac sf. funcie citete n, x citete vectorul v // a se vedea problema 5 recursiv(1,n) sf. program 5. Metoda backtracking Metoda de programare backtracking are avantajul c, la orice problem, obine toate soluiile. Totui ea rmne o metoda destul de dificil. Se aplic n general n probleme de cutare.Algoritmul care folosete aceast metod poate fi rezolvat att prin varianta iterativ ct i prin cea recursiv. n general problemele ce se rezolv prin aceast metod necesit o perioad de timp mai mare pentru compilare i execuie n limbajele de programare, mai ales pentru probleme complexe(orarul unei clase, etc.), aici fiind important i structura hardware a calculatorului (un calculator ct mai puternic). Ex. 12 Problema celor 8 dame S se determine cum pot fi aezate 8 dame pe o tabl de ah astfel nct acestea s nu se poat elimina reciproc. Problema poate fi extins la n dame pe o tabl de dimensiune (n * n). Modul de funcionare: Tabla de ah se va reine ntr-un vector i nu ntr-o matrice. De ce? Pentru c pe o coloan nu putem avea 2 dame. Atunci indicele i al vectorului poate fi coloana pe care se afl regina, iar valoarea x[i] linia. Condiiile ce trebuie mai trebuie ndeplinite sunt: 1. s nu fie 2 dame pe aceeai linie: i,j, x[i]x[j] 2. daca se considera 2 elemente pe aceeai diagonala (i,x[i]) ,(k,x[k]) i- x[i]=k-x[k] sau i+ x[i]=k+x[k] x[i]- x[k]=i-k x[i]-x[k]=k-i adic se poate folosi condiia |j-l||k-i|. Construim funcia pune(k) care returneaza 0 daca dama cu numrul de ordine k nu poate fi plasata pe linia data de x(k). Operaiile care se fac sunt: - se testeaz daca x(k) != x(i) i=1,2,....k-1 - se testeaz daca nu exista alta dama in aceeai diagonala.

43

Laborator - Algoritmi

funcie pune(k) i=1; ct timp (i<k) execut dac (x(i)=x(k) sau |x(i)-x(k)|=|i-k|) returneaz 0 sf. dac i=i+1 sf. ct timp returneaz 1 sf. funcie Funcia dama(n) este metoda backtracking ce rezolv problema funcie dama(n) // x(1.....n)- vectorul de soluii x(1)=0; k=1; ct timp (k>0) execut x(k)=x(k)+1; ct timp x(k)<=n i pune(k)=0 x(k)=x(k)+1; sf. ct timp dac( x(k)<=n ) // place(k)=1- o poz. gasit dac (k=n) // sol. completa afieaz x //ATENIE x este vector altfel k=k+1; x(k)=0 sf. dac altfel //nu este o sol. bun k=k-1; sf. dac sf. ct timp sf. funcie 6. Matrice rare Atunci cnd avem o matrice de dimensiuni mari (de ex. 100 * 100), care are foarte multe elemente nule (peste 80%).Cum se poate memora o astfel de matrice? O modalitate este folosirea unui tablou cu trei linii i un numr suficient de mare de coloane. Pe prima linie se reine valoarea nenegativ, pe a doua numrul liniei pe care se afla acesta, pe a treia linie coloana. Operaii cu matrice rare Ex .13 Citirea matricelor rare Vom nota cu x[3][nr] matricea n care vom reine n mod economic matricea iniial(x va fi o matrice fr zerouri,iar nr numrul elementelor nenule din matricea iniial).
44

Laborator - Algoritmi

citete n,m //citim dimens. matricei iniiale k=0 //poz n matricea a 2-a a unui element din matricea iniial pentru i=1,n execut pentru j=1,n execut citete elem //se citete elementul de pe poziia i,j dac elem0 atunci x[0][k]=elem; x[1][k]=i; x[2][k]=j; k=k+1; sf. dac sf. pentru sf. pentru Numrul de elemente ce vor fi scrise n matricea x este k, de pe poz 0 pn la poz k-1. Ex. 14 Adunarea matricelor rare Fie x i y cele dou matrice de dimensiuni m,n, ce pot fi adunate. Se pune ntrebarea cum va arta matricea z=x+y. Problema care apare este c nu toate elementele din cele dou matrice sunt pe aceleai poziii. Nu vom prezenta la aceast problem pseudocodul, ci doar paii importani pt. rezolvarea ei. 1. se citesc elementele nenule din cele dou matrice x i y (a se vedea punctul ex. 13) 2. k=i=j=0 3. ct timp i<=m i j<n execut 4. dac x[1][i]=y[1][j] atunci 5. dac x[2][i]<y[2][j] atunci Dac x[1][i]=y[1][j] nseamn 6. z[0][k]=x[0][i] c elementele din y sunt pe linii 7. i=i+1;k=k+1 superioare fa de cele din x. 8. altfel 9. z[0][k]=y[0][j] 10. j=j+1;k=k+1 11. sf. dac 12. dac x[2][i]=y[2][j] atunci 13. z[0][k]=x[0][i]+y[0][j] 14. i=i+1;j=j+1;k=k+1 15. sf. dac 16. ... Tem Se cere s se completeze pseudocodul de mai sus.
45

Laborator - Algoritmi

ntrebri de autocontrol 1 Ce este un algoritm? 2 Care este diferena dintre un algoritm repetitiv cu test iniial i unul cu test final? 3 Cum putem face ca un algoritm cu test final s funcioneze ca unul cu test iniial? 4 Cum putem face ca un algoritm cu test iniial s funcioneze ca unul cu test final? 5 Cum putem prelucra o matrice ca un vector?

46

Laborator - Algoritmi

Probleme propuse Partea I Structura secventiala 1. Se consider un mobil aflat n micare rectilinie uniform. Se cere s se determine distana parcurs de acesta atunci cnd se deplaseaz cu viteza v[m/s], un timp t[h]. 2. Un vehicul merge cu viteza V km/h, parcurgnd distana D(m). S se determine timpul T (sec) n care se parcurge distana dat. 3. Se considera micarea rectilinie uniform accelerata cu viteza iniiala a unui mobil. Daca se cunosc v0, a, d, se cere s se determine t i v 4. La o casierie trebuie pltita o sum de bani B, folosind ct mai puine bancnote i monezi. Dac se cunosc bancnote de 10.000, 5.000,1.000, 100, 1 leu, s se determine cum se pltete aceast suma. 5. Fie z1,z2,z numere complexe. S se calculeze z=z1+z2, z=z1*z2, z=z1/z2 Structura de decizie 6. Se dau 5 numere. S se determine maximul dintre acestea fr a folosi vectori. 7. S se rezolve complet ecuaia de gradul al II lea. 8. Pentru algoritmii descrii n pseudocod ex. 26, 55, 56, 57, 61 (din culegerea de teste pentru admitere), alctuii organigrama corespunztoare fiecruia. ediia 2000. Structuri repetitive 9. S se calculeze integrala definit pe intervalul [a,b] prin metoda trapezelor. 10. S se calculeze cmmdc i cmmmc a dou numere 11. S se calculeze : S1=1+2+3+..+n S2=1+2(1+2)+3(1+2+3)+..+n(1+2+..+n) S3=1!+2!++n!

S4= (i + i 2 ) S5= cos(i) S6= ( j + i)


i =1 j =i m n

i =1 2

i =0 m

S7= (i / j )
i =1 j =i

Partea a II-a
Vectori

1. Se d un vector de n elemente. S se determine maximul(minimul). 2. Fie funcia f(x)=x2+3. Se dau valorile x1,x2,..xn. S se calculeze f(x1) , f(x2), f(xn). 3*. Se dau 2 mulimi. S se determine reuniunea acestora. 4. Se dau 2 mulimi A i B. S se determine A\B.
47

Laborator - Algoritmi

5. S se determine media aritmetic a numerelor egal deprtate de capetele unui vector. 6*. S se calculeze produsul a dou polinoame. 7. Se dau dou iruri ordonate de numere. S se interclaseze cele dou iruri.(Interclasare = obinerea unui ir din alte dou -sau mai multe- care are aceeai proprietate ca i cele iniiale) 8. Fie x un numr natural i a un vector de n numere naturale. Se cere s se determine dac x este n a i dac da, pe ce poziie. 9. Se citesc ntr-un tablou n cifre, 1 n 9. Calculai i afiai valoarea numrului compus din aceste cifre. 10. Fie funcia f(x)= x 2 2 x + 1 . Se dau valorile x1,x2,..xn. S se calculeze media aritmetic a irului: f(x1) , f(x2), f(xn). Matrice 11. Fie A[m,n],B[p,n],C[n,p],S[m,n] matrice. S se calculeze: S=A(C+Bt) 12. S se determine maximul(minimul) de pe fiecare linie(coloan) a unei matrice. 13. S se calculeze suma pe conturul unei matrice. 14. S se calculeze media aritmetic a elementelor de pe fiecare linie cu numr par. 15. S se calculeze produsul unei matrice cu un scalar. 16. Fie A o matrice. S se determine suma maximelor de pe fiecare coloan. 17. Fie x un element i a o matrice. S se determine dac x se afl n a i dac da pe ce poziie. Partea a III-a 1*. Un ho pleac la furat bijuterii cu un sac ce suport o greutate maxima G. La magazin exist n obiecte de greuti :g1,g2,...gn. i avnd valorile v1,v2,...vn. Se cere s se determine care sunt obiectele ce trebuie furate astfel nct houl s plece cu obiecte ce valoreaz ct mai mult. 2*. S se ordoneze un vector folosind metoda divide et impera. 3. Un oarece alearg printr-un labirint, cutnd un drum de ieire. S se indice unul(sau toate). 4. S se scrie algoritmul celor n dame. 5. Fie n i k dou numere naturale. S se determine toate : a) permutrile n b) aranjamentele n,k c) permutrile n,k Obs. Se cere acre sunt acestea, i nu s se calculeze numrul lor. Ex. Pentru n=3, permutrile sunt: 123 132 213 231 312 321 6. Jocul avioane(submarine). Pe o tabl de dimensiuni nXn se deseneaz un numr x de avioane(submarine) care au un cap unde orice lovitura va fi fatal i
48

Laborator - Algoritmi

un corp unde loviturile se vor considera doar rni. Forma avioanelor (submarinelor) va fi hotrt de juctori. S se implementeze jocul, tiind c juctorul trebuie s ghiceasc poziia avionului(submarinului) i s l doboare(lovitura n cap). 7. S se nmuleasc dou matrice rare. Bibliografie 1.*** Teste de informatic pentru admitere la facultate, Editura "Gh. Asachi", Iai, ediia 2000 2. *** Manual pentru clasa a XI-a de liceu, varianta C 3. Liviu Negrescu, Turbo C, editura Libris, 1992 4. Herbert Shildt, C++ Manual complet, editura Teora, Bucureti 1997 5. Tudor Sorin , Programarea calculatoarelor, Editura Teora, Bucureti, 1994

49