Documente Academic
Documente Profesional
Documente Cultură
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
23
dobnda lunar dl %
12
s1 b b
dl
dl
b 1
100
100
bf
b 1
1000
100
c) Reprezentarea algoritmului:
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.
1.a pseudocod
3.a pseudocod
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
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
Stop
Stop
11
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
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
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
Obs.
Instruc. Repetitive
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
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
struct. repetit.
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
17
7a Pseudocod
7b organigram
Fig. 7
18
19
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
Ex. 8
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
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
23
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
25
26
29
30
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
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
OBS.
Afiarea matricei b ramne ca tem!
Matricea initiala (a) va arata 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%,
32
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
33
34
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
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
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
Tema
1.
2.
12,13
37
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
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
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
41
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
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
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
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
49