Sunteți pe pagina 1din 40

Algoritmica - Curs 2 (2013)

1
CURS 2:
Descrierea algoritmilor in pseudocod
=Exemple=
Algoritmica - Curs 2 (2013) 2
Structura
Descrierea unor algoritmi simpli
Specificarea i utilizarea subalgoritmilor
Algoritmica - Curs 2 (2013) 3
Exemplu 1
Considerm un tabel cu informaii despre studeni
Nr. Nume Note Credite Stare Medie
1 A 8 6 7 60
2 B 10 10 10 60
3 C - 7 5 40
4 D 6 - - 20
5 E 8 7 9 60
Problema: s se completeze coloanele stare i medie folosind regulile
stare = 1 dac Credite=60 (obs: 1 credit=30 ore de activitate)
stare= 2 dac Credite este in [30,60)
stare= 3 dac Credite <30
media aritmetic a notelor se calculeaz doar dac Credite =60
Algoritmica - Curs 2 (2013) 4
Exemplu 1
Dup completare tabelul va arta astfel:
Nr. Nume Note Credite Stare Medie
1 A 8 6 7 60 1 7
2 B 10 10 10 60 1 10
3 C - 7 5 40 2 -
4 D 6 - - 20 3 -
5 E 8 7 9 60 1 8
Algoritmica - Curs 2 (2013) 5
Exemplu 1
Ce fel de date vor fi prelucrate?
Nr. Nume Note Credite Stare Medie
1 A 8 6 7 60
2 B 10 10 10 60
3 C - 7 5 40
4 D 6 - - 20
5 E 8 7 9 60
Date de intrare: Note si Credite
note[1..5,1..3] : tablou bidimensional (matrice) cu 5 linii i 3
coloane
Descriere n pseudocod: int note[1..5,1..3]
Algoritmica - Curs 2 (2013) 6
Exemplu 1
Ce fel de date vor fi prelucrate?
Nr. Nume Note Credite Stare Medie
1 A 8 6 7 60
2 B 10 10 10 60
3 C - 7 5 40
4 D 6 - - 20
5 E 8 7 9 60
Date de intrare: Note i Credite
credite[1..5] : tablou unidimensional cu 5 elemente
Descriere in pseudocod: int credite[1..5]
Algoritmica - Curs 2 (2013) 7
Exemplu 1
Ce fel de date vor fi prelucrate?
Nr. Nume Note Credite Stare Medie
1 A 8 6 7 60
2 B 10 10 10 60
3 C - 7 5 40
4 D 6 - - 20
5 E 8 7 9 60
Date de ieire: Stare si Medie
stare[1..5], medie[1..5] : tablouri unidimensionale cu 5 elemente
Descriere pseudocod: int stare[1..5]
real medie[1..5]
Algoritmica - Curs 2 (2013) 8
Exemplu 1
Regula pt.determinarea strii unui
student
stare = 1 dac credite=60
stare= 2 dac credite in [30,60)
stare= 3 dac credite <30
credite=60
Descriere n pseudocod:
if credite==60 then stare 1
else if credite>=30 then stare 2
else stare 3
endif
endif
stare 1
da
credite>=30
stare 2 stare 3
nu
nu
da
Descriere in Python
if credite==60:
stare=1
elif credite>=30:
stare=2
else:
stare=3
Exemplu 1
Completarea strii pentru toi studenii
Obs: Numrul studenilor este notat cu n (n
exemplul analizat n=5)
Pas 1: se pornete de la prima linie din tabel
(i 1)
Pas 2: se verific dac mai sunt linii de
prelucrat (i<=n); daca nu, se oprete
prelucrarea
Pas 3: se calculeaz starea elementului i
Pas 4: se pregatete indicele urmtorului
element (i i+1)
Pas 5: se continu cu Pas 2
calcul stare[i]
i 1
i<=n
i i+1
=60
1 >=30
2 3
9 Algoritmica - Curs 2 (2013)
Algoritmica - Curs 2 (2013)
Exemplu 1
Completarea strii pentru toi
studenii
calcul stare[i]
i 1
i<=n
i i+1
Pseudocod:
int credite[1..n], stare[1..n], i
i 1
while i<=n do
if credite[i]==60 then stare[i] 1
else if credite[i]>=30 then stare[i] 2
else stare[i] 3
endif
endif
i i+1
endwhile
10
Algoritmica - Curs 2 (2013)
Exemplu 1
Simplificarea descrierii algoritmului
prin gruparea unor prelucrri in
cadrul unui subalgoritm
Pseudocod:
int credite[1..n], stare[1..n], i
i 1
while i<=n do
stare[i] calcul(credite[i])
i i+1
endwhile
Descriere subalgoritm (modul sau
funcie):
calcul (int c)
int stare
if c==60 then stare 1
else if c>=30 then stare 2
else stare 3
endif
endif
return stare
Obs: un subalgoritm descrie un calcul
afectuat asupra unor date generice
numite parametri
11
Algoritmica - Curs 2 (2013)
Utilizarea subalgoritmilor
Idei de baza:
Problema iniial se descompune n subprobleme
Pentru fiecare subproblem se proiecteaz un algoritm
(numit subalgoritm sau modul sau funcie sau procedur)
Prelucrrile din cadrul subalgoritmului se aplic unor date
generice (numite parametri) i eventual unor date ajuttoare
(numite variabile locale)
Prelucrrile specificate n cadrul subalgoritmului sunt
executate n momentul apelului acestuia (parametrii generici
sunt inlocuii cu valori concrete)
Efectul unui algoritm const n :
Returnarea unuia sau a mai multor rezultate
Modificarea valorilor unor parametri (sau a unor variabile
globale)
12
Utilizarea subalgoritmilor
Mecanismul de comunicare intre algoritm si subalgoritmi:
- parametri i valori returnate
Algoritm
Variabile (globale)
Calcule locale
.
Apel subalgoritm
..
Calcule locale
Variable locale
Calcule asupra variabilelor
locale si parametrilor
Returnarea rezultatelor
Parametri:
- intrare
- iesire
Subalgoritm
Date intrare
Date iesire
Algoritmica - Curs 2 (2013) 13
Algoritmica - Curs 2 (2013)
Utilizarea subalgoritmilor
Mecanismul de comunicare intre algoritm si subalgoritmi:
- parametri si valori returnate
Algoritm
int credite[1..n], stare[1..n], i
i 1
while i<=n do
stare[i] calcul(credite[i])
i i+1
endwhile
calcul (int c)
int stare
if c==60 then stare 1
else if c>=30
then stare 2
else stare 3
endif
endif
return stare
Subalgoritm
Date intrare
Date iesire
Param. intrare
Var.
locala
Rezultat de
returnat
14
Utilizarea subalgoritmilor
Structura unui subalgoritm:
<nume subalgoritm> (<parametri formali (generici)>)
< declaraii ale variabilelor locale >
< prelucrri >
RETURN <rezultate>
Apelul unui subalgoritm:
<nume subalgoritm> (<parametri efectivi>)
Algoritmica - Curs 2 (2013) 15
napoi la Exemplul 1
Pseudocod:
int credite[1..n], stare[1..n], i
i 1
while i<=n do
stare[i] calcul(credite[i])
i i+1
endwhile
Alta variant:
int credite[1..n], stare[1..n], i
for i 1,n do
stare[i] calcul(credite[i])
endfor
Subalgoritm (functie) :
calcul (int c)
int stare
if c==60 then stare 1
else if c>=30 then stare 2
else stare 3
endif
endif
return stare
Algoritmica - Curs 2 (2013) 16
napoi la Exemplul 1
Python:
cr edi t e=[ 60, 60, 40, 20, 60]
st ar e=[ 0] *5
n=5
i =0
whi l e i <n:
st ar e[ i ] =cal cul ( cr edi t e[ i ] )
i =i +1
pr i nt st ar e
Utilizare for in loc de while:
f or i i n r ange( 5) :
st ar e[ i ] =cal cul ( cr edi t e[ i ] )
Functie Python:
def cal cul ( c) :
i f c==60:
st ar e=1
el i f c>=30:
st ar e=2
el se:
st ar e=3
r et ur n st ar e
Obs: indentarea liniilor este foarte
important n Python
Algoritmica - Curs 2 (2013) 17
napoi la Exemplul 1
Calcul medie: pentru studenii avnd starea=1 trebuie calculat media
arutmetic a notelor
Notele studentului i se afl pe linia i a matricii note (se pot specifica prin
note[i,1..m])
Nr. Nume Note Credite Stare Medie
1 A 8 6 7 60 1
2 B 10 10 10 60 1
3 C - 7 5 40 2
4 D 6 - - 20 3
5 E 8 7 9 60 1
18 Algoritmica - Curs 2 (2013)
napoi la Exemplul 1
Calculul mediei
int note[1..n,1..m], stare[1..n]
real medie[1..n]

for i 1,n do
if stare[i]==1
medie[i] calculMedie(note[i,1..m])
endif
endfor
Funcie pt calcul medie
calculMedie(int v[1..m])
real suma
integer i
suma 0
for i 1,m do
suma suma+v[i]
endfor
suma suma/m
return suma
19 Algoritmica - Curs 2 (2013)
napoi la Exemplul 1
Calculul mediei (exemplu Python)
not e=[ [ 8, 6, 7] , [ 10, 10, 10] , [ 0, 7, 5] , [ 6, 0, 0] , [ 8, 7, 9] ]
st ar e=[ 1, 1, 2, 3, 1]
medi e=[ 0] *5
f or i i n r ange( 5) :
i f st ar e[ i ] ==1:
medi e[ i ] =cal cul Medi e( not e[ i ] )
pr i nt medi e
Obs: r ange( 5) = [ 0, 1, 2, 3, 4]
In Python indicii tablourilor incep de la 0
Functie pt. calculul mediei
(Python)
def cal cul Medi e( not e) :
m=l en( not e)
suma=0
f or i i n r ange( m) :
suma =
suma+not e[ i ]
suma=suma/ m
r et ur n suma
20 Algoritmica - Curs 2 (2013)
Pauz ... de ciocolat
Am o tablet de ciocolat pe care doresc s o rup n
bucele (n cazul unei tablete 4x6 sunt 24 astfel
de bucele). Care este numrul minim de micri
de rupere necesare pentru a obine cele 24 de
bucele ? (la fiecare micare pot rupe o bucat
n alte dou buci)
21 Algoritmica - Curs 2 (2013)
Pauz ... de ciocolat
Am o tablet de ciocolat pe care doresc s o rup n
bucele (n cazul unei tablete 4x6 sunt 24 astfel
de bucele). Care este numrul minim de micri
de rupere necesare pentru a obine cele 24 de
bucele ? (la fiecare micare pot rupe o bucat
n alte dou buci)
Rspuns: 23 (n cazul unei tablete de mxn numrul
de micri este mxn-1)
Cum putem demonstra ?
22 Algoritmica - Curs 2 (2013)
Pauz ... de ciocolat
Prin inducie matematic (pentru o tablet cu N=nxm
bucele)
Caz particular: bucata ntreag (1) nu necesit nici o
rupere (0)
Ipotez: Prespunem c pentru orice K<N sunt
necesare i suficiente K-1 micri.
Pentru a obine N buci se procedeaz astfel:
Se rupe n dou buci (cu K
1
<N respectiv K
2
<N
bucele, K
1
+K
2
=N) o micare
Se rupe fiecare dintre cele dou buci n bucele
(K
1
-1+K
2
-1=K
1
+K
2
-2 micri)
Total: K
1
+K
2
-2+1=K
1
+K
2
-1=N-1 micri
23 Algoritmica - Curs 2 (2013)
Algoritmica - Curs 2 (2013) 24
Exemplu 2 cel mai mare divizor
comun
Problema: Fie a i b dou numere reale. S se determine cel mai
mare divizor al lui a i b: cmmdc(a,b)
Metoda lui Euclid:
Se calculeaz restul r al mpririi lui a la b
Inlocuiete valoarea lui a cu valoarea lui b, valoarea lui b cu
valoarea lui r i calculeaz din nou restul mpririi lui a la b
Procesul continu pn se obine un rest egal cu 0
Restul anterior (care este evident diferit de 0) va fi cmmdc(a,b).
Algoritmica - Curs 2 (2013) 25
Exemplu 2 cel mai mare divizor
comun
Cum funcioneaz metoda?
1: a=bq
1
+r
1
, 0<=r
1
<b
2: b=r
1
q
2
+r
2
, 0<=r
2
<r
1
3: r
1
=r
2
q
3
+r
3
, 0<=r
3
<r
2

i: r
i-2
=r
i-1
q
i
+r
i
, 0<=r
i
<r
i-1

n-1: r
n-3
=r
n-2
q
n-1
+r
n-1
, 0<=r
n-1
<r
n-2
n : r
n-2
=r
n-1
q
n
, r
n
=0
Observaii:
la fiecare pas dempritul
ia valoarea vechiului mpritor iar
noul mpritor ia valoarea vechiului
rest
secvena de resturi este
strict descresctoare, astfel c
exist o valoare n astfel nct
r
n
=0 (metoda este finit)
utiliznd aceste relaii
se poate demonstra ca r
n-1
este ntr-adevar cmmdc(a,b)
Algoritmica - Curs 2 (2013) 26
Exemplu 2 cel mai mare divizor
comun
Cum funcioneaz metoda?
1: a=bq
1
+r
1
, 0<=r
1
<b
2: b=r
1
q
2
+r
2
, 0<=r
2
<r
1
3: r
1
=r
2
q
3
+r
3
, 0<=r
3
<r
2

i: r
i-2
=r
i-1
q
i
+r
i
, 0<=r
i
<r
i-1

n-1: r
n-3
=r
n-2
q
n-1
+r
n-1
,0<=r
n-1
<r
n-2
n : r
n-2
=r
n-1
q
n
, r
n
=0
Demonstratie:
din ultima relaie rezult c r
n-1
divide pe r
n-2
, din penultima relaie
rezult c r
n-1
divide pe r
n-3
s.a.m.d.
rezult astfel c r
n-1
divide att pe a
ct i pe b (deci este divizor comun)
pt a arta c r
n-1
este cmmdc
considerm c d este un alt divizor
comun pentru a i b; din prima relaie
rezult c d divide r
1
; din a doua
rezult c divide pe r
2
s.a.m.d.
din penultima relaie rezult c d
divide pe r
n-1
Deci orice alt divizor comun il divide
pe r
n-1
=> r
n-1
este cmmdc
Algoritmica - Curs 2 (2013) 27
Exemplu 2 cel mai mare divizor
comun
Algoritm
(varianta WHILE ):
cmmdc(int a,b)
int d,i,r
d a
i b
r d MOD i
while r<>0 do
d i
i r
r d MOD i
endwhile
return i
Algoritm :
(varianta REPEAT )
cmmdc(int a,b)
int d,i,r
d a
i b
repeat
r d MOD i
d i
i r
until r=0
return d
Algoritmica - Curs 2 (2013) 28
Exemplu 2 cmmdc al unei secvene
de valori
Problema: s se determine cmmdc al unei secvene de numere
naturale nenule
Exemplu:
cmmdc(12,8,10)=cmmdc(cmmdc(12,8),10)=cmmdc(4,10)=2
Date de intrare: secvena de valori (a
1
,a
2
,..., a
n
)
Date de ieire (rezultat): cmmdc (a
1
,a
2
,..., a
n
)
Idee:
Se calculeaz cmmdc al primelor dou elemente, dup care se
calculeaz cmmdc pentru rezultatul anterior i noua valoare
e natural s se utilizeze un subalgoritm care calculeaz
cmmdc
Algoritmica - Curs 2 (2013) 29
Exemplu 2 cmmdc al unei secvene
de valori
Structura algoritmului:
cmmdcSecventa(int a[1..n])
int d,i
d cmmdc(a[1],a[2])
for i 3,n do
d cmmdc(d,a[i])
endfor
return d
cmmdc (int a,b)
int d,i,r
d a
i b
r d MOD i
while r<>0 do
d i
i r
r d MOD i
endwhile
return i
Algoritmica - Curs 2 (2013) 30
Exemplu 3: problema succesorului
Se consider un numr constituit din 10 cifre distincte. S se
determine elementul urmtor din secvena cresctoare a
numerelor naturale constituite din 10 cifre distincte.
Exemplu: x= 6309487521
Data de intrare: tablou unidimensional cu 10 elemente ce conine
cifrele numrului: [6,3,0,9,4,8,7,5,2,1]
Urmtorul numr (n ordine cresctoare) ce conine 10 cifre
distincte este:
6309512478
Algoritmica - Curs 2 (2013) 31
Exemplu 3: problema
succesorului
Pas 1. Determin cel mai mare indice i avnd proprietatea c
x[i-1]<x[i]
Exemplu: x= 6309487521 i=6
Pas 2. Determin cel mai mic x[k] din subtabloul x[i..n] care este
mai mare dect x[i-1]
Exemplu: x=6309487521 k=8
Pas 3. Interschimb x[k] cu x[i-1]
Exemplu: x=6309587421 (aceasta valoare este mai mare dect cea
anterioar)
Pas 4. Sorteaz x[i..n] cresctor (pentru a obine cel mai mic numr
care satisface cerinele)
Exemplu: x=6309512478 (este suficient s se inverseze ordinea
elementelor din x[i..n])
Algoritmica - Curs 2 (2013) 32
Exemplu 3: problema succesorului
Subprobleme / subalgoritmi:
Identifica: Identific poziia i a celui mai din dreapta element x[i],
care este mai mare dect vecinul su stng (x[i-1])
Input: x[1..n]
Output: i
Minim: determin indicele celui mai mic element din subtabloul
x[i..n] care este mai mare decat x[i-1]
Input: x[i-1..n]
Output: k
Inversare: inverseaz ordinea elementelor din x[i..n]
Input: x[i..n]
Output: x[i..n]
Algoritmica - Curs 2 (2013) 33
Exemplu 3: problema succesorului
Structura generala a algoritmului:
Succesor(int x[1..n])
int i, k
i Identifica(x[1..n])
if i==1
then write nu exista succesor !"
else
k Minim(x[i-1..n])
x[i-1]x[k]
x[i..n] Inversare(x[i..n])
write x[1..n]
endif
Observaie: In general
interschimbarea valorilor a dou
variabile necesit 3 atribuiri i
utilizarea unei variabile auxiliare
(la fel cum schimbarea
coninutului lichid a dou
pahare necesit utilizarea unui
alt pahar)
a b
este echivalent cu
aux a
a b
b aux
Algoritmica - Curs 2 (2013) 34
Exemplu 3: problema succesorului
Identifica(int x[1..n])
integer i
i n
while (i>1) and (x[i]<x[i-1]) do
i i-1
endwhile
return i
Minim(int x[i-1..n])
Integer j
k i
for j i+1,n do
if x[j]<x[k] and x[j]>x[i-1] then
k j
endif
endfor
return k
Algoritmica - Curs 2 (2013) 35
Exemplu 3: problema succesorului
inversare (int x[left..right])
int i,j
i left
j right
while i<j DO
x[i]x[j]
i i+1
j j-1
endwhile
return x[left..right]
Algoritmica - Curs 2 (2013) 36
Exemplu 3: implementare Python
def i dent i f i ca( x) :
n=l en( x)
i =n- 1
whi l e ( i >0) and ( x[ i -
1] >x[ i ] ) :
i =i - 1
r et ur n i
def mi ni m( x, i ) :
n=l en( x)
k=i
f or j i n r ange( i +1, n) :
i f ( x[ j ] <x[ k] ) and
( x[ j ] >x[ i - 1] ) :
k=j
r et ur n k
def i nver sar e( x, l ef t , r i ght ) :
i =l ef t
j =r i ght
whi l e i <j :
x[ i ] , x[ j ] =x[ j ] , x[ i ]
i =i +1
j =j - 1
r et ur n x
Obs. In Python interschimbarea a
doua variable a si b poate fi
realizata prin
a, b=b, a
Algoritmica - Curs 2 (2013) 37
Exemplu 3: implementare Python
# apelul functiilor definite anterior
x=[ 6, 3, 0, 9, 4, 8, 7, 5, 2, 1]
pr i nt "secvent a ci f r el or di n numar ul i ni t i al : ", x
i =i dent i f i ca( x)
pr i nt "i =", i
k=mi ni m( x, i )
pr i nt "k=", k
x[ i - 1] , x[ k] =x[ k] , x[ i - 1]
pr i nt "secvent a dupa i nt er schi mbar e: ", x
x=i nver sar e( x, i , l en( x) - 1)
pr i nt "secvent a dupa i nver sar e: ", x
Algoritmica - Curs 2 (2013) 38
Sumar
Problemele se descompun in subprobleme crora li se asociaz
subalgoritmi
Un subalgoritm este caracterizat prin:
Nume
Parametri
Valori returnate
Variabile locale
Prelucrri
Apelul unui subalgoritm:
Parametrii sunt nlocuii cu valori concrete
Prelucrrile din algoritm sunt executate
Algoritmica - Curs 2 (2013) 39
Cursul urmtor
Cum se poate verifica corectitudinea algoritmilor
Introducere in verificarea formal a corectitudinii algoritmilor
Algoritmica - Curs 2 (2013) 40
Intrebare de final
Considerm secvena de numere naturale:
8 5 7 2 6 4 1
Plasai operatori de adunare i scdere ntre valorile din ir astfel
nct rezultatul obinut s fie un numr cu modulul (valoarea
absolut) impar

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