Documente Academic
Documente Profesional
Documente Cultură
XI - Informatica (In Limba Romana) PDF
XI - Informatica (In Limba Romana) PDF
tiina, 2014
CZU 004(075.3)
G 80
Elaborat conform curriculumului disciplinar n vigoare i aprobat prin Ordinul ministrului educaiei al
Republicii Moldova (nr. 267 din 11 aprilie 2014). Editat din sursele financiare ale Fondului Special pentru
Manuale.
Comisia de evaluare: Gheorghe Curbet, profesor colar, grad didactic superior, Liceul Teoretic Mihai Emi-
nescu, Bli; Arcadie Malearovici, ef direcie, Centrul Tehnologiilor Informaionale i Comunicaionale n
Educaie, MET; Varvara Vanovscaia, profesor colar, grad didactic superior, Liceul Teoretic Vasile Alecsan-
dri, Chiinu
Recenzeni: Gheorghe Cpin, doctor inginer, confereniar universitar, Universitatea de Stat din Moldova;
Alexei Colbneac, maestru n arte, profesor universitar, Academia de Muzic, Teatru i Arte Plastice, Chiinu;
Tatiana Cartaleanu, doctor n filologie, confereniar universitar, Universitatea Pedagogic de Stat Ion Crean-
g, Chiinu; Mihai leahtichi, doctor n psihologie i n pedagogie, confereniar universitar, Universitatea
Liber Internaional din Moldova; Valeriu Cabac, doctor n tiine fizico-matematice, confereniar universi-
tar, Universitatea de Stat Alecu Russo, Bli
DIFUZARE:
Republica Moldova: M Societatea de Distribuie a Crii PRO-NOI
str. Alba-Iulia, 75; MD-2051, Chiinu;
tel.: (+373 22) 51-68-17, 71-96-74; fax: (+373 22) 58-02-68;
e-mail: info@pronoi.md; www.pronoi.md
Opio-
Uma-
Pagi-
Real
nist
nal
Coninuturi
na
Introducere 4
Capitolul 1. FUNCII I PROCEDURI 5
1.1. Subprograme 5
1.2. Funcii 6
1.3. Proceduri 10
1.4. Domenii de vizibilitate 14
1.5. Comunicarea prin variabile globale 18
1.6. Efecte colaterale 20
1.7. Recursia 23
1.8. Sintaxa declaraiilor i apelurilor de subprograme 26
Capitolul 2. STRUCTURI DINAMICE DE DATE 30
2.1. Variabile dinamice. Tipul referin 30
2.2. Structuri de date 34
2.3. Liste unidirecionale 35
2.4. Prelucrarea listelor unidirecionale 40
2.5. Stiva 46
2.6. Cozi 51
2.7. Arbori binari 55
2.8. Parcurgerea arborilor binari 62
2.9. Arbori de ordinul m 67
2.10. Tipul de date pointer 72
Capitolul 3. METODE DE ELABORARE A PRODUSELOR 80
PROGRAM
3.1. Programarea modular 80
3.2. Testarea i depanarea programelor 87
3.3. Elemente de programare structurat 90
Capitolul 4. ANALIZA ALGORITMILOR 93
4.1. Complexitatea algoritmilor 93
4.2. Estimarea necesarului de memorie 95
4.3. Msurarea timpului de execuie 100
4.4. Estimarea timpului cerut de algoritm 104
4.5. Complexitatea temporal a algoritmilor 109
Capitolul 5. TEHNICI DE ELABORARE A ALGORITMILOR 113
5.1. Iterativitate sau recursivitate 113
5.2. Metoda trierii 118
5.3. Tehnica Greedy 122
5.4. Metoda relurii 126
5.5. Metoda desparte i stpnete 133
5.6. Programarea dinamic 140
5.7. Metoda ramific i mrginete 144
5.8. Aplicaiile metodei ramific i mrginete 147
5.9. Algoritmi exaci i algoritmi euristici 159
Capitolul 6. ALGORITMI DE REZOLVARE A UNOR 170
PROBLEME MATEMATICE
6.1. Operaii cu mulimi 170
6.2. Analiza combinatorie 175
Capitolul 7. PROBLEME RECAPITULATIVE 183
Bibliografie 190
3
Dragi prieteni,
4
Capitolul 1
FUNCII I PROCEDURI
1.1. Subprograme
E cunoscut faptul c o problem complex poate fi rezolvat prin divizarea ei
ntr-un set de pri mai mici (subprobleme). Pentru fiecare parte se scrie o anumit
secven de instruciuni, denumit subprogram. Problema n ansamblu se rezolv
cu ajutorul programului principal, n care pentru rezolvarea subproblemelor se folo-
sesc apelurile subprogramelor respective. Cnd n programul principal se ntlnete
un apel, execuia continu cu prima instruciune din programul apelat (fig. 1.1). Cnd
se termin executarea instruciunilor din subprogram, se revine la instruciunea ime-
diat urmtoare apelului din programul principal.
Programul
Programul Subprogram 1
principal
principal
Subprogram 2
Apeluri de
subprograme
5
Funciile snt subprograme care calculeaz i returneaz o valoare. Limbajul
PASCAL conine un set de funcii predefinite, cunoscute oricrui program: sin,
cos, eof etc. n completare, programatorul poate defini funcii proprii, care se ape-
leaz n acelai mod ca i funciile-standard. Prin urmare, conceptul de funcie extin-
de noiunea de expresie PASCAL.
Procedurile snt subprograme care efectueaz prelucrarea datelor comunicate n
momentul apelului. Limbajul conine procedurile predefinite read, readln, wri-
te, writeln .a., studiate n clasele precedente. n completare, programatorul poate
defini proceduri proprii, care se apeleaz n acelai mod ca procedurile-standard.
Prin urmare, conceptul de procedur extinde noiunea de instruciune PASCAL.
Subprogramele se definesc, n ntregime, n partea declarativ a unui program.
Evident, apelurile de funcii i proceduri se includ n partea executabil a programului.
Un subprogram poate fi apelat chiar de el nsui, caz n care apelul este recursiv.
ntrebri i exerciii
Explicai termenii program principal i subprogram.
Cum interacioneaz programul i subprogramul?
Care este diferena dintre proceduri i funcii?
Cum se apeleaz o funcie? n care instruciuni ale limbajului pot aprea apeluri de funcii?
Cum se apeleaz o procedur?
Numii tipul argumentului i tipul rezultatului furnizat de funciile predefinite abs, chr,
eof, eoln, exp, ord, sin, sqr, sqrt, pred, succ, trunc.
Numii tipul parametrilor actuali ai procedurilor read i write.
Ce prelucrri de date efectueaz procedurile read i write?
1.2. Funcii
Textul PASCAL al unei declaraii de funcie are forma:
function f(x1, x2, ..., xn) : tr;
D;
begin
...
f := e;
...
end;
Prima linie este antetul funciei, format din:
f numele funciei;
(x1, x2, ..., xn) lista opional de parametri formali reprezentnd argumentele
funciei;
tr tipul rezultatului; acesta trebuie s fie numele unui tip simplu sau tip referin.
6
Antetul este urmat de corpul funciei, format din declaraiile locale opionale D
i instruciunea compus begin ... end.
Declaraiile locale snt grupate n seciunile (eventual vide) label, const, type,
var, function/procedure.
Numele f al funciei apare cel puin o dat n partea stng a unei instruciuni de
atribuire care se execut: f := e. Ultima valoare atribuit lui f va fi ntoars n progra-
mul principal.
n mod obinuit, un parametru formal din lista (x1, x2, ..., xn) are forma:
v1, v2, ..., vk : tp
unde v1, v2, ..., vk snt identificatori, iar tp este un nume de tip.
Utilizarea funciei f se specific printr-un apel de forma:
begin
a:=3.0;
b:=2;
c:=Putere(a, b);
writeln(a:10:5, b:4, c:10:5);
7
s:=2;
t:=4;
v:=Putere(s, t);
writeln(s:5, t:4, v:10:5);
readln;
end.
Funcia Putere are doi parametri formali: x de tipul real i n de tipul Natural.
Funcia returneaz o valoare de tipul real. n corpul funciei snt declarate variabi-
lele locale p i i.
La execuia apelului Putere(a,b) valorile 3.0 i 2 ale parametrilor actuali a, b
se transmit parametrilor formali, respectiv, x i n. De menionat c tipul lui a coinci-
de cu tipul lui x i tipul lui b coincide cu tipul lui n.
n cazul apelului Putere(s,t) tipul parametrilor actuali s,t nu coincide cu
tipul parametrilor formali, respectiv, x i n. Totui apelul este corect, ntruct tipurile
respectve snt compatibile din punctul de vedere al atribuirii.
ntrebri i exerciii
Se consider urmtoarea declaraie:
Numii tipul parametrului formal i tipul rezultatului returnat de funcie. Precizai varia-
bilele declarate n corpul funciei. Elaborai un program care afieaz pe ecran valorile n!
pentru n=2, 3 i7.
n care loc al programului principal se includ declaraiile de funcii?
Comentai programul ce urmeaz:
Program P98;
{ Eroare }
function Factorial(n : 0..7) : integer;
var p, i : integer;
begin
p:=1;
for i:=1 to n do p:=p*i;
Factorial:=p;
end; { Factorial }
begin
writeln(Factorial(4));
readln;
end.
8
Se consider antetul
a) F(3.18, 4, a) e) F(3.18, 4, 4)
b) F(4, 4, 4) f) F(3.18, 4, 4)
const nmax=100;
type Vector=array [1..nmax] of real;
type Punct=record
x, y : real
end;
Segment=record
A, B : Punct
end;
9
Triunghi=record
A, B, C : Punct
end;
Dreptunghi=record
A, B, C, D : Punct
end;
Cerc=record
Centru : Punct;
Raza : real
end;
1.3. Proceduri
Forma general a textului unei declaraii de procedur este:
10
begin ... end instruciune compus; ea nu conine vreo atribuire asupra
numelui procedurii.
Procedura poate s ntoarc mai multe rezultate, dar nu prin numele ei, ci prin
variabile desemnate special (cu prefixul var) n lista de parametri formali.
Parametrii din list introdui prin declaraii de forma
begin
a:=1.0;
Lac(a, b, c);
writeln(a:10:5, b:10:5, c:10:5);
11
Lac(3.0, t, q);
writeln(3.0:10:5, t:10:5, q:10:5);
readln;
end.
ntrebri i exerciii
Care este diferena dintre un parametru-valoare i un parametru-variabil?
Se consider declaraiile:
var k, m, n : integer;
a, b, c : real;
procedure P(i : integer; var j : integer;
x : real; var y : real);
begin
{...}
end.
a) P(k,m,a,b) d) P(m,m,a,b)
b) P(3,m,a,b) e) P(m,k,6.1,b)
c) P(k,3,a,b) f) P(n,m,6,b)
12
g) P(n,m,6,20) i) P(i,i,i,i)
h) P(a,m,b,c) j) P(a,a,a,a)
Argumentai rspunsul.
Comentai programul ce urmeaz:
Program P100;
{Eroare }
var a : real;
b : integer;
procedure P(x : real; var y : integer);
begin
{... }
end; { P }
begin
P(a, b);
P(0.1, a);
P(1, b);
P(a, 1);
end.
begin
a:=0;
b:=0;
P(a, b);
writeln(a=, a, b=, b);
readln;
end.
Argumentai rspunsul.
Elaborai o procedur care:
a) calculeaz rdcinile ecuaiei ax2+bx+c=0;
b) radiaz dintr-un ir caracterul indicat n apel;
c) ncadreaz un ir de caractere ntre simbolurile #;
13
d) ordoneaz componentele unui tablou array [1..100] of real n ordine cres-
ctoare;
e) ordoneaz componentele unui fiier file of integer n ordine descresctoare;
f) calculeaz i depune ntr-un tablou numerele prime mai mici dect un numr natural dat n.
Se consider urmtoarele tipuri de date
Elaborai o procedur care primete din programul principal o list de persoane i resti-
tuie:
a) persoanele nscute n ziua z a lunii;
b) persoanele nscute n luna l a anului;
c) persoanele nscute n anul a;
d) persoanele nscute pe data z.l.a;
e) persoana cea mai n vrst;
f) persoana cea mai tnr;
g) vrsta fiecrei persoane n ani, luni, zile;
h) lista persoanelor care au mai mult de v ani;
i) lista persoanelor n ordine alfabetic;
j) lista persoanelor ordonat conform datei naterii;
k) lista persoanelor de aceeai vrst (nscui n acelai an).
Elaborai o procedur care:
a) creeaz o copie de rezerv a unui fiier text;
b) exclude dintr-un fiier text liniile vide;
c) numeroteaz liniile unui fiier text;
d) concateneaz dou fiiere text ntr-unul singur;
e) concateneaz n fiiere text (n >2) ntr-unul singur.
Vom numi mari numerele naturale care conin mai mult de 20 de cifre semnificative. S
se defineasc un tip de date pentru numerele naturale mari i s se scrie proceduri care
s adune i s scad astfel de numere.
14
zult c blocurile pot fi imbricate (incluse unul n altul). Aceast imbricare de blocuri
este denumit structura de bloc a programului PASCAL.
ntr-o structur fiecrui bloc i se ataeaz cte un nivel de imbricare. Programul
principal este considerat de nivel 0, un bloc definit n programul principal este de
nivel 1. n general, un bloc definit n nivelul n este de nivelul n + 1.
Pentru exemplificare, n figura 1.2 este prezentat structura de bloc a programu-
lui P105.
begin
writeln(b=, b);
c:=b+1;
writeln(In procedura P c=, c);
Q(35);
end; {6}
begin
a:=F(5);
writeln(a=, a);
P(a);
readln;
end {7}.
15
De regul, un bloc PASCAL include declaraii de etichete, variabile, funcii, para-
metri .a.m.d. O declaraie introduce un nume, care poate fi o etichet sau un identi-
ficator. O declaraie dintr-un bloc poate redefini un nume declarat n exteriorul lui.
n consecin, n diferite pri ale programului unul i acelai nume poate desemna
obiecte diferite.
Prin domeniul de vizibilitate al unei declaraii se nelege textul de program,
n care numele introdus desemneaz obiectul specificat de declaraia n studiu.
Domeniul de vizibilitate ncepe imediat dup terminarea declaraiei i se sfrete
odat cu textul blocului respectiv. Deoarece blocurile pot fi imbricate, domeniul de
vizibilitate nu este neaprat o poriune continu din textul programului. Domeniul
de vizibilitate al unei declaraii dintr-un bloc inclus acoper domeniul de vizibilitate
al declaraiei ce implic acelai nume din blocul exterior.
De exemplu, n programul P105 domeniul de vizibilitate al declaraiei var a :
real este textul cuprins ntre punctele marcate {1} i {7}. Domeniul de vizibilitate
al declaraiei var c : real este format din dou fragmente de text cuprinse ntre
{2}, {3} i {5}, {6}. Domeniul de vizibilitate al declaraiei var c : char este
textul cuprins ntre {4} i {5}.
Cunoaterea domeniilor de vizibilitate ale declaraiilor este necesar pentru de-
terminarea obiectului curent desemnat de un nume.
De exemplu, identificatorul c din instruciunea
c:=chr(d)
a programului P105 desemneaz o variabil de tip char. Acelai identificator din
instruciunea
c:=b+1
desemneaz o variabil de tip real.
De reinut c declaraia unui nume de funcie/procedur se consider terminat
la sfritul antetului. Prin urmare, domeniul de vizibilitate al unei astfel de declaraii
include i corpul funciei/procedurii respective. Acest fapt face posibil apelul re-
cursiv: n corpul funciei/procedurii aceasta poate fi referit, fiind vizibil. Evident,
declaraia unui parametru formal este vizibil numai n corpul subprogramului res-
pectiv.
De exemplu, domeniul de vizibilitate al declaraiei procedure Q este textul
cuprins ntre punctele marcate {3}i {6}. Domeniul de vizibilitate al declaraiei
d:integer este textul cuprins ntre {3}i {5}.
ntrebri i exerciii
Cum se determin domeniul de vizibilitate al unei declaraii?
Determinai domeniile de vizibilitate ale declaraiilor b : real i x : real din pro-
gramul P105 (fig.1.2).
Precizai structura de bloc a programului ce urmeaz. Indicai domeniul de vizibilitate al
fiecrei declaraii i determinai obiectele desemnate de fiecare apariie a identificatori-
lor c i x.
16
Program P106;
{Redefinirea constantelor }
const c=1;
begin
writeln(F1=, F1(1));
writeln(F2=, F2(1));
writeln(F3=, F3(1));
readln;
end.
Ce va afia pe ecran programul n studiu?
Determinai domeniile de vizibilitate ale identificatorilor P i F din programul P105 (fig.1.2).
Comentai programul ce urmeaz:
Program P107;
{ Eroare }
var a : real;
begin
a:=3.14;
P(a);
end.
Cum se determin obiectul desemnat de apariia unui nume ntr-un program PASCAL?
17
1.5. Comunicarea prin variabile globale
Execuia unui apel de subprogram presupune transmiterea datelor de prelucrat
funciei sau procedurii respective. Dup executarea ultimei instruciuni din subpro-
gram, rezultatele produse trebuie ntoarse n locul de apel. Cunoatem deja c datele de
prelucrat i rezultatele produse pot fi transmise prin parametri. Parametrii formali se
specific n antetul funciei sau procedurii, iar parametrii actuali n locul apelului.
n completare la modul de transmitere a datelor prin parametri, limbajul PASCAL
permite comunicarea prin variabile globale.
Orice variabil este local n subprogramul n care a fost declarat. O variabil
este global relativ la un subprogram atunci cnd ea este declarat n programul
sau subprogramul ce l cuprinde fr s fie redeclarat n subprogramul n studiu.
ntruct variabilele globale snt cunoscute att n subprogram, ct i n afara lui, ele
pot fi folosite pentru transmiterea datelor de prelucrat i returnarea rezultatelor.
Exemplu:
Program P108;
{Comunicarea prin variabile globale }
var a, {variabil global n P }
b : real; {variabil global n P, F }
procedure P;
var c : integer; {variabil local n P }
begin
c:=2;
b:=a*c;
end; { P }
function F : real;
var a : 1..5; {variabil local n F }
begin
a:=3;
F:=a+b;
end; { F }
begin
a:=1;
P;
writeln(b); {se afieaz 2.0000000000E+00 }
writeln(F); {se afieaz 5.0000000000E+00 }
readln;
end.
18
argumentului funciei F se transmite prin variabila global b. Menionm c varia-
bila a este local n F i nu poate fi folosit pentru transmiterea datelor n aceast
funcie.
De obicei, comunicarea prin variabile globale se utilizeaz n cazurile n care mai
multe subprograme prelucreaz aceleai date. Pentru exemplificare amintim func-
iile cu argumente de tip tablou, procedurile care prelucreaz tablouri i fiiere de
angajai, persoane, elevi etc.
ntrebri i exerciii
Explicai termenii variabil global relativ la un subprogram i variabil local ntr-un
subprogram.
Numii variabilele globale i variabilele locale din programul P105 (fig.1.2).
Poate fi oare o variabil local n acelai timp i o variabil global relativ la un subpro-
gram?
Numii variabilele globale i variabilele locale din programul ce urmeaz. Ce va afia pe
ecran acest program?
Program P109;
{Comunicarea prin variabile globale }
var a : integer;
procedure P;
var b, c, d : integer;
procedure Q;
begin
c:=b+1;
end; { Q }
procedure R;
begin
d:=c+1;
end; { R }
begin
b:=a;
Q;
R;
a:=d;
end; { P }
begin
a:=1;
P;
writeln(a);
readln;
end.
19
Se consider declaraiile
Type Ora=0..23;
Grade=-40..+40;
Temperatura=array [Ora] of Grade;
Program P110;
{Efect colateral - atribuire la o variabil global}
var a : integer; { variabil global }
20
writeln(F(1)); { se afieaz 1 }
writeln(F(1)); { se afieaz 2 }
writeln(F(1)); { se afieaz 3 }
readln;
end.
Program P111;
{Efect colateral - atribuire la un parametru formal}
var a : integer;
begin
a:=2;
writeln(F(a)); { se afieaz 4 }
writeln(F(a)); { se afieaz 6 }
writeln(F(a)); { se afieaz 8 }
readln;
end.
21
1. Comunicarea funciilor cu mediul de chemare se va face prin transmiterea de
date spre funcie prin parametri formali valoare i ntoarcerea unui singur rezultat
prin numele ei.
2. Comunicarea procedurilor cu mediul de chemare se va face prin transmiterea
de date prin parametri formali valoare sau variabil i ntoarcerea rezultatelor prin
parametri formali variabil.
3. Variabilele globale pot fi folosite pentru transmiterea datelor n subprograme,
ns valorile lor nu trebuie s fie schimbate de acestea.
ntrebri i exerciii
Care este cauza efectelor colaterale? Ce consecine pot avea aceste efecte?
Precizai ce vor afia pe ecran programele ce urmeaz:
Program P112;
{Efecte colaterale }
var a, b : integer;
Program P113;
{Efecte colaterale }
var a : integer;
b : real;
22
procedure P(x,y:integer; var z:real);
begin
z:=x/y;
end; { P }
begin
a:=1;
P(F(a), a, b);
writeln(a, , b);
readln;
end.
Program P114;
{Efecte colaterale }
var a, b : real;
begin
a:=1; b:=2;
P(a, b);
writeln(a, b);
a:=3; b:=4;
P(a, b);
writeln(a, b);
readln;
end.
1.7. Recursia
Recursia se definete ca o situaie n care un subprogram se autoapeleaz fie di-
rect, fie prin intermediul altei funcii sau proceduri. Subprogramul care se autoape-
leaz se numete recursiv.
De exemplu, presupunem c este definit tipul
type Natural = 0..MaxInt;
Funcia factorial
23
dac
dac
poate fi exprimat n PASCAL, urmnd direct definiia, n forma:
function F(n : Natural) : Natural;
begin
if n=0 then F:=1
else F:=n*F(n-1)
end; {F}
Efectul unui apel F(7) este declanarea unui lan de apeluri ale funciei F pentru
parametrii actuali 6, 5, ..., 2, 1, 0:
F(7) -> F(6) -> F(5) -> ... -> F(1) -> F(0).
Fiecare apel al funciei Fib pentru n > 1 genereaz dou apeluri Fib(n-1),
Fib(n-2) .a.m.d., de exemplu:
Fib(4) ->
Fib(3), Fib(2) ->
Fib(2), Fib(1), Fib(1), Fib(0) ->
Fib(1), Fib(0).
Din exemplele n studiu se observ c recursia este util pentru programarea unor cal-
cule repetitive. Repetiia este asigurat prin execuia unui subprogram care conine un apel
la el nsui: cnd execuia ajunge la acest apel, este declanat o nou execuie .a.m.d.
Evident, orice subprogram recursiv trebuie s includ condiii de oprire a procesu-
lui repetitiv. De exemplu, n cazul funciei factorial procesul repetitiv se oprete cnd n
ia valoarea 0; n cazul funciei Fib procesul se oprete cnd n ia valoarea 0 sau 1.
La orice apel de subprogram, n memoria calculatorului vor fi depuse urmtoa-
rele informaii:
24
valorile curente ale parametrilor transmii prin valoare;
locaiile (adresele) parametrilor-variabil;
adresa de retur, adic adresa instruciunii ce urmeaz dup apel.
Prin urmare, la apeluri recursive spaiul ocupat din memorie va crete rapid,
riscnd depirea capacitii de memorare a calculatorului. Astfel de cazuri pot fi
evitate, nlocuind recursia prin iteraie (instruciunile for, while, repeat). Pentru
exemplificare prezentm o form nerecursiv a funciei factorial:
function F(n: Natural): Natural;
var i, p : Natural;
begin
p:=1;
for i:=1 to n do p:=p*i;
F:=p;
end; {F}
Recursia este deosebit de util n cazurile n care elaborarea unor algoritmi ne-
recursivi este foarte complicat: translatarea programelor PASCAL n limbajul cod-
main, grafica pe calculator, recunoaterea formelor .a.
ntrebri i exerciii
Cum se execut un subprogram recursiv? Ce informaii se depun n memoria calculato-
rului la execuia unui apel recursiv?
Care este diferena dintre recursie i iteraie?
Elaborai o form nerecursiv a funciei lui Fibonacci.
Scriei un subprogram recursiv care:
a) calculeaz suma S(n)=1+3+5+...+(2n1);
b) calculeaz produsul P(n) = 1 4 7 ... (3n 2);
c) inverseaz un ir de caractere;
d) calculeaz produsul P(n) = 2 4 6 ... 2n.
Elaborai un program care citete de la tastatur numerele naturale m, n i afieaz pe
ecran valoarea funciei lui Ackermann:
dac
dac
dac
Calculai a(0, 0), a(1, 2), a(2, 1) i a(2, 2). ncercai s calculai a(4, 4) i a(10, 10). Explicai
mesajele afiate pe ecran.
Se consider declaraia
25
c) inverseaz componentele vectorului;
d) calculeaz suma componentelor pozitive;
e) verific dac cel puin o component a vectorului este negativ;
f) calculeaz produsul componentelor negative;
g) verific dac cel puin o component a vectorului este egal cu un numr dat.
Elaborai o form nerecursiv a funciei ce urmeaz:
function S(n:Natural):Natural;
begin
if n=0 then S:=0
else S:=n+S(n-1)
end; {S}
Scriei o funcie recursiv care returneaz valoarea true dac irul de caractere s este
conform definiiei
<Numr>::=<Cifr>|<Cifr><Numr>
Indicaie. Forma unei astfel de funcii deriv din formula metalingvistic. Varianta nerecursiv
26
<Antet funcie> ::=
function <Identificator> [<List parametri formali>] : <Identificator>
function
function
Antet procedur
procedure
<Antet procedur>
procedure
27
Listele de parametri formali au urmtoarea sintax:
<List parametri formali> ::=
(<Parametru formal> {; <Parametru formal>})
<Parametru formal> ::=
[var] <Identificator> {, <Identificator>} : <Identificator>
| <Antet funcie>
| <Antet procedur>
Identificator
Antet funcie
Antet procedur
28
<Apel funcie>
<Nume funcie> List parametri actuali
<Apel procedur>
Nume procedur List parametri actuali
Variabil
Nume funcie
Nume procedur
ntrebri i exerciii
Cnd se utilizeaz declaraiile de forma
function <Identificator>; <Corp> ?
Indicai pe diagramele sintactice din figurile1.3 i 1.5 drumurile care corespund declara-
iilor de funcii din programul P106, paragraful 1.4.
Care este diferena dintre un parametru-valoare i un parametru-variabil?
Indicai pe diagramele sintactice din figurile1.4 i 1.5 drumurile care corespund declara-
iilor de proceduri din programul P101, paragraful 1.3.
Indicai pe diagramele sintactice din figurile1.31.6 drumurile care corespund declarai-
ilor i apelurilor de subprograme din programul P105, paragraful1.4.
29
Capitolul 2
STRUCTURI DINAMICE
DE DATE
<Tip referin>
^ Tip
Mulimea de valori ale unui tip de date referin const din adrese. Fiecare adres
identific o variabil dinamic ce aparine tipului de baz. La aceast mulime de
adrese se mai adaug o valoare special, notat nil (zero), care nu identific nicio
variabil.
Exemplu:
type AdresaInteger=^integer;
AdresaChar=^char;
30
var i : AdresaInteger;
r : ^real;
c : AdresaChar;
Valoarea curent a variabilei i va indica o variabil dinamic de tipul inte-
ger. ntr-un mod similar, variabilele de tip referin r i c identific variabile de ti-
pul real i, respectiv, char. Subliniem faptul c tipurile de date AdresaInteger,
AdresaChar i tipul anonim ^real snt tipuri referin distincte.
Operaiile care se pot face cu valorile unui tip de date referin snt = i <>. Valorile
de tip referin nu pot fi citite de la tastatur i afiate pe ecran.
Crearea unei variabile dinamice se realizeaz cu procedura predefinit new (nou).
Apelul acestei proceduri are forma
new(p)
unde p este o variabil de tip referin.
Procedura aloc spaiu de memorie pentru variabila nou-creat i returneaz
adresa zonei respective prin variabila p. n continuare variabila dinamic poate fi
accesat prin aa-zisa dereperare: numele variabilei de tip referin p este urmat de
semnul de ^. Dereperarea unei variabile de tip referin cu coninutul nil va de-
clana o eroare de execuie.
Exemplu:
new(i); i^:=1 crearea unei variabile dinamice de tipul integer; variabilei
create i se atribuie valoarea 1;
new(r); r^:=2.0 crearea unei variabile dinamice de tipul real; variabilei
create i se atribuie valoarea 2.0;
new(c); c^:=* crearea unei variabile dinamice de tipul char; variabilei
create i se atribuie valoarea *.
Subliniem faptul c variabila dinamic p^ obinut printr-un apel new(p) este
distinct de toate variabilele create anterior. Prin urmare, executarea instruciu-
nilor
new(p); new(p); ...; new(p)
conduce la crearea unui ir v1 , v2 , ..., vn de variabile dinamice. Numai ultima variabil
creat, vn , este referit prin p^. ntruct valorile variabilelor de tip referin reprezin-
t adresele anumitor zone din memoria intern a calculatorului, variabilele n studiu
se numesc indicatori de adres.
Distrugerea unei variabile dinamice i eliberarea zonei respective de memorie se
realizeaz cu procedura predefinit dispose (a dispune). Apelul acestei proceduri
are forma:
dispose(p)
unde p este o variabil de tip referin.
Exemple:
dispose(i); dispose(r); dispose(c)
31
Dup executarea instruciunii dispose(p) valoarea variabilei de tip referin p
este nedefinit.
Asupra variabilelor dinamice se pot efectua toate operaiile admise de tipul de
baz.
Exemplu:
Program P117;
{Operaii cu variabile dinamice }
type AdresaInteger=^integer;
var i, j, k : AdresaInteger;
r, s, t : ^real;
begin
{crearea variabilelor dinamice de tipul integer }
new(i); new(j); new(k);
{operaii cu variabilele create }
i^:=1; j^:=2;
k^:=i^+j^;
writeln(k^);
{crearea variabilelor dinamice de tipul real }
new(r); new(s); new(t);
{operaii cu variabilele create }
r^:=1.0; s^:=2.0;
t^:=r^/s^;
writeln(t^);
{distrugerea variabilelor dinamice }
dispose(i); dispose(j); dispose(k);
dispose(r); dispose(s); dispose(t);
readln;
end.
Program P118;
{Eroare: depirea capacitii memoriei }
label 1;
var i : ^integer;
32
begin
1 : new(i);
goto 1;
end.
ntrebri i exerciii
Care este diferena dintre variabilele statice i variabilele dinamice?
Cum se identific variabilele dinamice?
Indicai pe diagrama sintactic din figura2.1 drumurile care corespund declaraiilor de
tipuri referin din programul P117.
Se consider declaraiile:
type AdresaReal=^real;
var r : AdresaReal;
33
begin
new(i); i^:=1;
new(i); i^:=2;
new(i); i^:=3;
writeln(i^);
readln;
end.
Comentai programul:
Program P121;
{Eroare }
var i, j : ^integer;
begin
new(i);
i^:=1;
dispose(i);
new(j);
j^:=2;
dispose(j);
writeln(i^=, i^, j^=, j^);
readln;
end.
34
ie, staiile, rutele, capacitatea de trafic .a. pot fi stabilite interactiv de ctre utilizator.
n astfel de situaii utilizarea datelor cu structur implicit devine nenatural, dificil
i ineficient.
Prin urmare, este necesar folosirea unor structuri de date n care relaiile dintre
componente s fie reprezentate i prelucrate n mod explicit. Acest efect se poate
obine atand fiecrei componente o informaie ce caracterizeaz relaiile acesteia
cu alte date ale structurii. n cele mai multe cazuri, informaia suplimentar, numit
informaie de structur, se reprezint prin variabilele de tipul referin.
Structurile de date componentele crora snt create i eventual distruse n timpul exe-
cuiei programului se numesc structuri dinamice de date. Structurile dinamice frecvent
utilizate snt: listele unidirecionale, listele bidirecionale, stivele, cozile, arborii .a.
O structur de date este recursiv dac ea poate fi descompus n date cu aceeai
structur. Pentru exemplificare menionm listele unidirecionale i arborii care vor
fi studiai n paragrafele urmtoare.
ntrebri i exerciii
Explicai termenul structur de date. Dai exemple.
Care este diferena dintre structurile implicite i structurile explicite de date?
O structur de date este omogen dac toate componentele snt de acelai tip. n caz
contrar, structura de date este eterogen. Dai exemple de structuri omogene i struc-
turi eterogene de date.
Care este diferena dintre structurile statice i structurile dinamice de date?
Explicai termenul structur recursiv de date.
35
Urm : AdresaCelula;
end;
var P : AdresaCelula;
Informaia util asociat unei celule se memoreaz n cmpul Info, iar adresa
celulei urmtoare n cmpul Urm. Pentru simplificare se consider c cmpul Info
este de tipul ir de caractere. Ultima celul din list va avea n cmpul Urm valoarea
nil. Adresa primei celule (adresa de baz) este memorat n variabila de tip refe-
rin P (fig. 2.2).
P
cmp indicator
date de adres
A B C D
Program P122;
{Crearea listei unidirecionale A->B->C->D }
type AdresaCelula=^Celula;
Celula=record
Info : string;
Urm : AdresaCelula;
end;
var P, {adresa de baz }
R, V : AdresaCelula;
begin
{1 - iniial lista este vid }
P:=nil;
{2 - adugarea celulei A }
new(R); {crearea unei celule }
P:=R; {iniializarea adresei de baz }
36
R^.Info:=A; {ncrcarea informaiei utile }
R^.Urm:=nil; {nscrierea indicatorului sfrit de list }
V:=R; {memorarea adresei vrfului }
{3 - adugarea celulei B }
new(R); {crearea unei celule }
R^.Info:=B; {ncrcarea informaiei utile }
R^.Urm:=nil; {nscrierea indicatorului sfrit de list }
V^.Urm:=R; {crearea legturii A -> B }
V:=R; {actualizarea adresei vrfului }
{4 - adugarea celulei C }
new(R); {crearea unei celule }
R^.Info:=C; {ncrcarea informaiei utile }
R^.Urm:=nil; {nscrierea indicatorului sfrit de list }
V^.Urm:=R; {crearea legturii B -> C }
V:=R; {actualizarea adresei vrfului }
{5 - adugarea celulei D }
new(R); {crearea unei celule }
R^.Info:=D; {ncrcarea informaiei utile }
R^.Urm:=nil; {nscrierea indicatorului sfrit de list }
V^.Urm:=R; {crearea legturii C -> D }
V:=R; {actualizarea adresei vrfului }
{afiarea listei create }
R:=P;
while R<>nil do begin
writeln(R^.Info);
R:=R^.Urm
end;
readln;
end.
Program P123;
{ Crearea listelor unidirectionale}
type AdresaCelula=^Celula;
Celula=record
Info : string;
Urm : AdresaCelula;
end;
37
1 iniial lista este vid
P
2 adugarea celulei A
P V
3 adugarea celulei B
P V
A B
4 adugarea celulei C
P V
A B C
5 adugarea celulei D
V V
A B C D
38
var p,q,r : AdresaCelula;
s : string;
i: integer;
procedure Creare;
begin
p:=nil;
write(s=); readln(s);
new(r); r^.Info:=s; r^.Urm:=nil;
p:=r; q:=r;
write(s=);
while not eof do
begin
readln(s);write(s=);
new(r); r^.Info:=s; r^.Urm:=nil;
q^.Urm:=r; q:=r
end;
end; { Creare }
procedure Afisare;
begin
r:=p;
while r<>nil do
begin
writeln(r^.Info);
r:=r^.Urm;
end;
readln;
end; { Afisare }
begin
Creare;
Afisare;
end.
39
Proprietile listelor unidirecionale pot fi reproduse parial prin memorarea ele-
mentelor respective ntr-un tablou unidimensional. De exemplu, datele din figura 2.2
pot fi reprezentate n forma:
var L : array [1..4] of string;
...
L[1]:= A;
L[2]:= B;
L[3]:= C;
L[4]:= D;
...
ntrebri i exerciii
Cum se definesc datele necesare pentru crearea unei liste?
Care este destinaia cmpului datelor din componena unei celule? Care este destinaia
cmpului legturilor? Ce informaie se nscrie n acest cmp?
Scriei un program care creeaz lista unidirecional din figura2.2, adugnd cte un ele-
ment la baza listei.
Elaborai o procedur care schimb cu locul dou elemente din list.
De la tastatur se citesc numere ntregi diferite de zero. Se cere s se creeze dou liste,
una a numerelor negative, iar alta a numerelor pozitive.
Prin ce se explic faptul c listele unidirecionale snt structuri recursive de date?
40
R:=P; {poziionare pe celula de baz }
while R<>nil do
begin
{prelucrarea informaiei din cmpul R^.Info }
R:=R^.Urm; { poziionare pe celula urmtoare }
end;
41
R
...
...
Q
a)
R
...
...
Q
b)
Q^.Urm:=R^.Urm;
R^.Urm:=Q;
Program P124;
{Crearea i prelucrarea unei liste unidirecionale }
type AdresaCelula=^Celula;
Celula=record
Info : string;
Urm : AdresaCelula;
end;
42
Q R
...
...
a)
...
...
b)
procedure Afis;
var R : AdresaCelula;
begin
if P=nil then writeln(Lista este vid)
else begin
writeln(Lista curent:);
R:=P;
while R<>nil do
43
begin
writeln(R^.Info);
R:=R^.Urm;
end;
end;
readln;
end; {Afis }
procedure Includ;
label 1;
var Q, R : AdresaCelula;
Cheie : string;
begin
new(Q);
write(Dai elementul ce urmeaz);
writeln( s fie inclus:);
readln(Q^.Info);
write(Indicai elementul dup care);
writeln( se va face includerea:);
readln(Cheie);
R:=P;
while R<>nil do
begin
if R^.Info=Cheie then goto 1;
R:=R^.Urm;
end;
1:if R=nil then begin
writeln(Element inexistent);
dispose(Q);
end;
else begin
Q^.Urm:=R^.Urm;
R^.Urm:=Q;
end;
end; { Includ }
procedure Exclud;
label 1;
var Q, R : AdresaCelula;
Cheie : string;
begin
write(Dai elementul ce urmeaz);
writeln( s fie exclus:);
readln(Cheie);
R:=P;
Q:=R;
44
while R<>nil do
begin
if R^.Info=Cheie then goto 1;
Q:=R;
R:=R^.Urm;
end;
1:if R=nil then writeln(Element inexistent)
else begin
if R=P then P:=R^.Urm else Q^.Urm:=R^.Urm;
dispose(R);
end;
end; { Exclud }
begin
P:=nil; { iniial lista este vid }
repeat
writeln(Meniu:);
writeln(C - Crearea listei);
writeln(I - Includerea elementului);
writeln(E - Excluderea elementului);
writeln(A - Afiarea listei la ecran);
writeln(O - Oprirea programului);
write(Opiunea=); readln(c);
case c of
C : Creare;
I : Includ;
E : Exclud;
A : Afis;
O :
else writeln(Opiune necunoscut)
end;
until c=O;
end.
ntrebri i exerciii
Scriei o funcie nerecursiv care returneaz adresa vrfului listei unidirecionale.
Transcriei aceast funcie ntr-o form recursiv.
Transcriei procedurile Includ i Exclud din programul P124, fr a utiliza instruci-
unea goto.
45
Se consider urmtoarele tipuri de date:
type AdresaCandidat=^Candidat;
Candidat=record
NumePrenume : string;
NotaMedie : real;
Urm : AdresaCandidat
end;
2.5. Stiva
Prin stiv (n limba englez stack) nelegem o list unidirecional cu proprieta-
tea c operaiile de introducere i extragere a elementelor se fac la un singur capt
46
al ei. Poziia ocupat n stiv de ultimul element introdus poart numele de vrf. O
stiv fr niciun element se numete stiv vid.
Pentru exemplificare, n figura 2.6 este prezentat o stiv care conine elementele
A, B, C.
S C
S C
A B
A
b)
a)
Datele necesare pentru crearea i prelucrarea unei stive pot fi definite prin decla-
raii de forma:
type AdresaCelula=^Celula;
Celula=record
Info : string;
Prec : AdresaCelula
end;
var S : AdresaCelula;
Adresa vrfului stivei este memorat n variabila de tip referin S. Adresa celulei
precedente din stiv este memorat n cmpul Prec.
Operaia de introducere a unui element n stiv (fig. 2.7) este efectuat de secven-
a de instruciuni:
new(R); { crearea unei celule }
{ncrcarea informaiei utile n cmpul R^.Info }
R^.Prec:=S; { crearea legturii ctre celula precedent
din stiv }
S:=R; { actualizarea adresei vrfului }
47
S D
S C C
B B S B
A A A
a) b) c)
Extragerea unui element din stiv (fig. 2.7) este efectuat de secvena:
R:=S; { memorarea adresei celulei extrase }
{ prelucrarea informaiei din cmpul R^.Info }
S:=S^.Prec; { eliminarea celulei din stiv }
dispose(R); { distrugerea celulei extrase }
Exemplu:
Program P127;
{Crearea i prelucrarea unei stive }
type AdresaCelula=^Celula;
Celula=record
Info : string;
Prec : AdresaCelula;
end;
var S : AdresaCelula; {adresa vrfului }
c : char;
procedure Introduc;
var R : AdresaCelula;
begin
new(R);
write(Dai elementul ce urmeaz);
writeln( s fie introdus:);
readln(R^.Info);
R^.Prec:=S;
S:=R;
end; { Includ }
48
procedure Extrag;
var R : AdresaCelula;
begin
if S=nil then writeln(Stiva este vid)
else begin
R:=S;
write(Este extras);
writeln( elementul:);
writeln(R^.Info);
S:=S^.Prec;
dispose(R);
end;
end; { Extrag }
procedure Afis;
var R : AdresaCelula;
begin
if S=nil then writeln(Stiva este vid)
else begin
writeln(Stiva include elementele:);
R:=S;
while R<>nil do begin
writeln(R^.Info);
R:=R^.Prec;
end;
end;
readln;
end; { Afis }
begin
S:=nil; { iniial stiva este vid }
repeat
writeln(Meniu:);
writeln(I - Introducerea elementului;);
writeln(E - Extragerea elementului);
writeln(A - Afiarea stivei pe ecran);
writeln(O - Oprirea programului);
write(Opiunea=); readln(c);
case c of
I : Introduc;
E : Extrag;
A : Afis;
O :
else writeln(Opiune necunoscut)
end;
until c=O;
end.
49
Stivele mai poart i numele de liste LIFO (last in, first out ultimul element care
a intrat n stiv va fi primul care va iei din ea) i snt frecvent utilizate pentru aloca-
rea dinamic a memoriei n cazul procedurilor i funciilor recursive. Evident, stivele
pot fi simulate utiliznd tablourile unidimensionale array [1..n] of ..., ns o
astfel de reprezentare este limitat de cele n componente ale tablourilor.
ntrebri i exerciii
Care este ordinea de introducere i extragere a datelor din stiv?
De la tastatur se citesc mai multe numere naturale. Afiai numerele n studiu pe ecran
n ordinea invers citirii.
n figura2.8 este reprezentat schema de manevrare a vagoanelor de tren ntr-un de-
pou. Elaborai un program care citete de la tastatur i afieaz pe ecran datele despre
fiecare vagon intrat sau ieit din depou. Datele n studiu includ:
numrul de nmatriculare (integer);
staia de nmatriculare (string);
anul fabricrii (1960..2000);
tipul vagonului (string);
capacitatea de ncrcare (real);
proprietarul vagonului (string).
Intrare Ieire
Linie moart
50
b) dac A este un ir corect, atunci (A), [A] i {A} snt iruri corecte;
c) dac A i B snt iruri corecte, atunci AB este un ir corect.
De exemplu, irurile ( ), [ ], { }, [( )], ((({[ ]}))([ ])) snt corecte, iar irurile ([, ( )[ ]{{, ([)] nu snt
corecte. Elaborai un program care verific dac irul citit de la tastatur este corect.
Indicaie. Problema poate fi rezolvat printr-o singur parcurgere a irului supus verificrii.
Dac caracterul curent este (, [ sau {, el este depus n stiv. Dac vrful stivei i caracterul
curent formeaz una din perechile (), [] sau {}, paranteza respectiv este scoas din stiv.
n cazul unui ir corect, dup examinarea ultimului caracter din ir stiva rmne vid.
Elementele stivei snt memorate ntr-un tablou unidimensional. Elaborai procedurile ne-
cesare pentru introducerea i extragerea elementelor din stiv. Care snt avantajele i ne-
ajunsurile acestei reprezentri? Se consider c stiva conine cel mult 100 de elemente.
2.6. Cozi
Prin coad (n englez queue) nelegem o list unidirecional n care toate in-
troducerile se efectueaz la unul din capete, iar extragerile se efectueaz la cellalt
capt. O coad fr niciun element se numete coad vid.
Pentru exemplificare, n figura 2.9 este prezentat o coad care conine elementele A, B, C.
U P
C B A
a)
U P
C B A
b)
Datele necesare pentru crearea i prelucrarea unei cozi pot fi definite prin decla-
raii de forma:
type AdresaCelula=^Celula;
Celula=record
Info : string;
51
Urm : AdresaCelula
end;
var P, U : AdresaCelula;
Adresa primului element din coad este memorat n variabila de tip referin P,
iar adresa ultimului element n variabila U. Adresa celulei urmtoare din coad este
memorat n cmpul Urm.
Operaia de introducere a unui element (fig. 2.10) este efectuat de secvena de
instruciuni:
new(R); {crearea unei celule }
{ncrcarea informaiei utile n cmpul R^.Info }
R^.Urm:=nil; { nscrierea indicatorului ultimul element }
U^.Urm:=R; { adugarea celulei la coad }
U:=R; { actualizarea adresei ultimei celule }
U P
C B A
a)
U P
D C B A
b)
U P
D C
c)
52
Extragerea unui element din coad (fig. 2.10) este efectuat de secvena:
R:=P; { memorarea adresei primei celule }
{prelucrarea informaiei din cmpul R^.Info }
P:=P^.Urm; {eliminarea primei celule }
dispose(R); {distrugerea celulei extrase }
Exemplu:
Program P128;
{Crearea i prelucrarea unei cozi }
type AdresaCelula=^Celula;
Celula=record
Info : string;
Urm : AdresaCelula;
end;
var P, {adresa primului element }
U : AdresaCelula; {adresa ultimului element }
c : char;
procedure Introduc;
var R : AdresaCelula;
begin
new(R);
write(Dai elementul ce urmeaz);
writeln( s fie introdus:);
readln(R^.Info);
R^.Urm:=nil;
if P=nil then begin P:=R; U:=R end
else begin U^.Urm:=R; U:=R end;
end; { Introduc }
procedure Extrag;
var R : AdresaCelula;
begin
if P=nil then writeln(Coada este vid)
else begin
R:=P;
write(Este extras);
writeln( elementul:);
writeln(R^.Info);
P:=P^.Urm;
dispose(R);
end;
end; { Extrag }
53
procedure Afis;
var R : AdresaCelula;
begin
if P=nil then writeln(Coada este vid)
else begin
write(Coada include);
writeln( elementele:);
R:=P;
while R<>nil do
begin
writeln(R^.Info);
R:=R^.Urm;
end;
end;
readln;
end; { Afis }
begin
P:=nil; U:=nil; { iniial coada este vid }
repeat
writeln(Meniu:);
writeln(I - Introducerea elementului;);
writeln(E - Extragerea elementului;);
writeln(A - Afiarea cozii la ecran;);
writeln(O - Oprirea programului);
write(Opiunea=); readln(c);
case c of
I : Introduc;
E : Extrag;
A : Afis;
O :
else writeln(Opiune necunoscut)
end;
until c=O;
end.
Cozile mai poart numele de liste FIFO (first in, first out primul element intrat
n coad va fi primul ieit din coad). Menionm c simularea cozilor cu ajutorul ta-
blourilor unidimensionale este ineficient din cauza migrrii elementelor cozii spre
ultima component a tabloului.
ntrebri i exerciii
Elaborai o funcie care returneaz numrul elementelor unei cozi.
Avioanele care solicit aterizarea pe o anumit pist a unui aeroport formeaz un fir de
ateptare. Elaborai un program care citete de la tastatur i afieaz pe ecran datele
54
despre fiecare avion care solicit aterizarea i avionul care aterizeaz. Datele n studiu
includ:
numrul de nmatriculare (integer);
tipul avionului (string);
numrul rutei (integer).
Prin coad cu prioriti vom nelege o coad n care elementul de introdus se insereaz
nu dup ultimul element al cozii, ci naintea tuturor elementelor cu o prioritate mai mic.
Prioritile elementelor se indic prin numere ntregi. Elaborai un program care:
a) creeaz o coad cu prioriti;
b) introduce n coad elementele specificate de utilizator;
c) extrage elementele din coad;
d) afieaz coada cu prioriti pe ecran.
Pentru a sublinia faptul c arborii binari snt structuri recursive de date, declara-
iile n studiu pot fi transcrise n forma:
type Arbore=^Nod;
Nod=record
Info : string;
Stg, Dr : Arbore;
end;
var T : Arbore;
Nodul spre care nu este ndreptat nicio legtur se numete rdcin. Adresa
rdcinii se memoreaz n variabila de tip referin T. n cazul unui arbore vid
T=nil.
55
Cei doi arbori conectai la rdcin se numesc subarborele stng i subarborele
drept. Adresa subarborelui stng se memoreaz n cmpul Stg, iar adresa subarbo-
relui drept n cmpul Dr.
Nivelul unui nod este, prin convenie, 0 pentru nodul-rdcin i i + 1, pentru no-
dul conectat la un nod de nivelul i. n mod obinuit, n reprezentarea grafic a unui
arbore binar nodurile se deseneaz pe niveluri: rdcina se afl pe nivelul 0, vrfurile
conectate la rdcin pe nivelul 1 .a.m.d. (fig. 2.11).
B C
D E F G
H I J
a)
nivel 0 A
nivel 1 B C
nivel 2 D E F G
nivel 3 H I J
b)
56
Nodurile de pe nivelul i + 1, conectate la un nod de pe nivelul i, se numesc des-
cendenii acestuia. n figura 2.11 nodul B este descendentul stng, iar nodul C este
descendentul drept al nodului A; nodul D este descendentul stng, iar nodul E
descendentul drept al nodului B .a.m.d.
Dac un nod x este descendentul altui nod y, l numim pe acesta din urm p-
rintele nodului x. n figura 2.11 nodul A este printele nodurilor B i C; nodul B este
printele nodurilor D i E .a.m.d.
Un nod la care nu este conectat niciun subarbore este un nod terminal. n caz con-
trar, nodul este neterminal. Prin nlimea arborelui binar nelegem numrul de nivel
maxim asociat nodurilor terminale. Arborele din figura 2.11 are nlimea 3; nodurile
D, H, F, I i J snt noduri terminale; nodurile A, B, C, E i G snt noduri neterminale.
Arborii binari pot fi construii n memoria calculatorului cu ajutorul algoritmilor
iterativi sau algoritmilor recursivi.
Algoritmul iterativ creeaz nodurile n ordinea apariiei lor pe niveluri:
se creeaz nodul-rdcin;
nodul-rdcin se introduce ntr-o coad;
pentru fiecare nod extras din coad se creeaz, dac exist, descendentul stng
i descendentul drept;
nodurile nou-create se introduc n coad;
procesul de construire a arborelui se ncheie cnd coada devine vid.
Nodurile arborelui din figura 2.11 vor fi create de algoritmul iterativ n ordinea:
A, B, C, D, E, F, G, H, I, J.
Un algoritm similar poate fi utilizat pentru parcurgerea arborelui binar i afiarea
nodurilor respective pe ecran:
se creeaz o coad care conine un singur element nodul-rdcin;
fiecare nod extras din coad este afiat pe ecran;
descendenii nodului extras se introduc n coad;
procesul de afiare se ncheie cnd coada devine vid.
Exemplu:
Program P129;
{Crearea unui arbore binar - iteraie }
type AdresaNod=^Nod;
Nod=record
Info : string;
Stg, Dr : AdresaNod
end;
AdresaCelula=^Celula;
Celula=record
Info : AdresaNod;
Urm : AdresaCelula
end;
57
procedure IntroduInCoada(Q : AdresaNod);
var R : AdresaCelula;
begin
new(R);
R^.Info:=Q;
R^.Urm:=nil;
if Prim=nil then begin Prim:=R; Ultim:=R end
else begin Ultim^.Urm:=R; Ultim:=R end;
end; {IntroduInCoada}
58
write( drept: ); readln(s);
if s= then R^.Dr:=nil
else
begin
new(Q); R^.Dr:=Q;
Q^.Info:=s;
IntroduInCoada(Q);
end; { else }
end; { while }
end; { CreareArboreBinar }
procedure AfisareArboreBinar;
var R : AdresaNod;
begin
if T=nil then writeln(Arbore vid)
else
begin
writeln(Arborele este format din:);
Prim:=nil; Ultim:=nil;
IntroduInCoada(T);
while Prim<>nil do
begin
ExtrageDinCoada(R);
writeln(Nodul , R^.Info);
write( descendeni: );
if R^.Stg=nil then write(nil, )
else begin
write(R^.Stg^.Info, , );
IntroduInCoada(R^.Stg);
end;
begin
CreareArboreBinar;
AfisareArboreBinar;
end.
59
tatur un ir vid de caractere). Menionm c coada creat de programul P129 nu
conine nodurile propriu-zise, ci adresele acestor noduri.
Algoritmul recursiv construiete arborii binari urmnd direct definiia respec-
tiv:
se creeaz nodul-rdcin;
se construiete subarborele stng;
se construiete subarborele drept.
Nodurile arborelui binar din figura 2.11 vor fi create de algoritmul recursiv n
ordinea: A, B, D, E, H, C, F, G, I, J.
Exemplu:
Program P130;
{Crearea unui arbore binar - recursie }
type Arbore=^Nod;
Nod=record
Info : string;
Stg, Dr : Arbore
end;
60
begin
AfisArb(T^.Stg, nivel+1);
for i:=1 to nivel do write( );
writeln(T^.Info);
AfisArb(T^.Dr, nivel+1);
end;
end; {AfisareArb }
begin
writeln(Dai rdcina:);
T:=Arb;
AfisArb(T, 0);
readln;
end.
Funcia Arb citete de la tastatur informaia util asociat nodului n curs de cre-
are. Dac se citete un ir vid, nu se creeaz niciun nod i funcia returneaz valoarea
nil. n caz contrar, funcia creeaz un nod, nscrie irul de caractere n cmpul Info
i returneaz adresa nodului. n momentul cnd trebuie completate cmpurile Stg
(adresa subarborelui stng) i Dr (adresa subarborelui drept), funcia se autoapelea-
z, trecnd astfel la construcia subarborelui respectiv.
Procedura AfisArb afieaz arborele binar pe ecran. Se afieaz subarborele stng,
rdcina i apoi subarborele drept. Nivelul fiecrui nod este redat prin inserarea
numrului respectiv de spaii.
Comparnd programele P129 i P130, se observ c prelucrarea structurilor re-
cursive de date, i anume a arborilor binari, este mai natural i mai eficient n cazul
utilizrii unor algoritmi recursivi.
Arborii binari au numeroase aplicaii, una dintre cele specifice fiind reprezentarea
expresiilor n scopul prelucrrii acestora n translatoarele limbajelor de programare.
ntrebri i exerciii
Cum se definete un arbore binar? Explicai termenii: rdcin, subarborele stng, subar-
borele drept, descendent, nivel, nod terminal, nod neterminal, nlimea arborelui binar.
Formulai algoritmii iterativi destinai crerii i afirii arborilor binari.
Cum se construiete un arbore binar cu ajutorul algoritmului recursiv?
Elaborai un program care construiete arborele genealogic propriu pe parcursul a trei
sau patru generaii. Nodul-rdcin conine numele, prenumele i anul naterii, iar no-
durile descendente conin datele respective despre prini.
Cum trebuie modificat procedura AfisArb din programul P130 pentru ca arborele
binar s fie afiat n ordinea: subarborele drept, nodul-rdcin, subarborele stng?
Scriei o funcie recursiv care returneaz numrul nodurilor unui arbore binar. Transcriei
aceast funcie ntr-o form nerecursiv.
Organizarea unui turneu prin eliminare este redat cu ajutorul unui arbore binar.
Nodurile arborelui n studiu conin urmtoarea informaie:
61
numele (string);
prenumele (string);
data naterii (ziua, luna, anul);
cetenia (string).
Fiecrui juctor i corespunde un nod terminal, iar fiecrui meci un nod neterminal. n
fiecare nod neterminal se nscriu datele despre ctigtorul meciului la care au participat
cei doi juctori din nodurile descendente. Evident, rdcina arborelui va conine datele
despre ctigtorul turneului.
Scriei un program care creeaz n memoria calculatorului i afieaz pe ecran arborele
unui turneu prin eliminare.
Indicaie: Se pornete de la o list a juctorilor. Ctigtorii meciurilor din prima etap se
includ ntr-o alt list. n continuare se formeaz lista ctigtorilor meciurilor din etapa
a doua .a.m.d.
Cum trebuie modificat funcia Arb din programul P130 pentru ca arborele binar s se
construiasc n ordinea: A, C, G, J, I, F, B, E, H, D?
Funcia Arb din programul P130 construiete arborii binari n ordinea: nodul-rdcin,
subarborele stng, subarborele drept. Scriei o procedur nerecursiv care construiete
arborii binari n aceeai ordine.
Indicaie: Se utilizeaz o stiv elementele creia snt noduri. Iniial stiva va conine numai
nodul-rdcin. Pentru fiecare nod din vrful stivei se va construi subarborele stng, iar
apoi subarborele drept. Nodurile nou-create se introduc n stiv. Dup construirea
subarborelui drept, nodul respectiv este scos din stiv.
62
Parcurgerea n postordine sau traversarea SDR:
1) se traverseaz subarborele stng;
2) se traverseaz subarborele drept;
3) se viziteaz rdcina.
Notaiile RSD, SRD i SDR reprezint ordinea n care vor fi vizitate rdcina (R),
subarborele stng (S) i subarborele drept (D). Metodele de parcurgere a arborilor
binari snt ilustrate n figura 2.12.
R R R
S D S D S D
A, B, D, E, H, C, F, G, I, J;
parcurgerea n inordine furnizeaz nodurile n ordinea:
D, B, E, H, A, F, C, I, G, J;
iar parcurgerea n postordine conduce la:
D, H, E, B, F, I, J, G, C, A.
Prezentm mai jos un program PASCAL de parcurgere a unui arbore binar dup
toate cele trei metode.
Program P131;
{Parcurgerea arborelui binar }
type Arbore=^Nod;
Nod=record
Info : string;
Stg, Dr : Arbore
end;
var T : Arbore; {rdcina }
63
function Arb : Arbore;
{crearea arborelui binar }
var R : Arbore;
s : string;
begin
readln(s);
if s= then Arb:=nil
else begin
new(R);
R^.Info:=s;
write(Dai descendentul stng);
writeln( al nodului , s, :);
R^.Stg:=Arb;
write(Dai descendentul drept);
writeln( al nodului , s, :);
R^.Dr:=Arb;
Arb:=R;
end;
end; {Arb }
64
Inordine(T^.Stg);
writeln(T^.Info);
Inordine(T^.Dr)
end;
end; {Preordine }
begin
writeln(Dai rdcina:);
T:=Arb;
AfisArb(T, 0);
readln;
writeln(Parcurgere n preordine:);
Preordine(T);
readln;
writeln(Parcurgere n inordine:);
Inordine(T);
readln;
writeln(Parcurgere n postordine:);
Postordine(T);
readln;
end.
ntrebri i exerciii
Ce operaii pot fi efectuate asupra arborilor binari?
Explicai metodele de parcurgere a arborilor binari. Dai exemple.
Scriei listele de noduri obinute n urma celor trei metode de parcurgere a arborelui
binar din figura2.13.
Transcriei procedurile Preordine, Inordine i Postordine din programul P131
n form nerecursiv.
Scriei un subprogram care returneaz nlimea arborelui binar.
65
1
2 3
4 5 6
7 8 9 10
Elaborai un program care afieaz pe ecran toate nodurile aflate pe un nivel dat ntr-un
arbore binar.
Elaborai o procedur recursiv care parcurge un arbore binar n ordinea:
a) RDS (rdcina subarborele drept subarborele stng);
b) DRS (subarborele drept rdcina subarborele stng);
c) DSR (subarborele drept subarborele stng rdcina).
Transcriei procedura elaborat ntr-o form nerecursiv.
Scriei un subprogram care afieaz la ecran nivelul fiecrui nod dintr-un arbore binar.
Se d un arbore binar n care nodurile terminale reprezint numere ntregi, iar cele ne-
terminale operaiile binare +, -, *, mod, div. Arborele n studiu poate fi considerat ca o
reprezentare a unei expresii aritmetice. Valoarea acestei expresii se calculeaz efectund
operaia din nodul-rdcin asupra valorilor subexpresiilor reprezentate de subarborele
stng i subarborele drept.
Scriei o funcie care returneaz valoarea expresiilor aritmetice reprezentate prin arbori
binari.
Se consider expresiile aritmetice formate din operanzi i operatorii binari +, -, *, /. Operanzii
snt variabile numele crora este format dintr-o singur liter i constante alctuite dintr-o
cifr. Fiecrei expresii aritmetice i se poate asocia un arbore binar dup cum urmeaz:
a) expresiei aritmetice formate dintr-un singur operand i se asociaz un arbore binar
format doar din nodul ce conine operandul respectiv;
b) expresiei aritmetice de forma E1E2, unde E1 i E2 snt expresii aritmetice, i se asociaz
un arbore binar care are n nodul-rdcin operatorul , ca subarbore stng arborele aso-
ciat expresiei E1, iar ca subarbore drept arborele asociat expresiei E2.
Valoarea expresiei se calculeaz efectund operaia din nodul-rdcin asupra valorilor
subexpresiilor reprezentate de subarborele stng i subarborele drept.
Scriei un program care:
a) construiete arbori binari asociai expresiilor aritmetice citite de la tastatur;
b) evalueaz expresiile aritmetice reprezentate prin arborii binari.
Indicaie. Algoritmul va urma definiia recursiv a arborelui n studiu. Ca operator curent
se poate desemna orice operator +, - din expresia supus prelucrrii. Operatorii *, /
pot fi desemnai ca operatori cureni numai cnd expresia supus prelucrrii nu conine
operatorii +, -.
66
2.9. Arbori de ordinul m
Se consider variabile dinamice de tipul record care au n cmpul legturilor indi-
catori de adres. Ca i n cazul arborilor binari vom numi astfel de variabile noduri.
Arborele de ordinul m se definete recursiv dup cum urmeaz:
a) un nod este un arbore de ordinul m;
b) un nod ce conine cel mult m legturi ctre ali arbori de ordinul m este un ar-
bore de ordinul m.
Se consider c n arbore exist cel puin un nod care subordoneaz exact m sub-
arbori. Prin convenie, arborele vid nu conine niciun nod.
Arborii de ordinul 2 se numesc arbori binari i au fost studiai n paragrafele preceden-
te. Arborii de ordinul 3, 4, 5 .a.m.d. se numesc arbori multici (n englez multiway tree).
Pentru exemplificare, n figura 2.14 este prezentat un arbore de ordinul 4. Evident,
pentru arborii multici termenii rdcin, subarbore, nivel, printe, descendent, nod
terminal, nod neterminal, nlime au aceeai semnificaie ca i pentru arborii binari.
Terminologia utilizat n structurile de date n studiu include chiar cuvinte ca fiu,
tat, frai, unchi, veri, strbunic etc. cu neles similar celui din vorbirea curent pentru
noduri aflate pe diverse niveluri. ntr-un limbaj simplist, structurile de date n studiu
exprim relaii de ramificare ntre noduri, asemntoare configuraiei arborilor
din natur, cu deosebirea c n informatic arborii cresc n jos.
nivel 0 A
nivel 1 B C D
nivel 2 E F G H I
nivel 3 J K
Datele necesare pentru crearea i prelucrarea unui arbore binar de ordinul m pot
fi definite prin declaraii de forma:
type Arbore = ^Nod;
Nod = record;
Info : string;
Dsc : array [1..m] of Arbore
end;
var T : Arbore;
67
Adresele descendenilor unui nod se memoreaz n componentele Dsc[1],
Dsc[2], ..., Dsc[m] ale tabloului Dsc. Adresa rdcinii se reine n variabila de
tip referin T.
Cele mai uzuale metode de parcurgere a arborilor de ordinul m snt parcurgerea
n lime i parcurgerea n adncime.
Parcurgerea n lime presupune vizitarea nodurilor n ordinea apariiei lor pe
niveluri. De exemplu, pentru arborele din figura 2.14 nodurile vor fi vizitate n ordi-
nea: A, B, C, D, E, F, G, H, I, J, K.
n mod obinuit, parcurgerea n lime se realizeaz cu ajutorul unui algoritm
iterativ care utilizeaz o structur auxiliar de date, i anume o coad format din
adresele nodurilor care vor fi vizitate.
Parcurgerea n adncime se definete recursiv: dac arborele este vid, el este par-
curs fr a se face nimic; altfel se viziteaz nti rdcina, apoi subarborii de la stnga
la dreapta. Pentru arborele din figura 2.14 parcurgerea n adncime furnizeaz nodu-
rile n ordinea: A, B, C, E, F, J, K, G, H, D, I. Parcurgerea n adncime se realizeaz
foarte simplu cu ajutorul unui algoritm recursiv.
Exemplu:
Program P133;
{Arbori de ordinul m }
const m=4;
type Arbore=^Nod;
Nod=record
Info : string;
Dsc : array [1..m] of Arbore
end;
AdresaCelula=^Celula;
Celula=record
Info : Arbore;
Urm : AdresaCelula
end;
68
procedure ExtrageDinCoada(var Q : Arbore);
var R : AdresaCelula;
begin
if Prim=nil then writeln(Coada este vid)
else begin R:=Prim;
Q:=R^.Info;
Prim:=Prim^.Urm;
dispose(R);
end;
end; {ExtrageDinCoad }
69
begin
writeln(Arborele este format din:);
Prim:=nil; Ultim:=nil;
IntroduInCoada(T);
while Prim<>nil do
begin
ExtrageDinCoada(R);
writeln(Nodul , R^.Info);
write( Descendeni: );
for i:=1 to m do
if R^.Dsc [i]<>nil then
begin
write(R^.Dsc [i]^.Info, );
IntroduInCoada(R^.Dsc [i]);
end; {then }
writeln;
end; {while }
end; {else }
readln;
end; {AfisareArbore }
70
begin
CreareArbore(T);
AfisareArbore(T);
writeln(Parcurgerea arborelui n lime:);
InLatime(T);
readln;
writeln(Parcurgerea arborelui n adncime:);
InAdincime(T);
readln;
end.
ntrebri i exerciii
Dai exemple de arbori de ordinul 3, 5, 6.
Cum se definete un arbore de ordinul m? Ce operaii pot fi efectuate asupra arborilor n
studiu?
Explicai metodele de parcurgere a arborilor multici. Dai exemple.
Scriei un program recursiv care construiete n memoria calculatorului un arbore mul-
tici. Informaia util asociat nodurilor se citete de la tastatur.
Scriei o funcie care returneaz:
a) numrul nodurilor unui arbore multici;
b) nivelul unui anumit nod din arbore;
c) nlimea arborelui.
Transcriei procedura InAdincime din programul P133 ntr-o form nerecursiv.
Cum trebuie modificat procedura InLatime din programul P133 ca nodurile arbore-
lui din figura6.18 s fie vizitate n ordinea: A, D, C, B, I, H, G, F, E, K, J?
Cum trebuie modificat procedura InAdincime din programul P133 pentru ca nodu-
rile arborelui din figura2.14 s fie vizitate n ordinea: A, D, I, C, H, G, F, K, J, E, B?
Se d un arbore multici, informaiile din noduri fiind iruri de caractere. S se afieze pe
ecran toate irurile de caractere de lungime par.
71
Organizarea datelor de pe discurile magnetice este redat cu ajutorul unui arbore mul-
tici. Nodurile terminale reprezint fiierele, iar nodurile neterminale directoarele.
Informaia util asociat fiecrui nod include:
numele fiierului sau directorului (string[8]);
extensia (string[3]);
data i ora ultimei actualizri (respectiv ziua, luna, anul i ore, minute, secunde);
lungimea (integer);
atributele (A, H, R, S).
Elaborai un program care simuleaz operaiile de cutare, creare i tergere a fiierelor
i directoarelor.
n unele cazuri ordinul m al arborelui multici nu este cunoscut n momentul scrierii
programului, fapt ce nu permite utilizarea structurilor de date de tipul array[1..m]
of Arbore. Pentru a depi acest inconvenient, tabloul respectiv poate fi nlocuit cu o
list uni- sau bidirecional.
Elaborai subprogramele necesare pentru crearea i prelucrarea arborilor multici de
ordin arbitrar.
Program P134;
{ Tipul de date pointer }
var p : pointer;
i, j : ^integer;
x, y : ^real;
r, s : ^string;
begin
{p va identifica o variabil dinamic de tipul integer }
new(i); i^:=1;
72
p:=i;
new(i); i^:=2;
j:=p;
writeln(j^=, j^); { se afieaz 1 }
{p va identifica o variabil dinamic de tipul real }
new(x); x^:=1;
p:=x;
new(x); x^:=2;
y:=p; writeln(y^=, y^); {se afieaz 1.0000000000E+00 }
{p va identifica o variabil dinamic de tipul string }
new(r); r^:=AAA;
p:=r;
new(r); r^:=BBB;
s:=p;
writeln(s^=, s^); { se afieaz AAA }
readln;
end.
Zon
liber
HeapPtr
Zon ocupat de
variabilele
dinamice
HeapOrg
Variabilele dinamice snt create i depuse n heap de procedura new. Ori de cte ori
n vrful heap-ului se creeaz o variabil dinamic coninutul variabilei HeapPtr este
actualizat: valoarea curent este incrementat cu dimensiunea spaiului de memorie
necesar variabilei dinamice.
Memoria ocupat n heap de o variabil dinamic se elibereaz printr-un apel al
procedurii dispose. Dimensiunea spaiului ce se elibereaz depinde de tipul vari-
abilei dinamice.
73
Ordinea de apelare a procedurii dispose nu coincide n general cu ordinea cre-
rii variabilelor dinamice de ctre procedura new. n consecin, n heap pot aprea
goluri. Golurile aprute pot fi refolosite de procedura new, dac variabila dinamic
n curs de creare ncape n spaiul respectiv.
Eliberarea memoriei ocupate de o structur dinamic de date poate fi efectuat
apelnd procedura dispose pentru fiecare component. ntruct n program snt cu-
noscute numai adresele componentelor privilegiate, de regul baza i vrful listei, r-
dcina arborelui etc., cutarea celorlalte componente cade n sarcina programatoru-
lui. Mai mult dect att, ordinea de apelare a procedurii dispose trebuie s asigure
pstrarea legturilor ctre componentele care nc nu au fost distruse. n caz contrar,
componentele respective nu mai snt referite de niciun indicator de adres i devin
inaccesibile. Prin urmare, utilizarea procedurii dispose pentru eliberarea memoriei
ocupate de structuri complexe de date este greoaie i ineficient. Acest inconvenient
poate fi depit cu ajutorul procedurilor predefinite mark i release.
Apelul procedurii mark are forma:
mark(p)
unde p este o variabil de tip pointer. Procedura memoreaz adresa vrfului din
HeapPtr n variabila p.
Apelul procedurii release are forma:
release(p)
74
Starea heap-ului este prezentat n figura 2.16 a. Instruciunea mark(p) a memorat
n variabila de tip pointer p valoarea actual din HeapPtr nainte de crearea va-
riabilei dinamice k^.
Zon
liber
HeapPtr
Zon
5 n n
liber
4 m m
P
3 k HeapPtr k
2 j 2 j
HeapOrg 1 i HeapOrg 1 i
a) b)
Fig. 2.16. Starea heap-ului pn (a) i dup executarea instruciunii release(p) (b)
Program P135;
{Gestionarea memoriei interne }
type Lista=^Celula;
Celula=record
Info : string;
Urm : Lista
end;
Stiva=Lista;
end;
var L : Lista;
S : Stiva;
T : Arbore;
p : pointer;
75
var R : Lista;
s : string;
begin
write(Info=); readln(s);
if s= then Lst:=nil
else
begin
new(R);
R^.Info:=s;
R^.Urm:=Lst;
Lst:=R;
end;
end; {Lst }
76
begin
readln(s);
if s= then Arb:=nil
else begin
new(R);
R^.Info:=s;
write(Dai descendentul stng);
writeln( al nodului , s, :);
R^.Stg:=Arb;
write(Dai descendentul drept);
writeln( al nodului , s, :);
R^.Dr:=Arb;
Arb:=R;
end;
end; { Arb }
77
Subliniem faptul c n implementrile actuale procedurile dispose i relea-
se nu atribuie valoarea nil indicatorilor de adres variabilele dinamice ale crora
au fost distruse (fig. 2.16b). ntruct memoria eliberat este refolosit, atribuirile
efectuate asupra variabilelor distruse pot altera valorile variabilelor dinamice nou-
create.
ntrebri i exerciii
Care este mulimea de valori ale tipului de date pointer? Ce operaii pot fi efectuate
cu aceste valori?
Comentai urmtorul program:
Program P136;
{Eroare }
var i : ^integer;
j, k : integer;
p : pointer;
begin
new(i); i^:=1;
p:=i;
new(i); i^:=2;
j:=i^; k:=p^;
writeln(j+k=, j+k);
end.
Program P137;
var i, j, k, m, n : ^integer;
p : pointer;
begin
{crearea variabilelor i^, j^, k^ }
new(i); new(j); new(k);
i^:=1; j^:=2; k^:=3;
p:=j; {p reine adresa din j }
{distrugerea variabilei j^ i crearea variabilei m^}
dispose(j); new(m); m^:=4;
j:=p; {refacerea adresei din j }
writeln(i^=, i^, j^=, j^, k^=, k^);
{distrugerea variabilei m^ i crearea variabilei n^ }
dispose(m); new(n); n^:=5;
writeln(i^=, i^, j^=, j^, k^=, k^);
readln;
end.
78
Program P138;
var i, j, k, m : ^integer;
begin
{crearea variabilelor k^ i m^ }
new(k); new(m);
k^:=1; m^:=2;
writeln(k^=, k^, m^=, m^);
i^:=3; j^:=4;
writeln(k^=, k^, m^=, m^);
readln;
end.
79
Capitolul 3
METODE DE ELABORARE
A PRODUSELOR PROGRAM
unit <Nume>;
interface
[uses <Nume> {,<Nume>};]
[<Constante>]
[<Tipuri>]
[<Variabile>]
[{<Antet funcie>; | <Antet procedur>;}]
implementation
[uses <Nume> {,<Nume};]
[<Etichete>]
[<Constante>]
[<Tipuri>]
[<Variabile>]
[<Subprograme>]
[{function <Identificator>;
<Corp>; |
procedure <Identificator>;
<Corp>;}]
[begin
[<Instruciune> {; <Instruciune }]]
end.
80
n esen, o unitate de program const din trei seciuni: de interfa, de imple-
mentare i de iniializare.
Seciunea de interfa ncepe cu cuvntul-cheie interface. Aici se declar con-
stantele, tipurile, variabilele i subprogramele exportate de unitate. Aceste elemente
pot fi referite de orice modul care utilizeaz direct sau prin tranzitivitate unitatea
respectiv. Menionm c n seciunea de interfa apar doar antetele funciilor i
procedurilor exportate. Dac unitatea actual utilizeaz alte uniti, numele acestora
snt specificate n clauza uses.
Seciunea de implementare ncepe cu cuvntul-cheie implementation. Aceast
seciune conine declaraii locale de etichete, constante, tipuri, variabile i subpro-
grame. Elementele definite aici snt ascunse i nu pot fi referite de modulele care
utilizeaz unitatea actual. Dup declaraiile locale urmeaz corpul procedurilor i
funciilor, ale cror antete au fost definite n seciunea de interfa. Fiecare subpro-
gram specificat n interfa trebuie s aib un corp. Dup cuvntul-cheie function
sau procedure se scrie doar numele subprogramului. Menionm c nu este nece-
sar descrierea listei de parametri i a valorii returnate.
Seciunea de iniializare ncepe, dac exist, cu cuvntul-cheie begin. Seciunea
const dintr-o secven de instruciuni i servete pentru atribuirea valorilor iniiale
variabilelor definite n seciunea de interfa. Dac un program utilizeaz mai multe
uniti, execuia programului este precedat de execuia seciunilor de iniializare n
ordinea n care aceste uniti apar n clauza uses din program.
Exemplu:
Unit U1;
{Prelucrarea vectorilor }
interface
const nmax=100;
type Vector=array [1..nmax] of real;
var n : 1..nmax;
function sum(V : Vector) : real;
function min(V : Vector) : real;
function max(V : Vector) : real;
procedure Citire(var V : Vector);
procedure Afisare(V : Vector);
implementation
var i : 1..nmax;
s : real;
function sum;
begin
s:=0;
for i:=1 to n do s:=s+V [i];
sum:=s;
end; {sum }
81
function min;
begin
s:=V [1];
for i:=2 to n do
if s>V [i] then s:=V [i];
min:=s;
end; {min }
function max;
begin
s:=V [1];
for i:=2 to n do
if s<V [i] then s:=V [i];
max:=s;
end; {max }
procedure Citire;
begin
for i:=1 to n do readln(V [i]);
end; {Citire }
procedure Afisare;
begin
for i:=1 to n do writeln(V [i]);
end; {Afisare }
begin
write(n=); readln(n);
end.
Program P139;
{Utilizarea unitii U1 }
uses U1;
var A : Vector;
begin
writeln(Dai un vector:);
Citire(A);
writeln(Ai introdus:);
Afisare(A);
writeln(sum=, sum(A));
82
writeln(min=, min(A));
writeln(max=, max(A));
readln;
end.
Program P140;
uses U2;
var x : integer;
begin
x:=4;
writeln(Programul P140:);
writeln(n=, U3.n);
writeln(m=, m);
writeln(x=, x);
readln;
end.
Unit U2;
interface
uses U3;
var m : integer;
x : real;
implementation
begin
writeln(Unitatea U2:);
m:=2;
writeln( m=, m);
x:=3.0;
writeln( x=, x);
end.
83
Unit U3;
interface
var n : integer;
implementation
begin
writeln(Unitatea U3:);
n:=1;
writeln(n=, n);
end.
n programul P140 unitatea U2 este utilizat direct, iar unitatea U3 prin tranzi-
tivitate. Variabila n din modulul U3 este referit prin U3.n. Identificatorul x apare
n declaraiile var x: real din unitatea U2 i var x: integer din programul
P140. Compilatorul ia n considerare ultima declaraie.
Unitile de program se clasific n unitile-standard, livrate odat cu compi-
latorul Turbo PASCAL, i unitile scrise de utilizator. n continuare prezentm o
caracteristic succint a unitilor-standard frecvent utilizate.
System conine toate subprogramele predefinite din Turbo PASCAL. Unitatea n
studiu se ncorporeaz automat n toate programele, fr a fi necesar clauza uses.
Crt permite utilizarea funciilor i procedurilor referitoare la lucrul cu ecranul
n mod text, precum i cu tastatura i difuzorul. Accesibilitatea subprogramelor se
realizeaz prin clauza uses crt.
Graph implementeaz subprogramele destinate unor prelucrri grafice: defi-
niri de ferestre i pagini, definiri de culori i palete, desenarea arcurilor, cercurilor,
poligoanelor i a altor figuri, salvarea imaginilor etc. Serviciile unitii de program
pot fi accesate prin clauza uses graph.
Printer asigur redirectarea operaiilor de scriere n fiierul text cu numele
lst la imprimant. Utiliznd unitatea n studiu, programatorul nu mai trebuie s de-
clare, s deschid i s nchid acest fiier. Serviciile unitii Printer devin accesibile
unui program sau unei uniti de program prin specificarea clausei uses printer.
Destinaia i modul de utilizare a constantelor, tipurilor de date, variabilelor,
funciilor i procedurilor din unitile-standard este inclus n ghidurile de utilizare
i sistemele de asisten Turbo PASCALs Online Help.
Elabornd propriile uniti de program, orice utilizator i poate crea biblioteci de sub-
programe ce descriu algoritmi din diverse domenii: rezolvarea ecuaiilor, calcule statisti-
ce, procesarea textelor, crearea i prelucrarea structurilor dinamice de date etc. Divizarea
unui program mare n module uureaz activitatea de elaborare a produselor program
n echip. n astfel de cazuri fiecare programator scrie, testeaz i documenteaz cteva
module relativ simple, ceea ce contribuie la mbuntirea produsului program rezultat.
ntrebri i exerciii
Care snt avantajele programrii modulare? Prevede oare limbajul-standard mijloace
pentru programarea modular?
Care este forma-standard a unei uniti de program? Precizai structura i destinaia sec-
iunilor de interfa, de implementare i de iniializare.
84
Cum se determin domeniile de vizibilitate ale declaraiilor din unitile de program?
Precizai ce va afia pe ecran programul ce urmeaz.
Program P141;
uses U4;
var s : string;
begin
s:=BBB;
writeln(U5.k=, U5.k);
writeln(U5.m=, U5.m);
writeln(U5.s=, U5.s);
writeln(U4.m=, U4.m);
writeln(U4.s=, U4.s);
writeln(m=, m);
writeln(s=, s);
readln;
end.
Unit U4;
interface
uses U5;
var m : real;
s : char;
implementation
begin
m:=4.0;
s:=A;
end.
Unit U5;
interface
var k, m : integer;
s : real;
implementation
begin
k:=1;
m:=2;
s:=3.0;
end.
Comentai programul:
Program P142;
{Eroare }
uses U6;
begin
writeln(k=, k);
writeln(m=, m);
readln;
end.
85
Unit U6;
interface
var k : integer;
implementation
var m : integer;
begin
k:=1;
m:=2;
end.
86
d) arborilor binari;
e) arborilor multici.
Utilizai n acest scop declaraiile de tipuri, funcii i proceduri din capitolul2.
Gsii n sistemul de asisten Turbo PASCAL s Online Help descrierea unitilor-standard
instalate pe calculatorul dvs. Afiai pe ecran textul fiecrei uniti, determinai destina-
ia i modul de utilizare a funciilor i procedurilor respective.
87
b) valorile tipice:
ir cu dou numere pozitive;
ir cu trei sau mai multe numere pozitive.
n testarea structural testele snt elaborate examinnd structura programului:
declaraiile de date, proceduri i funcii, instruciunile simple, instruciunile structu-
rate etc. Datele de testare vor asigura:
a) execuia fiecrei instruciuni simple (atribuiri, apeluri de proceduri, salturi goto);
b) execuia fiecrui ciclu for de zero, unu i de mai multe ori;
c) execuia fiecrei instruciuni if, repeat, while pentru valorile true i fal-
se ale expresiilor booleene de control;
d) execuia fiecrui caz din componena instruciunilor case.
Exemplu. Prezentm textul programului care calculeaz media aritmetic a nume-
relor pozitive dintr-un ir:
Program P143;
{ Media numerelor pozitive dintr-un ir }
var n, k : integer;
x, s : real;
begin
n:=0;
k:=0;
s:=0;
writeln(Dai un ir de numere reale:);
while not eof do
begin
readln(x);
n:=n+1;
if x>0 then
begin
k:=k+1;
s:=s+x;
end;
end; { while }
if n=0 then writeln(ir vid)
else if k=0 then writeln(irul nu conine numere
pozitive)
else writeln(Media=, s/k);
readln;
end.
88
Metoda cutiei transparente poate fi utilizat independent sau mpreun cu me-
toda cutiei negre pentru a mbunti un test deja obinut. De exemplu, n cazul
programului P143 irul ce conine cel puin un numr pozitiv poate fi nlocuit cu
trei iruri ce conin, respectiv unul, dou, trei sau mai multe numere pozitive. Aceste
date vor asigura execuia instruciunilor k:=k+1, s:=s+x i calcularea expresiei
s/k pentru valorile tipice i valorile netipice ale variabilelor k i s.
Dificultile n aplicarea testrii structurale snt legate de prezena instruciunilor
de decizie (if, case), a celor iterative (for, while, repeat) sau a celei de transfer
(goto). Acestea determin apariia unui numr foarte mare de combinri, n care
instruciunile de atribuire i apelurile de proceduri pot fi executate.
Depanarea programului const n localizarea zonelor din program care au
condus la apariia unei erori, identificarea cauzelor erorii i corectarea acesteia.
Depanarea poate fi fcut static (dup executarea programului) i dinamic (n tim-
pul executrii).
n metoda depanrii statice cauzele erorii se stabilesc analiznd rezultatele de-
rulrii programului i mesajele sistemului de operare. Pentru a facilita procesul de
depanare, n program temporar se includ instruciuni care afieaz pe ecran valorile
intermediare ale variabilelor-cheie.
n metoda depanrii dinamice localizarea erorilor se face urmrind executarea
programului la nivel de instruciuni. Implementrile actuale ale limbajului permit
efectuarea urmtoarelor operaii de depanare dinamic:
execuia pas cu pas a programului;
observarea valorilor unor expresii specificate;
crearea i eliminarea unor puncte de suspendare a executrii;
modificarea valorilor unor variabile;
trasarea apelurilor de funcii i proceduri;
tratarea erorilor de intrareieire, a erorilor de depire etc.
Descrierea detaliat a operaiilor n studiu este inclus n sistemul de asisten
Turbo PASCALs Online Help.
Eficiena depanrii depinde de modul n care este scris i testat programul, calita-
tea mesajelor de eroare generate de calculator i tipul erorii. De regul, un test care
semnaleaz prezena unei erori este urmat de alte texte organizate n aa fel, nct s
izoleze eroarea i s furnizeze informaii pentru corectarea ei.
S-a constatat c testarea i depanarea ocup mai mult de jumtate din perioada de
timp necesar realizrii unui produs program. Complexitatea acestor procese poate
fi redus prin divizarea programelor mari n subprograme sau module i aplicarea
metodelor programrii structurate.
Subliniem faptul c testarea programelor este un mijloc eficient de a depista ero-
rile, ns nu i un mijloc de a demonstra absena lor. Cu toate c testarea nu demon-
streaz corectitudinea programului, ea este deocamdat singura metod practic de
certificare a produselor program. n prezent se elaboreaz metode de verificare baza-
te pe demonstrarea formal a corectitudinii programului, ns rezultatele cunoscute
n aceast direcie nu snt aplicabile programelor complexe.
89
ntrebri i exerciii
Cnd un program PASCAL este corect? Cum poate fi asigurat corectitudinea unui pro-
gram?
Cum se selecteaz datele de intrare n metoda testrii funcionale?
Elaborai un test funcional pentru programul P124 din paragraful 2.4. Programul reali-
zeaz urmtoarele funcii:
creeaz o list unidirecional;
afieaz lista pe ecran;
include un anumit element n list;
exclude din list elementul specificat de utilizator.
Precizai funciile realizate de programele ce urmeaz i elaborai testele funcionale:
a) P117 i P120 din paragraful 2.1;
b) P122 i P123 din paragraful 2.2;
c) P127 din paragraful 2.5 i P128 din paragraful 2.6.
Cum se selecteaz datele de intrare n metoda testrii structurale?
Elaborai teste structurale pentru programele ce urmeaz:
a) P117 i P120 din paragraful 2.1;
b) P122 i P123 din paragraful 2.2;
c) P127 din paragraful 2.5.
Care este diferena dintre depanarea static i depanarea dinamic?
Gsii n sistemul de asisten Turbo PASCAL s Online Help descrierea operaiilor de depa-
nare dinamic. Efectuai aceste operaii pentru programele elaborate de dvs.
90
Regulile de baz ale programrii structurate snt:
1. Structura oricrui program sau subprogram va fi conceput ca o combinaie a
structurilor de control admise: secvena, decizia, selecia, ciclul.
2. Structura datelor utilizate n program trebuie s corespund specificului pro-
blemelor rezolvate.
3. Lungimea maxim a unei funcii sau proceduri este de 50100 de linii. Folosirea
variabilelor globale nu este ncurajat.
4. Identificatorii folosii pentru constante, tipuri, variabile, funcii, proceduri i
uniti de program trebuie s fie ct mai sugestivi.
5. Claritatea textului trebuie asigurat prin inserarea comentariilor i alinierea
textului n conformitate cu structura logic i sintactic a instruciunilor.
6. Operaiile de intrareieire vor fi localizate n subprograme separate. Co-
rectitudinea datelor de intrare se verific imediat dup citirea lor.
7. ncuibarea insturciunilor if mai mult de trei ori trebuie evitat prin folosirea
istruciunilor case.
Programele obinute conform regulilor n studiu snt testabile, clare, ordonate,
fr salturi i reveniri. Menionm c, conform teoremei de structur, orice program
poate fi scris fr a utiliza instruciunea goto. Totui unii autori admit utilizarea
acestei instruciuni cu condiia ca ea s fie folosit la minimum, iar salturile s fie
efectuate numai n jos.
ntrebri i exerciii
Care este justificarea teoretic a programrii structurate?
Precizai structurile de control necesare i suficiente pentru reprezentarea oricrui algoritm.
Formulai regulile de baz ale programrii structurate.
Care snt avantajele programrii structurate?
Corespund oare programele P124, P130 i P135 din capitolul 2 regulilor de baz ale
programrii structurate?
Programul ce urmeaz afieaz pe ecran toate reprezentrile posibile ale numrului na-
tural n ca sum de numere naturale consecutive.
Program P144;
var a,i,l,s,n : integer;
b : boolean;
begin
write(n=); readln(n);
b:=true;
for i:=1 to ((n+1) div 2) do
begin
a:=i;
s:=0;
while (s<n) do
begin
s:=s+a;
a:=a+1;
end;
91
if s=n then
begin
b:=false;
write(n, =, i);
for l:=i+1 to (a-1) do write(+,l);
writeln;
end;
end;
if b then writeln(Reprezentri nu exist);
readln;
end.
92
Capitolul 4
ANALIZA ALGORITMILOR
93
n aceste formule volumul de memorie se calculeaz n octei, iar timpul n se-
cunde.
Necesarul de memorie i timpul cerut de algoritmii A1, A2 pentru diferite valori
ale lui n este prezentat n tabelul 4.1.
Tabelul 4.1.
Complexitatea algoritmilor A1 i A2
n 10 20 30 40 50
V1(n) 9,77 Koctei 39,06 Koctei 87,89 Koctei 156,25 Koctei 244,14 Koctei
V2(n) 112 octei 212 octei 312 octei 412 octei 512 octei
Din tabelul 4.1 se observ c algoritmul A2 devine practic inutilizabil pentru da-
tele de intrare caracteristica crora n > 30. Pentru astfel de date timpul de execuie
a algoritmului A1 este mult mai mic, ns necesarul de memorie V1(n) poate depi
limita impus de mediul de programare (64 Koctei pentru variabilele statice din pro-
gramele Turbo PASCAL 7.0).
Determinarea necesarului de memorie V(n) i a timpului de execuie T(n) pre-
zint un interes deosebit la etapa de elaborare a algoritmilor i a programelor res-
pective. Evident, anume pe parcursul acestei etape pot fi eliminai din start acei
algoritmi care necesit memorii prea mari sau care au un timp de execuie inac-
ceptabil.
Menionm c existena unor calculatoare cu memorii din ce n ce mai performan-
te fac ca atenia informaticienilor s fie ndreptat n special asupra necesarului de
timp sau, cu alte cuvinte, asupra complexitii temporale a algoritmilor.
ntrebri i exerciii
Explicai termenul complexitatea algoritmului. Numii indicatorii ce caracterizeaz com-
plexitatea algoritmilor.
Cum credei, care factori influeneaz complexitatea unui algoritm?
De ce depinde necesarul de memorie i timpul cerut de un algoritm? Cnd este posibil
aplicarea practic a unui algoritm?
Algoritmii A1 i A2 (vezi tabelul 4.1) vor derula n mediul de programare Turbo PASCAL
7.0. Cum credei, care algoritm trebuie utilizat n cazul datelor de intrare cu caracteristi-
ca: a) n = 10; b) n = 20; c) n = 30? Pentru care valori ale lui n algoritmul A1 poate fi utilizat
n mediul de programare Turbo PASCAL 7.0?
Complexitatea unui algoritm, notat prin A3, se caracterizeaz prin
V3(n) = 600n3 + 18;
T3(n) = 3 n 10 -2 .
94
Cum credei, pentru care valori ale lui n algoritmul A3 poate derula n mediul de progra-
mare Turbo PASCAL 7.0?
Determinai mrimea datelor de intrare a celor mai reprezentativi algoritmi elaborai de
dvs. n procesul studierii limbajului de programare PASCAL.
este
V(n) = 6n2 + 2n + 11 (octei).
n general, necesarul de memorie al unui program PASCAL depinde nu numai de
tipul variabilelor utilizate, dar i de modul de gestionare a memoriei interne a calcu-
95
latorului. n procesul derulrii unui program PASCAL spaiul de memorie intern
este divizat n trei seciuni (fig. 4.1):
segmentul date, destinat alocrii variabilelor globale. Aceste variabile se decla-
r n seciunea var a programului PASCAL;
stiva, destinat alocrii parametrilor actuali, variabilelor locale, valorilor retur-
nate de funcii i adreselor de revenire pe durata execuiei subprogramelor PASCAL.
Apelul unui subprogram implic depunerea datelor respective n stiv, iar ieirea din
subprogram eliminarea lor. Accentum c n cazul parametrului-variabil n stiv
se depune numai adresa variabilei din programul apelant, iar n cazul parametrului-
valoare n stiv va fi depus o copie a datelor din lista parametrilor actuali.
heap-ul, utilizat pentru alocarea variabilelor dinamice. Aceste variabile snt cre-
ate i, eventual, distruse cu ajutorul procedurilor new i dispose.
Segmentul
date Stiva Heap-ul
Vs(n)
parametri
actuali;
variabile
locale;
Vh(n)
Vd(n) valori
variabile de funcii; variabile
globale adrese dinamice
de revenire
Program P145;
{ Gestionarea memoriei interne }
const n = 100;
type Matrice = array[1..n, 1..n] of real;
Vector = array[1..n] of real;
96
var A : Matrice;
i : integer;
p, q : ^Matrice;
begin
{...introducerea matricei A...}
Prelucrare(A);
new(p);
new(q);
{...prelucrarea variabilelor dinamice p^ si q^...}
dispose(p);
dispose(q);
{...afiarea rezultatelor...}
writeln(Sfrit);
readln;
end.
ntrebri i exerciii
Determinai cu ajutorul sistemului de asisten al mediului de programare cu care lu-
crai dvs. necesarul de memorie pentru variabilele nestructurate.
Cum se evalueaz volumul de memorie intern necesar pentru nmagazinarea datelor
unui algoritm?
97
Segmentul
date Stiva Heap-ul
q
p Matricea q^
i q
Vectorul C
Matricea A Adresa matricei A Matricea p^
Adresa de revenire p
98
ListaDePlata = array[1..n] of Angajat;
var L1, L2 : ListaDePlata;
function S(n:integer):real;
begin
if n=0 then S:=0
else S:=S(n-1)+n;
end; { S }
begin
write(n=); readln(n);
writeln(s=, S(n));
readln;
end.
99
n acest program suma
S(n) = 0 + 1 + 2 + ... + n
este calculat cu ajutorul funciei recursive
Unit U7;
{ Masurarea timpului }
interface
function TimpulCurent : real;
implementation
uses Dos;
var ore : word;
minute : word;
secunde : word;
sutimi : word;
function TimpulCurent;
begin
GetTime(ore, minute, secunde, sutimi);
TimpulCurent:=3600.0*ore+60.0*minute+
1.0*secunde+0.01*sutimi;
end; { TimpulCurent }
end.
100
Unitatea de program U7 ofer programatorului funcia TimpulCurent, care
returneaz o valoare de tip real timpul n secunde. Indicaiile ceasului de sis-
tem n ore, minute, secunde i sutimi de secund se citesc cu ajutorul proce-
durii GetTime din unitatea de program DOS a mediului de programare Turbo
PASCAL 7.0.
Pentru exemplificare prezentm programul P149 n care se msoar timpul de
execuie a procedurii Sortare:
Program P149;
{ Timpul de execuie a procedurii Sortare }
uses U7;
type Vector = array[1..10000] of real;
var A : Vector;
i, n : integer;
T1, T2 : real; { timpul in secunde }
begin
write(Dai numarul de elemente n=);
readln(n);
T1:=TimpulCurent;
Sortare(A, n);
T2:=TimpulCurent;
101
Procedura Sortare ordoneaz elementele vectorului A prin metoda bulelor. n
aceast metod vectorul A este parcurs de n ori, la fiecare parcurgere efectundu-se
n-1 comparri ale elementelor vecine A[j] i A[j+1]. Dac A[j]>A[j+1], elemen-
tele vecine i schimb locul.
Pentru a evita introducerea de la tastatur a unui numr mare de date, n progra-
mul P149 vectorului A i se atribuie valoarea iniial
A = (n, n-1, n-2, ..., 3, 2, 1).
De exemplu, pentru n=4, vectorul iniial va fi
A=(4, 3, 2, 1).
n procesul sortrii avem:
i = 1, A = (3, 2, 1, 4);
i = 2, A = (2, 1, 3, 4);
i = 3, A = (1, 2, 3, 4);
i = 4, A = (1, 2, 3, 4).
Timpul de execuie a procedurii Sortare n cazul unui calculator Pentium cu frecvena
ceasului de sistem 500 MHz este prezentat n tabelul 4.3, iar graficul respectiv n figura 4.3.
Tabelul 4.3
Timpul de execuie a procedurii Sortare
n 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000
T(n), s 0,27 1,10 2,47 4,50 7,03 10,16 13,84 18,02 22,85 28,18
ntrebri i exerciii
Cum credei, ce legtur exist ntre timpul necesar execuiei unui program PASCAL,
frecvena ceasului de sistem i capacitatea de prelucrare a calculatorului?
Msurai timpul de execuie a procedurii Sortare (vezi programul P149) n cazul cal-
culatorului cu care lucrai dvs. Construii un grafic similar celui din figura 4.3.
Reprezentai grafic pe un singur desen timpul de execuie a procedurilor ce urmeaz.
102
t, s
30
20
10
begin
for i:=1 to n do
for j:=1 to n do
for k:=1 to n do
r:=1.0;
end; { N3 }
Pentru exemplificare, n figura 4.4 snt prezentate graficele respective n cazul unui cal-
culator Pentium, frecvena ceasului de sistem 500 MHz.
Care este precizia de msurare a timpului cu ajutorul funciei TimpulCurent?
Argumentai rspunsul dvs.
103
t, s
N4
13
12 N3
11
10
9
8
7
6
5
4
3 N2
2
1
104
QE = m + k QF ,
unde QF este numrul de operaii elementare necesare pentru calcularea funciei F.
Exemple:
Expresia E Numrul de operaii elementare QE
a) a*b+c 2
b) (a<b)or(c>d) 3
d) a+M[i] 2
e) sin(x+y)+sin(x-y) 3 + 2Qsin
Numrul de operaii elementare QI necesare pentru execuia unei instruciuni I a
limbajului PASCAL se estimeaz conform formulelor din tabelul 4.4.
Tabelul 4.4
Numrul de operaii elementare necesare pentru execuia
unei instruciuni PASCAL
Nr. crt. Instruciunea PASCAL Numrul de operaii elementare
1 Atribuirea := E QE + 1
2 Apelul procedurii P QP + 1
Selecie
3 QE + max{QI , QI } + 1
if E then I1 else I2 1 2
Selecie multipl
4 QE + max{QI , QI , ..., QI } + k + 1
case E of I1; I2; ...; Ik end 1 2 k
Ciclu cu contor
5 QE + QE + mQI + m + 1
for := E1 to/downto E2 do I 1 2
Instruciunea
9 QI + 1
with do I
10 Saltul goto 1
Formulele din tabelul 4.4 pot fi deduse urmnd modul de execuie a fiecrei instruc-
iuni PASCAL. n acest tabel reprezint o variabil sau un nume de funcie, E o
expresie, iar I o instruciune. Numrul de execuii ale instruciunii I din cadrul unui
ciclu for, while sau repeat este notat prin m. Menionm c ciclurile unui program
PASCAL pot fi organizate i cu ajutorul instruciunilor if i goto, ns o astfel de
utilizare a acestor instruciuni contravine regulilor programrii structurate.
105
Pentru exemplificare vom estima numrul de operaii elementare Q(n) necesare
ordonrii elementelor unui vector prin metoda bulelor:
Instruciunile I1, I2, ... , I8 ale procedurii Sortare vor fi referite cu ajutorul co-
mentariilor {1}, {2}, ..., {8} din partea stng a liniilor de program. Prin Qj vom nota
numrul de operaii elementare necesare pentru executarea instruciunii Ij :
Q6 = 2;
Q7 = 4;
Q8 = 3;
Q5 = Q6 + Q7 + Q8 + 1 = 10;
Q4 = 4 + Q5 + 1 = 15;
Q3 = 0 + 1 + (n1)Q4 + (n1) + 1 = 16n 14;
Q2 = 0 + 0 + nQ3 + n + 1 = 16n2 13n + 1;
Q1 = Q2 +1 = 16n2 13n + 2.
Prin urmare, numrul de operaii elementare
Q(n) = 16n2 13n + 2,
iar timpul cerut de procedura Sortare
T(n) = (16n2 13n + 2) .
Din exemplul studiat mai sus se observ c ordinea parcurgerii instruciunilor
este impus de structura programelor PASCAL. Evident, mai nti se analizeaz in-
struciunile simple, iar apoi cele structurate. n cazul instruciunilor imbricate, mai
nti se analizeaz instruciunile din interior, apoi cele care le cuprind.
Expresiile analitice T(n) obinute n urma analizei programelor PASCAL pot fi
folosite pentru determinarea experimental a timpului necesar efecturii unei ope-
raii elementare. De exemplu, pentru procedura Sortare (vezi tabelul 4.3) n = 10000
i T(n) = 28,18 s. Din ecuaia
(16n2 13n + 2) = 28,18
obinem 1,8 10 -8 secunde.
106
Evident, aceast valoare este valabil numai pentru mediul de programare Turbo
PASCAL 7.0 i calculatorul Pentium cu frecvena ceasului de sistem 500 MHz, uti-
lizate n procesul de msurare a timpului de execuie a procedurii Sortare. De
exemplu, n cazul unui calculator Pentium cu frecvena ceasului de sistem 150 MHz
se obine valoarea 6,0 10 -8 secunde.
ntrebri i exerciii
Determinai cu ajutorul programului P149 valoarea pentru mediul de programare i
calculatorul cu care lucrai dvs.
Determinai numrul de operaii elementare QI necesare pentru execuia urmtoarelor
instruciuni PASCAL:
a) x:=2*a-6*(y+z);
b) p:=not(a=b)and(c>d);
e) case i of
1: x:=0;
2: x:=a+b;
3: x:=a+b+c;
end;
107
b) procedure N3(n : integer);
var i, j, k : integer;
r : real;
begin
for i:=1 to n do
for j:=1 to n do
for k:=1 to n do
r:=1.0;
end; { N3 }
i
.
Cum credei, prin ce se explic acest fapt?
n procesul compilrii, instruciunile limbajului PASCAL snt translatate n una sau mai
multe instruciuni din limbajul cod-main. Numrul concret de instruciuni depinde de
mediul de programare i tipul calculatorului utilizat. Elaborai planul unui experiment
care ne-ar permite s estimm numrul de instruciuni cod-main n care este transla-
tat fiecare instruciune PASCAL.
E cunoscut faptul c timpul de execuie a instruciunilor din limbajul cod-main de-
pinde de tipul lor. De exemplu, o instruciune care adun dou numere ntregi este mai
rapid dect instruciunea care adun dou numere reale. n consecin, valorile , de-
terminate prin msurarea timpului de execuie a unui program PASCAL, depind de tipul
datelor utilizate. Verificai experimental aceast afirmaie n cazul calculatorului cu care
lucrai dvs.
Capacitatea de prelucrare a unui calculator se msoar n Mips Megainstruciuni pe
secund. De exemplu, calculatoarele personale au capacitatea de prelucrare 500800
Mips. Pentru a msura aceast caracteristic, productorii de calculatoare utilizeaz
instruciunile limbajului cod-main. Evident, pentru un programator PASCAL ar pre-
zenta interes i capacitatea de prelucrare exprimat n instruciuni PASCAL pe secund.
Elaborai planul unui experiment care ar permite estimarea acestei caracteristici pentru
calculatorul cu care lucrai dvs.
108
4.5. Complexitatea temporal a algoritmilor
n informatic complexitatea temporal a algoritmilor se caracterizeaz prin tim-
pul de execuie T(n) sau numrul de operaii elementare Q(n). ntruct calculatoarele
moderne au o vitez de calcul foarte mare 108 ... 1010 instruciuni pe secund, pro-
blema timpului de execuie se pune numai pentru valorile mari ale lui n. n conse-
cin, n formulele ce exprim numrul de operaii elementare Q(n) prezint interes
numai termenul dominant, adic acel care tinde ct mai repede la infinit. Importana
termenului dominant fa de ceilali este pus n eviden n tabelul 4.5.
Tabelul 4.5
Valorile termenilor dominani
n log2 n n2 n3 n4 2n
2 1 4 8 16 4
4 2 16 64 256 16
8 3 64 512 4096 256
16 4 256 4096 65536 65536
32 5 1024 32768 1048576 4294967296
109
De exemplu, algoritmul de sortare a elementelor unui vector prin metoda bulelor
este un algoritm polinomial de ordinul n2. Acest lucru se observ i din graficul tim-
pului de execuie T(n) a procedurii Sortare, grafic prezentat n figura 4.3.
Un algoritm se numete exponenial dac termenul dominant are forma Ckn, adic
Q(n) Ckn; T(n) Ckn,
unde k>1. Complexitatea temporal a algoritmilor exponeniali este redat prin no-
taia O(kn).
Menionm faptul c tot exponeniali se consider i algoritmii de complexitatea
nlog n, cu toate c aceast funcie nu este exponenial n sensul strict matematic al
acestui cuvnt.
Din comparaia vitezei de cretere a funciilor exponenial i polinomial (vezi
tabelul 4.5) rezult c algoritmii exponeniali devin inutilizabili chiar pentru valori
nu prea mari ale lui n. Pentru exemplificare amintim tabelul 4.1 n care este prezentat
timpul de execuie T1(n) a unui algoritm polinomial de ordinul O(n3) i timpul de
execuie T2(n) a unui algoritm exponenial de ordinul O(2n).
Algoritmii nederminist polinomiali se studiaz n cursurile avansate de infor-
matic.
n funcie de complexitatea temporal se consider c o problem este uor re-
zolvabil dac pentru soluionarea ei exist un algoritm polinomial. O problem
pentru care nu exist un algoritm polinomial se numete dificil. Accentum faptul
c aceast clasificare se refer doar la analiza asimptotic a algoritmilor, adic la
comportarea lor pentru valori mari ale lui n. Pentru valorile mici ale lui n situaia
poate fi diferit.
De exemplu, presupunem c pentru soluionarea unei probleme exist doi algo-
ritmi, unul polinomial cu timpul de execuie T1(n) i altul exponenial cu timpul de
execuie T2(n):
T1(n) = 1000n2 ;
T2(n) = 2n.
Prin calcule directe se poate verifica c pentru n = 1, 2, 3, ..., 18 timpul T2(n) < T1(n).
Prin urmare, n situaia n 18 vom prefera algoritmul exponenial.
n practic, elaborarea programelor de calculator presupune parcurgerea urm-
toarelor etape:
formularea exact a problemei;
determinarea complexitii temporale a problemei propuse problem uor
rezolvabil sau problem dificil;
elaborarea algoritmului respectiv i implementarea lui pe un sistem de calcul.
Evident, n cazul unor probleme uor rezolvabile, programatorul va depune toate
eforturile pentru a inventa algoritmi polinomiali, adic algoritmi de ordinul nk, astfel
nct parametrul k s ia valori ct mai mici. n cazul problemelor dificile se va da prio-
ritate algoritmilor care minimizeaz timpul de execuie cel puin pentru datele de in-
trare frecvent utilizate n aplicaiile practice. Metodele de clasificare a problemelor n
cele uor i cele dificil rezolvabile se studiaz n cursurile avansate de informatic.
110
ntrebri i exerciii
Indicai termenii dominani:
a) 12n + 5;
d) 2000n3 + 2n + 13;
e) nlog2n + n5 + 300n2 + 6;
f) 3n + 2n + 14n3 + 21;
for i1:=1 to n do
for i2:=1 to n do
...
for ik:=1 to n do P
111
Numrul de operaii elementare QP efectuate n procedura P este o mrime constant.
Estimai complexitatea temporal a algoritmului.
Schiai un algoritm pentru rezolvarea urmtoarei probleme:
Se consider mulimea A format din n numere ntregi. Determinai dac exist cel puin
o submulime B, BA, suma elementelor creia este egal cu m. De exemplu, pentru
A={-3, 1, 5, 9} i m=7, o astfel de submulime exist, i anume, B={-3, 1, 9}.
Estimai complexitatea temporal a algoritmului elaborat.
112
Capitolul 5
TEHNICI DE ELABORARE
A ALGORITMILOR
deosebim:
Cazul elementar n = 0. n acest caz valoarea fact(0) este direct calculabil i
anume fact(0)=1.
Cazurile neelementare n > 0. n astfel de cazuri valorile fact(n) nu snt direct
calculabile, ns procesul de calcul progreseaz ctre cazul elementar fact(0).
De exemplu, pentru n = 3 obinem:
fact(3) = 3 fact(2) = 3 2 fact(1) = 3 2 1 fact(0) = 3 2 1 1 = 6.
Prin urmare, definiia recursiv a funciei fact(n) este o definiie consistent.
Amintim c funcia fact(n) poate fi exprimat n PASCAL, urmnd direct definiia,
n forma:
113
function Fact(n:Natural):Natural;
begin
if n=0 then Fact:=1
else Fact:=nFact(n-1)
end;
Modul de gestionare a stivei n cazul apelului Fact(3) este prezentat n figura 5.1.
Evoluia n stiv
Eliberarea stivei
Fact = 1 Fact = 1 Fact = 2 Fact = 6
deosebim cazul elementar n=0 i cazurile neelementare n0. ns, spre deosebire de
funcia fact(n), pentru n 0 valorile incons(n) nu pot fi calculate, ntruct procesul de
calcul progreseaz ctre incons().
114
De exemplu, pentru n=3 obinem:
incons(3) = 3 incons(4) = 3 4 incons(5) = 3 4 5 incons(6) = .
Prin urmare, definiia recursiv a funciei incons(n) este o definiie inconsistent
i teoretic procesul de calcul va dura la nesfrit. n practic calculele vor fi ntrerupte
de sistemul de operare n momentul depirii capacitii de memorare a stivei sau n
cazul depirii capacitii dispozitivului aritmetic.
Accentum faptul c mediile actuale de programare nu asigur verificarea consis-
tenei algoritmilor recursivi, acest lucru revenindu-i programatorului.
Dup cum s-a vzut n capitolele precedente, orice algoritm recursiv poate fi tran-
scris ntr-un algoritm iterativ i invers. Alegerea tehnicii de programare iterativi-
tate sau recursivitate ine, de asemenea, de competena programatorului. Evident,
aceast alegere trebuie fcut lund n considerare avantajele i neajunsurile fiecrei
metode, care variaz de la caz la caz. Pentru exemplificare, n tabelul 5.1. snt prezen-
tate rezultatele unui studiu comparativ al ambelor tehnici de programare n cazul
prelucrrii automate a textelor.
Tabelul 5.1
Studiul comparativ al iterativitii i recursivitii
(prelucrarea automat a textelor)
Nr. crt. Caracteristici Iterativitate Recursivitate
1. Necesarul de memorie mic mare
2. Timpul de execuie acelai
3. Structura programului complicat simpl
4. Volumul de munc necesar
mare mic
pentru scrierea programului
5. Testarea i depanarea progra-
simpl complicat
melor
ntrebri i exerciii
Explicai termenul tehnici de programare.
Care este diferena dintre recursia direct i recursia indirect? Dai exemple.
Ce condiii trebuie respectate pentru ca definiia unui algoritm recursiv s fie corect?
Care este diferena dintre definiiile recursive consistente i definiiile recursive inconsis-
tente?
115
Se consider urmtoarele definiii recursive de funcii. Care din aceste definiii snt con-
sistente? Argumentai rspunsul.
dac
a) f : NN,
dac
dac
b) f : NN,
dac
dac
c) f : ZZ,
dac
dac
d) f : NN,
dac
dac
g : NN, dac
dac
e) f : NN, div dac
Lansai n execuie programul ce urmeaz. Explicai mesajele afiate la ecran.
Program P150;
{ Depirea capacitii de memorare a stivei }
type Natural = 0..Maxint;
function Incons(n:Natural):Natural;
{ Definiie recursiv inconsistent }
begin
writeln(Apel recursiv n=, n);
if n=0 then Incons:=1
else Incons:=n*Incons(n+1);
end; { Incons }
begin
writeln(Incons(3));
readln;
end.
Reprezentai pe un desen similar celui din figura 5.1 modul de gestionare a stivei n cazul
apelului Incons(3).
Indicai cazurile elementare i cele neelementare pentru urmtorii algoritmi recursivi:
a) funcia Arb i procedura AfisArb din programul P130;
b) procedurile Preordine, Inordine i Postordine din programul P131;
c) procedura InAdincime din programul P133.
Suma primelor n numere naturale S(n) poate fi calculat cu ajutorul funciei iterative
116
sau al funciei recursive
dac
dac
Utiliznd ca model tabelul 5.1, efectuai un studiu comparativ al algoritmilor destinai
calculrii sumei S(n).
Se consider urmtoarele formule metalingvistice:
Cifr ::= 0123456789
Numr ::= Cifr Cifr
Semn ::= +-*/
Expresie ::= Numr (Expresie)ExpresieSemnExpresie
Scriei o funcie recursiv care returneaz valoarea true dac irul de caractere S este
conform definiiei unitii lexicale Expresie i false n caz contrar.
Efectuai un studiu comparativ al algoritmilor iterativi i algoritmilor recursivi destinai
creri i prelucrrii urmtoarelor structuri dinamice de date:
a) liste unidirecionale;
b) stiva;
c) cozi;
d) arbori binari;
e) arbori de ordinul m.
Scriei o funcie iterativ care returneaz valoarea true dac irul de caractere S este
conform definiiei unitii lexicale Expresie din exerciiul 9 i false n caz contrar.
Utiliznd ca model tabelul 5.1, efectuai un studiu comparativ al algoritmului iterativ i
algoritmului recursiv.
Elaborai un subprogram recursiv care calculeaz suma cifrelor unui numr natural n.
Examinai cazurile n MaxInt i n 10250.
Imaginile n alb-negru (fig. 5.2) pot fi codificate cu ajutorul unei matrice binare B =
= ||bij||nm, 1 n, m 30. Elementul bij indic culoarea microzonei respective: neagr (bij
=1) sau alb (bij =0).
a) b)
Elaborai o procedur recursiv pentru colorarea unei suprafee nchise, specificate prin
coordonatele (i, j) ale oricrei microzone A din interiorul ei.
117
Elaborai o procedur care determin cte obiecte conine o imagine n alb-negru.
Imaginea este mprit n microzone i codificat cu ajutorul matricei binare B = ||bij||nm.
Elementul bij indic culoarea microzonei cu coordonatele (i, j).
Efectuai un studiu comparativ al algoritmilor iterativi i algoritmilor recursivi destinai
soluionrii problemelor din exerciiile 13 i 14.
for i:= 1 to k do
if SolutiePosibila(si) then PrelucrareaSolutiei(si)
Program P151;
{ Suma cifrelor unui numr natural }
type Natural=0..MaxInt;
var i, K, m, n : Natural;
118
function SumaCifrelor(i:Natural):Natural;
var suma : Natural;
begin
suma:=0;
repeat
suma:=suma+(i mod 10);
i:=i div 10;
until i=0;
SumaCifrelor:=suma;
end; { SumaCifrelor }
function SolutiePosibila(i:Natural):boolean;
begin
if SumaCifrelor(i)=m then SolutiePosibila:=true
else SolutiePosibila:=false;
end; { SumaCifrelor }
procedure PrelucrareaSolutiei(i:Natural);
begin
writeln(i=, i);
K:=K+1;
end; { PrelucrareaSolutiei }
begin
write(Dai n=); readln(n);
write(Dai m=); readln(m);
K:=0;
for i:=0 to n do
if SolutiePosibila(i) then PrelucrareaSolutiei(i);
writeln(K=, K);
readln;
end.
for j:=1 to n do
for m:=1 to n do
if SolutiePosibil(Pj, Pm) then PrelucrareaSolutiei(Pj, Pm)
119
Distana dintre punctele Pj, Pm se calculeaz cu ajutorul formulei:
Program P152;
{ Puncte pe un plan euclidian }
const nmax=30;
type Punct = record
x, y : real;
end;
Indice = 1..nmax;
var P : array[Indice] of Punct;
j, m, n : Indice;
dmax : real; { distana maxima }
PA, PB : Punct;
function SolutiePosibila(j,m:Indice):boolean;
begin
if j<>m then SolutiePosibila:=true
else SolutiePosibila:=false;
end; { SolutiePosibila }
begin
write(Dati n=); readln(n);
writeln(Dai coordonatele x, y ale punctelor);
for j:=1 to n do
begin
write(P[, j, ]: ); readln(P[j].x, P[j].y);
end;
dmax:=0;
for j:=1 to n do
for m:=1 to n do
120
if SolutiePosibila(j, m) then
PrelucrareaSolutiei(P[j], P[m]);
ntrebri i exerciii
Explicai structura general a algoritmilor bazai pe metoda trierii.
Cum poate fi realizat trierea soluiilor posibile cu ajutorul ciclurilor while i repeat?
Estimai timpul de execuie al programelor P151 i P152. Modificai programul P152
astfel, nct timpul de execuie s se micoreze aproximativ de dou ori.
Dai exemple de programe timpul de execuie al crora nu este critic.
Care snt avantajele i dezavantajele algoritmilor bazai pe metoda trierii?
Se consider mulimea P = {P1, P2, , Pn} format din n puncte (3 n 30) pe un plan
euclidian. Fiecare punct Pj este definit prin coordonatele sale xj, yj. Elaborai un program
ce determin trei puncte din mulimea P pentru care aria triunghiului respectiv este
maxim. Estimai timpul de execuie a programului elaborat.
Scriei o funcie PASCAL care, primind ca parametru un numr natural n, returneaz va-
loarea true dac n este prim i false n caz contrar. Estimai complexitatea temporal
a funciei respective.
121
n notaia (a)x litera x reprezint baza sistemului de numeraie, iar litera a un numr
scris n sistemul respectiv. Elaborai un program care calculeaz, dac exist, cel puin o
rdcin a ecuaiei
(a)x = b,
unde a i b snt numere naturale, iar x este necunoscuta. Fiecare cifr a numrului na-
tural a aparine mulimii {0, 1, 2, , 9}, iar numrul b este scris n sistemul zecimal. De
exemplu, rdcina ecuaiei
(160)x = 122
este x = 8, iar ecuaia
(5)x = 10
nu are soluii. Estimai complexitatea temporal a programului elaborat.
ntr-o puculi se afl N monede de diferite valori cu greutatea total G grame. Greutatea
fiecrei monede de o anumit valoare este dat n tabelul ce urmeaz.
Valoarea monedei, lei Greutatea monedei, grame
1 1
5 2
10 3
25 4
50 5
Elaborai un program care determin suma minim S care ar putea s fie n puculi.
Elaborai un program care determin cte puncte cu coordonate ntregi se conin ntr-o
sfer de raza R cu centrul n originea sistemului de coordonate. Se consider c R este
un numr natural, 1R30. Distana d dintre un punct cu coordonatele (x, y, z) i originea
sistemului de coordonate se determin dup formula .
122
while ExistaElemente do
begin
AlegeUnElement(x);
IncludeElementul(x);
end
Program P153;
{ Tehnica Greedy }
const nmax=1000;
var A : array [1..nmax] of real;
n : 1..nmax;
B : array [1..nmax] of real;
m : 0..nmax;
x : real;
i : 1..nmax;
123
begin
i:=1;
while A[i]<=0 do i:=i+1;
x:=A[i];
A[i]:=0;
end; { AlegeUnElement }
begin
write(Dai n=); readln(n);
writeln(Dai elementele mulimii A:);
for i:=1 to n do read(A[i]);
writeln;
m:=0;
while ExistaElemente do
begin
AlegeUnElement(x);
IncludeElementul(x);
end;
writeln(Elementele mulimii B:);
for i:=1 to m do writeln(B[i]);
readln;
end.
ntrebri i exerciii
Explicai structura general a algoritmilor bazai pe metoda Greedy.
Care snt avantajele i neajunsurile algoritmilor bazai pe tehnica Greedy?
Estimai timpul de execuie al programului P153.
124
Schiai un algoritm care determin submulimea B din exemplul de mai sus prin meto-
da trierii. Estimai complexitatea temporal a algoritmului elaborat.
Memorarea fiierelor pe benzi magnetice. Se consider n fiiere f1, f2, ..., fn care trebu-
ie memorate pe o band magnetic. Elaborai un program care determin ordinea de
amplasare a fiierelor pe band astfel nct timpul mediu de acces s fie minim. Se pre-
supune c frecvena de citire a fiierelor este aceeai, iar pentru citirea fiierului fi (i=1, 2,
..., n) snt necesare ti secunde.
Problema continu a rucsacului. Se consider n obiecte. Pentru fiecare obiect i (i=1,
2, ..., n) se cunoate greutatea gi i ctigul ci care se obine n urma transportului su
la destinaie. O persoan are un rucsac cu care pot fi transportate unul sau mai multe
obiecte greutatea sumar a crora nu depete valoarea Gmax. Elaborai un program
care determin ce obiecte trebuie s transporte persoana n aa fel nct ctigul s fie
maxim. n caz de necesitate, unele obiecte pot fi tiate n fragmente mai mici.
Hrubele de la Cricova. Dup o vizit la renumitele hrube* de la Cricova un informatician
a construit un robot care funcioneaz ntr-un cmp divizat n ptrele (fig. 5.3). Robotul
poate executa doar instruciunile SUS, JOS, DREAPTA, STINGA, conform crora se de-
plaseaz n unul din ptrelele vecine. Dac n acest ptrat este un obstacol, de exem-
plu, un perete sau un butoi, are loc un accident i robotul iese din funciune.
Robot
Intrare Ieire
Elaborai un program care, cunoscnd planul hrubelor, deplaseaz robotul prin ncperi-
le subterane, de la intrarea n hrube la ieire. Colecia de vinuri fiind foarte bogat, nu se
cere vizitarea obligatorie a tuturor ncperilor subterane.
Datele de intrare. Planul hrubelor este desenat pe o foaie de hrtie liniat n ptre-
le. Ptrelele haurate reprezint obstacolele, iar cele nehaurate spaiile libere.
Ptrelele de pe perimetrul planului, cu excepia celor de intrare sau ieire, snt hau-
rate prin definiie. n form numeric planul hrubelor este redat prin tabloul A cu m linii
i n coloane. Elementele A[i, j] ale acestui tablou au urmtoarea semnificaie: 0 spaiu
* Hrub ncpere sau galerie subteran care servete la depozitarea produselor alimentare.
n hrubele de la Cricova pe parcursul mai multor decenii au fost depozitate cele mai bune
vinuri din Republica Moldova.
125
liber; 1 obstacol; 2 intrarea n hrube; 3 ieirea din hrube. Iniial, robotul se afl n
ptrelul pentru care A[i, j]=2.
Fiierul HRUBE.IN conine pe prima linie numerele m, n separate prin spaiu. Pe urm-
toarele m linii se conin cte n numere A[i, j] separate prin spaiu.
Datele de ieire. Fiierul HRUBE.OUT va conine pe fiecare linie cte una din instruciuni-
le SUS, JOS, DREAPTA, STINGA scrise n ordinea executrii lor de ctre robot.
Restricii. 5 m, n 100 . Timpul de execuie nu va depi 3 secunde.
Exemplu:
HRUBE.IN HRUBE.OUT
7 9 SUS
1 1 1 1 1 1 1 1 1 DREAPTA
1 0 0 1 0 0 0 0 1 DREAPTA
1 0 1 0 0 1 0 1 1 DREAPTA
1 0 0 0 1 0 0 0 1 DREAPTA
1 0 1 0 1 0 1 0 1 SUS
1 0 0 0 0 0 1 0 1 SUS
1 2 1 1 1 1 1 3 1 DREAPTA
DREAPTA
JOS
JOS
JOS
Indicaii. La fiecare pas selectai din mulimea {SUS, JOS, DREAPTA, STINGA} cte o
instruciune n aa fel nct robotul s se deplaseze numai de-a lungul unui perete.
126
condiii stabilesc situaiile n care are sens s trecem la calculul lui xk+1. Dac aceste
condiii nu snt satisfcute, va trebui s facem o alt alegere pentru xk sau, dac ele-
mentele din mulimea Ak s-au epuizat, s micorm pe k cu o unitate ncercnd s
facem o nou alegere pentru xk-1.
Menionm faptul c anume micorarea lui k d nume metodei studiate, cuvntul
reluare semnificnd revenirea la alte variante de alegere a variabilelor x1, x2 , ..., xk-1.
Evident, aceeai semnificaie o are i denumirea englez a metodei n studiu back-
tracking (back napoi, track urm).
Pentru exemplificare, n figura 5.4 este prezentat ordinea n care snt examinate
elementele mulimilor A1 = {a11, a12}, A2 = {a21, a22} i A3 = {a31, a32, a33}. n scopuri di-
dactice se consider c mulimile A1 i A2 au cte dou elemente (m1 = 2, m2 = 2), iar
mulimea A3 trei elemente (m3 = 3). Elementele akj ale mulimilor respective snt
simbolizate prin cerculee. Rezultatele verificrii condiiilor de continuare snt repre-
zentate prin valorile binare 0 (false) i 1 (true).
k:=1 0
A1
k:=k+1
A2
0 0
0 0 A3
Din figura 5.4 se observ c primul element a11 din mulimea A1 nu satisface con-
diiile de continuare i, n consecin, se trece la elementul al doilea a12 din aceeai
mulime. Mai departe n vectorul X se include primul element a21 din mulimea A2,
element care satisface condiiile de continuare, i se trece la examinarea elementelor
din mulimea A3.
ntruct niciunul din elementele a31 , a32 , a33 nu satisface condiiile de continuare,
se revine la mulimea A2 din care se alege elementul al doilea, i anume, a22. Dup
aceasta se testeaz din nou elementele mulimii A3, elementul a32 satisfcnd condii-
ile de continuare.
Schema general a unui algoritm recursiv bazat pe metoda relurii este redat cu
ajutorul procedurii ce urmeaz:
procedure Reluare(k:integer);
begin
if k<=n then
127
begin
X[k]:=PrimulElement(k);
if Continuare(k) then Reluare(k+1);
while ExistaSuccesor(k) do
begin
X[k]:=Succesor(k);
if Continuare(k) then Reluare(k+1)
end; { while }
end { then }
else PrelucrareaSolutiei;
end; {Reluare}
128
X=(a12, a21, a33),
ns nici unul din aceti vectori nu satisface condiiile de continuare. Dup exami-
narea ultimului element din mulimea A3, funcia ExistaSuccesor returneaz va-
loarea false i, n consecin, se revine n contextul apelului Reluare(2). n acest
context n componenta x2 a vectorului X se nscrie succesorul elementului a21:
X=(a12, a22).
ntruct i pentru acest vector funcia Continuare returneaz valoarea true,
din nou se execut apelul recursiv Reluare(3). ns, spre deosebire de apelul pre-
cedent, n acest caz vectorul
X=(a12, a22, a32)
satisface condiiile de continuare, fapt ce declaneaz execuia apelului recursiv
Reluare(4). n acest apel k>n i, prin urmare, procedura PrelucrareaSolutiei
va afia coordonatele vectorului X la ecran.
Exemplu. Se consider mulimile A1, A2, ..., An, fiecare mulime fiind format din
mk numere naturale. Selectai din fiecare mulime cte un numr n aa mod nct
suma lor s fie egal cu q.
Rezolvare. Vom reprezenta mulimile A1, A2, ..., An prin liniile tabloului bidimensi-
onal (matricei) A = ||akj||. Numrul de elemente mk al fiecrei mulimi Ak va fi reinut
n componenta respectiv a tabloului unidimensional (vectorului) M = ||mk||.
Din enunul problemei rezult c toate condiiile de continuare snt respectate
numai atunci cnd suma elementelor referite de primele k componente ale vectorului
X nu depete valoarea q pentru k<n i este egal cu q pentru k = n. Pentru a simpli-
fica scrierea programului, vom memora n vectorul X numai indicii j ai elementelor
aij selectate din mulimile A1, A2, ..., An.
Program P154;
{ Program bazat pe metoda relurii }
const mmax=50; { numrul maximal de mulimi }
nmax=50; { numrul maximal de elemente }
type Natural = 0..MaxInt;
Multime = array [1..nmax] of Natural;
129
function Continuare(k : integer) : boolean;
var j : integer;
suma : Natural;
begin
suma:=0;
for j:=1 to k do suma:=suma+A[j, X[j]];
if ((k<n) and (suma<q)) or ((k=n) and (suma=q))
then Continuare:=true
else Continuare:=false;
end; { Continuare }
procedure PrelucrareaSolutiei;
var k : integer;
begin
write(Soluia: );
for k:=1 to n do write(A[k, X[k]], );
writeln;
Indicator:=true;
end; { PrelucrareaSolutiei }
130
begin
write(Dai cardinalul A[, k, ]=); readln(M[k]);
write(Dai elementele mulimii A[, k, ]: );
for j:=1 to M[k] do read(A[k, j]);
writeln;
end;
Write(Dai q=); readln(q);
Indicator:=false;
Reluare(1);
if Indicator=false then writeln(Nu exist soluii);
readln;
end.
ntrebri i exerciii
Explicai structura general a algoritmilor bazai pe metoda relurii.
Indicai cazurile elementare i cele neelementare n procedura recursiv Reluare.
Elaborai o variant iterativ a procedurii Reluare.
Elaborai un studiu comparativ al algoritmilor iterativi i algoritmilor recursivi bazai pe
metoda relurii.
Reprezentai pe un desen similar celui din figura 5.4 ordinea n care snt examinate ele-
mentele mulimilor A1, A2, ..., An din programul P154:
a) A1={1}, A2={2}, A3={3}, q=4;
b) A1={1}, A2 ={2, 3}, A3={4, 5}, q=10;
c) A1={1, 2, 3}, A2={4, 5}, A3={6}, q=14;
d) A1={1, 2}, A2={3, 4}, A3={5, 6}, A4={7, 8}, q=20.
131
Precizai condiiile de continuare pentru programele n care se dorete generarea tutu-
ror elementelor produsului cartezian A1A2...An. Pentru a verifica rspunsul scriei i
depanai programul respectiv.
Indicai pe desenul din figura 5.4 ordinea de parcurgere a elementelor din mulimile A1,
A2, A3 n cazurile cele mai favorabile i cele mai nefavorabile.
Se consider mulimea B={b1, b2, ..., bn} format n primele n litere ale alfabetului latin.
Elaborai un program bazat pe metoda relurii care genereaz toate submulimile
Bi, BiB, formate exact din q litere.
Indicaie. Fiecare submulime Bi poate fi reprezentat prin vectorul caracteristic X = ||xk||n,
unde
dac
n caz contrar.
Evident, submulimea Bi satisface condiiile problemei dac x1+x2+...+xn=q.
Colorarea hrilor. Pe o hart sunt reprezentate n ri, n30. n memoria calculatorului
harta este redat prin matricea A=||aij||nm, unde
dac rile i, j snt vecine;
n caz contrar.
Determinai numrul minim de culori m necesare pentru a colora harta. Evident, se cere
ca oricare dou ri vecine s fie colorate diferit.
Labirintul. Se consider planul unui labirint desenat pe o foaie de hrtie liniat n ptr-
ele (fig. 5.5). Ptrelele haurate reprezint obstacolele, iar cele nehaurate camerele
i coridoarele labirintului.
132
Se consider n (n30) sculee, numerotate prin 1, 2, 3, ..., n. Sculeul i conine mi mo-
nede de aceeai valoare Vi. Elaborai un program care afieaz la ecran modul de plat a
unei sume S cu exact p monede din sculee.
Elaborai un program care afieaz la ecran toate modurile de a descompune un numr
natural n sum de k numere naturale distincte. De exemplu, pentru n=9 i k=3 soluiile
snt: 1+2+6, 2+3+4, 1+3+5.
Efectuai un studiu comparativ al algoritmilor bazai pe metoda trierii i algoritmilor
bazai pe metoda relurii n cazul problemelor din exerciiile 8 i 12.
133
else
begin
m:=(j-i) div 2;
DesparteSiStapineste(i, i+m, x1);
DesparteSiStapineste(i+m+1, j, x2);
Combina(x1, x2, x);
end;
end;
Program P155;
{ Gasirea elementuli maximal prin metoda desparte i
stpnete }
const nmax=100;
134
function SolutieDirecta(i, j : integer) : boolean;
begin
SolutieDirecta:=false;
if (j-i<2) then SolutieDirecta:=true;
end; { SolutieDirecta }
begin
write(Dai n=); readln(n);
writeln(Dai , n, numere reale);
for i:=1 to n do read(A[i]);
writeln;
DesparteSiStapineste(1, n, x);
writeln(Numrul maximal x=, x);
readln;
readln;
end.
135
exemplul ce urmeaz problema curent tierea unei placi de arie maxim este
mprit n patru subprobleme de acelai tip, dar de dimensiuni mai mici.
Exemplul 2. Se consider o plac dreptunghiular de dimensiunile LH. Placa are
n guri punctiforme, fiecare gaur fiind definit prin coordonatele (xi, yi). Elaborai
un program care decupeaz din plac o bucat de arie maxim, dreptunghiular i
fr guri. Snt admise doar tieturi de la o margine la alta pe direcii paralele cu
laturile plcii verticale sau orizontale (fig. 5.7).
a)
b) c)
Rezolvare. Vom defini placa curent prin vectorul P=(a, b, c, d), unde a i b snt co-
ordonatele colului stnga-jos, iar c i d coordonatele colului dreapta-sus. Evident,
placa iniial se definete prin (0, 0, L, H). Metoda desparte i stpnete poate fi reali-
zat dup cum urmeaz:
iniial stabilim aria maxim Smax=0;
dac placa curent nu are guri, problema poate fi soluionat direct, compa-
rnd aria curent cu valoarea Smax;
n caz contrar alegem o gaur arbitrar (xi, yi) prin care tiem placa curent n
plci mai mici, artate n figura 5.7:
P1=(a, b, xi, d), P2=( xi, b, c, d) sau P3=(a, yi, c, d), P4=(a, b, c, yi );
136
n continuare examinm n acelai mod fiecare din plcile obinute n urma tie-
rii, memornd consecutiv n variabila Smax aria plcii de suprafa maxim.
Program P156;
{ Tierea unei placi prin metoda desparte i stpnete }
const nmax=100;
var L, H : real;
n : 1..nmax;
X,Y : array[1..nmax] of real;
Smax, amax, bmax, cmax, dmax : real;
i : integer;
137
else begin
DesparteSiStapineste(a, b, X[i], d);
DesparteSiStapineste(X[i], b, c, d);
DesparteSiStapineste(a, Y[i], c, d);
DesparteSiStapineste(a, b, c, Y[i]);
end;
end; { DesparteSiStapineste }
begin
writeln(Dai dimensiunile L, H); readln(L, H);
write(Dai n=); readln(n);
writeln(Dai coordonatele X[i], Y[i]);
for i:=1 to n do read(X[i], Y[i]);
writeln;
Smax:=0;
DesparteSiStapineste(0, 0, L, H);
writeln(Placa de arie maxim (,
amax:5:1, , bmax:5:1, ,
cmax:5:1, , dmax:5:1, ));
writeln(Smax=, Smax:5:2);
readln;
end.
ntrebri i exerciii
Explicai schema de calcul a algoritmilor bazai pe metoda desparte i stpnete.
Care snt avantajele i neajunsurile metodei desparte i stpnete?
Utiliznd metoda desparte i stpnete, elaborai un program care determin suma ele-
mentelor mulimii A={a1, a2, ..., an} format din n numere reale.
138
Indicai pe un desen similar celui din figura 5.7 ordinea examinrii plcilor curente pe
parcursul executrii programului P156:
dimensiunea plcii iniiale: 3 4;
numrul de guri ale plcii iniiale: 3;
coordonatele gurilor: (1, 1); (1, 2); (2, 2).
Estimai necesarul de memorie i complexitatea temporal a programelor P155 i P156.
Schiai un algoritm care rezolv problema tierii unei plci de arie maxim prin metoda
trierii. Estimai complexitatea temporal i necesarul de memorie al algoritmului elabo-
rat. Efectuai un studiu comparativ al algoritmilor bazai pe metoda trierii i algoritmilor
bazai pe metoda desparte i stpnete.
Cutarea binar. Se consider mulimea A={a1, a2, ..., an}, elementele creia snt numere
ntregi sortate n ordine cresctoare. Elaborai un program care determin dac mulimea
A conine numrul dat p. Estimai complexitatea temporal a programului elaborat.
Utiliznd metoda desparte i stpnete, elaborai un program care determin cel mai
mare divizor comun al numerelor naturale a1, a2, ..., an.
Sortarea prin interclasare. Elaborai un program care sorteaz elementele irului (a1,
a2, ..., an) n ordine cresctoare dup cum urmeaz:
divizm irul curent n dou subiruri de aproximativ aceeai lungime;
dac subirul conine numai dou elemente, aranjm elementele respective n ordine
cresctoare;
avnd dou subiruri sortate, le interclasm pentru a obine irul curent sortat.
Se consider c elementele irului care trebuie sortat snt numere ntregi. De exemplu, n urma
interclasrii subirurilor sortate (-3, 4, 18) i (-2, -1, 15) obinem irul ( -3, -2, -1, 4, 15, 18).
Problema turnurilor din Hanoi.* Se consider trei tije notate prin 1, 2 i 3 i n discuri
perforate de dimensiuni diferite (fig. 5.8). Iniial toate discurile snt pe tija 1, aranjate n
ordinea descresctoare a diametrelor, considernd sensul de la baz la vrf. Elaborai un
program care mut toate discurile pe tija 2 folosind tija 3 ca tij de manevr i respectnd
urmtoarele reguli:
la fiecare pas se mut un singur disc;
orice disc poate fi aezat doar peste un disc cu diametrul mai mare.
* Denumirea problemei provine de la o veche legend hindus conform creia dup mutarea
celor 64 de discuri va veni sfritul lumii.
139
Indicaii. Mutarea unui disc de pe tija i pe tija j poate fi reprezentat ca o pereche (i, j) cu
i, j{1, 2, 3}, ij. Prin H(m, i, j) vom nota irul mutrilor necesare pentru a muta primele m
discuri (evident, cele situate cel mai sus) de pe tija i pe tija j. De exemplu,
H(1, 1, 2)=(1, 2);
H(2, 1, 2)=(1, 3), (1, 2), (3, 2);
H(3, 1, 2)=(1, 2), (1, 3), (2, 3), (1, 2), (3, 1), (3, 2), (1, 2).
n general,
pentru
pentru
unde k=6ij. Prin urmare, problema celor n discuri se reduce la rezolvarea a dou sub-
probleme de acelai tip pentru (n1) discuri.
140
zonele vecine cea din est sau cea din sud. Elaborai un program care determin
cantitatea maxim de aur Cmax care poate fi extras de robot.
Robot
2 3 4 6 4 6
A=
3 6 2 7 7 5
4 7 2 3 4 5
141
Se observ c la pasul k vor fi calculate numai acele elemente cij ale tabloului C
pentru care se respect egalitatea i + j 1 = k. Ordinea n care snt calculate elemen-
tele cij n cazul tabloului A de mai sus este prezentat n figura 5.10.
Program P157;
{ Deplasarea robotului pe un teren aurifer }
var A , C : array [1..50, 1..50] of real;
m, n, i, j, k : integer;
begin
write(Dai valorile n, m: ); readln(n, m);
writeln(Dai componentele tabloului A);
for i:=1 to n do
for j:=1 to m do read(A[i,j]);
writeln;
C[1,1]:=A[1,1];
for i:=2 to n do C[i,1]:=A[i,1]+C[i-1,1];
for j:=2 to m do C[1,j]:=A[1,j]+C[1,j-1];
142
for k:=2 to n+m-1 do
for i:=2 to n do
for j:=2 to m do
if (i+j-1)=k then
C[i,j]:=A[i,j]+Max(C[i,j-1], C[i-1,j]);
writeln(Cmax=, C[n,m]);
readln;
end.
ntrebri i exerciii
Explicai esena principiului optimalitii.
n ce ordine pot fi luate deciziile n procesul soluionrii unei probleme prin metoda
programrii dinamice?
Explicai ordinea de luare a deciziilor n problema deplasrii robotului pe un teren aurifer.
Demonstrai c problema deplasrii robotului pe un teren aurifer satisface principiul
optimalitii.
Estimai necesarul de memorie i timpul de execuie al programului P157.
Cum credei, care snt avantajele i neajunsurile algoritmilor bazai pe metoda progra-
mrii dinamice?
Problema discret a rucsacului. Se consider n obiecte. Pentru fiecare obiect i (i=1,
2, ..., n) se cunoate greutatea gi i ctigul ci care se obine n urma transportului su
la destinaie. O persoan are un rucsac cu care pot fi transportate unul sau mai multe
obiecte greutatea sumar a crora nu depete valoarea Gmax. Elaborai un program
care determin ce obiecte trebuie s transporte persoana n aa fel nct ctigul s fie
maxim. Obiectele respective nu pot fi tiate n fragmente mai mici.
Drumul de cost minim. Se consider o reea format din n orae. ntre unele orae
exist curse directe de autobuz. Costul unui bilet la o curs direct din oraul i n oraul
j este de cij lei. Evident, costul unei curse directe ntotdeauna este mai mic dect costul
unei cltorii cu transbordri: cij < cik + ckj. Elaborai un program care determin costul
minim al unei cltorii din oraul i n oraul j.
Arhivarea fiierelor. E cunoscut faptul c pe suporturile de memorie extern orice fiier
este memorat ca o secven de cifre binare. Pentru a economisi spaiul de memorare,
programele de arhivare descompun fiierul iniial ntr-o succesiune de cuvinte binare ce
aparin unui dicionar i nscriu pe disc numai numerele de ordine ale cuvintelor respec-
tive. De exemplu, n cazul unui dicionar format din 5 cuvinte binare:
1) 0;
2) 1;
3) 000;
4) 110;
5) 1101101,
143
fiierul iniial 10001101101110 va fi memorat pe disc n forma 2354. Elaborai un
program care descompune orice secven binar ntr-un numr minim de cuvinte apar-
innd dicionarului propus.
Triangularea polinoamelor. Procesarea imaginilor cu ajutorul calculatoarelor presu-
pune descompunerea poligoanelor n figuri geometrice mai simple, i anume, n triun-
ghiuri. Admitem c poligonul convex P1P2...Pn este definit prin coordonatele (xi, yi) ale
vrfurilor Pi, i=1, 2, ..., n. Elaborai un program care descompune poligonul P1P2...Pn n
triunghiuri trasnd n acest scop un set de coarde PjPm, jm, j, m{1, 2, ..., n}, care nu se
intersecteaz. Se cere ca lungimea total a coardelor respective s fie minim.
144
Starea
iniial
Starea Starea
final final
145
Tabelul 5.2
Parcurgerea de cost minim
Nr. Lista nodurilor Nodul de cost Descendenii nodului
Etapa
crt. active minim de cost minim
1. iniial (s1) - -
2. ramific s1 s 2, s 3, s 4
3. mrginete (s3, s4) - -
4. ramific (s3) s4 s8, s9
5. mrginete (s3, s8) - -
6. ramific (s8) s3 s 5, s 6, s 7
7. mrginete (s8, s5, s6, s7) - -
8. ramific (s8, s6, s7) s5 s10, s11
9. mrginete (s8, s6, s7, s10, s11) - -
10. stop (s8, s6, s7, s11) s10 -
IniializareaListei;
repeat
Ramifica;
Margineste;
until Gasit or ListaEsteVida
146
urmare, complexitatea algoritmilor bazai pe metoda ramific i mrginete depinde
n mare msur de experiena i iscusina programatorului.
ntrebri i exerciii
Pentru care tip de probleme poate fi aplicat metoda ramific i mrginete?
Cum se construiete arborele soluiilor? Ce informaie conine fiecare nod al arborelui?
Cum se reprezint soluia unei probleme n metoda ramific i mrginete?
Care este destinaia funciei de cost ? Cum poate fi definit aceast funcie?
Explicai schema de calcul a metodei ramific i mrginete.
Scriei o procedur PASCAL care realizeaz parcurgerea de cost minim. Se consider c
fiecare nod al arborelui conine un cmp n care este indicat valoarea funciei de cost.
Estimai necesarul de memorie i complexitatea temporal a procedurii elaborate.
Indicai ordinea n care snt vizitate nodurile arborelui din figura 5.11 n urmtoarele cazuri:
a) parcurgerea n lime;
b) parcurgerea n adncime;
c) parcurgerea de cost minim.
Snt oare vizitate toate nodurile unui arbore n cazul parcurgerii de cost minim?
Argumentai rspunsul dvs.
Schiai un algoritm care caut soluia optim parcurgnd arborele soluiilor n lime
(n adncime). Estimai necesarul de memorie i complexitatea temporal a algoritmului
elaborat.
Dai exemple de probleme ce pot fi soluionate prin metoda ramific i mrginete.
ncercai s desenai nodurile de pe nivelele 0, 1 i 2 ale unui arbore ce reprezint jocul
dvs. preferat, de exemplu, lupta maritim, ah, dame etc.
Cum credei, care snt avantajele i neajunsurile algoritmilor bazai pe metoda ramific
i mrginete?
147
stabilirea transformrilor (operaiilor) elementare n urma crora sistemul trece
dintr-o stare n alta;
definirea funciei de cost;
definirea structurilor de date necesare pentru a reprezenta strile sistemului,
arborele soluiilor i lista nodurilor active;
elaborarea subprogramelor necesare pentru generarea descendenilor, calcula-
rea funciei de cost, selectarea nodurilor de cost minim etc.
Pentru exemplificare vom analiza modul de implementare a metodei ramific i
mrginete n cazul jocului Perspico, cunoscut i sub denumirea jocul 15. n acest joc
snt 15 plcue ptrate numerotate de la 1 la 15 (fig. 5.12).
a) b)
Plcuele snt ncadrate ntr-o ram ptrat de dimensiunile 44, o poziie din
interiorul ramei fiind liber. Orice plcu vecin cu poziia liber poate fi mutat pe
locul respectiv. Se cere a trece, folosind mutrile permise, din starea iniial n starea
final.
Starea curent a jocului Perspico poate fi exprimat printr-o distribuie a celor 15
plcue n cele 16 poziii libere. Numerotnd placa liber prin 0, putem scrie:
148
Starea
iniial
jos
dreapta
Starea
final
ntruct plcua liber poate fi deplasat pe trasee ciclice, arborele soluiilor este
infinit. Pentru a evita revenirea la strile deja examinate, vom include n arbore nu-
mai strile curente noi. De asemenea, lund n considerare faptul c memoria intern
a calculatoarelor personale nu permite stocarea tuturor strilor posibile, n continu-
are vom examina numai primele 1015 nivele ale arborelui soluiilor. Evident, n
prezena acestei restricii nu se mai garanteaz gsirea, chiar dac exist, a irului de
mutri permise care transform starea iniial n stare final.
Funcia de cost f : S R poate fi definit n forma:
f(si) = niv(si) + h(si),
unde componenta h(si) caracterizeaz numrul de mutri necesare pentru a trece
din starea curent si n stare final. ntruct acest numr nu poate fi calculat fr a
149
construi mai nti subarborele de rdcin si, vom folosi o aproximare prin lips a
numrului necesar de mutri:
h(si) = numrul de plcue care nu se afl la locul lor.
De exemplu, pentru arborele din figura 5.13 avem:
f(s1) = niv(s1) + h(s1) = 0 + 4 = 4;
f(s2) = niv(s2) + h(s2) = 1 + 5 = 6;
f(s3) = niv(s3) + h(s3) = 1 + 3 = 4;
f(s6) = niv(s6) + h(s6) = 2 + 2 = 4;
f(s7) = niv(s7) + h(s7) = 3 + 0 = 3.
Arborele soluiilor i lista nodurilor active pot fi reprezentate n memoria calcula-
torului cu ajutorul urmtoarelor structuri de date:
Program P158;
{ Jocul Perspico - metoda ramifica si margineste }
const NivelMaxim=15;
type Stare=array[1..4, 1..4] of 0..15;
AdresaNod=^Nod;
150
Nod=record
S : Stare;
Nivel, Cost : integer;
Drum : boolean;
D : array [1..4] of AdresaNod; {adresele
descendentilor}
Tata : AdresaNod;
end;
AdresaCelula=^Celula;
Celula=record
ReferintaNod : AdresaNod;
Urm : AdresaCelula;
end;
procedure Initializare;
{ Creeaza nodul radacina si lista nodurilor active }
{ Inscrie in lista nodurilor active nodul radacina }
var i : integer;
begin
Gasit:=false;
new(Radacina);
Radacina^.S:=StareaInitiala;
Radacina^.Nivel:=0;
CalculareaCostului(Radacina);
Radacina^.Drum:=false;
for i:=1 to 4 do Radacina^.D[i]:=nil;
Radacina^.Tata:=nil;
151
new(BazaListei);
BazaListei^.ReferintaNod:=Radacina;
BazaListei^.Urm:=nil;
end; { Initializare }
152
begin
St:=Adresa^.S;
St[i,j]:=St[i, j+1];
St[i, j+1]:=0;
m:=m+1;
Str[m]:=St;
end;
end; { Desparte }
153
dispose(P);
1:end; { ExtrageDinLista }
begin
EsteInArbore:=false;
InAdincime(Radacina);
StareDejaExaminata:=EsteInArbore;
end; { StareDejaExaminata }
154
begin
k:=0;
if (Adresa^.Nivel+1) > NivelMaxim then goto 1;
for i:=1 to m do
if not StareDejaExaminata(Str[i]) then
begin
k:=k+1;
new(R);
R^.S:=Str[i];
R^.Nivel:=Adresa^.Nivel+1;
CalculareaCostului(R);
for j:=1 to 4 do R^.D[j]:=nil;
Adresa^.D[i]:=R;
R^.Tata:=Adresa;
R^.Drum:=false;
if StariEgale(R^.S, StareaFinala) then
begin
R^.Drum:=true;
Gasit:=true;
end;
IncludeInLista(R);
end;
writeln(Foutput);
writeln(Foutput, In lista au fost inclusi , k,
descendenti);
writeln(Foutput);
1:end; { Margineste }
procedure RamificaSiMargineste;
var NodulCurent : AdresaNod;
155
begin
Initializare;
repeat
ExtrageDinLista(NodulCurent);
writeln(Foutput, NODUL EXTRAS DIN LISTA);
writeln(Foutput, ======================);
AfisareaNodului(NodulCurent);
Ramifica(NodulCurent);
Margineste(NodulCurent);
until Gasit or (BazaListei=nil);
end; { RamificaSiMargineste }
procedure AfisareaDrumului;
label 1;
var R : AdresaCelula;
P, Q : AdresaNod;
begin
if not Gasit then
begin
writeln(Foutput, DRUMUL NU A FOST GASIT);
goto 1;
end;
writeln(Foutput, DRUMUL GASIT:);
writeln(Foutput, =============);
{ cautarea in lista a nodului terminal}
R:=BazaListei;
while (R<>nil) and (not R^.ReferintaNod^.Drum) do R:=R^.Urm;
{ marcarea nodurilor care formeaza drumul }
P:=R^.ReferintaNod;
while P<>nil do
begin
P^.Drum:=true;
P:=P^.Tata;
end;
{ afisarea drumului }
P:=Radacina;
while P<>nil do
begin
AfisareaNodului(P);
Q:=nil;
for i:=1 to 4 do
if (P^.D[i]<>nil) and P^.D[i]^.Drum then Q:=P^.D[i];
P:=Q;
end;
writeln(Foutput, Sfirsitul drumului);
1:end; { AfisareaDrumului }
156
begin
{ Citirea starii initiale }
assign(Finput, FINPUT.TXT);
reset(Finput);
for i:=1 to 4 do
for j:=1 to 4 do read(Finput, StareaInitiala[i, j]);
{ Citirea starii finale }
for i:=1 to 4 do
for j:=1 to 4 do read(Finput, StareaFinala[i, j]);
close(Finput);
{ Deschiderea fisierului de iesire }
assign(Foutput, FOUTPUT.TXT);
rewrite(Foutput);
RamificaSiMargineste;
AfisareaDrumului;
close(Foutput);
writeln(Gasit=, Gasit);
readln;
end.
n programul P158 starea iniial i starea final snt citite din fiierul FINPUT.
TXT, iar nodurile extrase la fiecare pas din list i drumul gsit snt nscrise n fiierul
FOUTPUT.TXT. Coninutul acestor fiiere poate fi vizualizat sau modificat cu ajuto-
rul unor editoare simple de text.
ntrebri i exerciii
Indicai ordinea n care vor fi vizitate nodurile arborelui din figura 5.13 n cazul parcurge-
rii de cost minim. Folosind ca model tabelul 5.2, completai un tabel cu datele referitoare
la acest arbore.
Explicai destinaia fiecrui subprogram din programul P158.
Lansai n execuie programul P158 pentru datele iniiale din figura 5.12. Comentai re-
zultatele nscrise n fiierul de ieire.
Lansai n execuie programul P158 pentru urmtoarele stri iniiale ale jocului
Perspico:
a) b)
1 2 0 4 1 2 3 4
5 6 3 8 5 7 6 8
9 11 7 12 9 0 10 11
13 10 14 15 13 14 15 12
157
c) d)
1 3 4 8 0 1 2 3
5 2 6 0 6 7 8 4
9 10 7 11 5 9 10 11
13 14 15 12 13 14 15 12
9 5 7 8 5 0 7 8
13 6 10 11 9 6 10 11
0 14 15 12 13 14 15 12
a) b)
158
Verificai cum deruleaz programul modificat n cazul strilor iniiale din exerciiile 4 i 5.
Elaborai planul unui experiment care ne-ar permite s stabilim care din funciile h(si),
g(si) micoreaz timpul de calcul.
Comparai complexitatea programului P158 cu complexitatea unui program bazat pe
metoda trierii.
Se consider o tabl de ah pe care se afl o singur pies un cal de culoare alb.
Elaborai un program care determin dac piesa respectiv poate trece, utiliznd
mutrile permise, din poziia (, ) n poziia (, ). Amintim c , {A, B, ..., H}, iar
, {1, 2, ..., 8}.
Problema comis-voiajorului*. Se consider n orae ntre care exist curse aeriene di-
recte. n oraul i se afl un comis-voiajor care trebuie s viziteze celelalte n-1 orae i s
revin n localitatea din care s-a pornit. Elaborai un program care, cunoscnd distanele
dij ntre orae, determin ordinea n care ele vor fi vizitate. Se cere ca distana parcurs
de comis-voiajor s fie ct mai mic, iar fiecare ora s fie vizitat numai o singur dat.
Scriei un program PASCAL care soluioneaz problema comis-voiajorului prin metoda
trierii. Comparai complexitatea programului elaborat cu complexitatea programului
bazat pe metoda ramific i mrginete.
Indicaii: Drumul parcurs de comis-voiajor poate fi reprezentat ca o mulime ordonat (1,
i, j, ..., k, 1) de orae n care i, j, ..., k {2, 3, ..., n}. Pentru a genera toate drumurile posibile,
se calculeaz permutrile mulimii {2, 3, ..., n}.
Efectuai un studiu comparativ al algoritmilor bazai pe metoda ramific i mrginete i
algoritmilor bazai pe metoda trierii.
159
trierea tuturor soluiilor posibile. Dac aceste condiii snt alese nereuit, soluiile op-
time pot fi pierdute i, n consecin, algoritmul respectiv nu va mai fi exact. Pentru
exemplificare vom analiza problema ce urmeaz.
Problema drumului minim. Se consider n orae legate printr-o reea de drumuri
(fig. 5.15). Cunoscnd distanele dij dintre oraele vecine, determinai cel mai scurt
drum din oraul a n oraul b.
Datele iniiale ale problemei n studiu pot fi descrise cu ajutorul matricei (tabelu-
lui bidimensional) D = ||dij||nn cu n linii i n coloane, denumit matricea distanelor.
n aceast matrice componenta dij este egal cu distana dintre oraele i, j atunci cnd
ele snt vecine i 0 n caz contrar. Prin definiie, dii = 0, i = 1, 2, ..., n.
De exemplu, pentru oraele din figura 5.15 avem:
1 2 3 4 5 6
1 0 1 2 6 0 0
2 1 0 0 0 0 0
D= 3 2 0 0 2 3 0
4 6 0 2 0 5 0
5 0 0 3 5 0 2
6 0 0 0 0 2 0
160
unde q ia valori de la 0 la n-2. Este clar c algoritmii bazai pe generarea tuturor
permutrilor ntotdeauna determin drumul minim, ns complexitatea temporal
O(n!) a acestor algoritmi este inacceptabil.
Pentru a reduce volumul de calcule, vom ncerca s determinm drumul minim
prin metoda relurii. n aceast metod construirea drumului ncepe cu oraul ini-
ial x1 = a i continu cu primul dintre vecinii si nevizitai, fie acesta x2, trecndu-se
la primul dintre vecinii lui x2 nevizitai nc .a.m.d. Pentru a construi drumuri ct
mai scurte, vom aplica urmtoarea regul intuitiv: la fiecare pas vom examina, n
primul rnd, vecinii nevizitai care se afl ct mai aproape de oraul curent.
Drumul n construcie poate fi reprezentat n forma unui vector:
X = (a, x2, ..., xk-1, xk, ..., b),
n care componenta xk trebuie s fie unul din vecinii oraului xk-1. Pentru a sistematiza
calculele vom memora vecinii nc nevizitai ai oraului i n mulimea Ai , i = 1, 2, ...,
n. Evident, conform regulii intuitive formulate mai sus, oraele din fiecare mulime
Ai trebuie sortate n ordinea creterii distanelor dij, j Ai.
De exemplu, pentru figura 5.15 iniial vom avea:
A1 = (2, 3, 4);
A2 = (1);
A3 = (1, 4, 5);
A4 = (3, 5, 6);
A5 = (6, 3, 4);
A6 = (5).
Condiiile de continuare n metoda relurii rezult direct din enunul problemei:
oraul xk poate fi adugat la poriunea de drum deja construit (a, x2, ..., xk-1) numai
atunci cnd:
1) xk este un vecin nc nevizitat al oraului xk-1, deci xk Ak-1;
2) oraul xk anterior nu a fost inclus n drumul n curs de construcie, deci xk a,
xk x2, ..., xk xk-1.
De exemplu, pentru figura 5.15 vectorul X va lua consecutiv urmtoarele valori:
X = (1);
X = (1, 2);
X = (1);
X = (1, 3);
X = (1, 3, 4);
X = (1, 3, 4, 5);
X = (1, 3, 4, 5, 6).
Drumul (1, 3, 4, 5, 6) construit prin metoda relurii are lungimea 11 i, evident,
nu este un drum minim. Totui acest drum este mai bun ca drumul (1, 4, 5, 6) care
are lungimea 13.
n programul ce urmeaz elementele mulimilor A1, A2, ..., An snt plasate la n-
ceputul liniilor A[1], A[2], ..., A[n] ale tabelului bidimensional A, restul poziiilor
avnd valoarea zero.
161
Program P159;
{ Problema drumului minim - metoda relurii }
const nmax=50;
var n : integer; { numrul de orae }
D : array[1..nmax, 1..nmax] of real; { matricea distanelor }
a, b : 1..nmax;
X : array [1..nmax] of integer; { drumul construit }
V : array[1..nmax, 1..nmax] of integer; { vecinii }
Finput : text;
procedure InitializareVecini;
{ nscrie n V[k] vecinii oraului k }
var k, i, j, p, q, r : integer;
begin
for k:=1 to n do
begin
{ iniial mulimea V[k] este vid }
for i:=1 to n do V[k,i]:=0;
{ calculm elementele mulimii V[k] }
i:=0;
for j:=1 to n do
if D[k,j]<>0 then
begin
i:=i+1;
V[k,i]:=j;
end; { then }
{ sortarea elementelor mulimii V[k] prin metoda bulelor }
for j:=1 to i do
for p:=1 to i-1 do
if D[k, V[k,p]]>D[k, V[k, p+1]] then
begin
q:=V[k,p];
V[k,p]:=V[k, p+1];
V[k, p+1]:=q;
end; { then }
end; { for }
end; { InitializareVecini }
procedure Initializare;
var i, j : integer;
begin
assign(Finput, DRUM.IN);
reset(Finput);
readln(Finput, n);
readln(Finput, a, b);
writeln(n=, n, a=, a, b=, b);
for i:=1 to n do
for j:=1 to n do read(Finput, D[i,j]);
162
close(Finput);
InitializareVecini;
end; { Initializare }
163
readln;
halt;
end; { PrelucrareaSolutiei }
begin
Initializare;
X[1]:=a;
Reluare(2);
end.
164
1) mai nti se examineaz drumurile minime care leag oraele vecine:
dac i = j;
dac oraele i, j snt vecine;
n caz contrar;
2) n continuare se examineaz drumurile minime ntre oraele i, j formate prin
folosirea localitii k drept punct de conexiune:
cij = min(cik, cik+cjk), i, j {1, 2, ..., n}, i j, i k, j k;
3) punctul 2 se repet pentru k = 1, 2, ..., n.
Valorile curente ale matricei costurilor pentru oraele din figura 5.15 snt prezen-
tate n figura 5.16.
k=6
165
ntruct matricea costurilor C nu include drumurile minime propriu-zise, ci nu-
mai lungimile lor, vom construi drumul minim ce leag oraele a, b cu ajutorul teh-
nicii Greedy. Conform acestei tehnici, construcia drumului minim X = (x1, ..., xk-1, xk,
...) ncepe cu oraul iniial x1 = a. n continuare, la fiecare pas k se alege acel ora xk, xk
Ak-1, care satisface principiul optimalitii:
C[a, xk] + C[xk, b] = C[a, b].
De exemplu, pentru oraele a = 1, b = 6 din figura 5.15 avem:
X = (1);
X = (1, 3);
X = (1, 3, 5);
X = (1, 3, 5, 6).
Algoritmul de determinare a drumurilor minime bazat pe metoda programrii
dinamice este cunoscut n literatura de specialitate sub denumirea Roy-Floyd. n ca-
litate de exerciiu v propunem s demonstrai c acest algoritm este exact, adic
ntotdeauna construiete numai drumuri minime.
n programul ce urmeaz algoritmul exact este implementat cu ajutorul procedu-
rii RoyFloyd.
Program P160;
{ Problema drumului minim - metoda programrii dinamice }
const nmax=50;
Infinit=1.0E+35;
var n : integer; { numarul de orase }
D : array[1..nmax, 1..nmax] of real; { matricea distanelor }
a, b : 1..nmAx;
X : array [0..nmax+1] of integer; { drumul construit }
V : array[1..nmax, 1..nmax] of integer; { vecinii }
C : array[1..nmax, 1..nmax] of real; { matricea costurilor }
Finput : text;
procedure InitializareVecini;
{ nscrie in V[k] vecinii oraului k }
var k, i, j, p, q, r : integer;
begin
for k:=1 to n do
begin
{ iniial multimea V[k] este vid }
for i:=1 to n do V[k,i]:=0;
{ calculm elementele mulimii V[k] }
i:=0;
for j:=1 to n do
if D[k,j]<>0 then
begin
i:=i+1;
V[k,i]:=j;
166
end; { then }
end; { for }
end; { InitializareVecini }
procedure Initializare;
var i, j : integer;
begin
assign(Finput, DRUM.IN);
reset(Finput);
readln(Finput, n);
readln(Finput, a, b);
writeln(n=, n, a=, a, b=, b);
for i:=1 to n do
for j:=1 to n do read(Finput, D[i,j]);
close(Finput);
InitializareVecini;
end; { Initializare }
procedure AfisareaDrumului;
var k : integer;
begin
write(Drumul gsit: );
k:=1;
repeat
write(X[k] : 3);
k:=k+1;
until X[k]=0;
writeln;
writeln(Lungimea drumului , C[a, b] : 5);
readln;
end; { PrelucrareaSolutiei }
procedure RoyFloyd;
var i, j, k : integer;
s : real;
ors : integer; { oraul candidat la includerea n drumul
minim }
cnd : boolean; { condiiile de includere a oraului n drum }
167
begin
{ Iniializarea matricei costurilor }
for i:=1 to n do
for j:=1 to n do
if (D[i,j]=0) and (i<>j) then C[i,j]:=Infinit
else C[i,j]:=D[i,j];
{ Calcularea matricei costurilor }
for k:=1 to n do
for i:=1 to n do
if i<>k then
for j:=1 to n do
if j<>k then C[i,j]:=Min(C[i,j], C[i,k]+C[j,k]);
{ Trasarea drumului - tehnica Greedy}
for k:=1 to n do X[k]:=0;
k:=1; X[1]:=a;
while X[k]<>b do
begin
i:=1;
while V[X[k], i]<>0 do
begin
ors:=V[X[k], i];
cnd:=true;
for j:=1 to k do if ors=X[j] then cnd:=false;
if cnd and (C[A, ors]+C[ors, B]=C[a,b])
then X[k+1]:=ors;
i:=i+1;
end; { while }
k:=k+1
end; { while }
end; { RoyFloyd }
begin
Initializare;
RoyFloyd;
AfisareaDrumului;
end.
168
2) condiii pentru care se poate accepta un compromis, n sensul c ele pot fi nlo-
cuite cu alte condiii ce permit apropierea de o soluie optimal.
De exemplu, n cazul drumului minim X = (a, x2, ..., xk-1, xk, ..., b) faptul c xk trebuie
s fie un vecin al oraului xk-1 este o condiie necesar, iar respectarea principiului op-
timalitii este o condiie de compromis. n metoda relurii condiia de compromis a
fost nlocuit cu una mai simpl, i anume, oraul xk trebuie s fie ct mai aproape de
oraul xk-1. Evident, formularea condiiilor care accept un compromis i nlocuirea
lor cu altele mai simple cade n sarcina programatorului.
ntrebri i exerciii
Care este diferena dintre algoritmii exaci i cei euristici?
n care cazuri algoritmii euristici snt mai buni dect cei exaci?
Scriei un program care determin cel mai scurt drum prin metoda trierii. Estimai com-
plexitatea temporal a programului elaborat.
Efectuai un studiu comparativ al algoritmilor exaci i algoritmilor euristici destinai
soluionrii problemei drumului minim.
Calculai matricea distanelor pentru reeaua de drumuri auto ce leag centrele raionale.
Determinai cele mai scurte drumuri ntre centrele raionale date cu ajutorul algoritmilor
exaci i algoritmilor euristici.
Cum credei, poate fi oare aplicat metoda trierii pentru determinarea celui mai scurt
drum ntre oricare dou localiti din ar ? Argumentai rspunsul dvs.
Formulai condiiile necesare i condiiile pentru care se poate accepta un compromis n
cazul robotului ce exploreaz un teren aurifer (vezi paragraful 5.6).
Estimai complexitatea algoritmilor exaci i a algoritmilor euristici destinai soluionrii
problemelor ce urmeaz:
a) memorarea fiierelor pe benzi magnetice (exerciiul 5, paragraful 5.3);
b) problema continu a rucsacului (exerciiul 6, paragraful 5.3);
c) colorarea unei hri (exerciiul 9, paragraful 5.4);
d) problema discret a rucsacului (exerciiul 7, paragraful 5.6);
e) arhivarea fiierelor (exerciiul 9, paragraful 5.6);
f) triangularea polinoamelor (exerciiul 10, paragraful 5.6);
g) jocul Perspico (paragraful 5.8);
h) problema comis-voiajorului (exerciiul 10, paragraful 5.8).
169
Capitolul 6
ALGORlTMI DE REZOLVARE A UNOR
PROBLEME MATEMATICE
170
O alt operaie frecvent utilizat n algoritmii bazai pe metoda trierii este gene-
rarea tuturor submulimilor unei mulimi. Realizarea acestei operaii n programele
PASCAL este prezentat cu ajutorul exemplului ce urmeaz.
Exemplul 1. Se consider mulimea A={a1, a2, , an} format din n numere ntregi.
Determinai dac exist cel puin o submulime Ai, Ai A, suma elementelor creia
este egal cu m.
Rezolvare. Soluiile posibile , {a1}, {a2}, {a1, a2} .a.m.d. pot fi generate formnd
consecutiv vectorii binari B1, B2, ..., Bk.
Program P161;
{ Generarea tuturor submulimilor unei mulimi }
const nmax=50;
type Multime = array [1..nmax] of integer;
CifraBinara = 0..1;
VectorCaracteristic = array[1..nmax] of CifraBinara;
var A : Multime;
B : VectorCaracteristic;
n, m, j : integer;
procedure PrelucrareaSolutiei;
var j : integer;
begin
write(Submulimea: );
for j:=1 to n do
if B[j]=1 then write(A[j], );
writeln;
end; { PrelucrareaSolutiei }
171
procedure CautareSubmultimi;
var i : integer;
t : CifraBinara;
begin
for j:=1 to n do B[j]:=0;
{ ncepem cu vectorul caracteristic B=(0, 0, ..., 0) }
repeat
if SolutiePosibila then PrelucrareaSolutiei;
GenerareSubmultimi(t);
until t=1;
end; { CautareSubmultimi }
begin
write(Dai n=); readln(n);
writeln(Dai , n, numere intregi:);
for j:=1 to n do read(A[j]);
write(Dai m=); readln(m);
CautareSubmultimi;
writeln(Sfrit);
readln;
end.
172
obinem:
s1 = (-6, 4, -8) C1 = (, , );
s2 = ( 2, 4, -8) C2 = (, , );
s3 = ( 1, 4, -8) C3 = (, , );
s4 = (-6, 9, -8) C4 = (, , );
s5 = ( 2, 9, -8) C5 = (, , );
s18= ( 1, 9, 5) C18 = (, , ),
unde , i snt indicii elementelor din mulimile respective.
Vectorii C1, C2, , Ck pot fi generai n ordine lexicografic pornind de la vectorul
iniial C1=(1, 1, , 1).
Program P162;
{ Generarea elementelor unui produs cartezian }
const nmax=50; { numrul maximal de mulimi }
mmax=50; { numrul maximal de elemente }
type Multime = array [1..mmax] of integer;
VectorIndicii = array[1..nmax] of 1..mmax;
procedure PrelucrareaSolutieiPosibile;
var j, p : integer;
begin
p:=1;
for j:=1 to n do p:=p*A[j, C[j]];
if p > Pmax then begin Pmax:=p; Cmax:=C end;
end; { PrelucrareaSolutieiPosibile }
173
procedure CautareaProdusuluiMaximal;
var j : integer;
t : integer;
begin
Pmax:=-MaxInt;
writeln(Pmax=, Pmax);
for j:=1 to n do C[j]:=1;
{ ncepem cu vectorul indiciilor C=(1, 1, ..., 1) }
repeat
PrelucrareaSolutieiPosibile;
write(Produsul cartezian: );
for j:=1 to n do write(A[j, C[j]], ); writeln;
GenerareProdusCartezian(t);
until t=1;
end; { CautareaProdusuluiMaximal }
begin
write(Dai numrul de mulimi n=); readln(n);
for i:=1 to n do
begin
write(Dai cardinalul M[, i, ]=); readln(M[i]);
write(Dai elementele multimii A[, i, ]: );
for j:=1 to M[i] do read(A[i, j]);
writeln;
end;
CautareaProdusuluiMaximal;
writeln(Pmax=, Pmax);
write(Elementele selectate: );
for j:=1 to n do write(A[j, Cmax[j]], );
writeln;
readln;
readln;
end.
174
for j1:=1 to m1 do
for j2:=1 to m2 do
...
for jn:=1 to mn do
if SolutiePosibila(aj1, aj2 ,..., ajn)
then PrelucrareaSoluiei(aj1, aj2, ..., ajn)
Complexitatea temporal a algoritmilor bazai pe generarea tuturor elementelor
unui produs cartezian este O(mn), unde m = max(m1, m2, , mn).
ntrebri i exerciii
Submulimile Ai, Aj ale mulimii A snt reprezentate prin vectori caracteristici. Elaborai
procedurile necesare pentru efectuarea urmtoarelor operaii: Ai Aj, Ai Aj, Ai \ Aj, Ai.
Orice submulime Ai, Ai A, poate fi reprezentat printr-un vector cu n componente,
unde elementele submulimii Ai snt plasate la nceputul vectorului, iar restul poziiilor
au o valoare ce nu aparine mulimii A. Elaborai procedurile necesare pentru efectuarea
operaiilor frecvent ntlnite n calculul cu mulimi: , , \ , . Cum credei, care repre-
zentare a submulimilor este mai comod: prin vectorii caracteristici sau prin vectorii ce
conin chiar elementele submulimii?
Estimai timpul de execuie a procedurii CautareSubmultimi din programul P161.
Verificai aceste estimri prin msurri directe ale timpului de execuie pentru diferite
valori ale lui n.
Se consider mulimea A format din primele n caractere ale alfabetului latin. Elaborai
un program care afieaz la ecran toate submulimile acestei mulimi.
Se consider numrul natural n = 32*35*17*, format din 9 cifre zecimale. Determinai
cifrele care trebuie nscrise n poziiile marcate cu simbolul * pentru ca numrul obinut
s se mpart fr rest la m.
Estimai timpul de execuie a procedurii CautareaProdusuluiMaximal din pro-
gramul P162. Verificai aceste estimri prin msurri directe ale timpului de execuie
pentru diferite valori ale lui n i m1, m2, , mn.
ntr-un co snt m mere i p pere. S se genereze toate posibilitile de a alege f fructe
dintre care k s fie mere.
Elaborai o procedur recursiv care genereaz toate elementele unui produs cartezian.
Fie A = (a1, a2, , aj, , an) o mulime ordonat de caractere numit alfabet. Numim cu-
vnt de lungime p orice succesiune de p caractere din alfabetul A. Elaborai o procedur
care genereaz toate cuvintele de lungimea p.
175
Generarea permutrilor. E cunoscut faptul c numrul de permutri posibile ale
unei mulimi A={a1, a2, ..., an} cu n elemente se determin ca Pn = n!. Acest numr poa-
te fi calculat cu ajutorul funciei factorial, exprimat n form iterativ:
Pn = 1 2 3 ... n
sau recursiv:
dac
dac
De exemplu, pentru A={a1, a2} cele P2 = 2! = 2 permutri snt (a1, a2) i (a2, a1). Pentru
A={a1, a2, a3} cele P3 = 3! = 6 permutri snt:
(a1, a2, a3); (a1, a3, a2); (a2, a1, a3);
(a2, a3, a1); (a3, a1, a2); (a3, a2, a1).
ntruct ntre permutrile mulimii A={a1, a2, ..., an} i permutrile mulimii I={1,
2, ..., n} exist o coresponden biunivoc, problema generrii permutrilor oricrei
mulimi A cu n elemente se reduce la generarea permutrilor mulimii {1, 2, ..., n},
denumite permutri de grad n.
Exist mai multe metode ingenioase de generare a permutrilor de grad n, cea
mai rspndit fiind metoda lexicografic. n aceast metod se pleac de la per-
mutarea cea mai mic n ordine lexicografic, i anume de la permutarea identic
(1, 2, ..., n).
Avnd construit o permutare p = (p1, ..., pi-1, pi, pi+1, ..., pn), pentru determinarea
urmtoarei permutri p care i urmeaz n ordine lexicografic se caut acel indice i
care satisface relaiile:
pi < pi+1; pi+1 > pi+2 > ... > pn.
n continuare, elementul pi este nlocuit cu cel mai mic dintre elementele pi+1, ..., pn
care este mai mare dect pi, fie el pk:
(p1, ..., pi-1, pk, pi+1, ..., pk-1, pi, pk+1, ..., pn).
Permutarea cutat p se obine prin inversarea ordinii ultimilor (n i) elemente
din acest vector, astfel nct ele s apar n ordine cresctoare.
Dac nu exist niciun indice i ca mai sus, nseamn c s-a ajuns la permutarea cea
mai mare n ordine lexicografic, adic la (n, (n 1), ..., 1) i algoritmul se termin.
De exemplu, pentru n=3 se obin permutrile:
(1, 2, 3); (1, 3, 2); (2, 1, 3);
(2, 3, 1); (3, 1, 2); (3, 2, 1).
n programul ce urmeaz metoda lexicografic este realizat cu ajutorul procedu-
rii GenerarePermutari.
Program P163;
{ Generarea permutrilor }
const nmax=100;
176
var P : Permutare;
n : 2..nmax;
Indicator : boolean;
i : integer;
{ cutarea indicelui i }
i:=n-1;
while P[i]>P[i+1] do
begin
i:=i-1;
if i=0 then
begin
{ un astfel de indice nu mai exist }
Indicator:=false;
goto 1;
end; { then }
end; {while }
{ cutarea indicelui k }
k:=n;
while P[i]>P[k] do k:=k-1;
177
begin
write(Dai n=); readln(n);
Indicator:=false;
repeat
GenerarePermutari(Indicator);
if Indicator then
for i:=1 to n do write(P[i] : 3);
writeln;
until not Indicator;
readln;
end.
178
Dac nu exist un indice i cu proprietatea menionat, nseamn c s-a ajuns
la aranjamentul (nm+1, nm+2, ..., n), deci procesul generrii s-a ncheiat. Pentru
a semnala acest lucru, n programul ce urmeaz se utilizeaz variabila boolean
Indicator.
Program P164;
{ Generarea aranjamentelor }
const nmax=100;
mmax=100;
var A : Aranjament;
D : array[1..nmax] of 0..1;
n : 1..nmax;
m : 1..nmax;
i : integer;
Indicator : boolean;
179
goto 1;
end; { if }
end; { for }
Indicator:=false;
1:end; { GenerareAranjamente }
begin
write(Dai n=); readln(n);
write(Dai m=); readln(m);
Indicator:=false;
repeat
GenerareAranjamente(Indicator);
if Indicator then
for i:=1 to m do write(A[i] : 3);
writeln;
until not Indicator;
readln;
end.
Program P165;
{ Generarea combinarilor }
const nmax=100;
mmax=100;
180
var C : Combinare;
n : 1..nmax;
m : 1..mmax;
i : integer;
Indicator : boolean;
begin
write(Dai n=); readln(n);
write(Dai m=); readln(m);
Indicator:=false;
repeat
GenerareCombinari(Indicator);
if Indicator then
for i:=1 to m do write(C[i] :3);
writeln;
until not Indicator;
readln;
end.
181
ntrebri i exerciii
Scriei un program PASCAL care afieaz la ecran numrul permutrilor Pn, numrul
aranjamentelor Amn i numrul combinrilor Cmn . Valorile n i m se citesc de la tastatur.
Elaborai o procedur recursiv pentru generarea tuturor permutrilor posibile ale mul-
imii I={1, 2, ..., n}.
Utiliznd metoda relurii, schiai trei algoritmi pentru generarea, respectiv, a permut-
rilor, aranjamentelor i combinrilor unei mulimi formate din n elemente distincte.
Se consider un tablou bidimensional T[1..n, 1..n] format din numere ntregi.
Elaborai un program care determin o permutare a coloanelor tabloului astfel nct
suma componentelor de pe diagonala principal s fie minim.
Elaborai un program care afieaz la ecran toate irurile posibile formate din caractere-
le A, b, C, d, E. Fiecare caracter apare n ir numai o singur dat.
Dintr-o list ce conine n candidai trebuie alese m persoane care vor fi incluse n echipa
de fotbal a unui raion. Elaborai un program care afieaz la ecran toate modalitile de
selecie a celor m persoane.
Se consider mulimea numerelor ntregi A={a1, a2, ..., an}. Elaborai un program care
determin o submulime ce conine exact m elemente ale mulimii A astfel nct suma
lor s fie maxim.
Cum credei, care snt avantajele i neajunsurile algoritmilor bazai pe generarea tuturor
permutrilor, aranjamentelor i combinrilor posibile?
Exist oare tehnici de programare care ar permite evitarea unei analize exhaustive a
tuturor permutrilor, aranjamentelor sau combinrilor posibile?
Se consider mulimea numerelor ntregi A={a1, a2, ..., an}. Elaborai un program care de-
termin o descompunere a mulimii A n dou submulimi nevide B i C astfel nct suma
elementelor din submulimea B s fie egal cu suma elementelor din submulimea C. De
exemplu, pentru A={4, 1, 0, 1, 2, 3, 9} avem B={4, 0, 9} i C={1, 1, 2, 3}.
182
Capitolul 7
PROBLEME RECAPITULATIVE
183
se calculeaz nsumnd coeficienii rij pentru toate perechile posibile (i, j) din cadrul
fiecrei echipe. Determinai compatibilitatea maxim Cmax care poate fi asigurat prin
formarea corespunztoare a echipelor.
9. Compasul. Se consider n puncte pe un plan cartezian. Fiecare punct i este spe-
cificat prin coordonatele sale xi, yi. Elaborai un program care verific dac se poate
desena o circumferin cu centrul n unul din punctele n studiu i care ar trece prin
toate celelalte puncte.
10. Intersecia dreptunghiurilor. Se dau n dreptunghiuri (n 10) care au laturile
paralele cu axele de coordonate, iar coordonatele vrfurilor snt numere naturale din
mulimea {0, 1, 2, ..., 20}. Elaborai un program care calculeaz aria figurii obinute
prin intersecia celor n dreptunghiuri.
11. Reuniunea dreptunghiurilor. Se dau n dreptunghiuri (n 10) care au latu-
rile paralele cu axele de coordonate, iar coordonatele vrfurilor snt numere reale.
Elaborai un program care calculeaz aria figurii obinute prin reuniunea celor n
dreptunghiuri.
12. Numere prime. Calculai toate numerele prime formate din 4 cifre inversul c-
rora este la fel un numr prim, iar suma cifrelor este de asemenea un numr prim.
13. Vizibilitate. Se consider linia frnt nchis P1P2 ... PnP1, n 20, care nu se
autointersecteaz. n punctul A din interiorul liniei este situat un observator. Pentru
observator unele segmente ale liniei frnte pot fi invizibile. Elaborai un program
care calculeaz numrul segmentelor invizibile.
14. Felinare. Un parc de form dreptunghiular este mprit n ptrate de ace-
leai dimensiuni. n fiecare ptrat al parcului poate fi instalat cte un felinar. n ge-
neral, un felinar asigur iluminarea nu numai a ptratului n care el se afl, dar i
a celor opt ptrate vecine. Elaborai un program care determin numrul minim de
felinare necesare pentru iluminarea parcului.
15. Laserul. Se consider o plac dreptunghiular cu dimensiunile mn, unde m
i n snt numere naturale. Aceast plac trebuie tiat n mn plci mai mici, fiecare
bucat avnd forma unui ptrat cu dimensiunile 11. ntruct placa este neomogen,
pentru fiecare bucat se indic densitatea dxy, unde x, y snt coordonatele colului
stnga-jos al ptratului respectiv.
Pentru operaiile de tiere se folosete un strung cu laser. Fiecare operaie de t-
iere include:
fixarea unei plci pe masa de tiere;
stabilirea puterii laserului n funcie de densitatea materialului de tiat;
o singur deplasare a laserului de-a lungul oricrei drepte paralele cu una din
axele de coordonate;
scoaterea celor dou plci de pe masa de tiere.
Costul unei operaii de tiere se determin dup formula c = dmax, unde dmax
este densitatea maxim a bucilor 11 peste marginile crora trece raza laserului.
Evident, costul total T poate fi determinat adunnd costurile individuale c ale tuturor
operaiilor de tiere necesare pentru obinerea bucilor 11. Scriei un program care
calculeaz costul minim T.
184
16. Judee. Teritoriul unei ri este mprit n judee (fig. 7.1). Pe hart, frontiera
rii i graniele administrative ale fiecrui jude reprezint cte un poligon definit
prin coordonatele (xi, yi) ale vrfurilor sale. Se presupune c vrfurile de poligoane
snt numerotate direct prin 1, 2, 3, ..., n, iar coordonatele lor snt numere ntregi. n
interiorul oricrui jude nu exist alte judee.
185
Fig. 7.2. Turn construit din plci dreptunghiulare
Exemplu:
TURNURI.IN TURNURI.OUT
5 8
3 4 2
3 4 3
4 3 2
1 5 4
2 2 1
Restricii: n 1000; xi, yi, hi < 1000. Timpul de execuie nu va depi 10 sec.
18. Speologie. Speologul este un specialist care se ocup cu explorarea i studie-
rea peterilor. Antrenarea speologilor presupune parcurgerea unor labirinturi sub-
terane. Un astfel de labirint const din n, n 100, peteri i coridoare (fig. 7.3). Fiecare
peter are o denumire individual format din cel mult 10 caractere alfanumerice,
fr spaii, scris pe unul din pereii ei. Petera de intrare are denumirea INTRARE,
iar cea de ieire denumirea IESIRE. La intrarea n fiecare coridor este scris denu-
mirea peterii spre care ea duce.
Speologul nu cunoate planul labirintului. n schimb, el este echipat cu un caiet,
un creion i o lantern, fapt ce i permite s poat citi denumirile de peteri sau de
coridoare i s fac notie. Vom numi drum o succesiune de peteri cu proprietatea
c ntre oricare dou peteri consecutive din succesiune exist un coridor. Prin lun-
gimea drumului nelegem numrul de peteri ce-l formeaz. De exemplu, drumul
INTRARE, STALAGMITE, LILIECI, IZVOARE, IESIRE are lungimea 5.
Elaborai un program care gsete unul dintre cele mai scurte drumuri de la pe-
tera INTRARE la petera IESIRE.
Date de intrare. Fiier de intrare nu exist. Totui caracteristica peterii curente
poate fi aflat prin apelul funciei predefinite UndeMaAflu de tip string. Funcia
returneaz un ir de caractere ce conine denumirea peterii n care n prezent se afl
speologul, dou puncte i denumirile de intrri de galerii, separate prin spaiu. De
exemplu, dac speologul se afl n petera LILIECI, funcia va ntoarce valoarea:
LILIECI: STALAGMITE IZVOARE LILIECI LILIECI
186
Fig. 7.3. Planul unei peteri
Trecerea speologului din petera curent n petera spre care duce galeria c se
realizeaz prin apelul procedurii predefinite TreciCoridorul(c), unde c este o
expresie de tip string. Dac se indic un coridor inexistent, speologul rmne pe
loc. Pentru ca aceste subprograme s fie accesibile, includei n partea declarativ a
programului de elaborat linia
uses LABIRINT;
Date de ieire. Fiierul text SPEOLOG.OUT va conine pe prima linie un numr
ntreg lungimea celui mai scurt drum. Pe urmtoarele linii se va scrie drumul.
Fiecare denumire de peter ocup o linie separat. Dac un astfel de drum nu exis-
t, fiierul va conine o singur linie cu cuvntul FUNDAC.
Exemplu. Pentru labirintul din figura 7.3 avem:
SPEOLOG.OUT
4
INTRARE
STALACTITE
IZVOARE
IESIRE
187
20. Discoteca. La o discotec particip mai multe persoane, numerotate de la 1
la n. Iniial, numai un singur participant, cel cu numrul i, cunoate o tire foarte
important pe care el o comunic prietenilor si. n continuare, orice participant
j, care deja cunoate aceast tire, o comunic, de asemenea, numai prietenilor si.
Elaborai un program care determin numrul de participani p care vor afla tirea
respectiv. Relaia de prietenie este definit prin m perechi distincte de tipul {j, k}
cu semnificaia participanii j, k snt prieteni. Se consider c 3 n 1000 i
2 m 30000.
21. Genistul. O poriune de drum este mprit n n segmente. Pe fiecare seg-
ment poate fi plantat cel mult o min. Genistul a memorat informaia despre minele
plantate ntr-un tablou unidimensional M = ||mi||, n care mi = 1 dac segmentul i
conine o min i mi = 0 n caz contrar. Pentru orice eventualitate, genistul a cifrat in-
formaia din tabloul M ntr-un alt tablou C = ||ci||n componentele cruia se determin
dup cum urmeaz:
pentru
pentru
pentru
188
Date de intrare. Fiierul text CUTII.IN conine pe prima linie numrul natural n.
Fiecare din urmtoarele n linii conine cte trei numere naturale xi, yi, zi separate prin
spaiu.
Date de ieire. Fiierul text CUTII.OUT va conine pe o singur linie numrul na-
tural kmax.
Exemplu:
CUTII.IN CUTII.OUT
5 3
4 4 4
1 3 5
2 2 3
1 1 1
1 1 2
Restricii: 2 n 500; 1 xi, yi, zi 30 000. Timpul de execuie nu va depi 2 se-
cunde.
189
Bibliografie
1. Cerchez Emanuela, erban Marinel. Informatic. Manual pentru clasa a X-a. Filiera
teoretic, profilul matematic-informatic. Iai: Editura POLIROM, 2000, 200 p.
2. Cerchez Emanuela. Informatic. Culegere de probleme pentru liceu. Iai, Editura
POLIROM, 2002, 240 p.
3. Galatan Suzana, Ghinea Diana, ntuneric Ana, Radu Stefana. Ghid de pregtire
pentru BAC. Informatic. Intensiv. Pascal C/C++. Bucureti, Editura Sigma, 2009,
539 p.
4. Giumale Cristian. Un atelier de programare. Cluj-Napoca. Editura Computer
Libris AGORA, 2000, 382 p.
5. Giumale Cristian. Introducere n analiza algoritmilor. Iai, Editura POLIROM,
2004, 456 p.
6. Gremalschi Anatol, Mocanu Iurie, Spinei Ion. Informatic. Limbajul PASCAL.
Manual pentru clasele IX-XI. Chiinu, Editura tiina, 2003, 256 p.
7. Ivac Cornelia., Prun Mona. Bazele informaticii (Grafuri i elemente de combi-
natoric). Proiect de manual pentru clasa a X-a. Profil informatic. Bucureti, Editura
Petrion, 1995, 175 p.
8. Livovschi Leon, Georgescu Horia. Sinteza i analiza algoritmilor. Bucureti, Editura
tiinific i Pedagogic, 1986, 458 p.
9. Moraru Florin. Bacalaureat. Informatic. Bucureti, Editura Petrion, 2000, 319 p.
10. Negreanu Dan. Probleme de matematic rezolvate cu calculatorul. Bucureti,
Editura Teora, 1998, 214 p.
11. Roca Ion Gh., Cocianu Ctlina, Uscatu Cristian. Bazele informaticii. Manual
pentru clasa a X-a, licee teoretice. Bucureti, Editura ALL EDUCAIONAL, 1999,
64 p.
12. Roca Ion Gh., State Luminia, Ghilic-Micu Bogdan, Cocianu Ctlina-Luca, Stoica
Marian, Uscatu Cristian. Informatic. Manual pentru clasa a 10-a. Profilul matemati-
c-informatic. Bucureti, ALL EDUCAIONAL, 2000, 96 p.
13. Sorin Tudor. Informatic (Tehnici de programare). Manual pentru clasa a X-a.
Varianta Pascal. Bucureti, Editura L&S INFOMAT, 2000, 188 p.
14. Thomas H. Cormen, Charles E. Leiserson, Ronald R. Rivest. Introducere n algo-
ritmi. Cluj-Napoca, Editura Computer Libris AGORA, 2000, 881 p.
15. ., , .
. . . : . . .: , 2003, 384 .
16. . Turbo PASCAL. . , Prut
International, 2007, 232 .
17. ., + = , .,
, 1985, 243 .
18. . , ., , 1989,
350 .
190
19. ., ., . . -
. , 2000, 270 .
20. .. -
: . .: , 2006, 366 .
21. ., . , . .,
, 1989, 255 .
22. .. -
: , .: .
, 2012, 272 .
23. .. . .: .
, 2004, 341 .
24. .. . .: . -
, 2008, 231 .
25. . .., .., .. -
. .: , 2006, 256 .
26. .., .. -
. .: , 2012, 400 .
27. .., .., .. . 2 . . 2:
11 . .: , 2008, 271 .
191
Acest manual este proprietatea Ministerului Educaiei al Republicii Moldova.
Liceul/gimnaziul __________________________________________________________
Manualul nr. _____________________________________________________________
Nr. Numele de familie i prenumele Aspectul manualului
crt. elevului Anul colar
la primire la restituire
1.
2.
3.
4.
5.