Sunteți pe pagina 1din 9

1. Descrierea algoritmilor, limbajul Pseudocod.

1.1. Descrierea algoritmilor.


Prin algoritm putem nelege o succesiune finit de operaii. Acesta presupune executarea unor calcule ntr-o anumit ordine. Putem considera c un algoritm este o secven finit de propoziii ale unui 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. Algoritmii pe care i descriem ar trebui s fie ct mai generali ( s rezolve o clas de probleme de acelai tip), s dea rezultate ntr-un anumit timp (finit, adic s se termine oricare ar fi datele de intrare) i de asemenea s asigure unicitatea rezulatelor ori de cte ori se dau aceleai date de intrare. Aceste trei caracteristici generalitate, finitudine i unicitate trebuie s ne preocupe ori de cte ori scriem un algoritm, indiferent de forma (scheme logice sau limbaj Pseudocod) n care este prezentat acesta. 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. Datele utilizate ntr-un algoritm pot fi variabile sau constante (i pot modifica valoarea sau nu ). n descrierea unui algoritm,

intervin variabile care marcheaz att datele cunoscute iniial, ct i rezultatele dorite, precum i alte rezultate intermediare necesare n rezolvarea problemei. Variabila definete o mrime care i poate schimba valoarea. Valorile pe care le poate lua variabila aparin unei mulimi D pe care o vom numi domeniul variabilei. Prin variabil vom nelege tripletul (nume, domeniul D, valoare) .

n continuare vor fi descrise blocurile ce descriu n schema logic o anumit operaie. Blocurile delimitatoare (Start i Stop) (figura 1a i 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) (figura 1.c i 1.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). 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 (figura 1.e).
Start Citete list_var_intrare Stop Tiprete list_expr.ieire

a)

b)

c)

d)

var := expresie

Da

Condii e

Nu

<0

Epr. aritm.
=0

>0

e) i i h)

f)

g)

Figura 1. Blocurile schemelor logice.

Blocurile de decizie marcheaz punctele de ramificaie ale algoritmului n etapa de decizie. Ramificarea poate fi dubl (blocul logic, figura 1.f) sau tripl (blocul aritmetic, figura 1.g). Blocul de decizie logic indic ramura pe care se va continua executia algoritmului n functie 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 hotar 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 (figura 1.h). Vom da n continuare o schem logic, pentru rezolvarea ecuaiei de gradul doi aX2+bX+c=0 (a,b,c R i a 0). Ecuaia rdcini reale, poate avea
Start Citete a, b, c Da

respectiv

complexe, n funcie de semnul discriminantului = b2 - 4ac. Algoritmul de rezolvare a problemei va citi mai nti datele problemei, marcate prin variabilele a, b i c. Va calcula apoi discriminantul i va continua n funcie de valoarea lui , aa cum se poate vedea n figura 2.
Tiprete Re,Im Re:=-b / 2a

a=0 Nu

Mesaj a=0
1

:=b2-4ac
Da

<0

Nu

x1:=

-b+ 2a -b- 2a

Im:=-/2a

x2:=

Tiprete x1,x2

Stop

Figura 2.

Algoritm pentru rezolvarea ecuaiei de gradul doi.

1.2. Limbajul Pseudocod.


Limbajul Pseudocod a fost conceput pentru descrierea algoritmilor. Limbajul Pseudocod are dou tipuri de propoziii: standard (care au o structur fix i este format cu ajutorul unor cuvinte cheie), propoziii nestandard (care descriu pri ale algoritmului nc incomplet elaborate, nefinisate, asupra crora urmeaz s se revin) i comentarii (texte scrise ntre acolade utilizate pentru documentarea algoritmului). Propoziiile limbajului Pseudocod se vor executa n ordinea ntlnirii lor n text, asemenea oricrui text al limbii romne. n descrierea algoritmilor se recomand o scriere structurat prin utilizarea urmtoarelor structuri : secvenial (format dintr-o succesiune de propziii simple), alternativ (permite executarea anumitor ramuri n funcie de anumite condiii) repetitiv (prin care putem execut aceleai propoziii de mai multe ori). Structura general a unui algoritm descris n Pseudocod este :

Algoritmul Nume Este : ... Sfarit_Algoritm.

{ Antetul algoritmului } { Corpul { Sfaritul } }

Un algoritm (n general) se desfoar n trei etape : - citirea datelor de intrare (iniializarea datelor), - efectuarea de calcule (prelucrarea datelor),

Date de intrare

Prelucrare

Date de iesire

- tiprirea rezultatelor (extragerea datelor de ieire).

Citirea datelor se face prin propoziia Date List_variabile_de_intrare; iar Tiprirea rezultatelor prin Rezultate List_expresii_de_ieire;

O propoziie des utilizat n efectuarea calculelor este aceea prin care unei variabile i se atribuie valoarea unei expresii. Aceasta este de forma [Fie] Variabil := Expresie; n care cuvntul Fie poate lipsi. Expresia din dreapta semnului de atribuire poate fi o expresie construit cu cele patru operaii: adunare, scdere, nmulire i mprire (notate prin caracterele +, , *, respectiv /). Prin aceast instruciune o variabil primete (i se asigneaz, i se atribuie, sau este iniializat) valoarea (calculat a) unei expresii. Pentru descrierea unei structuri alternative avem trei posibiliti : - structura alternativ cu o ramur : Dac Condiie Atunci Secven Sf_Dac ; Sf_Dac; Dac a<0 Atunci Fie a := a

interpretat astfel : dac este ndeplinit aceast Condiie atunci se execut secvena de propoziii care urmeaz pn la sfritul structurii, iar n caz contrar se trece direct la urmatoarea structur; - structura alternativ cu dou ramuri : Dac Condiie Atunci Secven1 Altfel Secvena2 Sf_Dac ; Sf_Dac Altfel Minim:=b Dac a<b Atunci Minim:=a

aceasta se poate interpreta astfel: dac aceast Condiie este ndeplinit se execut prima secven, dac nu, a doua.

- structura alternativ cu mai multe ramuri : Selecteaz Expresie Dintre List_Valori1 : Secven1; List_Valori2 : Secven2; . . . List_Valorin : Secvenn [ Altfel Sf_Selecteaz; care se poate traduce astfel : se caut valoarea expresiei n listele de valori i se execut secvena corespunztoare. Dac valoarea calculat nu se regseste n nici o list (i apare alternativa Altfel care este opional, atunci se execut ultima secven notat cu n+1). Structurile repetitive permit executarea unei secvene de propoziii de mai multe ori (de un anumit numr de ori, sau ct vreme este ndeplinit o anumit condiie, sau pn cnd este ndeplinit o anumit condiie). Pentru descrierea structurilor repetitive exist trei variante pe care le putem alege n funcie de problema concret pe care dorim s o rezolvm. Structura Pentru este o structur repetitiv cu un numr bine determinat de pai, n schimb structura Ct_Timp (cu test iniial) i structura Repet (cu test final) sunt structuri repetitive cu un numr necunoscut de pai (lucru pe care l vom vedea imediat). - structura repetitiv Pentru se descrie prin propoziia : Pentru Varc := Li , Lf [ , Pas ] Execut Secven Sf_Pentru; avnd urmtoarea semnificaie : se execut secvena (corpul structurii) dnd succesiv valori variabilei contor (Varc ) ncepnd de la limita iniial (Li) pn la Secvenn+1 ] Selecteaz Luna Dintre 4, 6, 9, 11: Nr_Zile:=30; 2: Nr_Zile:=28+Dif_Bisect Altfel Nr_Zile:=31 Sf_Selecteaz;

limita final (Lf) cu pasul precizat (implicit este 1, adic dac lipsete Pas, atunci se consider egal cu 1). - structura repetitiv Ct_Timp are format general : Ct_Timp Condiie Execut Secven Sf_Ct_Timp; i se interpreteaz astfel : dac aceast condiie este ndeplinit atunci se execut secvena i din nou se verific condiia, i asa mai departe. n momentul n care condiia nu este ndeplinit se termin structura repetitiv i se continu cu urmatoarea structur. - structura repetitiv Repet se va scrie Repet Secven Pn_Cnd Condiie ; avnd semnificaia : se execut secvena descris apoi se verific dac este ndeplinit condiia precizat. Dac aceasta este ndeplinit se termin structura repetitiv, iar dac nu este ndeplinit, atunci de execut din nou secvena i se reevalueaz condiia.
Secven Da Nu

Condii e Nu

Secven

Condii e Da

Structura Ct_Timp Figura 3.

Structura Repet

Se observ i n figura 3 c spre deosebire de structura Ct_Timp care poate s nu execute niciodat secvena sa, structura Repet va permite executarea corpului su cel puin o dat. Pentru ambele structuri trebuie s fim ateni s

modificm n secvenele lor, variabile care fac parte din condiie pentru ca aceasta s se modifice. n caz contrar algoritmul nu se va termina, va intra ntr-o bucl infinit. Exemplul urmtor calculeaz produsul a dou polinoame P i Q , date prin irurile coeficienilor. Algoritmul Produs Este : Date m,(Pi, i=0,m), n,(Qj, j=0,n); Pentru k:=0,m+n Execut Rk:=0 Sf_Pentru; Pentru i:=0,m Execut Pentru j:=0,n Execut Ri+j:=Ri+j+Pi*Qj Sf_Pentru; Sf_Pentru; Rezultate (Rk, k=0,m+n) Sf_Algoritm. Algoritmul urmtor, dat ca exemplu, determin primele n (n dat) numere prime. Algoritmul Prime Este : Date n; p:=2; i:=0; Ct_Timp i<n Execut d:=2; d:=d+1 Sf_Ct_Timp; Dac d>Sqrt(p) Atunci Rezultate p; i:=i+1 Sf_Dac; Dac p=2 Atunci p:=p+1 { Se verific doar pentru } { dac am trecut cu d de p atunci p este prim ! } { i reprezint al ctelea numr prim a fost gsit } { p este prim ?( se divide cu 2,3, ... )} {se caut divizori d =2,3,... p} { Primele n numere Prime } { primele n numere prime p =2,3,5, ... } { R:=PQ } { m=gradul lui P, n=gradul lui Q } { m+n=gradul lui R }

Ct_Timp (d<Sqrt(p)) i (p Mod d > 0) Execut

10

Altfel p:=p+2 Sf_Dac; Sf_Ct_Timp Sf_Algoritm.

{ numerele impare de la 3,... }

Ca exemplu de folosire a structurii Repet vom scrie urmtorul algoritm care determin cel mai mare numar n de patru cifre pentru care este ndeplinit condiia : Oglindit (n) + Suma_Cifrelor(n) = n + 99 (Oglinditul lui 123 este 321).

De exemplu pentru n = 4014, egalitatea este adevarat pentru c 4104 + 9 = 4014 + 99 (4+0+1+4=9). Algoritmul Numr Este : n:=9999; Repet n:=n1; Ct:=n; Sc:=0; Ogl:=0; Repet Uc :=Ct Mod 10; Sc :=Sc + Uc; Ogl :=Ogl *10+ Uc; Ct :=[Ct / 10] Pn_Cnd Ct=0; Pn_Cnd (Ogl+Sc=n+99) Sau (n=999); Dac n>999 Atunci Rezultate n Altfel Rezultate Nu exist Sf_Dac Sf_Algoritm. { Determin Ultima cifr a numrului } { Adun Ultima cifr la Suma cifrelor } { Adaug Ultima cifr la Oglindit } { Sterg Ultima cifr din numr } { Primul Ct este n } { Cel mai mare numr n de patru cifre : } { Ogl (n) + Sc (n) = n + 99 }

11