Sunteți pe pagina 1din 49

Laboratorul nr.

2 - 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

Laboratorul nr. 2 - 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;

Laboratorul nr. 2 - 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 %

suma n cont dup prima lun

12

s1 b b

dl
dl

b 1

100
100

suma final dup n luni este obinut din relaia


anterioar, considernd creterea lunar a valorii aflate n cont
1
dl

bf
b 1

1000
100

Tem S se demonstreze formula de calcul a lui bf.

Laboratorul nr. 2 - Algoritmi

c) Reprezentarea algoritmului:

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.

Laboratorul nr. 2 - Algoritmi

Etapele rezolvrii problemei


a) Definirea datelor de intrare/ieire
Date de intrare :
- a1,b1,a2,b2
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

Laboratorul nr. 2 - Algoritmi

Laboratorul nr. 2 - 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.

Laboratorul nr. 2 - 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

2.b schem logic


Fig. 2

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.

Laboratorul nr. 2 - 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

3.b schem logic


Fig. 3

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 .
daca a0 atunci

b
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).

Laboratorul nr. 2 - Algoritmi

c)Reprezentarea algoritmului

d)Tabel de verificare
operaii
citete a
citete b
a=0?
DA

NU

b=0?
DA

a=4
b=2
4=0?
Nu
-

NU
x=-b/a
afieaz x

x=-2/4
-0,5

afi. Ec. are o inf. sol


afi. Ec. nu are sol

Stop

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.
10

Laboratorul nr. 2 - 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.

11

Laboratorul nr. 2 - 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.

12

Laboratorul nr. 2 - Algoritmi

Ex. 4 Sa se determine valoarea expresiei

S i3

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

i 1

S 13 2 3 33 ............. n 3 i 3
i 1

d) Reprezentarea algoritmului :

pseudocod
logic

schema

Obs.
- 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.

13

Laboratorul nr. 2 - Algoritmi

e) Tabel de verificare

Instruc. repetitiv

instruciune
citete n
afieaz n
s=0
i=1
i<=n?

Tabelul 2

PAS 1
n=3
3//ecou
s=0
i=1
1<=3 ?

PAS 2

PAS 3

PAS 4

2<=3 ?

3<=3 ?

4<=3 ?

DA

DA

DA

DA

s=s+i3

s=0+13=1

s=1+23=9

s=9+33=36
NU

i=i+1

i=1+1=2

i=2+1=3

i=3+1=4

afieaz s

36
n

i 1

j 1

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

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

i 1

j 1

S i j 2

d) Reprezentarea algoritmului :

14

Laboratorul nr. 2 - Algoritmi

Obs.

Instruc. Repetitive

- 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

PAS 2

PAS 3

PAS 4

PAS 5

2<=2
2<=1

3<2

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

2<=2
S=3+2*2

j=2

j=3

j=2
i=2

PAS 6

3<=2

i=3
7

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:

15

Laboratorul nr. 2 - 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)

x2 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;
citete xi, xf, xp;
16

Laboratorul nr. 2 - Algoritmi

afieaz xi, xf, xp;


f=0;
x= xi;
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.

struct. repetit.

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

Pas 0

Pas 1

Pas 2

Pas 3

Pas 4

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

xi=0
xf=7
xp=2
f=0
x=0
0<=7

2<=7

4<=7

6<=7

8<=7

t=-9
-9>=0
NU

t=-5
-5>=0
NU

x=2
0

x=4
1

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

t=27
27>=0
f= 27
5.19
x=8
3

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
transcendente, calculul valorii radicalului,determinarea valorii unei serii cu
numr infinit de termeni etc).

17

Laboratorul nr. 2 - Algoritmi

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
urmtoare secvenei repetitive (aciune 3).

18

Laboratorul nr. 2 - Algoritmi

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 :

19

Laboratorul nr. 2 - Algoritmi

e) Tabel de verificare

Instruc. Repetitiv

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

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

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

1>=0

-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

20

Laboratorul nr. 2 - Algoritmi

Ex. 8

Calculul mediei aritmetice a unui numr n elemente cuprinse intr-un


anumit interval [yi, yf].

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 .

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:
x[0] x[1] x[2] x[3] .................... x[n 1]
ma
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

21

Laboratorul nr. 2 - Algoritmi

Descrierea metodei :
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.

22

Laboratorul nr. 2 - Algoritmi

23

Laboratorul nr. 2 - 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.

24

Laboratorul nr. 2 - 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

25

Laboratorul nr. 2 - 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).

26

Laboratorul nr. 2 - 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 .
27

Laboratorul nr. 2 - 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
28

Laboratorul nr. 2 - Algoritmi

29

Laboratorul nr. 2 - 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.

30

Laboratorul nr. 2 - 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

Pas 0

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

m=2 n=2

instruciuni
(continuare)

Pas 7

i<m?

0<2
Da
j=0

Nu

Da
j=0
j<n?

Nu
Da
b[j,i]= a[i,j]
J=j+1
I=i+1
//afiseaza b[i][j]

Pas 1

Pas 2

i=0
0<2?
Da
j=0

Pas 3

Pas 4

Pas 5

1<2
Da
j=0

0<2?
Da
a[0,0]=-2

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

j=1

j=2

2<2?
Nu

Pas 6
2<2
NU

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

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

j=1

j=2

i=1

2<2?
NU

i=2
i=0

Pas 8

Pas 9

Pas
10

Pas
11

Pas
12

1<2
Da
j=0

0<2
Da
b[0,0]=-2

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

j=1

j=2

2<2?
Nu

i=1

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

Pas
13
2<2
NU

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

2<2?
NU

i=2

31

Laboratorul nr. 2 - Algoritmi

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

Matricea final (b) va arta astfel:


2

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:
Ti

xi
i!

Deci:

Ti 1

Ti 1
Ti

o
o
o

x
(i 1)

x i 1
(i 1)!

deci

Ti 1 Ti

x
(i 1)

, iar T0 = 1;

Calculul sumei:
S = S + Ti+1
Stabilirea valorilor iniiale:
i = 0, S = 1, Ti = T0=1
Stabilirea condiiei de convergen:
Ti 1
100 max
S

max 1%,

numarul maxim de iteratii 20

32

Laboratorul nr. 2 - Algoritmi

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

x
i 1

s s tc

tc
100
s
i i 1
eps

dac (i > nr_max)


atunci
afieaz "Soluie divergent"
STOP
sfrit dac
ti = t c
ct timp (eps > eps_max)
afieaz s
sfrit program

33

Laboratorul nr. 2 - Algoritmi

34

Laboratorul nr. 2 - Algoritmi

e) Tabel de verificare
Pas 0

citete x
citete eps_max
citete nr_max
S=0
Ti=1
i=0
executa

3
50
9
0
1
0

struct. repetit.

Operaii

tc ti

Pas 1

x
3
t 1
i 1 c
1

s s tc

3
2
s 3 4.5

tc 3

s3

Pas 2

3
3
s 7.5 4.5 12

t c 4.5

4.5
4.5
3
tc
eps
100
100eps 3 100eps 7.5 100
12
s
i 1
i3
i2
i i 1

eps

dac (i >
nr_max) da

1>2
NU

2>2
NU

3>9
NU

ti =3

ti =4.5

ti =4.5

100>50
DA

60>50?
DA

37.5>50
NU

afieaz
"Soluie
divergent"
STOP

ti = t c
Cat timp
eps >
eps_max
Afis S

Pas

12
Stop

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)
unde x0=1; i=1,n
35

Laboratorul nr. 2 - 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
xc

1
n
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

citete n
citete eps_max
xi=1
n<0
nu
da
Afis
1
n
NR.
NRGATIV
x x

2
0.1
1
2<0
nu

xi

eps=|xc*xc-n|

xi=xc
Eps>eps_max

11
22

xxcc 1 ,51
22
1,1
5

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

Afis xc
Pas

Pas 1

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

36

Laboratorul nr. 2 - 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.
2.
12,13

Sa se alcatuiasca schema logica la problemele 12,13.


Sa se alcatuiasca tabelul de verificare la problemele

37

Laboratorul nr. 2 - 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

Laboratorul nr. 2 - 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

funcia apelat

Fig. 8
Ex. 18. S se calculeze n!.
39

4
funcia apelat

Laboratorul nr. 2 - Algoritmi

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

Laboratorul nr. 2 - 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 :g 1,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

Laboratorul nr. 2 - 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

Laboratorul nr. 2 - 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.
funcie pune(k)
i=1;
43

Laboratorul nr. 2 - Algoritmi

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).
citete n,m //citim dimens. matricei iniiale
44

Laboratorul nr. 2 - Algoritmi

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 c
6.
z[0][k]=x[0][i]
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.
ntrebri de autocontrol
1 Ce este un algoritm?
45

Laboratorul nr. 2 - Algoritmi

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

Laboratorul nr. 2 - 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!
m

2
S4= (i i )
i 1
2

S5= cos(i )
i 0
m
n

S6= ( j i )
i 1 j i
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

Laboratorul nr. 2 - 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

Laboratorul nr. 2 - 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

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