Documente Academic
Documente Profesional
Documente Cultură
Algoritmi Baze
Algoritmi Baze
Algoritmi
Un algoritm (cuvântul are la origine o lucrare fundamentală în
domeniul aritmeticii a matematicianului persan Al-Khwarizmi) înseamnă în
matematică și informatică o metodă sau o procedură de calcul, alcătuită
din pașii elementari necesari pentru rezolvarea unei probleme sau
categorii de probleme.
Algoritmul este noțiunea fundamentală a informaticii. Totul este construit
în jurul algoritmilor chiar și reprezentarea datelor se efectuează după
algoritmi specializați.
Câteva exemple de algoritmi:
algoritmul de determinare al celui mai mare divizor comun a două
numere;
algoritmul de determinare a numerelor prime;
algoritmul de asamblare a unei mașini;
Proprietăți
1
mai puțin general decât unul care rezolvă ecuația ax2 + bx + c = 0,
oricare ar fi valorile lui a,b,c.
d) Finititudine - algoritmul trebuie să furnizeze rezultatele într-un număr
finit (cât mai mic) de paşi;
e) Unicitate - etapele algoritmului trebuie să fie definite în mod unic.
f) Verificabilitatea - acea proprietate a algoritmilor care permite ca fiecare
pas să poată fi verificat într-un timp rezonabil de către om.
Clasificări
În funcție de modul de implementare, un algoritm poate fi:
recursiv – în execuția algoritmului un pas îl reprezintă apelul la sine
însuși
iterativ ( conține o structură liniară/mai multe structuri liniare și una
sau mai multe structuri repetitive)
serial sau paralel
determinist sau aleatoriu (probabilistic)
exact sau aproximativ
În funcție de modul de rezolvare , ei pot fi:
algoritmi backtracking
algoritmi 'divide et impera'
algoritmi de programare dinamică
algoritmi 'greedy'
algoritmi specializați (probabilistici, genetici, euristici ș.a.)
Reprezentarea algoritmilor
2
simboluri grafice numite blocuri, care prin forma lor indică tipul operaţiei,
iar prin textul conţinut specifică semantica acesteia.
Schema logică conține blocuri terminale START/STOP care identifică
în mod unic începutul/ sfârșitul algoritmului.
blocul delimitator sau terminal (fig. 2.1.a) - defineşte începutul (fig.
b) sau sfârşitul (fig. c) unui algoritm, proceduri sau funcţii;
Start
Stop
a) b) c)
Blocuri delimitatoare.
Operaţiile de bază care apar într-un algoritm sunt următoarele:
operaţii de intrare/ieşire - datele de intrare se citesc, iar datele de
ieşire se afişează (se tipăresc);
Citeşte Scrie
a, b a, b
a) b) c)
Blocuri de citire/scriere
operaţii de atribuire - unei variabile i se atribuie valoarea unei
expresii;
blocul de calcul - este utilizat pentru reprezentarea operaţiei de
atribuire . Efectul acestei operaţii constă în evaluarea expresiei e şi
atribuirea rezultatului obţinut variabilei v.
De exemplu, în cazul operaţiei din fig. b, se adună valorile variabilei a
cu valoarea variabilei b şi rezultatul se atribuie variabilei x. Efectul
operaţiei din fig. c constă în creşterea cu o unitate a valorii variabilei i;
v e x a+b i i+1
a) b) c)
Blocuri de calcul
3
operaţii de decizie - se determină valoarea de adevăr a unei expresii
logice şi, funcţie de rezultatul obţinut, se ramifică rezultatul
algoritmului.
DA NU NU
Condiţie Condiţie
DA
a) b)
Blocuri de decizie.
Un bloc special îl reprezintă blocul de apel procedură/funcție
Blocul de procedură.
Programare structurată
4
problemei iniţiale. Algoritmul, în acest caz, apare ca o secvenţă liniară de
structuri elementare.
Structurile elementare sunt următoarele:
structura liniară - constă în execuţia necondiţionată a unei secvenţe
de instrucţiuni, un algoritm liniar fiind un algoritm în care etapele de calcul
se succed una după cealaltă;
structura alternativă - constă în ramificarea execuţiei algoritmului în
funcţie de valoarea de adevăr a unei condiţii evaluate, algoritmii ramificaţi
presupunând luarea unei anumite decizii în funcţie de care se continuă
execuţia pe ramuri distincte;
structura repetitivă - constă în execuţia repetată, de un număr finit
de ori, a unei secvenţe de instrucţiuni. Un algoritm repetitiv presupune
repetarea unor etape de calcul de un anumit număr de ori. Ansamblul
etapelor ce se repetă alcătuiesc o buclă. Dacă numărul de repetări este
cunoscut, bucla se numeşte cu număr cunoscut de paşi, iar dacă nu este
cunoscut, bucla se numeşte cu condiţie sau cu număr necunoscut de paşi.
Subproblemelor obţinute prin descompunerea unei probleme le
corespunde conceptul de subprogram.
Subprogramele pot fi tip funcţie sau tip procedură. Diferenţa dintre
funcţie şi procedură constă în faptul că funcţia transmite programului
apelant o singură valoare, în timp ce procedura poate să nu transmită
programului apelant nici o valoare, sau să transmită una sau mau multe
valori.
Referirea unui subprogram poartă denumirea de apel.
O noţiune de bază în programare o constituie noţiunea de variabilă. O
variabilă este caracterizată de patru elemente: nume, tip, valoare şi
adresă în memorie.
Numele unei variabile este format din unul sau mai multe caractere
(litere şi cifre, primul fiind literă), de exemplu: A, o ,min, X3.
Tipul indică mulţimea de valori posibile: întreg, real, şir de caractere,
boolean etc.
Un tip variabilă poate fi elementar sau structurat.
Tipurile structurate se obţin prin gruparea tipurilor elementare. Dintre
acestea amintim tabloul, în care variabilele au acelaşi nume şi tip,
deosebindu-se prin indici. Un tablou cu o singură dimensiune se numeşte
şir, iar un tablou cu două dimensiuni se numeşte matrice.
Adresa variabilei este adresa fizică din memoria calculatorului la care
se află valoarea variabilei. De obicei adresa este invizibilă pentru
programator.
Valoarea variabilei reprezintă valoarea efectivă pe care aceasta o are
la un moment dat. Valoarea unei variabile se poate modifica numai printr-
o instrucţiune de citire sau atribuire.
Structuri elementare
5
A
Structura liniară.
Acţiunile (A, B, …) pot fi blocuri: de calcul, de intrare-ieşire, de
procedură, sau combinaţii liniare ale acestora. Structura liniară se execută
necondiţionat.
b) structura alternativă sau decizia - utilizează un bloc de decizie.
Atunci când este îndeplinită condiţia, execuţia programului se continuă
pe ramura “DA“, adică se execută instrucţiunile din secvenţa A. În caz
contrar, se execută instrucţiunile din secvenţa B.
c)
DA Condiţie NU
A B
Structura alternativă.
DA NU DA NU
Condiţie Condiţie
A A
a) b)
6
c) structura repetitivă sau bucla - se bazează pe executarea repetată a
unei secvenţe de blocuri. Această structură trebuie să conţină o condiţie
care, la un moment dat, să determine ieşirea din structura repetitivă.
A A
DA nu
Condiţie Condiţie
NU DA
a) b)
7
i vi
i i+r
DA
i <=
vf
NU
În cazul buclelor repeat şi for, secvenţa A este executată cel puţin o dată,
chiar dacă iniţial condiţia de buclă nu este îndeplinită.
Pseudocodul
8
Cuvintele cheie din pseudocodu sunt următoarele:
9
Aceste cuvinte cod corespunde structurii de decizie din schema
logică.Operațiile care se execută sunt următoarele:
-se determină valoarea logică de adevărat sau fals a condiţiei
specificate;
-dacă condiția este adevărată se execută lista de instrucţiuni A;
-dacă condiţia este falsă se execută lista de instrucţiuni B;
-execuția algoritmului după efectuarea listei de instrucțiuni A sau B
continuă cu instrucțiunea descrisă de cuvîntul cod imediat următor după
cuvîntul cod sfărșit dacă.
Ramura asociată cuvântului cod altfel este opţională (de aceea s-a
pus între paranteze pătrate), adică, în anumite cazuri, aceasta poate lipsi.
În asemenea situaţii, instrucţiunea este următoarea:
dacă condiţie
atunci listă de instrucţiuni A
sfârşit dacă;
Exemplu pentru algoritmul c.m.m.d.c.:
dacă (a<b)
atunci
aux a
a b
b a
sfârşit dacă;
Prin această secvență de cod asigurăm rularea algoritmului c.m.m.d.c.
atunci când prin împărțiri succesive ale numerelor a și b a devine mai mic
decât b dar restul împărțirii este diferit de 0 (nu s-a obținut încă
c.m.m.d.c.)
10
Condițiile 1,2,... n reprezintă valori ale variabilei de caz. Cazul implicit nu
tebuie să lipsească altfel compilatorul va da eroare. Aceste restricții previn
injectare de cod în program.
Dacă (a=b)
n 2
Sfârșit dacă
Caz n
1: scrie ”Date intrare incorecte”
ieșire
2: scrie”c.m.m.d.c=”, a
ieșire
Implicit...............................
Sfârșit caz
În acest exemplu se observă de ce se folosește semnul „/” pentru
împărțire. Pentru că semnul „:” intră în construcția unei instrucțiunii foarte
restictive.
De asemenea în exemplu mai apare cuvântul cod ieșire cu sensul de
părăsire a instrucțiunii caz și de a continua execuția cu cuvintul cod ce
urmează după sfărșit caz.
Instrucţiunea caz nu are un bloc corespondent în schema logică.
Totuşi ea poat fi asimilată cu mai multe structuri alternative conectate în
cascadă.
11
Exemplu
cât timp (a%b≠ 0) execută
a a/b
dacă (a<b)
atunci
aux a
a b
b aux
sfârşit dacă;
8. repetă
listă de instrucţiuni A
până când condiţie;
Exemplu:
repetă
a a/b
dacă (a<b)
atunci
aux a
a b
b aux
sfârşit dacă;
12
Această instrucţiune corespunde structurii repetitive de tip buclă
condiționată de contor buclă.
Bucla se va executa până când contorul de bucle va depăși o valoare
stabilită.
Execuţia aloritmului descris de aceste cuvinte cod este următoarea:
-se dă contorului de bucle i valoarea iniţială vi;
-se execută lista de instrucţiuni A;
-se creşte valoarea variabilei i cu pasul r (i i+r);
-dacă valoarea variabilei i este mai mică sau egală cu valoarea finală vf, se
execută lista de instrucțiuni A,în caz contrar, se trece la execuţia
instrucţiunii ce urmează după sfârşit pentru.
Observație:
Specificarea valorii pasului r este opţională. În cazul în care valoarea lui r
nu se specifică, se consideră r =1.
10. stop;
Această instrucţiune determină terminarea execuţiei programului,
deci este ultima instrucţiune dintr-un program (corespunde blocului STOP
din schema logică).
13. salt;
Cu această instrucţiune se determină salt la inceputul/sfîrşitul buclei
ce conţine această instrucţiune (deci la un repetă cât timp, la un sfârşit
până când, sau la un pentru), fără a se produce ieşirea din buclă
14. ieşire;
Această instrucţiune determină ieșirea din buclă execuția programului
continuă cu următorul cuvânt cod după sfârşit cât timp, până când, sau
sfârşit pentru;
13
15. //Comentariu;
Încadrate de /* și */ sau începând pe fiecare linie cu //, comentariile
pot să apară oriunde în program. La execuţia programului, rezultatul
comentariilor este nul, acestea având o valoare de reper pentru
programator.
dacă (a=b)
14
n 2
sfârșit dacă
caz n
1: scrie ”Date intrare incorecte” //cazul de excepție
ieșire
2: scrie”c.m.m.d.c=”, a //cazul cel mai favorabil
ieșire
Implicit
cât timp (a%b≠ 0) execută
dacă (a<b)
atunci
aux a
a b
b aux
sfârşit dacă;
a a/b
sfârşit cât timp
scrie”c.m.m.d.c=”, b
sfârșit caz
sfârșit
Această rezolvare nu este cea mai optimă întrucât nu se ține cont de
2 factori:
-există o posibilitate mare ca ambele numere să fie pare;
-operațiile de împarțire la 2 se efectueaza foarte rapid (o deplasare
către dreapta cu un bit).
15