Foarte multi algoritmi executa anumite calcule in functie de satisfacerea
unor conditii. Aceste calcule sunt redate de structura alternativa prezentata
in figura 1.3.1.b, careia ii corespunde propozitia Pseudocod DACA
cond ATUNCI A ALTFEL B SFDACA sau varianta redusa a ei, DACA cond ATUNCI A SFDACA folosita in cazul in care grupul de propozitii B este vid. o8q14qr
Aceste propozitii redau in Pseudocod structura alternativa de calcul.
Ele cer mai intai verificarea conditiei scrise dupa cuvantul
DACA. In caz ca aceasta conditie este adevarata se va executa grupul de
propozitii A. In cazul in care aceasta conditie este falsa se va
executa grupul de propozitii B, daca este prezenta ramura ALTFEL. Indiferent
care dintre secventele A sau B a fost executata, se va continua cu propozitia
urmatoare propozitiei DACA.
O generalizare a structurii alternative realizata de propozitia DACA este structura
selectiva:
SELECTEAZA i DINTRE v1: A1; v2: A2;
. . . vn: An
SFSELECTEAZA structura echivalenta cu urmatorul text Pseudocod:
DACA i=v1 ATUNCI A1 ALTFEL
DACA i=v2 ATUNCI A2 ALTFEL
. . .
DACA i=vn ATUNCI An SFDACA
...
SFDACA
SFDACA
Cu propozitiile prezentate pana aici putem deja descrie destui algoritmi.
Acestia se numesc algoritmi cu ramificatii.
Ca exemplu vom scrie un algoritm pentru rezolvarea ecuatiei de gradul al doilea.
Am scris mai sus specificatia acestei probleme si am precizat semnificatia variabilelor
respective. Pe langa aceste variabile, pentru rezolvarea problemei mai
avem nevoie de doua variabile auxiliare: delta ? pentru a retine discriminantul ecuatiei; r ? pentru a retine valoarea radicalului folosit in exprimarea radacinilor.
Ajungem usor la algoritmul dat in continuare.
ALGORITMUL ECGRDOI ESTE: A Algoritmul 2: Rezolvarea S
A ecuatiei de gradul doi S
CITESTE a,b,c; A a,b,c = Coeficientii ecuatiei S
FIE delta:=b*b?4*a*c;
DACA delta<0 ATUNCI ind:=0; A radacini complexe S r:=radical din (?delta); x1:=?b/(a+a); x2:=r/(a+a);
ALTFEL ind:=1; A radacini reale S r:=radical din delta; x1:=(?b?r)/(a+a); x2:=(?b+r)/(a+a);
SFDACA
TIPARESTE ind, x1,x2;
SFALGORITM
1.3.3 Algoritmi ciclici
In rezolvarea multor probleme trebuie sa efectuam aceleasi calcule de
mai multe ori, sau sa repetam calcule asemanatoare. De exemplu, pentru a calcula
suma a doua matrice va trebui sa adunam un element al primei matrice cu elementul
de pe aceeasi pozitie din a doua matrice, aceasta adunare repetandu?se
pentru fiecare pozitie. Alte calcule trebuiesc repetate in functie de
satisfacerea unor conditii. In acest scop in limbajul Pseudocod
exista trei propozitii standard: CATTIMP, REPETA si PENTRU.
Propozitia CATTIMP are sintaxa CATTIMP cond EXECUTA A SFCAT
i cere executia repetata a grupului de propozitii A, in functie de conditia
"cond". Mai exact, se evalueaza conditia "cond"; daca aceasta
este adevarata se executa grupul A si se revine la evaluarea conditiei. Daca
ea este falsa executia propozitiei se termina si se continua cu propozitia care
urmeaza dupa SFCAT. Daca de prima data conditia este falsa grupul A nu
se va executa niciodata, altfel se va repeta executia grupului de propozitii
A pana cand conditia va deveni falsa. Din cauza ca inainte
de executia grupului A are loc verificarea conditiei, aceasta structura se mai
numeste structura repetitiva conditionata anterior. Ea reprezinta structura
repetitiva prezentata in figura 1.3.1.c.
Ca exemplu de algoritm in care se foloseste aceasta propozitie dam algoritmul
lui Euclid pentru calculul celui mai mare divizor comun a doua numere.
ALGORITMUL Euclid ESTE: AA3: Cel mai mare divizor comunS
CITESTE n1,n2; ACele doua numere a caror divizor se cereS
FIE d:=n1; i:=n2;
CATTIMP i¹0 EXECUTA r:=d modulo i; d:=i; i:=r
SFCAT
TIPARESTE d; A d= cel mai mare divizor comun al S
SFALGORITM A numerelor n1 si n2 S
In descrierea multor algoritmi se intalneste structura repetitiva
conditionata posterior:
REPETA A PANA CAND cond SFREP structura echivalenta cu: CATTIMP not(cond) EXECUTA A SFCAT
Deci ea cere executia neconditionata a lui A si apoi verificarea conditiei "cond".
Va avea loc repetarea executiei lui A pana cand conditia devine
adevarata. Deoarece conditia se verifica dupa prima executie a grupului A aceasta
structura este numita structura repetitiva conditionata posterior, prima executie
a blocului A fiind neconditionata.
O alta propozitie care cere executia repetata a unei secvente A este propozitia
PENTRU c:=li ;lf a;pi EXECUTA A SFPENTRU
Ea defineste structura repetitiva predefinita, cu un numar determinat de executii
ale grupului de propozitii A si este echivalenta cu secventa c:=li ; final:=lf ;
REPETA
A c:=c+p
PANACAND (c>final si p>0) sau (c<final si p<0) SFREP
Se observa ca, in sintaxa propozitiei PENTRU, pasul p este inchis
intre paranteze drepte. Prin aceasta indicam faptul ca el este optional,
putand sa lipseasca. In cazul in care nu este prezent, valoarea
lui implicita este 1.
Semnificatia propozitiei PENTRU este clara. Ea cere repetarea grupului de propozitii
A pentru toate valorile contorului c cuprinse intre valorile expresiilor
li si lf (calculate o singura data inainte de inceperea ciclului),
cu pasul p. Se subintelege ca nu trebuie sa modificam valorile contorului
in nici o propozitie din grupul A. De multe ori aceste expresii sunt variabile
simple, iar unii programatori modifica in A valorile acestor variabile,
incalcand semnificatia propozitiei PENTRU. Deci, nu recalcula limitele
si nu modifica variabila de ciclare (contorul) in interiorul unei structuri
repetitive PENTRU).
Sa observam, de asemenea, ca prima executie a grupului A este obligatorie, abia
dupa modificarea contorului verificandu-se conditia de continuare a executiei
lui A.
Ca exemplu, sa descriem un algoritm care gaseste minimul si maximul componentelor
unui vector de numere reale. Vom nota prin X acest vector, deci
X = (x1, x2, ... , xn)
Specificatia problemei este urmatoarea:
DATE n,(xi ,i=1,n);
REZULTATE valmin,valmax; iar semnificatia acestor variabile se intelege din cele scrise mai sus.
Pentru rezolvarea problemei vom examina pe rand cele n componente. Pentru
a parcurge cele n componente avem nevoie de un contor care sa precizeze pozitia
la care am ajuns. Fie i acest contor. Usor se ajunge la urmatorul algoritm:
ALGORITMUL MAXMIN ESTE: A Algoritmul 5: Calculul S
A valorii minime si maxime S
CITESTE n,(xi,i=1,n);
FIE valmin:=x1; valmax:=x1;
PENTRU i:=2,n EXECUTA
DACA xi<valmin ATUNCI valmin:=xi SFDACA
DACA xi>valmax ATUNCI valmax:=xi SFDACA
SFPENTRU
TIPARESTE valmin,valmax;
SFALGORITM
Un rol important in claritatea textului unui algoritm il au denumirile
alese pentru variabile. Ele trebuie sa reflecte semnificatia variabilelor respective.
Deci alege denumiri sugestive pentru variabile, care sa reflecte semnificatia
lor.
In exemplul de mai sus denumirile valmin si valmax spun cititorului ce
s-a notat prin aceste variabile.