Documente Academic
Documente Profesional
Documente Cultură
Structura
Descrierea unor algoritmi simpli
Exemplu 1
Considerm un tabel cu informaii despre studeni
Nr.
Nume Note
Credite
60
10
10
10
60
40
20
60
Stare
Medie
Exemplu 1
Dup completare tabelul va arta astfel:
Nr.
Nume Note
Credite
Stare
Medie
60
10
10
10
60
10
40
20
60
Exemplu 1
Ce fel de date vor fi prelucrate?
Nr.
Nume Note
Credite
60
10
10
10
60
40
20
60
Stare
Medie
Exemplu 1
Ce fel de date vor fi prelucrate?
Nr.
Nume Note
Credite
60
10
10
10
60
40
20
60
Stare
Medie
Exemplu 1
Ce fel de date vor fi prelucrate?
Nr.
Nume Note
Credite
60
10
10
10
60
40
20
60
Stare
Medie
Exemplu 1
Regula pt.determinarea strii
asociate unui student
stare = 1 dac credite=60
stare= 2 dac credite in [30,60)
stare= 3 dac credite <30
da
credite=60
stare 1
Descriere n pseudocod:
if credite==60 then stare = 1
else if credite>=30 then stare = 2
else stare = 3
endif
endif
nu
nu
da
Descriere in Python
credite>=30
stare 2
if credite==60:
stare=1
elif credite>=30:
stare 3
stare=2
else:
Algoritmi si structuri de date - Curs 2
stare=3
(2015)
Exemplu 1
Completarea strii pentru toi studenii
i1
nu
STOP
i<=n
da
calcul stare[i]
i i+1
=60
1
Algoritmi si structuri de date - Curs 2
(2015)
>=30
Exemplu 1
Completarea strii pentru toi
studenii
i1
nu
i<=n
da
calcul stare[i]
i i+1
STOP
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
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
11
Utilizarea subalgoritmilor
Idei de baz:
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 (cnd parametrii generici sunt inlocuii cu
valori concrete)
Efectul unui subalgoritm const n :
Returnarea unuia sau a mai multor rezultate
Modificarea valorilor unor parametri (sau a unor variabile globale)
Algoritmi si structuri de date - Curs 2
(2015)
12
Utilizarea subalgoritmilor
Mecanismul de comunicare intre algoritm si subalgoritmi:
- parametri i valori returnate
Subalgoritm
Algoritm
Variabile (globale)
Date intrare
Parametri:
- intrare
- iesire
Variable locale
Calcule locale
.
Apel subalgoritm
..
Calcule locale
Returnarea rezultatelor
13
Utilizarea subalgoritmilor
Mecanismul de comunicare intre algoritm si subalgoritmi:
- parametri si valori returnate
Subalgoritm
Algoritm
int credite[1..n], stare[1..n], i
i1
while i<=n do
stare[i] calcul(credite[i])
i i+1
endwhile
Date intrare
Date iesire
Param. intrare
calcul (int c)
Var.
int stare
locala
if c=60 then stare 1
else if c>=30
then stare 2
else stare 3
endif
endif
Rezultat de
return stare
returnat
14
Utilizarea subalgoritmilor
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
16
napoi la Exemplul 1
Functie Python:
Python:
credite=[60,60,40,20,60]
stare=[0]*5
n=5
i=0
while i<n:
stare[i]=calcul(credite[i])
i=i+1
print stare
def calcul(c):
if c==60:
stare=1
elif c>=30:
stare=2
else:
stare=3
return stare
17
napoi la Exemplul 1
Nr.
Nume Note
Credite
Stare
60
10
10
10
60
40
20
60
Medie
18
napoi la Exemplul 1
Calculul mediei
for i = 1,n do
if stare[i]==1
medie[i] = calculMedie(note[i,1..m])
endif
endfor
calculMedie(int v[1..m])
real suma
int i
suma = 0
for i = 1,m do
suma = suma+v[i]
endfor
suma = suma/m
return suma
Linia i a matricii =
tablou unidimensional
19
napoi la Exemplul 1
Calculul mediei (exemplu Python)
note=[[8,6,7],[10,10,10],[0,7,5],[6,0,0],[8,7,9]]
stare=[1,1,2,3,1]
Functie pt. calculul mediei
medie=[0]*5
(Python)
for i in range(5):
if stare[i]==1:
def calculMedie(note):
medie[i]=calculMedie(note[i])
m=len(note)
print medie
suma=0
for i in range(m):
Obs: range(5) = [0,1,2,3,4]
suma = suma+note[i]
In Python indicii tablourilor ncep de la 0
suma=suma/m
return suma
20
21
22
23
24
i: ri-2=ri-1qi+ri, 0<=ri<ri-1
Observaii:
la fiecare pas dempritul
ia valoarea vechiului mpritor iar
noul mpritor ia valoarea vechiului
rest
secvena de resturi este un ir
strict descresctor de numere
naturale, astfel c exist o valoare
n astfel nct rn=0 (metoda este
finit)
utiliznd aceste relaii se poate
demonstra ca rn-1 este ntr-adevar
cmmdc(a,b)
25
i: ri-2=ri-1qi+ri, 0<=ri<ri-1
n-1: rn-3=rn-2qn-1+rn-1,0<=rn-1<rn-2
n : rn-2=rn-1qn, rn=0
Demonstratie:
din ultima relaie rezult c rn-1
divide pe rn-2 , din penultima relaie
rezult c rn-1 divide pe rn-3 s.a.m.d.
rezult astfel c rn-1 divide att pe a
ct i pe b (deci este divizor comun)
pt a arta c rn-1 este cmmdc
considerm c d este un alt divizor
comun pentru a i b; din prima relaie
rezult c d divide r1 ; din a doua
rezult c divide pe r2 s.a.m.d.
din penultima relaie rezult c d
divide pe rn-1
Deci orice alt divizor comun il divide
pe rn-1 => rn-1 este cmmdc
26
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
27
Exemplu:
cmmdc(12,8,10)=cmmdc(cmmdc(12,8),10)=cmmdc(4,10)=2
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
Algoritmi si structuri de date - Curs 2
(2015)
28
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
29
30
Exemplu 3: problema
succesorului
Pas 1. Determin cel mai mare indice i avnd proprietatea c
x[i-1]<x[i] (se consider c prima cifr, adic 6, are indicele 1)
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])
Algoritmi si structuri de date Curs 2 (2015)
31
32
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
33
Minim(int x[i-1..n])
int 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
34
35
def inversare(x,left,right):
i=left
j=right
while i<j:
x[i],x[j]=x[j],x[i]
i=i+1
j=j-1
return x
a,b=b,a
36
37
Sumar
38
Cursul urmtor
39
Intrebare de final
Variante de rspuns:
a) 8
b) 6
c) 12
d) 11
e) 5
x=7
y=5
while y>0 do
x = x+1
y = y-1
endwhile
Ce valoare va avea variabila x
dup execuia algoritmului de
mai sus ?
40