Sunteți pe pagina 1din 10

ALGORITMI ŞI STRUCTURI DE DATE

3.1. ALGORITMI - CARACTERIZARE GENERALĂ

Noţiunea de algoritm nu are o definiţie. Termenul derivă de la numele matematicianului arab


Abu Ja’far Mohamed ibn Mûsa al Kahowârizmi (în limba arabă algoritm = al-khârezmi).
Algoritmul este un concept1 folosit în mod intuitiv pentru a desemna o mulţime finită de
operaţii cunoscute, care, executate într-o ordine bine stabilită, pornind de la o mulţime de
valori numită domeniul de definiţie, produce în timp finit un alt set de valori (ieşirea).
Algoritmul constituie baza programării calculatoarelor electronice. În activitatea de rezolvare a
problemelor cu calculatorul elaborarea algoritmilor reprezintă cea mai importantă etapă,
obligatorie şi de multe ori dificilă. De calitatea algoritmului proiectat depinde calitatea şi
fiabilitatea programului şi succesul execuţiei acestuia.
Studiul unei probleme compatibile din punctul de vedere al calculatorului (principial rezolvabilă
şi cu soluţie practică realizabilă) conduce la formalizarea şi abstractizarea ei, în scopul înţelegerii
de către calculator.
Rezolvarea cu calculatorul a unei probleme concrete constă din parcurgerea următoarelor
etape:
a) Formularea exactă a problemei de rezolvat:
 definirea datelor problemei (intrările) caracterizându-le prin tip, proprietăţi, domeniul
valorilor;
 definirea rezultatelor problemei (ieşirile);
 precizarea relaţiilor dintre date şi rezultate.
b) Descrierea modului de rezolvare a problemei (algoritmul).
c) Scrierea într-un limbaj de programare convenabil a unui program pe baza algoritmului definit
anterior şi a datelor de prelucrat.
Principalele caracteristici ale unui algoritm sunt:

1
În cadrul matematicii şi logicii, algoritmii apar ca metode generale pentru rezolvarea tuturor
problemelor dintr-o clasă dată. În perioada 1931-1947 s-au dezvoltat în cadrul logicii matematice un
număr de concepte de “algoritm” bine delimitate care precizează noţiunea intuitivă. Cele mai
importante sunt rezolvarea ecuaţiilor (J. Herbrand, K. Gödel, S.C., Kleene, aproximativ în perioada 1931-
1936), maşina lui Turing (A.M. Turing, 1936),  - calcul (A. Church, 1936) şi conceptele algoritmice ale lui
E.L. Post (1936) şi A.A. Markov (1947).
Semnificativ este faptul că toate aceste noţiuni sunt echivalente în sensul că aceleaşi funcţii definite pe
domeniul numerelor naturale, aşa numitele funcţii recursive pot fi calculate prin fiecare din ele. Pe baza
acestei echivalenţe se poate adopta punctul de vedere prin care conceptul intuitiv de algoritm câştigă
astfel precizie. Acest punct de vedere a fost formulat în 1936 de către Church şi este cunoscut în
literatura matematică ca ipoteza lui Church.
O funcţie f definită pe mulţimea numerelor naturale se zice calculabilă dacă există un algoritm prin care
f(n) se poate găsi pentru orice valoare n a argumentului.
Ipoteza lui Church - o funcţie definită pe domeniul numerelor naturale este calculabilă dacă şi numai
dacă este recursivă.

1
 Generalitatea reprezintă proprietatea algoritmului de a fi aplicabil tuturor problemelor din
clasa de probleme pentru care a fost elaborat.
 Finitudinea algoritmului presupune că într-un timp determinat (un număr finit de paşi,
cunoscut sau necunoscut), problema se consideră soluţionată. În caz contrar algoritmul
ciclează, adică algoritmul va efectua la infinit transformări asupra datelor de intrare.
 Claritatea (unicitatea) algoritmului presupune ordinea exactă a paşilor şi perfecta lor
determinare şi inteligibilitate; totul trebuie exprimat corect, fără ambiguităţi şi neclarităţi.

Succesiunea logică şi determinată de operaţii prin care se trece de la informaţia iniţială la


informaţia finală, reprezintă paşii algoritmului.
În practica programării se utilizează diverse forme de reprezentare a algoritmilor, dintre care
vom prezenta:
1. Schema logică constituie un mod intuitiv de reprezentare a unui algoritm, utilizând
simboluri grafice ce permit o vizualizare expresivă şi sintetică, uşor de urmărit, a algoritmilor.
2. Limbajul convenţional permite exprimarea neambiguă a ordinii de execuţie a paşilor unui
algoritm cu ajutorul unor reguli sintactice simple.
3. Limbajul algoritmic constituie o formă intermediară între limbajul natural şi limbajul de
programare.
4. Tabela de decizie permite reprezentarea compactă a unor clase de algoritmi (cu număr
mare de decizii bazate pe condiţii complexe).

Deoarece activitatea de elaborare a unui algoritm este strâns legată de etapa următoare de
codificare şi transpunere într-un limbaj de programare (etapa de programare), este necesar ca
abordarea construcţiei şi analizei algoritmilor să se facă prin prisma principiilor programării
structurate.

3.2. PRINCIPIILE TEORETICE ALE PROGRAMĂRII STRUCTURATE

Un program poate fi privit ca un sistem. Structura unui program, adică elementele şi relaţiile
dintre ele, a fost studiată atent odată cu dezvoltarea teoriei programării structurate.
Programarea structurată este o metodă de concepere, organizare, codificare, testare,
menţinere şi documentare a programelor.
Programarea structurată reprezintă modalitatea de ordonare a activităţii mentale desfăşurate
în scopul obţinerii de programe constituite din structuri fundamentale (secvenţială, alternativă,
repetitivă), în condiţiile minimizării efortului de programare, dar realizării unor produse
program fiabile şi de bună calitate.
Începutul programării structurate aparţine profesorului E.W. Dijkstra de la Universitatea
Eindhoven, care propune în 1965 construirea unor programe mai bune prin evitarea folosirii
instrucţiunii de salt necondiţionat (GOTO).
Fundamentarea matematică este făcută de Bőhm şi Jacopini într-un articol publicat în 1966, în
care demonstrează că sunt suficiente trei tipuri de structuri de transfer a execuţiei pentru a
exprima logica internă a oricărui program: secvenţa, selecţia şi iteraţia.

2
În 1974, Knuth2 prezintă două situaţii în care utilizarea instrucţiunii GOTO nu modifică claritatea
programelor.
a) situaţia în care se doreşte să se iasă din mai multe repetiţii ierarhizate pe nivele, astfel încât
să se ajungă pe primul nivel;
b) situaţia unei selecţii multiple în care variantele selectate sunt apropiate; în cazul în care
soluţia unei variante poate fi redusă la soluţia unei alte variante printr-un calcul simplu, cel mai
natural mod de a rezolva prima variantă este efectuarea unui salt necondiţionat.
În 1972 Mills dă o fundamentare riguroasă programării structurate, modelând programul cu
ajutorul conceptului de funcţie.

Schema logică (organigrama) este rezultatul unei analize inductive, care duce la o înlănţuire de
acţiuni şi teste. Făcând abstracţie de unele convenţii de reprezentare, organigrama unui proces
de calcul conţine 3 tipuri de simboluri:

a) Acţiunea elementară – poate fi o instrucţiune simplă (instrucţiune de atribuire, apel de


subrutină, instrucţiuni de intrare/ieşire), proceduri interne sau externe cu o singură intrare şi o
singură ieşire; acţiunea elementară include şi grupurile de instrucţiuni care se execută
secvenţial; se reprezintă:

a1

b) Predicatul (condiţie, expresie booleană, test) – ia valoarea de adevăr (T) sau de fals (F);
corespunzător acestor valori se continuă execuţia pe un arc sau pe celălalt:
T

F
c) Simbolul de regrupare – pentru a continua pe un singur arc; se asigură astfel ieşirea sau
intrarea într-o structură standard; se reprezintă:

2
Donald E. Knuth (n.1938), profesor emerit la Stanford University, este autorul lucrării The Art of
Computer Programming, una dintre cele mai apreciate lucrări în domeniul informaticii. Lucrarea conţine
mai multe volume: Fundamental Algorithms (vol. I), Seminumerical Algorithms (vol. II), Sorting and
Searching (vol. III), Combinatorial Algorithms (vol. IV) şi în pregătire Syntactic Algorithms (vol. V), estimat
să apară în 2020.

3
În continuare se prezintă în sinteză principalele structuri şi teoremele fundamentale legate de
acestea.
1) Structura D (Dijkstra) – conţine:
 acţiunea elementară;
 compoziţia (înlănţuirea secvenţială):

a b

unde a, b sunt structuri D. Această diagramă se va nota SEQ (a, b).

 selecţia (structura alternativă):


a
T
unde a, b sunt structuri D,
P
iar p este un predicat
F
b

Această diagramă se notează IF-THEN-ELSE (p, a, b).

 ciclul cu test iniţial (structura repetitivă condiţionată anterior):

F
unde a este o structură D,
P iar p este un predicat

a T

Diagrama se notează DO-WHILE (p, a).

2) Structura D’ - reprezintă o extindere a structurii D. Conţine:


 structura D;

 selecţia redusă (structura pseudoalternativă):

a
T

P unde a este o structură D’,


iar p este un predicat
F

Această diagramă se notează cu IF-THEN (p, a).

4
Se observă că se poate introduce pe ramura fals o acţiune elementară vidă, notată cu Ø,
obţinând astfel echivalenţa:

IF-THEN (p, a)  IF-THEN-ELSE (p, a, Ø) (3.1)

 ciclul cu test final (structura repetitivă condiţionată posterior):

T
a P unde a este o structură D’,
iar p este un predicat
F

Diagrama se notează DO-UNTIL (p, a).

Între structurile DO –WHILE şi DO-UNTIL se stabilesc următoarele echivalenţe:

DO-UNTIL (p, a)  SEQ (a, DO –WHILE ( p , a)) (3.2.)

DO-WHILE (p, a)  IF-THEN (p, DO –UNTIL ( p , a)) (3.3.)

 selecţia multiplă (structura alternativă multiplă):

1
a1
1

an
n

Această diagramă se notează CASE-OF (  , a1 , a2 ,..., an ).
3) Structura L – este o structură oarecare „bine formată”, adică pe orice cale avem un drum de
la intrare la ieşire; poate conţine instrucţiuni de salt necondiţionat; nu există restricţii asupra
predicatelor.

Definiţia 3.1. Dacă o schemă logică are numai structuri D sau D’, atunci ea se numeşte schemă
logică structurată.

Definiţia 3.2. O structură S1 este convertibilă funcţional într-o structură S2 , dacă şi numai dac
pentru orice intrare, S2 calculează aceeaşi funcţie ca şi S1 .

5
Teorema de structură a lui Böhm şi Jacopini
a) Orice structură L este echivalentă funcţional cu o structură D sau D’.
b) În conversia funcţională a unei structuri L într-o structură D sau D’ sunt eventual folosite un
număr finit de variabile booleene de control.

Observaţie.
Teorema de structură a lui Böhm şi Jacopini permite transformarea unei scheme logice
nestructurate (structura L) într-o schemă logică structurată. Utilizarea abuzivă a instrucţiunii de
salt necondiţionat (GOTO) poate conduce la erori de programare fatale (cicluri infinite).
Consecinţa practică importantă a programării structurate este eliminarea lui GOTO sau o
utilizare cât mai mică (GOTO less).

Notă. La sfârşitul acestui paragraf, în aplicaţiile 1 şi 2 se exemplifică modul de transformare a


unui structuri L într-o structură D sau D’. Schemele logice prezentate determină diferenţa a
două mulţimi A şi B, date sub formă de vectori:
C  A  B  x / x  A şi x  B

Programarea structurată are avantaje legate de testarea programelor. Programarea structurată


permite divizarea programelor în module ce pot fi testate şi implementate în mod independent.
Structura modulară a programelor este o structură arborescentă: există un modul principal
(rădăcină) care controlează modulele sale descendente. Acest modul transmite date la modulul
descendent şi primeşte de la acesta rezultatele prelucrării. Această relaţie dintre un modul şi
descendenţii săi are loc pentru fiecare modul de pe nivelele neterminale. Proiectarea şi testarea
unui program modular se face pe principiul top-down (“de sus în jos”).

Corolarul “top – down”


Un program P structurat este echivalent cu un program pus sub una din formele:
P  SEQ a , b
P  IF  THEN  ELSE p , a , b
P  DO  WHILE p , a
P  DO  UNTILp , a
unde p este un predicat, iar a şi b sunt structurile privilegiate D sau D’; dacă se porneşte de la
un program nestructurat şi se realizează echivalentul său structurat, p poate fi şi o variabilă
booleană.
Corolarul top-down este aplicat la analiza problemelor după principiul de “de sus în jos”,
realizându-se descompuneri succesive până la ultimul nivel.

6
Exemplu
Programul:

s1 s2
T s5
T
p4 s6
P= p1 F
s3
T
F
p2
F
F T
s4 p3
poate fi descompus succesiv până la ultimul nivel astfel:

P  SEQ (f1, f2, s6)


f1 = IF-THEN-ELSE (p1, f4, f5)
f4 = SEQ (s1, s2)
f5 = IF-THEN-ELSE (p2, s3, f6)
f6 = DO-UNTIL (p3, s4)
f2 = DO-WHILE (p4, s5)

Rezultă că structura programului P poate fi scrisă liniar sub forma:


P  SEQ (IF-THEN-ELSE (p1, SEQ(s1, s2), IF-THEN-ELSE(p2, s3, DO-UNTIL (p3, s4))),
DO-WHILE (p4, s5), s6)

Descompunerea realizată în exemplu pentru programul P, subliniază posibilitatea oferită de


programarea structurată de a realiza proiectarea şi implementarea ierarhic modulară a
programelor.

7
SCHEME LOGICE STRUCTURATE
Schema logică (organigrama) este o reprezentare grafică a unui algoritm, care foloseşte diferite
figuri geometrice având o anumită semnificaţie; figurile sunt unite prin săgeţi care arată modul
în care acestea se înlănţuiesc.
Pentru sporirea clarităţii se admit următoarele simboluri grafice pentru reprezentarea
schemelor logice:

Simbolul Denumire Utilizare


marchează începutul START
bloc terminal sau sfârşitul STOP al unei
scheme logice

sunt evidenţiate calculele şi


bloc de calcul
atribuirile ce se efectuează

indică citirea / scrierea


bloc de intrare / ieşire
valorilor unor variabile

bloc de intrare pentru introducerea datelor

bloc de ieşire pentru extragerea datelor

marchează ramificaţiile în
bloc de decizie
funcţie de o anumită condiţie

leagă diferitele puncte ale


bloc conector
unei scheme logice
arată înlănţuirea blocurilor
săgeata
într-o schemă logică

reprezintă o prescurtare a
ceea ce urmează să se
sau bloc de procedură dezvolte sau există şi doar se
utilizează

8
Aplicaţia 1. Diferenţa a două mulţimi date sub formă de vectori - structură L.

START

CITEŞTE M, N
A(I), I=1,..,M
B(J), J=1,..,N

L:=0; I:=1

J:=1

T
A(I) = B(J)

J := J+1

T
J <= N

F
L := L+1
C(L) := A(I)

I := I+1

T
I <= M
F
T F
L=0

SCRIE SCRIE
“Diferenţa vidă” C(I), I = 1,…,L

STOP

9
Aplicaţia 2. Diferenţa a două mulţimi date sub formă de vectori - structură D’.

START

CITEŞTE M, N
A(I), I=1,..,M
B(J), J=1,..,N

L:=0; I:=1

J:=1 ; LOGIC:=T

F T
A(I) = B(J)

J := J+1 LOGIC:= F
:= J+1

(J <= N)
AND T
LOGIC

F T L := L+1
LOGIC C(L) := A(I)

I := I+1

T
I <= M
F
T F
L=0

SCRIE SCRIE
“Diferenţa vidă” C(I), I = 1,…,L

STOP

10

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