Sunteți pe pagina 1din 292

CORINT

E D U C A I O N A L

CORINT
E D U C A I O N A L
CORINT
E D U C A I O N A L
Manualul a fost aprobat prin Ordinul ministrului Educa]iei [i Cercet\rii nr. 4446 din 19.06.2006 n urma
evalu\rii calitative organizate de c\tre Consiliul Na]ional pentru Evaluarea [i Difuzarea Manualelor [i
este realizat n conformitate cu programa analitic\ aprobat\ prin Ordin al ministrului Educa]iei [i
Cercet\rii nr. 3252 din 13.02.2006.
MIOARA GHEORGHE profesor gradul I la Colegiul Na]ional Mihai Viteazul din Bucure[ti, metodist ISMB, mem-
bru n comisii la olimpiade [i concursuri de informatic\, autor de manuale [i auxiliare [colare de informatic\ pentru
gimnaziu [i liceu, printre care: Informatica pas cu pas, ap\rut\ la Editura Corint, Informatic\, manuale pentru clasa
a IX-a [i pentru clasa a X-a [i Tehnologia informa]iei [i a comunic\rii, manuale pentru clasa a IX-a [i a X-a.
Conf. Dr. MONICA T|T|RM, Catedra Fundamentele informaticii, Facultatea de Matematic\ [i Infor-
matic\, Universitatea Bucure[ti, cu preocup\ri n domeniile: Crearea aplica]iilor pentru soft educa]ional
cu VBA [i VB, Metodica pred\rii informaticii, algoritmic\ [i programare, Tehnici de proiectare, Analiza
[i proiectarea sistemelor. Autor a numeroase c\r]i, manuale [i articole de specialitate n publica]ii de
referin]\ din ]ar\ [i str\in\tate.
CORINA ACHINCA profesor gradul II la Colegiul Na]ional de Informatic\ Tudor Vianu din Bucure[ti.
Autor de auxiliare [colare pentru liceu, membru `n comisii la concursurile na]ionale de informatic\.
CONSTAN}A N|STASE profesor grad I la Colegiul Na]ional I.L. Caragiale din Bucure[ti, coautor de
manuale [i auxiliare [colare pentru liceu [i pentru examenul de bacalaureat, de ghiduri metodice
pentru profesorii de informatic\.
Referen]i:
Prof. Dr. Ioan Tomescu, membru al Academiei Romne, [eful Catedrei de informatic\, Facultatea de
Matematic\ [i informatic\, Universitatea Bucure[ti.
Prof. gradul I Doina Dru]\, metodist Inspectoratul {colar al Municipiului Bucure[ti.
Contribu]ia autorilor:
Mioara Gheorghe coordonator + capitolele 1, 4
Monica T\t\rm capitolul 2, Anexe
Corina Achinca capitolul 4
Constan]a N\stase capitolele 2.6, 3

Descrierea CIP a Bibliotecii Na]ionale a Romniei


Informatic\: manual pentru clasa a XI-aa / Mioara Gheorghe (coord.), Monica T\t\rm,
Corina Achinca, Constan]a N\stase. Ed. a 3-a. Bucure[ti: Corint, 2008
Bibliogr.
ISBN 978-973-135-353-1
I. Gheorghe, Mioara (coord.)
II. T\t\rm, Monica
III. Achinca, Corina
IV. N\stase, Constan]a
004(075.35)
004(075.35)

Redactare: Sorin Petrescu


Tehnoredactare [i procesare computerizat\: Dana Diaconescu
Coperta: Valeria Moldovan
Pentru comenzi [i informa]ii, contacta]i:
GRUPUL EDITORIAL CORINT
Departamentul de vnz\ri: Str. Mihai Eminescu, nr. 54A, sector 1, Bucure[ti, cod po[tal 010517
Tel./Fax: 021.319.47.97; 021.319.48.20
Depozit: Calea Plevnei nr. 145, sector 6, Bucure[ti, cod po[tal 060012, Tel.: 021.310.15.30
E-mail: vanzari@edituracorint.ro; Magazin virtual: www.edituracorint.ro
ISBN 978-973-135-353-1
Toate drepturile asupra acestei lucr\ri sunt rezervate Editurii CORINT,
parte component\ a GRUPULUI EDITORIAL CORINT.
1
Capitolul
STRUCTURI DE DATE

1. ORGANIZAREA DATELOR

STUDIU DE CAZ Compania Eficient

Pentru reducerea cheltuielilor cu amenajarea spaiilor comerciale, reclam i personal,


compania Eficient selecteaz tineri distribuitori, absolveni de liceu. Oferta companiei este
foarte atrgtoare; de aceea, numrul solicitanilor depete numrul de posturi oferite (n).
Selecia candidailor se face n ordinea nregistrrii scrisorii de intenie i a CV-ului. Dosarele
candidailor sunt pstrate ntr-un fiet, unul peste altul, n ordinea angajrii. Periodic, com-
pania trimite un angajat la cursuri de formare; este trimis ntotdeauna, ultimul angajat (fig. 1).
Angajaii sunt pltii n funcie de numrul de produse distribuite (vndute) zilnic.
Sptmnal, managerul companiei ine evidena pe zile a produselor distribuite de fiecare
angajat. n orice moment, managerul poate determina
angajatul cu cea mai bun activitate ntr-o zi sau ziua n Cursuri
care a fost distribuit cel mai mic numr de produse. La
sfritul sptmnii, dup ce aplic bonusuri sau pena-
lizri, managerul centralizeaz aceste date ntr-un re- An Selecie
gistru de eviden a vnzrilor realizate de ctre fiecare
angajat. A3 C1
Managerul companiei dorete s prelucreze cu calcu- C2
latorul datele pentru selecia candidailor, evidena anga- A2
jailor i evidena vnzrilor. C n
A1
primul angajat candidat nou
Figura 1
1.1. Analiza problemei

datele despre candidai; din CV-ul fiecrui candidat vor fi reinute urmtoarele informaii:
numele,
anul naterii,
media la examenul de bacalaureat;

3
L Ma Mi J V S D selecia candidailor se face n ordinea nregistrrii
A1 datelor personale;
A2
An
dup examinarea unui candidat (selecie), datele aces-
tuia nu mai sunt necesare; va intra n selecie candidatul
urmtor;
Evidena sptmnal

Figura 2 ntotdeauna, datele unui nou candidat sunt aezate dup


datele ultimului candidat care ateapt pentru selecie;

datele angajailor sunt pstrate ntr-o ordine care s


permit numirea rapid a ultimului angajat n vederea
trimiterii sale la cursuri;

centralizarea pentru evidena sptmnal a vnzrilor, se reine


vnzrilor
numrul de produse distribuite (vndute) zilnic de ctre

A1

A2 . . . . . . . . . . . . . . . . . An
fiecare angajat (fig. 2);

pentru evidena centralizat a vnzrilor, totalul


vnzrilor realizate ntr-o sptmn de fiecare angajat se
angajai adaug la vnzrile realizate de acel agajat pn la
Figura 3
momentul respectiv (fig. 3).

1.2. Solu]ia problemei

problema propus de managerul companiei Eficient necesit prelucrri matematice cu un grad


mic de dificultate: centralizarea sptmnal, prin nsumare, a valorilor reprezentnd
vnzrile realizate de ctre fiecare angajat;
datele specifice problemei trebuie organizate avantajos, astfel nct folosirea calculatorului s
nlocuiasc fietele sau mapele n care sunt pstrate dosarele candidailor/angajailor i s
respecte cerinele de ateptare sau prioritate specifice problemei.

1.3. Organizarea datelor

Din analiza problemei urmrind semnificaia i complexitatea datelor, rezult dou cate-
gorii de date:
date elementare, spre exemplu: numrul de produse vndute de un angajat la un moment dat;
date grupate (structurate):
date cu aceeai semnificaie (de acelai tip) numite i date omogene , spre exemplu: evi-
dena sptmnal a vnzrilor pe zile i angajai, evidena vnzrilor pe angajai, datele despre
toi angajaii/candidaii;

4
date cu semnificaii diferite numite i date neomegene spre exemplu, datele prin care
este descris o persoan (candidat sau angajat): nume, an, medie.

De reinut!
O persoan este descris prin mai multe tipuri de date, ceea ce determin aspectul
neomogen al grupului de date.

Candidaii sau angajaii formeaz grupuri de acelai tip persoan de unde rezult
aspectul omogen al acestui grup de date.

Din analiza problemei urmrind restriciile de intrare-ieire (ateptare sau prioritate),


dup care sunt organizate datele dintr-un grup (structur), rezult dou categorii de date:
date organizate dup disciplina specific unei cozi sau fir de ateptare; spre exemplu, can-
didaii care ateapt pentru selecie. ntr-o astfel de structur, ntotdeauna, un element nou
este aezat (intr) dup ultimul element. Dintr-o astfel de structur, iese, ntotdeauna,
primul element n exemplul nostru, candidatul aflat la rnd.
date organizate dup disciplina specific aezrii obiectelor unul peste altul, n stiv; spre
exemplu, dosarele angajailor. ntr-o astfel de structur, ntotdeauna, un element nou este
aezat deasupra celorlalte, n vrful stivei. Dintr-o astfel de structur, iese, ntotdeauna, ele-
mentul din vrful stivei n exemplul nostru, va fi prelucrat dosarul ultimului angajat.

Concluzie
organizarea datelor specifice unei probleme se poate face n locaii de memorie inde-
pendente date elementare sau n locaii grupate structuri de date;
structurile de date pot fi:
structuri omogene (date cu aceeai semnificaie/tip),
structuri neomegene (date cu semnificaii/tipuri diferite);
structurile omogene se numesc tablouri;
ntr-un tablou, datele pot fi organizate astfel:
dup un singur criteriu tablouri unidimensionale sau vectori; spre exemplu,
tabloul pentru evidena vnzrilor realizate de fiecare angajat,
dup dou criterii tablouri bidimensionale sau matrice; spre exemplu, tabloul
pentru evidena vnzrilor realizate zilnic (criteriul 1 zilele sptmnii) de ctre fiecare
angajat (criteriul 2 angajaii);
ntr-un tablou unidimensional, datele pot fi organizate astfel nct s respecte o disci-
plin de intrare/ieire de tip coad sau stiv;
structurile neomogene se numesc articole sau nregistrri; mai multe articole care
descriu aceeai entitate (obiect, persoan etc.) reprezint un grup de date cu aceeai
semnificaie i poate fi organizat ntr-o structur omogen de tip tablou unidimensional
(vector de articole).

5
# TEME
1. Explicai deosebirea dintre analiza datelor din punct de vedere al complexitii i analiza
datelor din punct de vedere al regulilor de organizare (intrare/ieire) ntr-o structur (grup de
date).
2. Formulai un exemplu care s evidenieze diferena dintre datele omogene i datele
neomegene.
3. Formulai un exemplu care s necesite organizarea dup mai multe criterii a datelor cu aceeai
semnificaie.
4. Formulai un exemplu care s necesite organizarea datelor cu aceeai semnificaie n structuri
de tip coad.
5. Formulai un exemplu care s necesite organizarea datelor cu aceeai semnificaie n structuri
de tip stiv.
6. Explicai disciplina structurii de date de tip coad (FIFO First Input First Output = primul
intrat, primul ieit).
7. Explicai disciplina structurii de date de tip stiv (LIFO Last Input First Output = ultimul
intrat, primul ieit).
8. Formulai exemple de oganizare a datelor dup alte reguli dect cele specifice structurilor de
tip coad sau stiv.

TEM de GRUP
Densitatea straturilor geologice
Un grup de geologi studiaz densitatea straturilor geologice. n acest scop, s-a extras
cte o prob pentru fiecare dintre cele n straturi geologice studiate. Fiecare prob este
transmis la un laborator specializat; pentru fiecare prob se fac mai multe teste, cel mult
m. ntruct nu exist suficiente aparate, analiza de laborator dureaz. La sfritul activitii,
geologii pstreaz probele n ordinea naturl a straturilor geologice (fig. 4). Rezultatele
testelor se pstreaz astfel nct s se poat determina, cu uurin:
zcmntul la care s-au obinut aceleai valori la toate testele;
zcmntul cu cea mai mare densitate medie la cele m teste;
zcmntul la care s-a obinut cea mai mare diferen ntre densitatea maxim i den-
sitatea minim din cele m teste.

Cerine:

1. Identificai formele de organizare a datelor specifice problemei propuse.

2. Fiecare membru al grupului descrie una dintre formele de organizare a datelor identi-
ficate (justificare, necesitate, proprieti, prelucrri specifice i alte aspecte).

6
3. Grupul compune un scenariu pentru prelucrarea cu calculatorul a datelor specifice
acestei probleme; scenariul poate fi prezentat narativ sau organizat pe secvene (pai).
4. Grupul realizeaz o prezentare PowerPoint care s ajute la susinerea temei.

probe arhivarea probelor

n 2 1
teste
1 2 3...... m
Analiza de laborator

1 1
2
2
n 1
n 2
3
3
2
1 n

Figura 4

SUGESTIE DE PREZENTARE:
Prezentrile pot fi expuse i analizate n laboratorul de Informatic; se va urmri corecti-
tudinea rezolvrii, creativitatea prezentrii i eficiena lucrului n grup.

7
2. ORGANIZAREA DATELOR CU ACEEAI SEMNIFICAIE
N TABLOURI BIDIMENSIONALE

APLICAIA 1 FLOARE DE COL


Membrii clubului Floare de col particip la o tabr de var, timp de o sptmn,
ntr-o zon montan greu accesibil. Scopul lor este s nregistreze n fiecare zi temperatura
aerului i s determine temperatura minim, temperatura maxim i zilele n care s-au atins
aceste temperaturi.

1. Analiza problemei
Date de intrare Date de ieire
7 valori reprezentnd temperatura temperatura minim (tmin);
nregistrat n fiecare zi a sptmnii temperatura maxim (tmax);
ziua/zilele n care s-au atins tmin i tmax.
2. Organizarea datelor
Datele de intrare au aceeai semnificaie i vor fi nregistrate ntr-un vector (T) cu 7 elemente.
De exemplu: T 18 15 12 14 18 15 12

tmin = 12 nregistrat miercuri i duminic


tmax = 18 nregistrat luni i vineri

3. Raionamentul problemei
Se nregistreaz temperaturile zilnice n vectorul T. Se determin, printr-o singur parcurge-
re, valoarea minim i cea maxim.
Pentru afiarea zilei/zilelor se mai fac dou parcurgeri ale vectorului. Ziua va fi afiat ca
indice (1, 2 etc.). Pentru afiarea zilei prin nume (luni, mari etc.) se recomand introducerea
structurii selective dup zi.

4. Reprezentarea algoritmului
nceput temperaturi1
aloc T[7]
pentru zi = 1, 7 execut citete T[zi] sfrit pentru
tmin T[1]
tmax T[1]
pentru zi = 2, 7 execut
bloc
dac T[zi] < tmin atunci tmin T[zi]
sfrit dac
dac T[zi] > tmax atunci tmax T[zi]
sfrit dac
sfrit bloc

8
sfrit pentru
scrie tmin
pentru zi = 1, 7 execut
dac T[zi] = tmin atunci scrie zi
sfrit dac
sfrit pentru
scrie tmax
pentru zi = 1, 7 execut
dac T[zi] = tmax atunci scrie zi
sf dac
sfrit pentru
sfrit temperaturi1

APLICAIA 2 FLOARE DE COL


Msurarea temperaturii aerului n zonele greu accesibile a fost foarte apreciat de ecolo-
giti. Numrul voluntarilor dornici s participe la astfel de aciuni a crescut. Instructorul
clubului a organizat zece echipe care s msoare temperatura zilnic n diverse zone de
interes.
Prelucrarea valorilor nregistrate se va face astfel:
se afieaz temperatura minim i temperatura maxim nregistrate n cele zece zone
pe parcursul sptmnii;
se afieaz temperatura medie, pentru oricare dintre zone, la solicitarea celui interesat;
se afieaz zona n care s-a atins cea mai mic, respectiv cea mai mare temperatur,
pentru orice zi a sptmnii solicitat de cel interesat.

T
1. Analiza problemei
Datele problemei au aceeai 1 21
semnificaie temperatura zil- 2 18
nic , dar se refer la zone
3 18 15 12 14 18 15 12
diferite; de aceea, pentru organi-
zarea lor se introduce i criteriul 4 16
zon. Rezult un tablou (T) cu Zona
5 17
dou dimensini: zona (linie) i
6 19
ziua (coloan) (fig. 5).
7 20
8 20
9 17
10 18
Figura 5 1 2 3 4 5 6 7
Ziua

9
Cum organizm datele n tablouri

1. Dac ntr-o problem este necesar memorarea mai multor valori cu aceeai sem-
nificaie, aceste valori vor fi grupate ntr-un ansamblu de tip tablou.
2. n funcie de cerinele problemei i de semnificaia datelor, acestea sunt organi-
zate n tablouri cu o singur dimensiune, numite vectori, sau n tablouri cu dou
dimensiuni, numite matrice.
3. Elementele unui tablou se identific printr-o adres format din numele tabloului
i cte un indice pentru fiecare dimensiune.
4. La tablourile cu dou dimensiuni, primul indice din adres reprezint linia, iar cel
de-al doilea coloana tabloului.
5. Operaiile care se repet pentru fiecare element din tablou pot fi grupate n struc-
turi repetitive cu contor. Contorul genereaz chiar indicele de adres.

3. IMPLEMENTAREA TABLOURILOR BIDIMENSIONALE

Pentru memorarea i prelucrarea datelor organizate ca tablouri bidimensionale, nainte de


scrierea unui program trebuie s cunoatem urmtoarele elemente:
tipul elementelor din tablou (datele cu aceeai semnificaie),
numrul maxim de elemente din tablou (capacitatea tabloului).

capacitatea tabloului = nrmax _linii * nrmax _coloane

Aceste elemente rezult din analiza problemei i sunt folosite de compilator pentru deter-
minarea zonei de memorie alocat tabloului.

1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7

linia 1 linia 2 ................. linia 10


coloan

Figura 6 Liniarizarea tabloului bidimensional

Tabloul ocup n memoria calculatorului o suprafa (array) compus din locaii nvecinate
(adiacente). n fiecare locaie este memorat valoarea unui element. Adresa locaiilor ncepe de
la o valoare de referin specific limbajului de programare (corespunztoare primei linii) i se
construiete prin valori succesive (corespunztoare coloanelor de pe linie), pentru fiecare ele-
ment din tablou. n memoria calculatorului, tabloul este liniarizat: elementele sunt memorate n
locaii adiacente, n ordinea liniilor (fig. 6). Adresarea unui element se face printr-o pereche de
indici corespunztori liniei i coloanei pe care se afl elementul respectiv.

10
n consecin, tipul variabilelor folosite ca indice de adres trebuie s accepte valori n
domeniile:
(1) [valoare de referin, nrmax-linii] pentru indicele de linie i
(2) [valoare de referin, nrmax-coloane] pentru indicele de coloan.
Adresarea elementelor se face, cel mai frecvent, prin dou structuri repetitive cu contor,
imbricate:

pentru indice_linie = valoare-de referin la nr-linii execut


pentru indice_coloana = valoare-de referin la nr-coloane execut
// prelucrarea elementelor din tablou n ordinea aezrii pe linii
sfrit pentru
sfrit pentru 8
7
Pentru indicele de linie sau indicele de coloan, se pot folosi 6
tipuri diferite de date, ceea ce permite o referire asemntoare cu 5
cea ntlnit la jocul de ah; spre exemplu: T[2][C] reprezint 4
3
elementul de pe tabla de ah aflat pe linia 2 n coloana C (fig. 7).
2
1
A B C D E F G H

Elementele de sintax specifice tablourilor bidimensionale Figura 7


sunt prezentate n Tabelul 1.

Tabelul 1. Tablouri bidimensionale elemente de sintax


PASCAL C / C++
Declararea tabloului
var tablou array [1...nl, 1..nc] of tipelement; tipelement tablou[ nl ][nc];
Declararea indicelui de adres
var l,c:tipindice; tipindice l,c;
Adresarea unui element din tablou
tablou [l,c] tablou [l][c ]
adresa de referin este 1. adresa de referin este 0.
Exemplu: pentru tabloul temperaturi cu 100 de elemente de tip ntreg distribuite pe 10 linii
i 10 coloane: se iniializeaz cu zero elementele de pe primele 5 linii
var temperaturi : array [1..10,1..10] of integer; int temperaturi [10] [10];
l,c: byte; short l,c;
begin {
for l:=1 to 5 do for (l=0; i< 5; i++)
for c:=1 to 10 do for (c=0; i< 10; i++)
temperaturi [l,c] =0;
end temperaturi [l][c]=0;
}

11
Datele organizate n tablouri bidimensionale sunt prelucrate element cu element. Iat cteva
dintre cele mai frecvente prelucrri:
introducerea valorilor direct de la tastatur sau dintr-un fiier;
afiarea valorilor pe ecran sau ntr-un fiier;
verificarea unor proprieti;
compararea valorilor (aflarea elementului maxim sau minim);
simularea unor situaii reale.

Tabelul 2. Operaii la nivel de matrice


PASCAL C / C++
A. Introducera valorilor n ordinea pe linii
var A: array[1..10, 1..10] of integer; int A [10] [10] ;
l,c,m,n : byte; int l,c,m,n ;
begin {
write ( numarul de linii=); readln (m); cout<< numarul de linii= ; cin>>m;
write ( numarul de coloane=); readln (n); cout<< numarul de coloane= ; cin>>n
for l:=1 to m do for ( l=0; l< m; l++)
for c:=1 to n do for ( c=0; c< n; c++)
readln (A[l,c]); cin >>A[l][c];
end; }
B. Afiarea valorilor n ordinea pe coloane
se pstreaz declaraiile de la secvena A
begin
for c:=1 to n do for ( c=0; c< n; c++)
begin {
writeln; cout<<endl;
for l:=1 to m do for ( l=0; l< m; l++)
write (A[l,c], ); cout <<A[l][c]<< ;
end; }
end;
C. Determinarea elementului minim de pe o linie oarecare, k
se pstreaz declaraiile de la secvena A
var k:byte; min: integer; int k, min;
begin {
write (specificati linia=); readln (k); cout<< specificati linia= ; cin>>k;
min := A[k,1]; min=A[k][0];
for c:=2 to n do for ( c=1; c< n; c++)
if A[k,c] < min then if A[k][c] < min
min:= A[k,c]; min= A[k][c];
write (min. de pe linia, k, =, min); cout<<min. de pe linia<<k<<=<<min;
end; }

12
PASCAL C / C++
D. Simularea unor situaii reale.
Exemplu: memorarea relaiilor de prietenie dintre membrii unui grup de n persoane (n<=10)
var R : array [1..10, 1..10] of byte; int R[10] [10] ;
l,c,i,j,d,n : byte; int l,c,i,j,d=1,n ;
begin {
write ( numarul de persoane=); cout<< numarul de persoane= ; cin>>n;
readln (n); while (d)
d:=1; {
repeat cout<<prietenie intre: ; cin>>i>>j;
write (prietenie intre: ); readln (i,j); // relatia de prietenie este reciproca
{relatia de pritenie este reciproca} R[i][j]=1; R[j][i]=1;
R[i,j] :=1; R[j,i] :=1; cout<< mai sunt prieteni? ; cin>>d;
write (mai sunt prieteni? ); // da (d=1)/ nu (d=0)
readln (d); }
{ da (d=1)/ nu (d=0)} for ( l=0; l< n; l++)
until d=0; {
for l:=1 to n do cout<<endl;
begin for ( c=0; c< n; c++)
writeln; cout>>R[l][c]<< ;
for c:=1 to n do }
write (R[l,c], ); }
end;
end;

Relum aplicaia Floare de col


Din analiza problemei, a reieit necesitatea organizrii datelor ntr-un tablou bidimensional.
Continum rezolvarea problemei.
2. Raionamentul problemei
Pentru determinarea temperaturii minime i a temperaturii maxime nregistrate n cele zece
zone, pe parcursul sptmnii, se prelucreaz toate elementele din tablou.
Pentru determinarea temperaturii medii, tmed, se solicit zona i se prelucreaz doar ele-
mentele de pe linia corespunztoare.
Pentru determinarea zonei n care s-a atins temperatura minim sau maxim, se solicit ziua
i se prelucreaz doar coloana corespunztoare.

13
3. Reprezentarea algoritmului
nceput temperaturi2 scrie zona, tmed
aloc T[10, 7] scrie ce zi v intereseaz?
pentru zona = 1, 10 execut citete zi
pentru zi = 1, 7 execut tmin T[1, zi]
citete T[zona, zi] zmin 1
sfrit pentru tmax T[1, zi]
sfrit pentru zmax 1
tmin T[1, 1] pentru zona = 2, 10 execut
tmax T[1, 1] bloc
pentru zona = 1, 10 execut dac T[zona, zi] < tmin
pentru zi = 1, 7 execut atunci
dac T[zona, zi] < tmin bloc
atunci tmin T[zona, zi] tmin T[zona, zi]
sfrit dac zmin zona
dac T[zona, zi] > tmax sfrit bloc
atunci tmax T[zona, zi] sfrit dac
sfrit dac dac T[zona, zi] > tmax
sfrit pentru atunci
sfrit pentru bloc
scrie tmin tmax T[zona, zi]
scrie tmax zmax zona
scrie ce zon v intereseaz? sfrit bloc
citete zona sfrit dac
tmed 0 sfrit bloc
pentru zi = 1, 7 execut sfrit pentru
tmed tmed + T[zona, zi] scrie zmin, tmin, zi
sfrit pentru scrie zmax, tmax, zi
tmed tmed/7 sfrit temperaturi2

# TEME
1. La cabinetul medical, se calculeaz nlimea medie a tuturor bieilor din coal. Precizai
care este forma de organizare a datelor corespunztoare acestei situaii.
2. La cabinetul medical, se calculeaz nlimea medie a tuturor bieilor din coal, pe grupe de
vrst (ani de studiu). Precizai care este forma de organizare a datelor corespunztoare aces-
tei situaii.
3. La cabinetul medical, se calculeaz nlimea medie a tuturor bieilor din coal pe grupe de
vrst (ani de studiu), pentru fiecare clas n parte (9A,..., 12 C,...). Precizai care este forma
de organizare a datelor corespunztoare acestei situaii.
4. Administratorul unui bloc cu 12 etaje i 20 de apartamente pe etaj calculeaz cheltuielile de
ntreinere, n funcie de numrul de persoane din fiecare apartament (toate apartamentele au
acelai numr de camere).
14
Realizai un program care s rspund urmtoarelor cerine:
a) nregistrarea numrului de persoane din fiecare apartament, pe etaje, de la parter pn la
ultimul etaj;
b) afiarea numrului de persoane din fiecare apartament, pe etaje, de la ultimul etaj pn la parter;
c) cunoscnd numrul unui apartament, introdus de la tastatur, s se afieze etajul la care se
afl apartamentul i numrul de persoane care locuiesc n apartamentul respectiv.
5. Se consider tabloul M cu urmtoarele elemente:
1 2 3 4 Precizai ce valori afieaz secvena de mai jos:
5 6 7 8 pentru c = 1, 3 execut
9 10 11 12 pentru l = 1, 2 execut
scrie M[l, c]
sfrit pentru
sfrit pentru

a) 1, 5, 9, 2, 6, 10, 3, 7, 11; b) 1, 2, 3, 5, 6, 7; c) 1, 5, 2, 6, 3, 7.
6. Ce realizeaz urmtoarea secven de operaii:
aloc M[10, 10]
pentru i = 1, 10 execut
M[i, i] i
sfrit pentru
a) atribuie valori de la 1 la 10 elementelor din vectorul M;
b) atribuie fiecrui element de pe diagonala matricei M o valoare egal cu linia pe care aces-
ta se afl;
c) atribuie valori de la 1 la 10 primelor 10 elemente din matricea M.
7. Care dintre urmtoarele secvene de operaii memoreaz n colurile matricei M valori citite
de la tastatur; matricea are 5 linii i 5 coloane.
a) pentru i = 1, N execut b) pentru i = 1, 5 execut
pentru j = 1, N execut pentru j = 1, 5 execut
citete M[i, j] dac (i = 1) i (j = 5)
sfrit pentru atunci citete M[i, i]
sfrit pentru altfel citete M[j, j]
sfrit dac
sfrit pentru
sfrit pentru
c) l 1 d) l 1
c5 c5
pentru x = 1, 4 execut citete M[l, l], M[l, c], M[c, l], M[c, c]
citete M[l, c]
cl
lc
sfrit pentru
15
4. TABLOURI BIDIMENSIONALE CAZURI PARTICULARE

Matrice p\trat\
Rezolvarea problemelor cu calculatorul necesit 1 2 3 4 5
G ds
gsirea soluiilor de organizare i memorare a datelor,
astfel nct acestea s pstreze semnificaiile reale att 1 50 10
din punct de vedere al valorilor proprii, ct i al relai- 2 30
ilor cu alte date. Spre exemplu, dac membrii unui 3
grup (persoane) mprumut bani unii de la alii,
intereseaz att suma de bani primit/datorat, ct i 4 60 10
cine/de la cine a mprumutat. n acest caz, dac n 5 5
grup sunt n persoane, un tablou bidimensional, G, cu dp
n linii i n coloane, este suficient pentru pstrarea att
a valorilor mprumutate, ct i a relaiilor de mpru- Figura 8
mut (fig. 8).

Fiecare element din tablou reprezint valoarea unui mprumut; liniile i coloanele reprezint
persoanele din grup care dau bani unei alte persoane sau primesc bani de la alt persoan din
grup. Fie i i j dou persoane: G[i,j] reprezint suma de bani pe care i-a mprumutat-o lui j, adic
suma de bani pe care j a primit-o de la i. Pentru exemplul din figura 8, G[4,2] reprezint suma
de 60 lei pe care persoana 4 a mprumutat-o persoanei 2.
Tabloul folosit are o particularitate: numrul de linii este egal cu numrul de coloane, de
aceea este numit tablou ptrat sau, mai simplu, matrice ptrat.
ntr-o matrice ptrat deosebim urmtoarele elemente specifice (fig. 8):
diagonala principal (dp);
diagonala secundar (ds);
triunghiurile formate de cele dou diagonale;
direciile paralele cu fiecare dintre cele dou diagonale.

Matrice binar\
Relum situaia grupului de persoane care 1 2 3 4 5
G
mprumut bani unii de la alii, dar urmrim numai
relaia de mprumut: cine/de la cine a primit bani. n 1 0 0 1 0 1
acest caz, nu se mai pstreaz valoarea mprumutu- 2 1 0 0 0 0
lui. Fie i i j dou persoane: G[i,j] are semnificaia i 3 0 0 0 0 0
a mprumutat bani lui j echivalent cu j a primit bani
de la i (fig. 9). Elementele matricei nu pot avea dect 4 0 1 0 0 1
dou valori alese convenional (spre exemplu 0 sau 1), 5 0 0 1 0 0
cu semnificaia:

1 dac i mprumut bani lui j Figura 9


G[i,j] =
0 dac i nu mprumut bani lui j

16
Matricea ale crei elemente au valori n mulimea {0,1}, cu semnificaii logice comple-
mentare, se numete matrice binar.

Matrice simetric\
Dac n grupul de n persoane urmrim relaiile de prietenie, acestea pot fi memorate tot ntr-o
matrice binar ale crei elemente au urmtoarea semnificaie:
1 dac i este prieten cu j
P[i,j] =
0 dac i nu este prieten cu j
P 1 2 3 4 5

1 1 1
2 1 1
3 1 1 1
Prietenia este o relaie reciproc; acest aspect se
regsete n proprietatea de simetrie a matricei bi- 4 1 1 1
nare asociat grupului de persoane: P [i, j] = P [j, i] 5 1 1
(fig. 10).

Figura 10
Matricea punctelor unui plan
Pe ecranul monitorului, n modul de lucru text, caracterele sunt afiate pe rnduri, de sus n
jos, de la stnga la dreapta, pe fiecare rnd. Se poate spune c ecranul monitorului este o
suprafa plan ale crei puncte sunt distribuite pe linii i coloane (cel mai frecvent, 24 de linii
i 80 de coloane). n acest exemplu, regsim modelul bidimensional de organizare a datelor:
oricrei suprafee plane i poate fi asociat o matrice a punctelor. Valorile atribuite elementelor
din matrice au semnificaia specific problemei modelate. Pentru exemplul suprafeei-ecran,
dac elementele matricei sunt de tip caracter, n matrice poate fi reinut textul de pe un ecran.
Un alt exemplu: o imagine fotografie este tot o reprezentare n plan. Punctele planului
formeaz obiecte distincte, dac sunt evideniate diferit de la un obiect la altul, prin culoare.
Dac toate punctele unei imagini (suprafa) sunt colorate la fel, imaginea este format dintr-un
singur obiect.
Oricrei imagini i poate fi asociat o matrice a 0 0 0 1 0 0 0 0
punctelor; valorile atribuite elementelor din matrice au sem- 0 1 1 1 1 1 0 0
nificaia culorii fiecrui punct. n figura 11 este reprezentat 1 2 2 2 2 0 0 0
matricea asociat unei imagini, n care s-au folosit 3 coduri
1 2 2 2 1 0 0 0
de culori cu semnificaia: 0 alb, 1 negru, 2 rou.
1 2 2 1 2 0 0 0
Cu ajutorul matricelor de tip plan, pot fi modelate i situ-
0 1 1 2 1 1 1 0
aii de joc: aezarea pieselor pe tabla de ah, configuraia
0 0 1 2 1 2 1 0
unui labirint, X i O, avioane i altele.
0 1 1 1 0 1 1 0

Figura 11

17
# TEME
1. Determinai proprietile elementelor aflate pe diagonala principal, ntr-o matrice ptrat.
Scriei un program pentru afiarea acestor elemente.
2. Determinai proprietile elementelor aflate pe diagonala secundar, ntr-o matrice ptrat.
Scriei un program pentru afiarea acestor elemente.
3. Scriei un program care s verifice dac o matrice ptrat este simetric.
4. Formulai un exemplu de problem care s necesite organizarea datelor ntr-o matrice binar.
5. Formulai un exemplu de problem care s necesite organizarea datelor ntr-o matrice de tip
plan.
6. Determinai condiiile de amplasare pe tabla de ah a dou piese de joc dame , astfel nct
acestea s nu se atace. (Indicaie: dou piese de ah dame se atac dac sunt amplasate
pe aceeai linie, pe aceeai coloan sau pe aceeai diagonal.)
7. Construii tabloul de vecintate pentru rile situate pe harta din figura 12.

1 2
6

4
3
7
5
8
Figura 12

8. S se verifice dac o matrice ptrat este tablou magic. ntr-un tablou magic, suma ele-
mentelor de pe oricare linie este egal cu suma elementelor de pe oricare dintre coloane pre-
cum i cu suma elementelor de pe oricare dintre diagonale.
Exemplu: 3 2 7
8 4 0
1 6 5

18
5. PRELUCRAREA TABLOURILOR BIDIMENSIONALE

5.1. Localizarea elementelor cu aceea[i proprietate

Formaiuni geografice
Se dorete determinarea configuraiei unui teren dreptunghiular dup formaiunile
geografice din Tabelul 3 i figura 13.
Analiza terenului se face prin secionarea acestuia pe orizontal i pe vertical.
Punctele aflate la intersecia dintre seciunile orizontale i seciunile verticale sunt cotate
fa de nivelul mrii; cotele sunt valori numerice ntregi i pozitive.
Terenul este secionat prin n seciuni orizontale i m seciuni verticale.
O formaiune geografic este format din cel puin trei puncte.

Tabelul 3. Formaiuni geografice


a) b)
FORMAIUNEA GEOGRAFIC
Pant a)
Rp b) c) d)
Deal c)
Vale d)
e) f)
Platou e)
Teren denivelat f)
Punct de tip a_xy: punct aflat la cota
maxim pe seciunea orizontal x i la g)
cota minim pe seciunea vertical y; se
poate defini i punct de tip a_yx g)
Figura 13

Exemplu:
n Tabelul 4 este reprezentat un teren pe care s-au fcut patru seciuni orizontale i apte sec-
iuni verticale.

Tabelul 4. nregistrarea datelor ntr-un teren secionat

1 2 3 4 5 6 7
1 25 72 69 69 69 73 40
2 20 40 50 56 30 19 100
3 15 30 35 40 39 20 10
4 10 55 0 60 42 50 19

19
Rezultatele analizei pe seciuni sunt prezentate n tabelul Tabelul 5.
Tabelul 5. Analiza pe seciuni
Seciuni orizontale Seciuni verticale
Numrul
Numrul seciunii Formaiunea geografic Formaiunea geografic
seciunii
1 Platou la cota 69 1 Rp
2 Deal cu vrf la cota 56 2 Vale cu punct minim la cota 30
3 Deal cu vrf la cota 40 3 Rp
4 Teren denivelat 4 Vale cu punct minim la cota 40
5 Teren denivelat
6 Vale cu punct minim la cota 19
7 Teren denivelat
Puncte de tip a_xy: punctul de coordonate [3,4] la cota 40

Sugestie de rezolvare
Pentru determinarea formaiunilor geografice, cotele vor fi nregistrate ntr-un tablou bidi-
mensional cu semnificaia: linii seciuni orizontale, coloane seciuni verticale.
Pentru fiecare seciune (linie sau coloan) se va studia monotonia irurilor de valori (cotele
nregistrate pe o linie sau pe o coloan) Tabelul 6.
Rezolvarea problemei conduce la determinarea elementelor cu aceeai proprietate dintr-un
tablou bidimensional.

Tabelul 6. Monotonia irurilor de valori

Formaiunea geografic Monotonia irului de valori


Pant/ Rp ir cresctor/ descresctor
Deal Exist un punct de tip vrf, astfel nct toate
punctele dispuse la stnga acestuia formeaz
un ir monoton cresctor, iar toate punctele
dispuse la dreapta acestuia formeaz un ir
monoton descresctor.
Vale Exist un punct de cota minim, astfel nct
toate punctele dispuse la stnga acestuia
formeaz un ir monoton descresctor, iar
toate punctele dispuse la dreapta acestuia
formeaz un ir monoton cresctor.
Platou Exist cel puin trei puncte consecutive aflate
la aceeai cot.

20
Pentru exemplificarea rezolvrii, prezentm, n pseudocod, secvena prelucrrilor pentru
determinarea formaiunii de tip platou i a punctelor de tip a_xy .

Determinarea formaiunii de tip platou


nceput platou
// cutarea unei formaiuni platou pe linia k
//semnificaia variabilelor de lucru
//M[100,100] tabloul cotelor cu m seciuni verticale
// lp lungimea platoului
// cp cota platoului
// inializare lungime platou
lp1
cpM[k,1]
pentru c=2 la m execut
// se verific dac punctul M[k,c] aparine platoului
dac M[k,c] =cp
atunci lp lp+1 // crete lungimea platoului
altfel
dac lp>=3 // exist platou la copta cp
atunci scrie platou la cota cp
sfrit dac
// iniializri pentru determinarea unui nou platou
lp1
cpM [k,c]
sfrit dac
sfrit pentru
// se verific dac linia k se termin cu platou
dac lp>=3
atunci scrie platou la cota cp
sfrit dac
sfrit platou

Determinarea punctelor de tip a_xy


Raionamentul de rezolvare
Pasul 1
Se parcurge tabloul pe linii: pentru fiecare linie, se determin elementul maxim i se
pstreaz coloana acestuia n vectorul max_linii.
Pentru exemplul dat, vectorul max_linii are urmtoarele valori: 6, 7, 4, 4.
Pasul 2
Se parcurge tabloul pe coloane; pentru fiecare coloan, se determin elementul minim i se
pstreaz linia acestuia n vectorul min_coloane.
Pentru exemplul dat, vectorul min_coloane are urmtoarele valori: 4, 3, 4, 3, 2, 2, 3.

21
Pasul 3
Se parcurge vectorul max_linii: n variabila de lucru cmax, se reine valoarea unui element
max_linii[k]
cmax = max_linii[k]
se verific proprietatea de punct a_xy:
min_colane[cmax] = k
Pentru exemplul dat, urmrim datele din Tabelul 7.
Exist punct a_xy pe linia 3, coloana 4.

Tabelul 7. Determinarea punctului a_xy


linia Cmax min-coloane[cmax]
1 6 2
2 7 3
3 4 3
4 4 3

Secvena pseudocod a prelucrrilor pentru determinarea punctelor de tip a_xy:

nceput punct_a_xy
// cutarea unui punct a_xy
//semnificaia variabilelor de lucru
//M[100,100] tabloul cotelor cu m seciuni orizontale i n seciuni verticale
// max_linii [100] vector cu m elemente n care se reine coloana elementului maxim de pe
fiecare linie
// min_coloane[100] vector cu n elemente n care se reine linia elementului minim de pe
fiecare coloan
//max valoarea maxim pe o linie; cm coloana pe care se afl max
//min valoarea minim pe o coloan; lm linia pe care se afl min

// se determin elementul maxim de pe fiecare linie


pentru k=1 la m execut
max M[k,1]
cm 1
pentru c=2 la n execut
dac M[k,c] >max
atunci
bloc
max M[k,c]
cm c
sfrit bloc
sfrit dac
sfrit pentru

22
// n linia k, elementul maxim se afl pe coloana cm
max_linii[k] cm
sfrit pentru

// se determin elementul minim de pe fiecare coloan


pentru c=1 la n execut
min M[1,c]
lm 1
pentru k=2 la m execut
dac M[k,c] <min
atunci
bloc
min M[k,c]
lm k
sfrit bloc
sfrit dac
sfrit pentru
// n coloana c, elementul minim se afl pe linia lm
min_coloane[c] lm
sfrit pentru
// se parcurge vectorul max_linii
pentru k=1 la m execut
cmax max_linii [k]
// se verific proprietatea de punct a_xy
dac min_coloane[cmax]=k
atunci
scrie punct sa de coordonate k, cmax
sfrit dac
sfrit pentru
sfrit punct _sa_xy

# TEME
1. Construii exemple numerice pentru urmtoarele formaiuni geografice:
a) platou pe coloana 3, c) rp pentru coloana 5, e) punct a_xy,
b) deal pentru linia 1, d) vale pentru linia 4, f) punct a_yx.
2. Construii expresii pentru relaiile de monotonie corespunztoare fiecrei formaiuni
geografice.
3. Codificai, n limbajul de programare studiat, secvena pseudocod pentru determinarea for-
maiunii geografice de tip platou.
4. Codificai, n limbajul de programare studiat, secvena pseudocod pentru determinarea
punctelor de tip a_xy.

23
5. Realizai, n limbajul de programare studiat, un program pentru determinarea punctelor de
tip a_yx.
6. Scriei secvenele de instruciuni pentru determinarea urmtoarelor formaiuni geografice:
a) rp, b) deal, c) vale.
7. Realizai i testai programul pentru derminarea configuraiei unui teren ale crui coordonate
i cote se citesc din fiierul teren.in cu urmtoarea structur:
pe prima linie valorile n i m reprezentnd: n numrul de seciuni orizontale i m numrul
de seciuni verticale;
pe urmtoarele n linii cte m valori reprezentnd cotele aflate pe fiecare seciune orizontal.

5.2. Prelucrarea elementelor distribuite pe aceleai direcii


(linii, coloane, diagonale)

Aranjamente florale
Un grdinar are mai multe soiuri de plante pe care dorete s le planteze att n aranja-
mente clasice, ct i n forme noi; spre exemplu, n locul rondurilor, grdinarul vrea s com-
pun careuri florale. ntruct timpul de cretere i nflorire al plantelor nu poate fi ntrziat,
grdinarul i-a propus s testeze modelele cu calculatorul.
Analiza problemei
Pentru rezolvarea cu calculatorul, soiurile de plante decorative vor fi codificate. n Tabelul 8
se prezint un exemplu de codificare.

Tabelul 8. Codificarea plantelor decorative

Planta decorativ/culoare Codul plantei


Iarb/verde 1
Trandafir imperial/rou 2
Narcise/albe 6
Narcise/galbene 7
Crizanteme/mov 8
Crizanteme/albe 9
Tuia/verde 11

Careul pe care va fi probat modelul este format din n*m sau n*n puncte; n fiecare punct,
poate fi sdit o plant. n Tabelul 9 sunt prezentate cteva modele dup care se vor testa aran-
jamentele florale.

24
Tabelul 9. Modele pentru aranjamente florale
Denumirea modelului Exemplu de model
Decor de primvar cu narcise albe i galbene:
6 6 6 6 6
Brazde paralele orizontale
7 7 7 7 7
6 6 6 6 6

Decor de primvar cu narcise albe i galbene;


aleea central (diagonal) cu gazon:

1 7 7 7 7
Triunghi 6 1 7 7 7
6 6 1 7 7
6 6 6 1 7
6 6 6 6 1

Decor cu trandafiri imperiali i tuia plantai pe direcii


paralele cu aleea central (diagonal):

1 2 11 2 11
Diagonale paralele cu diagonala 2 1 2 11 2
principal 11 2 1 2 11
2 11 2 1 2
11 2 11 2 1

Decor de toamn cu crizanteme mov i albe:


8 8 8 8 8 8
8 9 9 9 9 8
Spiral 8 9 8 8 9 8
8 9 8 8 9 8
8 9 9 9 9 8
8 8 8 8 8 8

Sugestie de rezolvare
Careurile florale vor fi generate ntr-un tablou bidimensional, G, cu n linii i m coloane, sau n
linii i n coloane, n funcie de model. Pentru fiecare model, se determin adresele punctelor n care
vor fi sdite plantele i se nregistreaz la aceste adrese codul plantei corespunztor modelului.

25
Rezolvarea problemei conduce la umplerea matricei cu valori dispuse pe direcii specifice
modelului: linii, coloane, triunghiuri, diagonale, spiral.
n Tabelul 10 sunt prezentate secvenele pseudocod pentru generarea adreselor de umplere
corespunztoare modelelor prezentate.

Tabelul 10. Secvene pseudocod pentru generarea adreselor de umplere

Modelul floral Direciile de umplere Generarea adreselor


// brazda de tip linie
// linia i
Brazde
Linii pentru c=1 la m execut
orizontale
G[i,c] cod
sfrit pentru
//se lucreaz cu o matrice ptrat n*n
// pe linii i i coloane j
pentru i=2 la n execut
Triunghi Triunghi stnga pentru j=1 la i-1 execut
G[i,j] cod
sfrit pentru
sfrit pentru
Se pot forma n-2 //se lucreaz cu o matrice n*n
direcii (d) paralele // pe linii i i coloane j
cu diagonala princi- // pe diagonalele d
Paralele la pal i situate
diagonala prin- deasupra acesteia pentru d=1 la n-2 execut
cipal pentru i=1 la n-d execut
G[i,i+d] cod
sfrit pentru
sfrit pentru
Se parcurg cadranele u p1 un
de la exterior primul repet
cadran-p, spre // se parcurge prima linie, p, din cadran,
interior, ultimul //de la stnga la dreapta
cadran-u pentru j=p la u execut
G[p,j] cod
Spiral sfrit pentru
// se parcurge ultima coloan, u, din cadran,
// de sus n jos
pentru i=p+1 la u execut
G[i,u] cod
sfrit pentru
//se parcurge ultima linie, u, din cadran

26
//de la dreapta la stnga
pentru j=u -1 la p execut
G[u,j] cod
sfrit pentru
// se parcurge prima coloan, p, din cadran,
// de jos n sus
pentru i=u - 1 la p - 1 execut
G[i,p] cod
sfrit pentru

// se pregtesc valorile p i u
// pentru cadranul urmtor
p p+1
uu-1
// se testeaz dac se mai pot forma cadrane
pn cnd p>u

# TEME
1. Construii expresii pentru relaiile care definesc direciile de umplere pentru fiecare dintre
modelele propuse.
2. Scriei secvenele de instruciuni pentru generarea fiecrui model.
3. Realizai i testai programul pentru generarea fiecrui model floral (pentru fiecare model se
va scrie un program).
4. Pentru atractivitatea prezentrii, realizai un program care s afieze modelul floral colorat,
corespunztor culorii de cod. (Indicaie: modul de lucru text permite setarea atributului de
culoare att pentru fond, ct i pentru text.)
5. Realizai un program care s per-
mit utilizatorului (grdinarul)
s aleag, pe rnd, oricare dintre
Meniul grdinarului
modelele oferite (program cu
1. Brazde orizontale
meniu fig. 14). 2. Triunghi
3. Spiral
4. Exit
Opiunea:_

Figura 14

6. Rescriei secvena umplerii n spiral astfel nct s folosii ct mai puine structuri repetitive.
7. Compunei un model floral nou i scriei secvena de instrucuni (programul) pentru generarea
modelului propus.

27
8. Analizai urmtoarele secvene pseudocod i determinai modelul de umplere generat:
a) b)
pentru i=2 la n execut pentru i= 1 la [n/2] execut
pentru j=n, la n+2-i execut pentru j=i+1 la n-i execut
G[i,j] cod G[i,j] cod
sfrit pentru sfrit pentru
sfrit pentru sfrit pentru
c) d)
pentru i=n la [n/2]+1 execut pentru i=1 la n execut
pentru j=n la n+2-i execut pentru j=1, la m execut
G[i,j] cod G[i,j] cod
sfrit pentru sfrit pentru
sfrit pentru sfrit pentru

5.3. Simularea unor situaii reale

Tabloul de familie
Se consider o familie format din prini (1) i copii (2). Fiecare copil are doi prini ntre
care exist relaie de cstorie. Nu toi membrii familiei sunt cstorii; nu toi membrii familiei
au copii.
Relaiile dintre membrii familiei sunt pstrate n tabloul de familie (fig. 15).

Figura 15. Tablou pentru o familie format din 8 persoane


Membrul familiei 1 2 3 4 5 6 7 8
1 1 2 2
2 2 1 2
3 1
4 1 2 2
5 1
6 1 2 2
7
8

28
Interpretarea tabloului de familie este prezentat n Tabelul 11.
Tabelul 11.
Membrul familiei Cstorit cu Copii Prini
1 4 6 i 8
2 6 5 i 7
3 5
4 1 6 i 8
5 3 2 i 6
6 2 5 i 7 1 i 4
7 2 i 6
8 1 i 4

Dup cum rezult din Tabelul 11, fiecare membru al familiei este complet caracterizat prin
analiza nregistrrilor de tip linie i a nregistrrilor de tip coloan.
Analiza nregistrrilor de tip linie:
familia are 8 membri; pentru fiecare membru (i) analizm valorile de pe linia i din tablou,
cu semnificaia: (1) i este cstorit cu j, unde j este poziia valorii 1 pe linie,
(2) i este printe pentru k, unde k este poziia valorii 2 pe linie.

Analiza nregistrrilor de tip coloan:


familia are 8 membri; pentru fiecare membru (j) analizm valorile de pe coloana j din tablou
cu semnificaia: (1) j este cstorit cu i, unde i este poziia valorii 1 pe coloan,
(2) k este printe pentru j, unde k este poziia valorii 2 pe coloan.

Concluzii i restricii
z oricrei familii i poate fi asociat un tablou de familie de tip matrice ptrat;
z pe o linie poate fi nregistrat cel mult o valoare 1;
z pe o coloan poate fi nregistrat cel mult o valoare 1;
z pe o coloan pot fi nregistrate cel mult dou valori 2;
z dac i este n relaie de tip 1 cu j, i j este n relaie de tip 1 cu i;
z dac i este n relaie de tip 1 cu j, i i este n relaie de tip 2 cu k, atunci i j este n relaie
de tip 2 cu k.

# TEME
1. Cunoscnd relaiile de tip 1 sau 2 dintre cei n membri ai unei familii, s se construiasc tabloul
de familie.
2. Validarea tabloului de familie: fiind dat un tablou de familie, s se verifice corectitudinea
nregistrrilor.

29
3. Fiind dat un tablou de familie validat, caracterizai fiecare membru al familiei.
4. S se determine descendenii unui membru al familiei (pentru exemplul analizat, 1 are copii
pe 6 i 8 i nepoi pe 5 i 7).
5. a) Realizai tabloul de familie pentru fami- Membrul familiei Cstorit cu Copii
lia cu 10 membri din exemplul urmtor:
2 3 1, 5, 7
b) Analizai tabloul de familie obinut la 5 8 1, 10
cerina a) i precizai ce restricii au fost 10 4 9
nclcate.
6. Cum procedm pentru a determina toi descendenii unui membru al familiei?
7. Cum procedm pentru a determina cel mai vrstnic ascendent al familiei?

5.4. Prelucrarea imaginilor

Aplicaia 3. Virusuri ntr-o matrice


Dup ce au descoperit cele mai puternice virusuri, biologii i-au propus s le izoleze i s
le studieze comportamentul n alte colonii de bacterii. Dup o vreme, au constatat c unele
virusuri au rmas izolate, altele nu. Privit la microscop, colonia de bacterii pare format
dintr-o mulime de puncte pe care biologii le-au reprezentat ca n figura de mai jos.
n aceast colonie exist un singur virus izolat (cel ncercuit). Biologii doresc s prelucreze
aceste imagini cu calculatorul. Pentru nceput vor s localizeze i s numere virusurile izolate.

Cum rezolvm problema?


1. Introducerea imaginii
De data aceasta, datele de intrare au aspectul unei imagini alb-negru: punctele de interes
sunt virusurile colorate n negru; restul suprafeei este colorat n alb. Pentru a transmite calcu-
latorului imaginea, ar trebui s-i spunem culoarea fiecrui punct. Sau, mai simplu, s-i spunem
de la nceput c imaginea este alb i apoi s-i dm adresele punctelor colorate n negru.
Imaginea descompus n puncte seamn att de bine cu o matrice, nct ea poate fi memorat
codificnd albul cu zero i negrul cu unu.

x x 0 1 0 0 0 1
x x x x 1 0 0 1 1 1
x x 0 0 0 1 1 0
x x 0 1 0 1 0 0
0 0 0 0 0 0
0 0 0 0 0 0

Localizarea virusurilor izolate


30
2. Reprezentarea algoritmului
Secvena de operaii pentru citirea imaginii:

nceput citire citete p //numrul de puncte negre


aloc M[10,10] pentru k = 1,p execut
citete NL, NC // numr linii -NL bloc
// numr coloane -NC citete l,c
pentru i = 1, NL execut M[l,c] 1
pentru j = 1, NC execut sfrit bloc
M[i, j] 0 sfrit pentru
sfrit pentru sfrit citire
sfrit pentru

3. Prelucrarea imaginii. Bordajul


Urmeaz prelucrarea imaginii: localizarea i numrarea virusurilor (punctele negre izolate).
Pentru rezolvarea acestei cerine, se parcurge matricea i, pentru fiecare valoare de 1, se ve-
rific vecinii acesteia. Un punct negru este izolat dac toi vecinii si sunt albi.
Ci vecini are un punct? Majoritatea punctelor au cte opt vecini. Punctele de la bariera
coloniei au mai puini vecini.
Pentru a simplifica procedeul de numrare a vecinilor, vom nconjura colonia cu o zon fr
virusuri. Imaginea se lrgete. La fel i matricea: n urma acestui bordaj, ea se va mri cu dou
linii i dou coloane.

0 0 0 0 0 0 0 0
0 0 1 0 0 0 1 0
0 1 0 0 1 1 1 0
0 0 0 0 1 1 0 0
0 0 1 0 1 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

Bordajul se pregtete nainte de citirea imaginii prin alocarea unui spaiu de memorie sufi-
cient, innd seama c la numrul de linii i coloane necesar memorrii imaginii se mai adaug
cte dou pentru bordaj.
n matricea bordat, fiecare punct al imaginii are cte opt vecini. n figura 16 sunt prezentate
adresele vecinilor punctului aflat la adresa [l, c].

31
l-1, c-1 l-1, c l-1, c+1
l, c-1 l, c l, c+1
l+1, c-1 l+1, c l+1, c+1

Figura 16. Vecinii unui punct din matrice

Dac punctul aflat la adresa [l, c] are valoarea 1 i fiecare dintre cei opt vecini ai si are va-
loarea zero, atunci punctul este izolat. Condiia o vom nota cu cond.
4. Reprezentarea algoritmului
Secvena pentru localizarea i numrarea punctelor izolate:
nceput puncte_izolate
nrp 0
pentru l = 2,NL + 1 execut
pentru c = 2,NC+1 execut
dac M[l,c] = 1 atunci
dac cond
atunci
bloc scrie l - 1, c - 1
nrp nrp + 1
sfrit bloc
sfrit dac
sfrit dac
sfrit pentru
sfrit pentru
scrie nrp
sfrit puncte_izolate

# TEM
Folosind cele dou secvene prezentate, realizai algoritmul complet i programul corespunztor.

De reinut!
1. Cu ajutorul matricelor pot fi rezolvate probleme care necesit descompunerea unei
imagini `n puncte sau probleme de orientare i deplasare `n plan.
2. Pentru uurina prelucrrii punctelor se folosete tehnica bordajului.
3. Multe jocuri precum X i zero, Vaporae, Perspico, mutarea pieselor pe tabla de
ah, Rzboi pot fi simulate cu ajutorul matricelor.

32
PROBLEME PROPUSE
1. JOC
Se dau n jetoane numerotate de la 1 la n. Din fiecare tip de jeton, exist n buci. Jetoanele
trebuie aezate pe o gril format din n*n careuri, ca n exemplul din figura 17 a.

Figura 17. Joc cu jetoane


a) b)
1 2 3 4 5 6 1 2 3 4 5
2 3 4 5 6 1 2 3 4 5 1
3 4 5 6 1 2 3 4 4 1 2
4 5 6 1 2 3 4 5 1 2 3
5 6 1 2 3 4 5 1 2 3 4
6 1 2 3 4 5

Cerine:
1. Stabilii regula dup care sunt aezate jetoanele pe grila de joc.
2. Realizai un program care s aeze jetoanele pe grila de joc dup regula stabilit la cerina
precedent.
3. Realizai un program care s verifice dac jetoanele de pe grila de joc respect regula de
amplasare stabilit la cerina 1.
Spre exemplu, pentru grila de joc din figura 17 b, nu sunt ndeplinite urmtoarele proprieti:
- pe diagonala secundar se afl un jeton diferi de jetonul n;
- pe linia 3 nu se afl jetoane distincte;
- pe coloana 3 nu se afl jetoane distincte.

Indicaie: se vor analiza jetoanele dispuse pe aceeai linie/coloan sau pe diagonale/paralele


la diagonale.

2. TABELE MATEMATICE
a) TABLA NMULIRII
Realizai un program pentru afiarea sub form de tabel a tablei nmulirii cu 1, 2, 3, pn
la 10. Spre exemplu, linia 3 va conine tabla nmulirii cu 3:

3 6 9 12 15 18 21 24 27 30

b) TABLA ADUNRII
Realizai un program pentru afiarea sub forma de tabel a tablei adunrii cu 1, 2, 3, pn la 10.
Spre exemplu, linia 7 va conine tabla adunrii cu 7:
8 9 10 11 12 13 14 15 16 17

33
c) TABELA PITAGORA_n
Realizai un program pentru afiarea tabelei Pitagora_n sub form de tabel cu n linii i
trei coloane: a, b, c. Pentru fiecare linie, valorile din tabel trebuie s respecte condiia:
a*a = b*b + c*c. Exemplu: tabela Pitagora_2
5 3 4
15 12 9

d) MATRICEA n_PALINDROM
Realizai un program care s verifice dac o matrice este n_Palindrom. O matrice
n_Palindrom are n linii; pe fiecare linie, i, se afl cte n palindromuri distincte formate din i
cifre. Un numr simetric se numete palindrom. Exemplu de matrice 5_Palindrom:
1 9 7 6 3
22 33 66 4455 55
121 323 464 585 979
3223 8668 7337 8118 9009
56365 43234 11111 91219 37473

3. MATRICE RAR
O matrice cu n linii i m coloane se numete matrice rar dac valorile 0 sunt majoritare.
Exemplu pentru o matrice cu 3 linii i 5 coloane:
0 0 20 0 0
0 0 0 12 0
0 88 0 0 0

ntr-o astfel de matrice, intereseaz valorile semnificative, de aceea este suficient s memo-
rm valorile diferite de zero i poziiile lor n matrice. Poziia reprezint n acest caz numrul de
ordine de 1 la n*m.
Pentru exemplul prezentat, se vor memora perechile: (20, 3) , (12, 9) i (88,12 ).
Cerine:
a) propunei structurile de date necesare memorrii valorilor semnificative dintr-o matrice
rar;
b) se cunoate numrul valorilor semnificative dintr-o matrice rar (fie p acest numr) i
perechile valoare, adres pentru fiecare numr semnificativ.
Scriei un program care s genereze i s afieze pe ecran matricea rar.
Exemplu: Date de intrare Date de ieire matricea rar 0 0 0 23
n =4 m=4 p=2 0 0 0 0
23 4 9 14 0 0 0 0
0 9 0 0

34
6. ORGANIZAREA DATELOR N STRUCTURI NEOMOGENE

6.1. Studiu de caz Catalogul clasei


ntr-o clas sunt 30 de elevi. Profesorul diriginte
dorete s pstreze, ntr-un catalog electronic, urm- CATALOG
toarele informaii (figura 18):
numele elevului; elev 1 elev2 ..... elev n
media general pe semestrul I;
media general pe semestrul II;
media general anual;
numrul de absene.
Elev
Profesorul diriginte dorete s calculeze media
general a clasei la sfrit de semestru sau an colar Nume Medie Absene
i s afieze:
media general a clasei;
lista elevilor dup media general; Figura 18
lista elevilor dup numrul de absene.

Analiza problemei
n catalogul electronic se vor pstra date despre elevi; se poate spune c n catalogul elec-
tronic se vor pstra date cu aceeai semnificaie. Numrul nregistrrilor din catalog va fi egal
cu numrul de elevi din clas. Se va ine seama de numrul maxim de elevi ce pot fi nscrii ntr-o
clas (30 de elevi).
Catalogul poate fi organizat ca un tablou unidimensional vector de elevi.
Pentru fiecare elev se rein mai multe categorii de date, cu semnificaii diferite date neo-
mogene. Fiecare informaie are un tip specific, spre exemplu:
medie de tip real;
numr de absene de tip ntreg cu valori pozitive.

Soluia de organizare a datelor


Ansamblul datelor despre elev formeaz o structur de date cu tipuri diferite (structur neo-
mogen) numit articol sau nregistrare.
Catalogul electronic al clasei va fi un vector de articole.

Prelucrarea datelor
Pentru rezolvarea cerinelor formulate de profesorul diriginte, sunt necesare urmtoarele pre-
lucrri:
nregistrarea datelor pentru fiecare elev;
afiarea datelor despre elevi;
determinarea i afiarea mediei generale a clasei la sfrit de semestru;

35
afiarea elevilor n ordine descresctoare, dup media general semestrial;
determinarea mediei generale, anuale, pentru fiecare elev;
afiarea elevilor n ordine descresctoare, dup media general anual;
determinarea i afiarea mediei generale a clasei la sfrit de an;
afiarea elevilor n ordine cresctoare, dup numrul de absene.

6.2. Definirea structurilor neomogene de date-articole

Categoriile distincte de informaii reinute ntr-un articol se numesc cmpuri.


Un articol se caracterizeaz prin urmtoarele elemente ce formeaz macheta articolului:
numele articolului;
dou sau mai multe cmpuri; pentru fiecare cmp se precizeaz:
numele cmpului;
tipul cmpului (stabilit n funcie de semnificaia real a datelor). Cmpurile pot fi
date elementare sau grupate: vectori, articole.

Exemplul 1:
Pentru exemplul analizat catalogul clasei , construim o machet simplificat (cu mai
puine cmpuri) corespunztoare articolului elev (fig. 19a).

Elev

Numele cmpului Tipul cmpului

MEDIE Real

ABSENE Natural

Figura 19, a)

Exemplul 2:
Completm macheta articolului elev cu cmpul note, un tablou unidimensional (vector) cu
4 elemente de tip natural (fig. 19b).

Elev

Numele cmpului Tipul cmpului

NOTE Vector (4)

MEDIE Real

ABSENE Natural
Figura 19, b)

36
Fiecare limbaj de programare dispune de cuvinte cheie pentru declararea structurilor de date
de tip articol (Tabelul 12).

Tabelul 12. Definirea articolelor

PASCAL C/C++
{cuvntul cheie pentru tipul articol // cuvntul cheie pentru tipul articol
este record} // este struct

Type articol = record Typedef struct


camp1:tip1; {
camp2:tip2; tip1 camp1;
tip2 camp2;
end; -
} articol;
//definirea variabilei cu tipul asociat articolului
{definirea variabilei cu tipul asociat articolului}
var variabila : articol; articol variabila;

Exemplu pentru articolul elev


{ se definete articolul elev } // se definete articolul elev
Type elev=record Typedef struct
{
medie:real;
absente:byte; float medie;
................... int:absente;
end; ...................
} elev;
{se definete variabila cu tipul elev} // se definete variabila cu tipul elev

var e: elev; elev e;

# TEME
1. Realizai macheta articolului data calendaristic n care s fie reinut data n forma zi, lun, an.
2. Realizai macheta articolului elev care s conin i cmpul data naterii sub forma grupului
de date data calendaristic.
3. Realizai macheta articolului elev care s conin cmpul medii sub forma unui vector.

37
6.3. Prelucrarea datelor organizate n structuri neomogene
Prelucrarea datelor nregistrate ntr-o structur de tip articol se face la nivel de cmp. Pentru
accesul la informaiile unui cmp, referirea acestuia se face prin adresare punctual dup sin-
taxa: nume-variabil-de-tip-articol.nume-cmp.
Exemplu:
referirea cmpului medie din articolul elev e.medie
referirea cmpului absene din articolul elev e.absente
referirea unui element, i, al cmpului medii din articolul elev e.medii[i]
Prelucrarea acestor date ncepe cu introducerea i memorarea lor n zona de memorie rezer-
vat la definirea variabilei de tip articol; pentru verificare, datele memorate vor fi afiate. Fiecare
cmp poate fi prelucrat prin operaii specifice tipului corespunztor (Tabelul 13).

Tabelul 13. Prelucrarea articolelor


PASCAL C / C++
Exemplu pentru articolul elev
1. Introducerea i afiarea datelor
Program exemplu; #include <iostream.h>
{ se defineste articolul elev } void main ()
Type elev=record {// se defineste articolul elev
....................... Typedef struct
medie1, medie2, medie_an:real; {
absente:byte; .......................
....................... float medie1, medie2, medie_an;
end; unsigned:absente;
.......................
{se defineste variabila cu tipul elev} } elev;

var e: elev; // se defineste variabila cu tipul elev

begin elev e;

{se introduc datele unui elev} // se introduc datele unui elev


write (medie1:); readln (e.medie1); cout<< medie1:; cin>> e.medie1;
write (medie2:); readln (e.medie2); cout<< medie2:; cin>> e.medie2;
write (absente:); readln (e.absente); cout<< absente:; cin>> e.absente;
....................... .......................
{se afiseaza datele elevului} // se afiseaza datele elevului
writeln (medie1:, e.medie1);
writeln (medie:2, e.medie2); cout<< medie1:<<e.medie1<<endl;
writeln (absente:, e.absente); cout<< medie2:<<e.medie2<<endl;
cout<< absente:<< e.absente<<endl;
end. }

38
2. Operaii asupra datelor
{ se calculeaz media anual} // se calculeaz media anual
e.medie_an := (e.medie1 +e.medie2)/2; e.medie_an= (e.medie1 +e.medie2)/2;

{se afiseaza media anuala} // se afiseaza media anuala


writeln(medie anuala: , e.medie_an); cout<<:medie anuala:<< e.medie_an;
3. Introducerea i afiarea datelor n cmpuri grupate
Type elev=record Typedef struct
....................... {
medii : array [1..3] of real; .......................
....................... float medii [3];
end; .......................
} elev;
{se defineste variabila cu tipul elev} // se defineste variabila cu tipul elev
var e: elev; i:byte; elev e;
begin int i;
{se introduc mediile unui elev} {
for i:=1 to 3 do // se introduc mediile unui elev
begin for (i=0; i<3;i++)
write (media:,i); {cout<< media:<<i;
readln (e.medii[i]); cin>> e.medii[i];
end; }
end }

# TEME
1. Descriei sub form de articol urmtoarele entiti:
a) carte; b) main; c) calculator; d) persoan.
2. Definii, n limbajul de programare studiat, tipurile de date i variabilele corespunztoare arti-
colelor descrise la cerina precedent.
3. Realizai, n limbajul de programare studiat, un program care s determine trimestrul calen-
daristic al zilei curente. Se va folosi un articol cu cmpurile: zi, lun, an.
Exemplu: pentru data curent: ziua 29 luna 08 anul 2007, se va afia: trimestrul 3.
4. Realizai, n limbajul de programare studiat, un program care s determine dac dou puncte
A i B ndeplinesc una dintre urmtoarele condiii:
a) punctele A i B se afl pe o dreapt paralel cu axa OX;
b) punctele A i B se afl pe o dreapt paralel cu axa OY;
c) punctele A i B se afl pe o dreapt egal deprtat de axele OX si OY.
Pentru fiecare punct se cunosc coordonatele x i y. Fiecare punct va fi descris printr-un articol.
Exemplu: Pentru punctul A de coordonate x=3, y=10 i punctul B de coordonate x=35, y=10
se va afia mesajul: punctele se afl pe o dreapt paralel cu axa OX.

39
6.4. Gruparea datelor organizate n structuri neomogene
Datele cu semnificaii diferite care necesit gruparea n structuri neomogene reprezint, n
cele mai frecvente cazuri, caracteristici sau atribute ale unei situaii din realitate (entitate): per-
soan, produs, carte, main etc. Memorarea datelor prin care poate fi descris o entitate se face
ntr-o singur zon de memorie (variabil); dac n problem sunt prelucrate date despre mai
multe instane ale unei entiti (mai multe persoane, mai multe produse), se vor pstra ntotdeau-
na datele ultimei instane introduse (ultima persoan, ultimul produs).

Exemplu:
La un magazin, se vnd ntr-o zi n produse. Se cunosc cantitatea i preul fiecrui produs; se
dorete calcularea i afiarea valorii totale a produselor vndute ntr-o zi.
Rezolvarea problemei necesit introducerea, pe rnd, a datelor despre fiecare produs. Pentru
fiecare produs introdus, se calculeaz valoarea:
valoare = cantitate * pret.
Valoarea calculat se nsumeaz la total:
total= total + valoare.
La sfrit, se afieaz totalul. (Tabelul 14)

Tabelul 14. Exemplu Magazin


PASCAL C/C++
program produse; #include <iostream.h>
void main ()
{ se defineste articolul produs } {
Type produs=record // se defineste articolul produs
cantitate:byte; Typedef struct
pret:real; {unsigned cantitate
end; float pret;
{se defineste variabila cu tipul produs} } produs;
var p: produs; // se defineste variabila cu tipul produs
{se definesc variabilele de lucru} produs p;
var valoare, total: real; //se definesc variabilele de lucru
n, i :integer; float valoare, total=0;

begin int n, i ;

{se introduce numarul de produse} //se introduce numarul de produse


Write(numarul de produse:); cout<< numarul de produse:;
readln (n); cin>> n;
total:=0; for (i=1; 1<n; i++)
for i:= 1 to n do {
begin //se introduc datele unui produs

40
{se introduc datele unui produs} cout<< cantitate:;
write(cantitate:); cin>>p.cantitate;
readln (p.cantitate); cout<< pret:
write (pret:); readln (p.pret); cin>>p.pret;

{se calculeaza valoarea produsului} //se calculeaza valoarea produsului


valoare:= p.cantitate * p.pret; valoare = p.cantitate * p.pret;
{se insumeaz valoarea la total} //se insumeaz valoarea la total}
total:= total + valoare; total= total + valoare;
end; }

{se afiseaza valoarea totala} //se afiseaza valoarea totala


Writeln (valoarea totala:, total); cout<<valoarea totala:<<total;
end }

n cele mai multe situaii reale, se pstreaz datele fiecrei instane (fiecare persoan, fiecare
produs) pentru prelucrri la nivel de grup: sortri, selecii. n Catalogul clasei, se pstreaz
datele despre toi elevii.
Gruparea instanelor unei entiti (toate persoanele, toate produsele, toi elevii) se face prin
memorarea valorilor corespunztoare n tablouri unidimensionale care, n acest caz, devin vec-
tori de articole. Un element al vectorului reprezint o instan (o persoan, un produs, un elev)
i este de tip articol.
Cmpul unui articol dintr-un vector de articole se adreseaz punctual, cu precizarea c, n
acest caz, numele articolului este nlocuit cu adresa acestuia n vector (Tabelul 15).

Tabelul 15. Vectori de articole


PASCAL C/C++

{definirea tipului de date articol} // definirea tipului de date articol


Type articol=record Typedef struct
camp1:tip1; { tip1 camp1;
camp2:tip2; tip2 camp2;
....................... .......................
end; } articol;
{definirea vectorului cu n elemente de tipul // definirea vectorului cu n elemente
asociat articolului} //de tipul asociat articolului
var vector:array [1..10] of articol; articol vector [10];
var i : byte; int i;
{adresarea unui camp dintr-un articol //adresarea unui camp dintr-un articol
oarecare,i} //oarecare,i}
vector [i].camp vector [i].camp

41
Exemplul 1 prelucrarea a n produse
PASCAL C/C++
program produse; #include <iostream.h>
{ se defineste articolul produs } void main ()
Type produs=record {
cantitate:byte; // se defineste articolul produs
pret:real; Typedef struct
end; {unsigned cantitate
float pret;
{se defineste vectorul p cu 100 de elemente } produs;
de tip produs}
var p:array [1..100] of produs; // se defineste vectorul p cu 100
//elemente de tip produs
{se definesc variabilele de lucru} produs p[100];
var valoare, total: real;
n, i :integer; //se definesc variabilele de lucru
begin float valoare, total=0;
int n, i ;
{se introduce numarul de produse}
write(numarul de produse:); //se introduce numarul de produse
readln (n); cout<< numarul de produse:;
total:=0; cin>> n;
for i:= 1 to n do for (i=0; i<n; i++)
begin {

{se introduc si se memoreaza datele fiecarui //se introduc si se memoreaza datele //


produs} fiecarui produs
write(cantitate:); cout<< cantitate:;
readln (p[i].cantitate); cin>>p[i].cantitate;
write (pret:); readln (p[i].pret); cout<< pret:
cin>>p[i].pret;
{se calculeaza valoarea produsului}
valoare:= p[i].cantitate * p[i].pret; //se calculeaza valoarea produsului
{se nsumeaz valoarea la total} valoare = p[i].cantitate * p[i].pret;
total:= total + valoare; {se nsumeaz valoarea la total}
end; total= total + valoare;
{se afiseaza valoarea totala} }
writeln (valoarea totala:, total); //se afiseaza valoarea totala
end. cout<<valoarea totala:<<total;
}

42
Exemplul 2 sortarea a n produse - metoda Bubble sort
var aux: produs; s:byte; {produs aux; unsigned s;
begin //sortare crescatoare dupa campul pret
{sortare crescatoare dupa campul pret} do
repeat {
s:=0; s=0;
for i:=1 to n-1 do for (i=0; i< n-1; i++)
begin if p[i].pret> p[i+1].pret
if p[i].pret> p[i+1].pret
then //interschimbarea se face la nivel de articol
{interschimbarea se face la nivel de articol } {
begin aux=p[i];
aux:=p[i]; p[i]= p[i+1];
p[i]:= p[i+1]; p[i+1]= aux;
p[i+1]:= aux; s=1;
s:=1; }
end; }
until s=0; while (s);
writeln ( lista preturilor); cout<<lista preturilor<<endl;
for i:=1 to n do for (i=0; i< n; i++)
writeln (p[i].pret); cout<<p[i].pret<<endl;
end }

# TEME
1. Formulai exemple care s necesite organizarea datelor n vectori de articole.
2. Prezentai o situaie real care s necesite ordonarea datelor organizate n vectori de articole.
3. Alctuii o list cu prelucrri specifice datelor grupate n tablouri unidimensionale; pentru
fiecare prelucrare, construii cte un exemplu care s necesite gruparea articolelor n vec-
tori de articole.

De reinut! ARTICOL
z structur de date necesar pentru nregistrarea informaiilor despre un aspect al
realitii (obiect, persoan, activitate) cu mai multe caracteristici;
z fiecare caracteristic formeaz un cmp al articolului;

z fiecare cmp poate avea un tip propriu; acest aspect determin proprietatea de
structur neomogen;
z memorarea i prelucrarea datelor organizate n structuri neomegene se face la nivel
de cmp;
z referirea unui cmp se face prin adresare punctual:
nume_articol.nume_cmp;
z articolele pot fi grupate n structuri omogene: vectori de articole;

z referirea unui cmp de articol dintr-un vector se face prin adresare punctual,
nlocuindu-se numele articolului cu adresa acestuia n vector.

43
PROBLEME PROPUSE
1. Colecie
Se dorete nregistrarea urmtoarelor date despre obiectele dintr-o colecie: denumire, anul
achiziiei, valoare.
Cerine:
a) realizai un program pentru introducerea i afiarea datelor despre un obiect din colecie;
b) realizai un program pentru introducerea i afiarea datelor despre mai multe obiecte din
colecie (max. 100);
c) realizai un program care s determine cel mai vechi obiect din colecie;
d) realizai un program care s afieze obiectele din colecie n ordinea descresctoare a
vechimii acestora.

2. Concurs
Se dorete nregistrarea urmtoarelor date despre candidaii nscrii la un concurs: numele,
data naterii (zi, lun, an), are carnet de conducere (da/nu).
Cerine:
a) realizai un program pentru introducerea i afiarea datelor despre un singur candidat;
b) realizai un program pentru introducerea i afiarea datelor despre mai muli candidai
(max. 100);
c) realizai un program care s determine candidaii cu aceeai vrst, v, introdus de la tas-
tatur;
d) realizai un program care s afieze, n ordinea vrstei, candidaii cu carnet de conducere.

3. Catalogul clasei
Realizai un program cu meniu care s rezolve urmtoarele cerine ale profesorului diriginte:
nregistrarea datelor pentru fiecare elev;
afiarea datelor despre elevi;
determinarea i afiarea mediei generale a clasei la sfrit de semestru;
afiarea elevilor n ordine descresctoare, dup media general semestrial;
determinarea mediei generale, anuale, pentru fiecare elev;
afiarea elevilor n ordine descresctoare, dup media general anual;
determinarea i afiarea mediei generale a clasei la sfrit de an;
afiarea elevilor n ordine cresctoare, dup numrul de absene.

7. ORGANIZAREA DATELOR N STRUCTURI DINAMICE

7.1. Modele de structuri dinamice

n foarte multe situaii reale, exist relaii sau reguli care trebuie modelate astfel nct soluia
de organizare a datelor s respecte att semnificaia, ct i restriciile de comportament spe-
cifice.

44
Exemple:
(a)
Exemplul 1. Persoanele care solicit un serviciu co- Provideet
r
nectarea la Internet printr-un provider autorizat se nscriu inte r n
pe o list de ateptare. O cerere nou este aezat, ntotdeau-
na, ultima n list. Serviciul de conectare este acordat, ntot-
deauna, primului solicitant din list; dup acordarea servi-
ciului, cererea este eliminat din list (fig. 20 a). C1 C2 Cn

cerere nou

Exemplul 2. O firm de software a realizat un program


antivirus; programul este mbuntit continuu, prin tratarea iune
versou clien
t
de noi virui; oferta de pia a firmei este organizat astfel n
nct clienii s aib acces la program, ncepnd ntotdeauna
vn
cu ultima versiune a acestuia (fig. 20 b).

...
v2

v1
(b)

Exemplul 3. Pentru a comunica rapid i sigur, eful (c)


unui grup de copii a ntocmit o list astfel nct un mesaj s ef
poat fi transmis ntregului grup, din copil n copil; eful
transmite mesajul primului copil din list; ultimul copil C4 C1
comunic efului c mesajul a ajuns la el (fig. 20 c).

C3
C2

4. Fiecare persoan are exact doi prini; fiecare printe (d)


este o persoan care la rndul ei are exact doi prini. Pentru copil
a pstra att datele despre persoane, ct i relaiile directe
de rudenie copil-prini, se construiete arborele de familie
mama tata
arborele genealogic (fig. 20 d).

mama
mama
Figura 20 tata
tata

45
Fiecare dintre exemplele propuse necesit organizarea datelor dup un model propriu:
(1) modelul firului de ateptare; (2) modelul stivei; (3) modelul listei circulare; (4) modelul
arborescent.
Implementarea acestor modele ntr-un limbaj de programare necesit soluionarea urm-
toarelor probleme:
organizarea datelor dup semnificaia acestora, cel mai frecvent n structuri omogene:
tablouri unidimensionale;
aezarea (intrarea) unui element din structur dup regula specific modelului;
scoaterea (ieirea) unui element din structur dup regula specific modelului;
accesul la elementele structurii (numrarea/listarea elementelor) dup regula specific
modelului.
n fiecare dintre situaiile reale din exemplele prezentate, numrul elementelor variaz n
timp: oricnd poate s apar un solicitant pentru serviciul Internet sau o versiune nou a progra-
mului antivirus; i n grupul de copii poate intra sau poate pleca un copil; n orice familie, copiii
devin la rndul lor prini, i arborele genealogic crete.
ntruct numrul elementelor nu este constant i nici nu poate fi precizat n timp, structurile de
date folosite pentru implementarea acestor modele se numesc structuri dinamice. Variaia n timp
a numrului de elemente (aspectul dinamic al structurii) respect relaiile i disciplina (regulile de
comportament) specifice modelului. Implementarea structurilor dinamice prin memorarea acesto-
ra n tablouri unidimensionale folosete alocarea static a memoriei (mecanism de alocarea a
memoriei din segmentul de date prin care zona de memorie maxim alocat corespunztor capa-
citii tabloului rmne la dispoziia programului pe toat durata de execuie a acestuia).
Aspectul dinamic al structurilor de date este pus i mai bine n eviden n modul de alocare
dinamic a memoriei: mecanism de alocarea a memoriei de tip Heap prin care zonele de me-
morie pot fi solicitate i eliberate chiar n timpul execuiei programului.

# TEME
1. Formulai un exemplu real care s necesite organizarea datelor ntr-un model de tip fir de
ateptare. Punei n eviden aspectul dinamic al structurii.
2. Formulai un exemplu real care s necesite organizarea datelor ntr-un model de tip stiv.
Punei n eviden aspectul dinamic al structurii.
3. Formulai un exemplu real care s necesite organizarea datelor ntr-un model de tip list cir-
cular. Punei n eviden aspectul dinamic al structurii.
4. Formulai un exemplu real care s necesite organizarea datelor ntr-un model de tip arbores-
cent. Punei n eviden aspectul dinamic al structurii.
5. Asociai modelul dinamic corespunztor fiecreia dintre urmtoarele situaii:
a) organizarea calculatoarelor ntr-o reea local de tip inel;
b) organizarea aplicaiilor deschise de un utilizator n sistemul de operare Windows;
c) organizarea informaiilor pe discul sistem;
d) organizarea cererilor de listare la imprimant;
e) organizarea instruciunilor unui program.

46
ARBORELE GENEALOGIC
tem\ de compozi]ie

Realizai arborele genealogic personal printr-o pre-


zentare ct mai atractiv care s pun n evidena perso-
nalitatea fiecrui membru al familiei.
Se poate lucra n oricare dintre aplicaiile cu efecte
grafice cunoscute.
Sugestie de rezolvare:
prezentarea acestei teme de ctre elevi, n laborator,
conduce la o activitate foarte atractiv; se pot face
clasamente: cel mai nalt arbore; cel mai vrstnic
arbore, cel mai stufos arbore.
Figura 21

7.2. Clasificarea structurilor dinamice


Relaiile dintre elemente determin mai multe categorii de structuri dinamice prezentate n
clasificarea din figura 22.
Figura 22. Clasificarea structurilor dinamice

oarecare
liste liniare
fir de ateptare (coad)

Structuri dinamice liste circulare stiv

arbori

Fiecare dintre categoriile de structuri dinamice din aceast clasificare are proprieti speci-
fice (Tabelul 16).
Tabelul 16. Proprietile structurilor dinamice
STRUCTURA DINAMIC PROPRIETI
Relaiile dintre elementele structurii sunt de tip succesor
predecesor; exist un singur element fr predecesor, capul
List liniar listei, i un singur element fr succesor, ultimul element din
list.
Nu exist nicio regul pentru intrarea i ieirea elementelor
List oarecare
din structur.
Intrarea i ieirea elementelor din structur se face dup regu-
Fir de ateptare la FIFO (First Input First Output = primul intrat, primul ieit).

47
Intrarea i ieirea elementelor din structur se face dup regula
Stiv LIFO (Last Input First Output = ultimul intrat, primul ieit).
Relaiile dintre elementele structurii sunt de tip succesor
List circular predecesor; nu exist niciun element fr predecesor sau fr
succesor.
Relaiile dintre elementele structurii sunt de tip ascendent
descendent; exist un singur element fr ascendent
Arbori rdcina arborelui i unul sau mai multe elemente fr
descendeni elementele terminale sau frunze.

# TEME
1. Identificai tipul listei liniare care poate fi asociat urmtoarelor situaii:
a) Profesorul diriginte ntocmete lista cu elevii care vor participa la o excursie cu numr li-
mitat de locuri (mai puine dect efectivul clasei).
b) ntruct numrul elevilor care doresc s mearg n excursie este mult mai mare dect
numrul de locuri, profesorul diriginte reface lista pentru a-i elimina mai uor pe cei care s-au
nscris mai trziu.
c) La ora de Educaie Fizic, elevii intr pe rnd din vestiar n sala de sport; fiecare elev tre-
buie s se alinieze, ocupndu-i locul astfel nct, n fiecare moment, irul elevilor prezeni n
sal s fie ordonat descresctor dup nlime.
2. Se consider o list liniar oarecare cu n elemente (n>10).
Determinai valoarea urmtoarelor expresii:
a) succesor (element 4 ) = b) predecesor (element 9) =
c) succesor (element n ) = d) predecesor (element n) =
e) succesor (element 1 ) = f) predecesor (element 1) =
g) succesor (predecesor (n)) = h) predecesor (predecesor (3)) =
3. Stabilii relaia prin care o list liniar oarecare cu n elemente poate fi transformat ntr-o list
circular.
4. 4.1. Pentru fiecare membru din arborele genealogic personal, determinai:
a) numrul descendenilor;
b) numrul ascendenilor;
c) numrul elementelor terminale (fr descendeni).
4.2. Precizai care este semnificaia elementelor terminale din arborele genealogic personal.
4.3. Care este semnificaia elementului rdcin din arborele genealogic personal?
4.4. Cum ar trebui construit arborele genealogic personal, astfel nct autorul s fie un ele-
ment terminal?

48
7.3. Prelucrri specifice structurilor dinamice liniare

Pentru organizarea datelor n structuri dinamice liniare, sunt necesare urmtoarele prelucrri:
z Crearea structurii dinamice: aceast prelucrare corespunde memorrii datelor pentru
primul element din structur.
z Parcurgerea structurii dinamice: aceast prelucrare permite localizarea fiecrui element
din structur, respectndu-se regulile de ordine specifice modelului de structur dinamic.
z Actualizarea structurii dinamice: aceast prelucrare permite modificarea numrului de ele-
mente din structur prin adugare sau inserare de elemente noi sau prin eliminarea unor ele-
mente; tot prin actualizare, se pot modifica informaiile specifice unui element.
n Tabelul 17 sunt descrise operaiile necesare implementrii acestor prelucrri.

Tabelul 17. Structuri dinamice prelucrri i operaii specifice


STAREA STRUCTURII
(numrul n de elemente)
PRELUCRARE OPERAII SPECIFICE
NAINTE DE DUP
PRELUCRARE PRELUCRARE
se verific dac structura atunci
dac n=0
este vid n=1
CREARE (structura este
se memoreaz datele pentru altfel
vid)
primul element din structur operaie fr sens

localizarea tuturor ele-


Total
mentelor
Nu se modific nici numrul, nici
PARCURGERE localizarea elementelor valorile elementelor.
Parial care ndeplinesc o condiie
specificat
se verific dac s-a comple-
tat capacitatea structurii
atunci
se memoreaz datele pen- dac
Adugare / operaie imposibil
tru un element nou care n=capacitatea
Inserare altfel
intr n structur respec- structurii
n+1 elemente
tnd regula de intrare
specific modelului.
se verific dac structura
atunci
ACTUALIZARE este vid dac
operaie imposibil
tergere se elimin din structur un n= 0
altfel
element respectnd regula de structura este vid
n-1 elemente
ieire specific modelului.
Se localizeaz (prin parcur- Nu se modific numrul de elemente din
gere parial) elementul ale structur; se modific valorile pentru
Modificare crui valori trebuie modifi- unul sau mai multe elemente.
cate; se modific valorile
elementului localizat.

49
# TEME
1. Precizai de ce este necesar cunoaterea capacitii unei structuri dinamice n varianta imple-
mentrii prin alocarea static a memoriei.
2. Identificai situaiile n care pot fi date urmtoarele mesaje:
a) operaie fr sens, list existent;
b) operaie imposibil, list vid;
c) operaie imposibil, element inexistent;
d) nu este permis operaia de inserare.
3. Alctuii cte o secven de operaii elementare, necesar fiecreia dintre urmtoarele prelu-
crri:
a) afiarea numrului de elemente dintr-o list oarecare;
b) intrarea unui element nou ntr-un fir de ateptare;
c) afiarea numrului de ordine al elementelor care respect o condiie specificat;
d) verificarea existenei n list a unui element care respect o condiie specificat;
e) ieirea unui element dintr-o stiv.

7.4. Implementarea structurilor dinamice liniare


7.4.1. FIRUL DE A{TEPTARE (COADA)
Disciplina structurii dinamice fir de ateptare sau coad este de tip FIFO (First Input First
Output = primul intrat, primul ieit). Implementarea ntr-un limbaj de programare a acestui
model de structur dinamic revine la controlul operaiilor de intrare/ieire n/din structur, ast-
fel nct s fie respectat disciplina FIFO.
n acest scop, structura va fi controlat prin:
(1) doi marcatori (indici) de poziie pe care i vom numi primul i ultimul (fig. 22).

1 2 3 .......... n-1 n

primul ultimul

Figura 22

(2) capacitatea structurii (numrul maxim de elemente alocate pe care l vom nota cu n).

Cazuri particulare
Dac firul de ateptare nu conine niciun element, firul este gol (fir vid).
Dac a fost ocupat toat capacitatea structurii, firul este plin.

50
Prelucrrile specifice firului de ateptare
` crearea are sens doar dac firul este gol (fir vid);
` intrarea unui element nou:
un element poate intra n structur, doar dac nu a fost completat capacitatea structurii
(mai sunt locuri libere);
ntotdeauna, noul element se aaz la sfritul structurii, el devine ultimul;
` ieirea unui element (ntruct firele de ateptare/coada se formeaz pentru satisfacerea
unor cereri, servicii, spunem c ieirea din fir are loc cnd primul element a fost servit):
un element poate iei din structur, doar dac firul nu este vid (exist cel puin un element);
ntotdeauna, dup ieirea unui element din structur, toate elementele se deplaseaz n
fa; coada avanseaz i elementul ajuns pe poziia primul poate fi servit (fig. 23);

2 3 .......... n-1 n

primul ultimul
Figura 23

` parcurgerea se poate efectua doar dac firul nu este vid:


parcurgerea se poate face pentru determinarea numrului de elemente aezate la coad,
pentru afiarea elementelor sau pentru determinarea unor proprieti;
parcurgerea se face ntotdeauna de la primul la ultimul element.

Elementele firului de ateptare pot fi persoane, obiecte, procese care ateapt satisfacerea
unor cereri; exemple:
persoanele nscrise pe o list de ateptare pentru rezervri de bilete, acceptarea la un inter-
viu etc.;
persoanele care ateapt la rnd pentru efecturea unor pli, cumprarea de produse etc.;
mainile aflate ntr-un spaiu de parcare la o benzinrie;
evenimentele planificate ntr-o locaie (concerte, concursuri etc.).

n cele mai frecvente situaii, se nregistreaz mai multe informaii despre elementele firului
de ateptare. Fiecare element din fir este descris ca o structur eterogen articol; firul de
ateptare va fi memorat ntr-un vector de articole.
Pentru nceput, vom considera c fiecare element este descris prin numrul su de ordine
(vector cu valori ntregi, pozitive).
n continuare, se prezint secvena pseudocod a operaiilor necesare implementrii unui fir
de ateptare.

51
nceput fir _de_ ateptare_1
// se lucreaz cu vectorul F pentru care se aloc 100 de elemente
// variabile de lucru:
// n numrul maxim de elemente din fir (capacitatea firului )
// primul ultimul marcatori de poziie
// i indicele de adres pentru F
// nr numrul de elemente din fir
// secvena de iniializare
// secvena poate fi completat cu validarea lui n faa de numrul de elemente alocate (100)
scrie introduceti valoare pentru capacitatea firului de asteptare, n=
citete n
pentru i=1 la n execut
F[i] 0
sfrit pentru
primul0 // fir vid; se consider c adresarea elementelor din vector ncepe de la 1
ultimul0
// sfrit secvena de iniializare
// secvena pentru creare
dac primul = 0
atunci
bloc
primul1
scrie introduceti valoare pentru primul element F[primul]=
citete F[primul]
ultimul primul
sfrit bloc
altfel
scrie operatie fara sens: firul nu este vid
sfrit dac
//sfrit secvena creare
// secvena pentru intrarea unui element nou
ultimul ultimul+1
dac ultimul < =n
atunci
bloc
scrie introduceti valoare pentru noul element F[ultimul]=
citete F[ultimul]
sfrit bloc
altfel
scrie operatie imposibila: firul este plin
sfrit dac
//sfrit secvena pentru intrarea unui element nou

52
// secvena pentru ieirea (servirea) unui element
dac primul =o
atunci
scrie operatie imposibila: firul este gol
altfel
bloc
scrie este servit elementul F[primul]

// coada avanseaz secvena A secvena B


pentru i= primul la ultimul-1 execut dac primul < ultimul
F [i] F[i+1] atunci
sfrit pentru F[primul] 0
F[ultimul] 0 primul primul +1
ultimul ultimul -1 sfrit dac
sfrit bloc
sfrit dac
//sfrsit secvena pentru ieirea unui element

//secvena pentru parcurgerea firului: se afieaz elementele din ir i lungimea firului


dac primul =o
atunci
scrie operatie imposibila: firul este gol
altfel
bloc
nr 0
pentru i= primul la ultimul execut
bloc
scrie F [i]
nr nr + 1
sfrit bloc
sfrit pentru
scrie firul contine nr elemente
sfrit bloc
sfrit dac
//sfrit secvena pentru parcurgerea firului de ateptare

sfrit fir _de_ ateptare_1

53
Pentru simularea aspectului dinamic al firului de ateptare, sugerm implementarea prelu-
crrilor specifice printr-un program cu meniu (fig. 24).

Meniu FIFO
nceput fir _de_ ateptare_2
//se afieaz opiunile din meniu 1. Creare
optiune 0
repet 2. Intrare
// se sterge ecranul 3. Servire
// afiare meniu
repet 4. Parcurgere
scrie fir de asteptare prelucrri specifice
scrie 1 creare 5. Exit
scrie 2 intrarea unui element nou
Optiune _
scrie 3 iesirea unui element
scrie 4 parcurgere Figura 24
scrie 5 sfarsit program

scrie introduceti optiunea (1,2,3,4,5):


citeste optiune
pn cnd optiune <=5 // se valideaz optiunea
selecteaz optiune
optiune=1
// secven creare
optiune=2
// secven intrare element nou
optiune=3
// secven ieire element
optiune=4
// secven parcurgere
optiune=5
scrie sfarsit program
sfrit selecteaz
pn cnd optiune=5

sfrit fir _de_ ateptare_2

Printr-o singur rulare a programului, utilizatorul poate s aleag din meniu, de mai multe
ori, opiunea corespunztoare simulrii firului de ateptare.
Spre exemplu, pentru simularea intrrii primului element urmat de intrarea a nc trei ele-
mente i ieirea a dou elemente, utilizatorul poate dirija execuia programului prin urmtoarea
secven de opiuni: 1, 4, 2, 4, 2, 4, 2 ,4, 3, 4, 3, 4, 5.

54
Dup fiecare opiune care simuleaz dinamica structurii (creare, intrare, ieire), s-a ales par-
curgerea (opiunea 4) prin care se afieaz elementele din fir. n acest mod, utilizatorul poate
controla dac programul modeleaz corect firul de ateptare.

# TEME
1. Codificai, n limbajul de programare studiat, fiecare dintre secvenele pseudocod propuse
pentru simularea unui fir de ateptare.
2. Precizai care este efectul urmtoarei secvene de opiuni :
a) crearea i parcurgerea firului de ateptare;
b) crearea, intrarea unui nou element i parcurgerea firului de ateptare;
c) crearea, ierea unui element i parcurgerea firului de ateptare;
d) ieirea unui element din firul de ateptare.
3. Care este efectul eliminrii din program a secvenei de instruciuni pentru crearea firului de
ateptare?
4. Compunei un program nou care s nu conin secvena de creare.
5. Pentru ieirea unui element din coad, au fost propuse dou secvene care simuleaz
avansul: secvena A i secvena B. Urmrii secvena B i rspundei la urmtoarele ntrebri:
a) Care este semnificaia momentului primul = ultimul?
b) Cum pot fi utilizate locaiile de memorie eliberate prin ieirea unui element?
6. Realizai un program cu meniu pentru modelarea urmtoarei situaii:
Mai multe persoane se nscriu pentru rezervarea de bilete la un spectacol la care au acces
doar elevii. Se cunosc numrul de bilete i anul naterii fiecrei persoane nscris pe list.
Organizatorii doresc s afle numrul de persoane nscrise, ci elevi s-au nscris, cte bilete
disponibile mai sunt.
7. Propunei o situaie real a crei rezolvare cu calculatorul s necesite modelarea datelor prin
fire de ateptare.

7.4.2. STIVA
Disciplina structurii dinamice numit stiv este de tip
LIFO (Last Input First Output =ultimul intrat, primul ieit).
Implementarea ntr-un limbaj de programare a acestui model n vrf
de structur dinamic revine la controlul operaiilor de n-1
intrare/ieire n/din structur, astfel nct s fie respectat
disciplina LIFO.
3
n acest scop, structura va fi controlat prin:
doi marcatori (indici) de poziie pe care i vom numi 2
baz i vrf (fig. 25); 1 baz
capacitatea structurii (numrul maxim de elemente
alocate pe care l vom nota cu n). Figura 25

55
Cazuri particulare
Dac stiva nu conine niciun element, stiva este goal (stiv vid).
Dac a fost ocupat toat capacitatea structurii, stiva este plin.

Prelucrrile specifice stivei

` crearea are sens doar dac stiva este goal (stiv vid);

` intrarea unui element nou:


un element poate intra n structur doar dac nu a fost completat capacitatea structurii
(mai sunt locuri libere);
ntotdeauna, noul element se aaz peste celelalte elemente, n vrful stivei;
dup intrarea unui element nou n stiv, spunem c stiva crete;

` ieirea unui element:


un element poate iei din structur, doar dac stiva nu este vid (exist cel puin un element);
ntotdeauna, iese din structur elementul aflat n vrful stivei;
dup ieirea unui element din stiv, spunem c stiva scade ;

n vrf
n-1 Figura 26

3
2
1 baz

` parcurgerea se poate efectua doar dac stiva nu este vid:


parcurgerea se poate face pentru determinarea numrului de elemente stivuite, pentru
afiarea elementelor sau pentru determinarea unor proprieti;
parcurgerea se face ntotdeauna de la vrf spre baz.

Elementele stivei pot fi persoane, obiecte, procese care ateapt rezolvarea unei solicitri
dup regula LIFO; exemple:
persoanele propuse pentru disponibilizare de la un loc de munc al crui manager ine
seama de vechimea angajailor;
vagoanele de tren aflate n prob pe o linie de manevr;
programele activate de un utilizator Windows.

56
n cele mai frecvente situaii, se nregistreaz mai multe informaii despre elementele aflate
n stiv. Fiecare element din stiv este descris ca o structur eterogen articol; pentru memo-
rarea elementelor din stiv se va folosi un vector de articole.

Pentru nceput, vom considera c fiecare element este descris prin numrul su de ordine
(vector cu valori ntregi, pozitive). n continuare, se prezint secvena pseudocod a operaiilor
necesare implementrii stivei.

nceput stiva1
// se lucreaz cu vectorul S pentru care se aloc 100 de elemente
// variabile de lucru:
// n numrul maxim de elemente din stiv (capacitatea stivei )
// baza vrf marcatori de poziie
// i indicele de adres pentru S
// nr numrul de elemente din stiv

// secvena de iniializare
// secvena poate fi completat cu validarea lui n fa de numrul de elemente alocate (100)

scrie introduceti valoare pentru capacitatea stivei, n=


citete n
pentru i=1 la n execut
S[i] 0
sfrit pentru
// stiva este vid; se consider c adresarea elementelor din vector ncepe de la 1
vrf0
baza0
// sfrit secvena de iniializare

// secvena pentru creare


dac vrf = 0
atunci
bloc
vrf1
scrie introduceti valoare pentru elementul din varful stivei S[vrf]=
citete S[vrf]
sfrit bloc
altfel
scrie operatie fara sens:stiva nu este vida
sfrit dac
//sfrit secvena creare

57
// secvena pentru intrarea unui element nou
vrf o vrf+1 // stiva crete
dac vrf < =n
atunci
bloc
scrie introduceti valoare pentru elementul din varful stivei S[vrf]=
citete S[vrf]
sfrit bloc
altfel
scrie operatie imposibila: stiva este plin
sfrit dac
//sfrit secvena pentru intrarea unui element nou
// secvena pentru ieirea unui element
dac vrf =0
atunci
scrie operatie imposibila: stiva este goala
altfel
bloc
scrie iese elementul din varful stivei S[varf]
// stiva scade
S[varf] 0
varf varf 1
sfrit bloc
sfrit dac
//sfrit secvena pentru ieirea unui element
//secvena pentru parcurgerea stivei:
//se afieaz elementele din stiv i nlimea stivei
dac vrf =o
atunci
scrie operatie imposibila: stiva este goala
altfel
bloc
nr 0
pentru i= vrf la baza execut
bloc
scrie S [i]
nr nr + 1
sfrit bloc
sfrit pentru
scrie stiva contine nr elemente
sfrit bloc
sfrit dac
//sfrit secvena pentru parcurgerea stivei
sfrit stiva1

58
Pentru simularea aspectului dinamic al stivei, sugerm implementarea prelucrrilor specifice
printr-un program cu meniu (fig. 27).

nceput stiva2
//se afieaz opiunile din meniu
optiuneo0

repet
// se terge ecranul
// afiare meniu
repet
scrie operatii asupra stivei
scrie 1 creare
scrie 2 intrare element nou
scrie 3 iesirea unui element
scrie 4 parcurgere
scrie 5 sfarsit program

scrie introduceti optiunea (1,2,3,4,5):


citete optiune
pn cnd optiune <=5 // se valideaz optiunea

selecteaz optiune Meniu LIFO


optiune=1
1. Creare
// secventa creare
optiune=2 2. Intrare
// secventa intrare element nou
optiune=3 3. Ieire
// secventa iesire element
optiune=4 4. Parcurgere
// secventa parcurgere 5. Exit
optiune=5
scrie sfarsit program Optiune: _
sfrit selecteaz
pn cnd optiune=5 Figura 27
sfrit stiva2

Printr-o singur rulare a programului, utilizatorul poate s aleag din meniu, de mai multe
ori, opiunea corespunztoare simulrii stivei.
Spre exemplu, pentru simularea intrrii primului element urmat de intrarea a nc trei
elemente i ieirea a dou elemente, utilizatorul poate dirija execuia programului prin urm-
toarea secven de opiuni: 1, 4, 2, 4, 2, 4, 2, 4, 3, 4, 3, 4, 5.

59
Dup fiecare opiune care simuleaz dinamica structurii (creare, intrare, ieire) s-a ales
parcurgerea (opiunea 4) prin care se afieaz elementele stivei. n acest mod, utilizatorul poate
controla dac programul modeleaz corect stiva.

# TEME
1. Codificai, n limbajul de programare studiat, fiecare dintre secvenele pseudocod propuse
pentru simularea stivei.
2. Precizai care este efectul urmtoarei secvene de opiuni:
a) crearea i parcurgerea stivei;
b) crearea, intrarea unui nou element i parcurgerea stivei;
c) crearea, ieirea unui element i parcurgerea stivei;
d) ieirea unui element din stiv.
3. Precizai care este efectul eliminrii din program a secvenei de instruciuni pentru crearea
stivei.
4. Compunei un program nou care s nu conin secvena de creare a stivei.
5. Care este rolul marcatorului de poziie baza stivei?
6. Compunei un program nou n care marcatorul baza s aib valoarea n (capacitatea stivei).
7. Realizai un program cu meniu pentru modelarea urmtoarei situaii:
La biblioteca colii, crile de Informatic sunt att de solicitate, nct bibliotecara nu le mai
pune la loc n raft dect la sfritul zilei; n rest, le aaz una peste alta pe mas; s-a constatat c
nici elevii nu selecteaz crile i mprumut de fiecare dat cartea aflat la vedere (deasupra
celorlalte cri). Teancul de cri nu poate depi n exemplare (n25). Se cunoate autorul, anul
editrii i preul fiecrei cri. Dorim s aflm, la cerere, numrul crilor, valoarea acestora pre-
cum i numrul crilor mprumutate ntr-o zi. (Execuia programului va simula activitatea de
restituire i mprumut pe parcursul unei zile.)
8. Propunei o situaie real a crei rezolvare cu calculatorul s necesite modelarea datelor prin
structuri dinamice de tip stiv.

PROBLEME PROPUSE
1. La un cabinet medical, pacienii intr la consultaie n ordinea sosirii. Despre fiecare pacient
se cunoate anul naterii, genul (M/F), nlimea i greutatea. Realizai un program care s
simuleze nregistrarea pacienilor n lista de ateptare, modificarea listei dup fiecare consul-
taie i determinarea urmtoarelor informaii:
a) numrul pacienilor care ateapt pentru consultaie;
b) numrul pacienilor brbai care ateapt pentru consultaie;
c) numrul pacienilor supraponderali care ateapt pentru consultaie ( greutatea 80 Kg i
nlimea 1,70m).

60
2. Pentru a rezolva mai repede solicitrile unor clieni nemulumii de serviciile primite, Oficiul
pentru protecia consumatorilor a decis s nfiineze, pe lng ghieul de lucru G1, un ghieu
nou, G2. Coada format la ghieul G1 este reorganizat astfel: clienii cu numr de ordine
par trec la ghieul G2.
Realizai un program pentru simularea celor dou cozi: G1 i G2 pornind de la o coad
iniial, G1. Stabilii singuri datele memorate pentru fiecare client.
3. Realizai un program pentru adunarea a dou numere foarte mari. Justificai structura dina-
mic folosit.
4. Realizai un program pentru afiarea n ordine invers a unui text introdus de la tastatur
(exemplu: textul introdus este mai mult ca perfectul textul afiat este lutcefrep ac tlum iam).
Justificai structura dinamic folosit.
5. Realizai un program pentru transformarea unui numr din baza 10 n baza 2. Justificai struc-
tura dinamic folosit.
6. Se consider formate dou cozi C1i C2; n cele dou cozi sunt memorate valori numerice. S se
formeze o coad nou, C3, prin aezarea elementelor din coada C2 dup elementele cozii C1.
Exemplu:
Coada C1 este: 7, 3, 6, 5, 8, 9, 2.
Coada C2 este: 6, 8, 1, 2, 5, 1, 3, 5, 9.
Se obine coada C3: 7, 3, 6, 5, 8, 9, 2, 6, 8, 1, 2, 5, 1, 3, 5, 9.
7. Se consider formate dou stive S1 i S2; n cele dou stive sunt memorate valori numerice. S
se formeze o stiv nou, S3, prin aezarea elementelor din stiva S2 peste elementele stivei S1.
Exemplu:
Stiva S1 este: 7, 3, 6, 5, 8, 9, 2.
Stiva S2 este: 6, 8, 1, 2, 5, 1, 3, 5, 9.
Se obine stiva S3: 6, 8, 1, 2, 5, 1, 3, 5, 9, 7, 3, 6, 5, 8, 9, 2.
8. Realizai un program care s prelucreze o secven de comenzi pentru un calculator de buzu-
nar; prima comand executat este prima comand din secven. Fiecare comand are urm-
toarea structur:
operator1 operand operator2
unde: operator1, operator2 sunt valori numerice reale iar operand poate avea valorile
S-sum, Ddiferen Pprodus, Esfritul secvenei de comenzi (sfrit prelucrare).
Exemplu:
Secvena de comenzi rezultate
3.4 S 3 6.4
25.5 D 20.5 5
12 P 4 48
E sfrit prelucrare

9. Un ir de caractere conine duplicate n serie (caractere de acelai fel care se repet unul dup
altul). Se dorete rafinarea irului prin eliminarea duplicatelor n serie. irul vid este ir rafinat.

61
Exemplu:
irul iniial este: 912222223444355aa16777777800095.
irul final este: 96895.
10. ntr-un grup de n copii exist relaii de prietenie; fiecare copil este identificat prin numrul su
de ordine n grup; fiecare copil poate fi prieten cu mai muli copii din grup. Profesorul diriginte
dorete s aeze copiii ntr-o ordine care s pun n eviden relaiile de prietenie, i anume:
ncepnd cu un copil oarecare i, acesta i strig toi prietenii n ordinea cresctoare a numru-
lui; prietenii copilului i se aaz n rnd, unul dup altul. Primul copil care urmeaz n ir dup
copilul i i strig toi prietenii n ordinea cresctoare a numrului; acetia se aaz i ei n
rnd, unul dup altul (dac un copil a fost strigat nainte, el i pstreaz locul n rnd).

Exemplul 1: n grup sunt 6 copii. Exemplul 2: n grup sunt 6 copii.


Relaiile de prietenie dintre copii: Relaiile de prietenie dintre copii:

Figura 28
a) 1 1 1 b) 1 1
1 1 1 1 1
1 1 1 1 1
1 1
1 1 1 1
1 1

Pentru i=2, ordinea copiilor Pentru i=3, ordinea copiilor


n ir este: 2, 1, 3, 5, 4, 6. n ir este: 3, 2, 5, 1, 4, 6.

Cerine
a) Specificai structurile necesare organizrii datelor din aceast problem.
b) Determinai situaiile particulare care pot fi ntlnite n grupul de copii.
c) Formulai exemple numerice care s pun n eviden situaiile particulare determinate.
d) Realizai un program care s afieze aranjarea copiilor din grup n ordinea dorit de pro-
fesorul diriginte.

MINIPROIECT N ECHIP. COMPANIA EFICIENT


Etapa: Analiz (identificarea datelor i a prelucrrilor)
Cerine:
1. Analizai datele i cerinele prezentate n studiul de caz Compania Eficient (pag. 3); jus-
tificai formele de organizare a datelor prin analiza comparativ dup eficiena prelucrrii aces-
tora cu calculatorul.
2. Alctuii documentaia de proiect corespunztoare acestei etape.

62
2
Capitolul
SUBPROGRAME

1. UN EXEMPLU DE MODULARIZARE
Modularizarea ca metod de rezolvare a problemelor s-a dovedit foarte util nu numai n pro-
gramare, ci i n alte domenii ale tiinei i chiar n viaa de zi cu zi.
Rezolvarea acestei probleme prin modularizare prezint urmtoarele avantaje:

A. ORGANIZAREA FESTIVITII DE ABSOLVIRE A LICEULUI

S presupunem c avem de organizat festivitatea de absolvire a liceului.


Pare mult mai greu dect n cazul organizrii unei onomastici; de aceea, vom ncerca s
descompunem problema n probleme mai mici:
(p1) cum vom contacta invitaii?
(p2) cum vom organiza partea distractiv?
(p3) cum vom organiza partea culinar?
Problema (p1) se poate i ea descompune n alte trei probleme:
(p1.1) lista celor care pot fi anunai telefonic;
(p1.2) lista celor care pot fi anunai prin e-mail;
(p1.3) lista celor care pot fi anunai prin pot.
Problema (p2) se poate descompune n dou subprobleme:
(p2.1) stabilirea scenariului, alegerea formaiilor i a solitilor;
(p2.2) anunarea formaiilor i a solitilor invitai.
Problema (p3) se poate descompune la rndul ei n urmtoarele subprobleme:
(p3.1) alctuirea meniului;
(p3.2) contactarea furnizorilor.

y problemele (p1.1), (p1.2) , , (p3.2) sunt mult mai simple i mai uor de rezolvat dect
problema iniial; ele pot fi rezolvate i verificate independent;
y soluia gsit pentru o anumit subproblem poate fi folosit i pentru alte subprobleme;
de exemplu: problemele (p2.2) i (p2.3) se pot rezolva la fel ca i problema (p1), (fig. 29);
acest fapt determin o mare economie de efort i de timp de lucru;

63
y soluia gsit pentru o anumit subproblem poate fi adaptat pentru rezolvarea altor pro-
bleme: de exemplu, soluia problemei (p2.2) poate fi adaptat i poate conduce la
rezolvarea problemei (p3.2). i acest fapt determin o mare economie de efort i de timp
de lucru;
y avnd de rezolvat mai multe probleme independente mai simple n loc de una singur
mai complicat soluionarea acestora se poate face independent de ctre diverse per-
soane; acest fapt determin, de asemenea, o mare economie de timp de lucru.
Figura 29 ilustreaz structurarea i descompunerea problemei de mai sus n subprobleme
(blocurile corespunztoare problemelor care admit aceeai soluie au fost haurate identic).

(P) Organizarea festivitii de absolvire a liceului


(p1) cum vom contacta invitaii?
(p1.1) lista celor care pot fi anunai telefonic;
(p1.2) lista celor care pot fi anunai prin e-mail;
(p1.3) lista celor care pot fi anunai prin pot.

(p2) cum vom organiza partea distractiv?


(p2.1) scenariul: formaii i soliti
(p2.2) invitarea formaiilor
(p2.2.1) lista celor care pot fi anunai telefonic;
(p2.2.2) lista celor care pot fi anunai prin e-mail;
(p2.2.3) lista celor care pot fi anunai prin pot.

(p3) cum vom organiza partea culinar?


(p3.1) alctuirea meniului
(p3.2) contactarea furnizorilor
(p3.2.1) lista celor care pot fi anunai telefonic;
(p3.2.2) lista celor care pot fi anunai prin e-mail;
(p3.2.3) lista celor care pot fi anunai prin pot.

Figura 29. Descompunerea unei probleme n subprobleme

64
B. CUM FOLOSIM MODULARIZAREA LA NIVELUL UNUI PROGRAM?

Definiie
Un modul de program este o unitate de prelucrare care face parte dintr-un program.

Orice program poate fi considerat o funcie n sensul matematic al cuvntului:


programul primete date de intrare (argumente; de ex. numerele: 1500; 19,44; 13,89; 25);
programul aplic datelor de intrare un ir de prelucrri (de ex.: nmulirea, ridicarea la
ptrat, mprirea la 2);
programul furnizeaz rezultate (n cazul nostru, va-
lorile: 283.435; 144.699; 468.750).
Programul calculeaz energia cinetic dezvoltat
de un corp de mas m (aici: un autoturism de 1,5 tone),
atunci cnd viteza sa este egal cu 70, 50, respectiv
90 km/h1 (adic atunci cnd circul n localiti, n afara
lor, respectiv pe autostrzi). Cu alte cuvinte, avem de a
face cu calcularea energiei cinetice dup relaia:

m v2 f : R+ R+ R+ , f (m, v) =
m v2
Ec =
2 sau, cu o funcie 2

S simplificm puin lucrurile i s presupunem c masa corpului pentru care trebuie calculat
energia cinetic este constant, variind doar viteza. Obinem o funcie cu un singur argument:
m 2
f1 : R+ R+ , f1 (v ) = v
2
Dac examinm expresia funciei f1, observm c aceasta rezult din compunerea a dou
funcii: (1) funcia h pentru ridicarea la ptrat:

h : R R , h (v ) = v 2

(2) funcia g pentru nmulirea cu o constant:


m
g : R R , g ( w) = k w , unde k = adic:
2

f1 : R R , f1 = g D h , f1 (v ) = g ( h(v))

1 70km/h 19,44 m/s2; 50km/h 13,89 m/s2; 90km/h 25 m/s2.

65
n matematic, putem obine funcii orict de complexe prin compunerea funciilor ele-
mentare (funcia polinomial, funcia raional, funcia de ridicare la putere sau de extragere de
radical etc.).
n programare, putem construi programe orict de complexe prin tehnica de modularizare,
adic prin nlnuirea logic a unor uniti elementare de program: citirea datelor de intrare,
prelucrarea lor, afiarea rezultatelor obinute n urma prelucrrii datelor. Un modul de prelucrare
poate rezulta din nlnuirea logic a mai multor module: calcularea valorii minime dintr-un set
de valori, calcularea valorii maxime dintr-un set de valori, calcularea mediei aritmetice a
acestora etc.

citete
date_de_intrare date_program

prelucreaz
date_program rezultate

afieaz
rezultate date_de_ieire

program
date_de_intrare date_de_ieire

Figura 30. nlnuirea logic a unitilor de program

nlnuirea logic a unitilor de program, dup modelul compunerii funciilor matematice,


pune n eviden mulimile de valori specifice rezolvrii problemelor cu calculatorul:

citete (date_de_intrare date_program)


Program (date_de_intrare date_de_ieire) prelucreaz (date_program rezultate)
afieaz (rezultate date_de_ieire).

66
2. MODULARIZAREA PROGRAMELOR

A. TIPURI DE PROBLEME (FACULTATIV)


Rezolvarea unei probleme cu ajutorul unui program de calculator este etapa final a unui pro-
ces care depinde de gradul n care cunoatem datele de intrare, tipul rezultatelor, metoda de
rezolvare. innd seama de aceste aspecte, problemele cu care suntem zilnic confruntai se pot
clasifica astfel:

Probleme

informale formale

de analiz de sintez

care nu admit care admit o soluie


o soluie algoritmic algoritmic

cu timp de cu timp de
calcul calcul
exponenial polinomial

Figura 31. O clasificare a problemelor

Exemple:
y O problem informal este o problem pentru care nu tim exact de ce date dispunem, nu
cunoatem metoda de rezolvare, nu tim nici mcar cum ar trebui s arate rezultatele. O pro-
blem informal poate fi formulat astfel: Cum s procedez pentru a fi apreciat de cei din jur?
y O problem formal de analiz este o problem pentru care cunoatem mulimea datelor
iniiale i forma rezultatelor, dar nu cunoatem metoda de rezolvare; de exemplu: ne aflm
ntr-un orel portuar strin, nu cunoatem nici mcar grafia limbii respective i dorim s
ajungem de la hotel n port. Analiznd problema, constatm c nu putem apela la localnici
nici mcar la taximetriti sau hotelieri , dar, de la leciile de geografie, tim c portul se afl

67
n partea sudic a oraului respectiv. Presupunnd c avem parte de o zi nsorit, ne putem
totui orienta s gsim, astfel, drumul.
y O problem formal de sintez este o problem pentru care cunoatem mulimea datelor
iniiale i metoda de rezolvare. (Foarte multe probleme de matematic, fizic, chimie fac
parte din aceast categorie.)
y O problem de sintez care nu poate fi rezolvat algoritmic este mai greu de explicat intu-
itiv. De aceea, vom recurge la prezentarea problemei corespondenei1 Post2. Aceasta este o
problem de decizie nerezolvabil algoritmic care, informal, poate fi enunat astfel: Fie un
dicionar care conine perechi de fraze i fie dou fraze oarecare; se poate decide dac cele
dou fraze au acelai neles n ambele limbi?
n continuare, vom considera o variant mai simpl a problemei lui Post. Fie dou mulimi
finite de numere scrise n baza 10, X = {x1, x2, , xn}, Y = {y1, y2, , yn}. Se cere s se deter-
mine o secven de indici i1, i2, , ik, astfel nct numerele xi xi xi i yi yi yi , obinute prin
1 2 k 1 2 k
concatenare, s fie identice. Se poate demonstra c nu exist un algoritm care s determine o ast-
fel de secven de indici, dndu-se oricare dou mulimi X i Y. Spunem c problema este nede-
cidabil (algoritmic). Exist cazuri particulare ale problemelor nedecidabile care pot fi rezolvate
cu algoritmi particulari, n funcie de exemplul tratat; schimbarea datelor de intrare implic
gsirea unei alte soluii (deci a unui alt algoritm!) aa cum vom arta imediat.
Fie mulimile X1 = {44, 48, 84, 88} i Y1 = {4444, 4448, 4884, 8448}. Problema lui Post
nu are soluie pentru aceste mulimi deoarece oricare dintre numerele din Y1 este mai lung (are
mai multe cifre) dect oricare dintre numerele din X1 .
Fie acum mulimile X2 = {121, 21, 22, 1221}, Y2 = {1121, 12, 112, 122}. Problema lui Post
are soluie pentru aceste mulimi: secvena de indici este 4,2,2,1. ntr-adevr:
Px 4 PP
x 2 x 2 x1
P
12212121121
x4x2x2x1 = 12212121121 = 12212121121 = y4y2y2y1
122
N 12 121121
NNN
y4 y2 y2 y1

Ce se ntmpl cu mulimile X3 = {23, 2333, 323} i Y3 = {22, 32323, 33}? Dar cu


X4 = {22, 2223, 333} i Y4 = {22, 22233, 32}? Dar cu?!

1
Aceast problem a fost formulat n anul 1946 i publicat n articolul "A variant of a recursively
unsolvable problem", n volumul 52 al Bulletin of the American Mathematical Society. Fiind mai simpl
dect problema opririi programelor (a se vedea Anexa 1), problema corespondenei Post este frecvent
folosit pentru demonstrarea prin reducere a nedecidabilitii unor probleme din informatic.
2
Emil Leon POST (1897 1954): matematician de origine polonez, profesor la City College of New
York. n teza sa de doctorat, susinut n 1920, Post a demonstrat completitudinea i noncontradicia cal-
culului cu propoziii descris de B. Russell i A.N. Whitehead n "Principia Mathematica" folosind pen-
tru prima dat metoda tabelelor de adevr. Este considerat printele teoriei demonstraiei, un precursor al
lui Kurt Gdel (prin lucrrile sale privind mulimile recursiv enumerabile, gradele de nedecidabilitate) i
John von Neumann (printr-un model matematic de main de calcul foarte asemntor celui descris de von
Neumann n celebrul su articol din 1946).

68
y O problem formal de sintez, care admite o soluie algoritmic dar al crei ordin de
mrime este exponenial, este problema determinrii combinrilor de n elemente luate cte
m, 0 m n folosind bine-cunoscuta proprietate a combinrilor.

y O problem formal de sintez, care admite o soluie algoritmic i al crei ordin de


mrime este polinomial (chiar liniar), este problema cutrii secveniale. Pentru un ir ordo-
nat dac utilizm metoda cutrii binare, studiat n clasa a IX-a complexitatea algorit-
mului de cutare devine O(log2n).

Transformarea unei probleme informale ntr-o problem formal mai nti de analiz i
apoi de sintez i, mai departe, ntr-o problem rezolvabil algoritmic este uneori extrem
de dificil. Nici gsirea unui algoritm de rezolvare cu complexitate polinomial, liniar sau loga-
ritmic nu este ntotdeauna rezolvabil algoritmic!

# TEM
Exemplificri
a) n ce categorie de probleme se ncadreaz urmtoarele enunuri:
calcularea titlului unui aliaj;
construirea unui aeromodel;
verificare primalitii unui numr natural dat;
acordarea unui mprumut;
sortarea cresctoare a unui ir de numere reale;
calculul sumei primelor n numere naturale;
intrarea n cartea recordurilor;
calcularea dobnzii primite pentru banii depui la banc;
ordonarea elevilor din clas dup nlime i greutate.
b) Cutai exemple din domeniile de interes colar sau din situaii reale pentru fiecare din-
tre categoriile de probleme prezentate.

B. MODULARIZAREA REZOLVRII M1
PROBLEMELOR Introducere
n practic suntem confruntai, cel mai adesea, fie cu
date de intrare
probleme care admit soluii algoritmice i au un grad de com-
plexitate rezonabil, fie numai cu cazuri particulare ale unor M2
probleme nedecidabile, pentru care putem gsi soluii con-
Prelucrare
venabile. n rezolvarea acestor probleme cu ajutorul unui pro-
gram, folosim modularizarea atunci cnd cutm o soluie date de ieire
pentru fiecare dintre urmtoarele subprobleme (fig. 32):
(M1.) introducerea datelor de intrare (modulul de M3
citire a datelor); Afiare
Afiare
(M2.) prelucrarea datelor (modulul de prelucrare);
(M3.) transmiterea datelor de ieire (modulul de Figura 32. Modularizarea rezolvrii
afiare a rezultatelor). unei probleme

69
Noiunea de modul este independent fa de limbajul de programare. Un algoritm poate fi
format din mai multe module (subalgoritmi). n continuare, vom folosi termenul de program,
fr a implica prin aceasta folosirea unui anumit limbaj de programare.

APLICAIE
Problema traiectoriilor
Un tun execut n aruncri de proiectile. Pentru fiecare aruncare se cunosc viteza iniial,
v, i unghiul de tragere . Trebuie determinate:
(1) distana maxim,
viteza iniial,
unghiul de tragere pentru care distana pe orizontal atins de proiectil dup t secunde
este maxim;
(2) nlimea minim,
viteza iniial,
unghiul de tragere pentru care nlimea pe vertical atins de proiectil dup t secunde
este minim.

Ymin


Xmax

Figura 33. Aruncarea unui proiectil

1. Analiza problemei
y Date de intrare: 3 3 5 2 4 6 2 7
numrul de aruncri (n>1);
n viteze iniiale (V); 15 30 15 20 45 60 20 75
n unghiuri de tragere (A).
y Date de ieire:
cea mai mare distan la care a ajuns un proiectil dup t secunde (Xmax);
viteza iniial pentru care, dup t secunde, proiectilul a atins distana maxim (Vk);
unghiul de aruncare pentru care, dup t secunde, proiectilul a atins distana maxim (Ak);
cea mai mic nlime la care a ajuns un proiectil dup t secunde (Ymin);
viteza iniial pentru care, dup t secunde, proiectilul a atins nlimea minim (Vj);
unghiul de aruncare pentru care, dup t secunde, proiectilul a atins nlimea minim (Aj).

70
y Condiii i relaii importante:
Se cunoate t = 10 secunde.
Se utilizeaz formulele de calcul pentru aflarea distanei (1) i a nlimii (2) din traiectoria
unui proiectil:
(1) x = v t cos ,
g t2
( 2) y = v t sin
2

2. Raionamentul problemei
Metoda I: cutm un algoritm ct mai eficient pentru rezolvarea problemei. Aceasta nseam-
n soluionarea concomitent a ambelor cerine.
Pasul 1. Se citete numrul de aruncri n.
Pasul 2. Se citesc cele n perechi de viteze iniiale i unghiuri de tragere (V1, A1), (V2,
A2),, (Vn, An).
Pasul 3. Se iniializeaz constantele t = numrul de secunde i g = acceleraia gravitaional.
Pasul 4. Se calculeaz distana X1 i nlimea Y1 conform formulelor (1) i (2).
Pasul 5. Xmax X1 , k 1, Ymin Y1 , j 1.
Pasul 6. Se calculeaz o nou pereche (Xi,Yi).
Pasul 7. Dac Xi > Xmax atunci Xmax Xi , k i.
Pasul 8. Dac Yi < Ymin atunci Ymin Yi , j i.
Pasul 9. Se repet paii P6, P7, P8 pentru toate perechile de valori (Vi, Ai).
Pasul 10. Se afieaz U, distana maxim Xmax i nlimea minim Ymin, viteza Vk i
unghiul de tragere Ak, viteza Vj i unghiul de tragere Aj.

3. Reprezentarea algoritmului
nceput traiectorii1
variabile n, V, A, X, Y, Xmax, Ymin, k, j, i
t = 10
g = 9,8
citete n
pentru i =1 la, n execut
citete Vi, Ai
sfrit pentru
pentru i =1 la, n execut
Xi Vi * t * cos(Ai)
Yi Vi * t * sin(Ai) g * t * t / 2
sfrit pentru
Xmax X1
k 1

71
Ymin Y1
j 1
pentru i =2 la, n execut
dac Xi > Xmax atunci
bloc
Xmax Xi
k i
sfrit bloc
sfrit dac
dac Yi < Ymin atunci
bloc
Ymin Yi
j i
sfrit bloc
sfrit dac
sfrit pentru
scrie Xmax, Vk, Ak, Ymin, Vj, Aj
sfrit traiectorii1

Metoda II: rezolvarea prin modularizare

Cutm s descompunem problema n probleme mai simple, pentru care eventual avem
soluii, chiar sub form de subalgoritmi:
(M1) modulul de citire a datelor.
(M1.1) modulul de iniializare a constantelor: t = 10 i g = 9,8;
(M1.2) modulul de citire a variabilelor: numrul de aruncri n, cele n viteze iniiale V1,
V2,, Vn i cele n unghiuri de tragere A1, A2,, An ;
(M2) modulul de prelucrare
(M2.1) modulul de calculare a distanelor X1, X2,, Xn i a nlimilor Y1, Y2,, Yn prin
aplicarea formulelor (1) i (2);
(M2.2) modulul de calculare a valorii maxime Xmax dintre X1, X2,, Xn i reinere a inde-
xului corespunztor k;
(M2.3) modulul de calculare a valorii minime Ymin dintre Y1, Y2,, Yn i reinere a inde-
xului corespunztor j;
(M3) modulul de afiare a rezultatelor
afiarea distanei maxime Xmax , a vitezei iniiale i a unghiului de tragere corespunztor Vk,
Ak ; afiarea nlimii minime Ymin , a vitezei iniiale i a unghiului de tragere corespunztor Vj ,
Aj.
Raionamentul modularizat este prezentat n figura 34.

72
(P) Calcularea distanei maxime i a nlimii minime atinse de un
proiectil din mai multe aruncri

(M1) citirea datelor de intrare

(M 1.1) modulul de iniializare a constantelor:


t = 10
g = 9,8

(M 1.2) modulul de citire a variabilelor: numrul de


aruncri n, cele n viteze iniiale V1, V2,..., Vn i cele
n unghiuri de tragere A1, A2,..., An;

(M2) prelucrarea datelor

(M 2.1) modulul de calculare a distanelor: X1, X2,..., Xn


i a nlimilor Y1, Y2,..., Yn prin aplicarea formulelor
(1) i (2);

(M 2.2) modulul de calculare a valorii maxime Xmax


dintre X1, X2,..., Xn i reinere a indexului
corespunztor k;

(M 2.2) modulul de calculare a valorii minime Ymin


dintre Y1, Y2,..., Yn i reinere a indexului
corespunztor j.

(M3) afiarea rezultatelor


distana maxim Xmax, viteza Vk i unghiul Ak pentru
care a fost atins;
nlimea minim Ymin, viteza Vj i unghiul Aj pentru
care a fost atins.

Figura 34. Problema traiectoriilor rezolvare modularizat

73
3. Reprezentarea algoritmului

nceput traiectorii2
variabile n, V, A, X, Y, Xmax, Ymin, k, j, i

t = 10
g = 9,8

citete n
pentru i = 1 la n execut
citete Vi
sfrit pentru
pentru i 1 , n execut
citete Ai
sfrit pentru

pentru i 1, n execut
Xi Vi*t*cos(Ai)
Yi Vi*t*sin(Ai)9,8*t*t/2
sfrit pentru

Xmax X1
k1
pentru i 2, n execut
dac Xi > Xmax atunci
bloc
Xmax Xi
ki
sfrit bloc
sfrit dac
sfrit pentru

Ymin Y1
j1
pentru i 2, n execut
dac Yi < Ymin atunci
bloc
Ymin Yi
ji
sfrit bloc
sfrit dac
sfrit pentru

scrie Xmax, Vk, Ak


scrie Ymin, Vj, Aj

sfrit traiectorii2

74
 Atenie
Programul traiectorii 1 este realizat printr-o secven de operaii ce poate fi folosit doar
pentru rezolvarea acestei probleme.
Programul traiectorii 2
poate folosi module deja scrise, i anume:
y modulul pentru determinarea valorii maxime dintr-o secven de valori i reinere a
poziiei pe care apare acest maxim,
y modulul pentru determinarea valorii minime dintr-o secven de valori i reinere a
poziiei pe care apare acest minim;
se poate adapta mai uor;
prezint un grad mai mare de generalitate.

Urmtoarele exemple pun n eviden flexibilitatea oferit de modularizare.


Exemplul 1: modulul de determinare a valorii minime dintr-o secven de valori se poate
obine din cel de determinare a valorii maxime (i reciproc) prin modificarea operatorului
relaional din instruciunea de test:
Calcularea minimului Calcularea maximului
nceput modul minim nceput modul maxim
variabile Z, VAL, i variabile Z, VAL, i
VAL Z1 VAL Z1
pentru i = 2 la n execut pentru i = 2 la n execut
dac Zi < VAL atunci VALZi dac Zi > VAL atunci VAL Zi
sfrit dac sfrit dac
sfrit pentru sfrit pentru
returneaz VAL returneaz VAL
sfrit minim sfrit maxim

Exemplul 2: modulul de determinare a poziiei valorii maxime (minime) dintr-o secven de


valori se poate obine din modulul de determinare a valorii maxime (minime) prin adugarea a
dou instruciuni de atribuire:
Calcularea poziiei Calcularea valorii
nceput modul poziie_maxim nceput modul maxim
variabile Z, VAL, INDEX, i variabile Z, VAL, i
VAL Z1 VAL Z1
INDEX 1
pentrui = 2 la n execut pentru i = 2 la n execut
dac Zi > VAL atunci dac Zi > VAL atunci
bloc
VAL Zi VALZi
INDEX i

75
sfrit bloc
sfrit dac sfrit dac
sfrit pentru sfrit pentru
returneaz VAL, INDEX returneaz VAL
sfrit poziie_maxim sfrit maxim

# TEME
Utilizarea modulelor
1. Scriei un modul de program pentru citirea datelor din problema traiectoriilor, folosind, n loc
de tablouri unidimensionale, variabile independente. Condiia n > 1 este eliminat. Semnalai
ncheierea operaiei de citire prin:
a) citirea numrului de aruncri n;
b) utilizarea unei valori-semafor care s indice oprirea sau continuarea citirii.
2. Scriei un modul de program care s numere elementele nenule dintr-o secven de n numere
date, n N fixat.
3. Scriei un modul de program pentru calcularea mediei aritmetice a unor numere ntregi nenule,
care s poat fi folosit ntr-un alt modul de program.
4. Se citesc n 3 numere ntregi strict pozitive mai mari dect 1000. S se scrie un modul de
program care s determine cifra unitilor, a sutelor, a miilor i dac este cazul a mili-
oanelor; cifrele cutate vor fi afiate ntr-un alt modul de program.
5. Formulai exemple de prelucrri care pot fi organizate n module (subalgoritmi) i utilizate n
alte prelucrri (algoritmi).

C. TEHNICI DE MODULARIZARE
Pentru modularizarea programelor putem folosi dou tehnici frecvente n proiectare i pro-
gramare:
(T1.) tehnica top-down (de sus n jos, de la complex la simplu; tehnic specific operaiei de
analiz);
(T2.) tehnica bottom-up (de jos n sus, de la simplu la complex; tehnic specific operaiei
de sintez).
Tehnica top-down const n descompunerea modulelor n submodule pn la izolarea celor
mai simple uniti de lucru (este calea pe care am urmat-o n exemplele prezentate).
Tehnica bottom-up procedeaz exact invers: pornete de la uniti de prelucrare elementare
i prin compunerea lor ajunge la soluia problemei. Acest demers este intuitiv asemntor
operaiei matematice de compunere a funciilor.
Dou module M1 i M2 din cadrul unui program se pot afla unul fa de altul n una dintre
urmtoarele relaii (ilustrate n figura 35):
(R1) M2 succede lui M1; prin urmare, M1 i M2 se numesc module independente;
(R2) M2 face parte din M1; prin urmare M2 se numete submodul (subalgoritm, subprogram)
i i este subordonat modulului (algoritmului, programului) M1.

76
Modulul M Modulul M
M1
M1
M2
M2

M..n

Mn

Module independente (R1) Module subordonate (R2)


Figura 35. Subordonarea modulelor

n ambele cazuri, M1 i transfer controlul lui M2. Acest transfer are loc necondiionat,
numai dac execuia modulului M1 s-a ncheiat corect.
Cu alte cuvinte, modul M2 se poate executa pentru c modulul M1 a pregtit toate datele
necesare. Aceste date constituie interfaa prin intermediul creia cele dou module comunic i
pot fi:
date de intrare, pentru modului M2;
date de ieire, pentru modului M1.

n cazul (R1), interfaa trebuie s asigure numai comunicarea de la modulul M1 la modu-


lul M2: datele de ieire ale modulului M1 trebuie transmise modulului M2 i devin date de
intrare pentru acesta.
n cazul (R2), interfaa trebuie s asigure att comunicarea de la modulul (M1) la submo-
dulul (M2), ct i de la submodulul M2 ctre modulul M1:
elementul de interfa, care asigur comunicarea de la modul spre submodul, se introduce
prin cuvntul pseudocod apeleaz urmat de numele submodulului i mulimea datelor de intrare;
apeleaz modul(date_de_intrare)
elementul de interfa, care asigur comunicarea de la submodul spre modul, se introduce
prin cuvntul poseudocod returneaz, urmat de mulimea datelor de ieire.
returneaz(date_de_ieire)

Figura 36 ilustreaz modul de comunicare ntr-un program compus din mai multe module,
aflate fie n relaia (R1), fie n relaia (R2).

77
nceput program p
apeleaz modul s1 (d_i)
nceput modul si-1
apeleaz modul s2 (d_i)
instruciunea j1 nceput modul si

instruciunea j2 instruciunea k1

instruciunea k2
apeleaz modul si-2 (d_i)
apeleaz modul si (d_i)
apeleaz modul si-1 (d_i) instruciunea kh
instruciunea jn
apeleaz modul si+1 (d_i) returneaz (d_e)
returneaz (d_e)
sfrit modul si
sfrit modul si-1

apeleaz modul sn (d_i)
sfrit program

Figura 36. Comunicarea ntre module

# TEME
Comunicarea ntre module
1. Proiectai un modul de program care s numere zilele care au trecut de la nceputul anului pn
n ziua curent. Ce date de intrare primete modulul? Ce date de ieire returneaz modulul?
2. Se citesc n perechi de numere ntregi. Proiectai un program modularizat pentru:
a) determinarea mediei aritmetice a fiecrei perechi de numere;
b) determinarea perechilor de numere pentru care media aritmetic are valoarea maxim.
Cte module poate avea programul? De cte ori poate fi apelat fiecare modul?

D. IMPLEMENTAREA MODULARIZRII. STIVA SISTEM


Fiecare apel de modul determin o ntrerupere a prelucrrilor din modulul apelant. Pentru
reluarea acestora dup revenirea n modul, adresa operaiei la care s-a fcut ntreruperea este
reinut ntr-o zon special de memorie, la dispoziia procesorului, numit stiva sistem. Pe
acelai nivel al stivei sistem sunt memorate i datele de intrare n modul. Cu fiecare apel/ntre-
rupere, stiva sistem crete; la revenirea din modulul apelat, stiva sistem scade.

apel adr_2 returnare

adr_1 adr_1

Figura 37. Stiva sistem


Exemplu: Intervalul de lungime maxim.
Fie dou intervale de numere reale [A, B] i [C, D]. Se cere s se determine intervalul de
lungime maxim.

78
1. Analiza problemei
z Date de intrare:
capetele celor dou intervale (A,B,C,D R).
z Date de ieire:
un mesaj corespunztor.
2. Raionamentul de rezolvare
z pentru fiecare pereche de numere se verific dac formeaz interval i, n caz negativ, se
interschimb capetele intervalului;
z se calculeaz lungimea fiecrui interval;
z se compar cele dou lungimi;
z se tiprete mesajul corespunztor: [A, B] are lungimea cea mai mare sau [C, D] are
lungimea ce mai mare.
3. Modularizarea rezolvrii
z se folosete un submodul pentru calcularea lungimii unui interval i dac e cazul pen-
tru interschimbarea capetelor intervalului.

(P) Determinarea intervalului de lungime maxim

(M1) citirea datelor de intrare


citete A, B, C, D

(M2) prelucrarea datelor


apeleaz interval (A, B, lg1)
apeleaz interval (C, D, lg2)
(M 2.1) submodul interval (X, Y, lg)
dac X > Y atunci
bloc
aux X
X Y
Y aux
sfrit bloc
sfrit dac
lg Y X
returneaz (lg)

(M3) afiarea rezultatelor


dac lg1 > lg2 atunci scrie [A, B] are cea mai mare lungime
dac lg2 > lg1 atunci scrie [C, D] are cea mai mare lungime
altfel scrie intervalele au aceeai lungime

Figura 38. Raionamentul problemei

4. Descrierea fluxului de control


z se intr n modulul de citire a datelor de intrare (M1)
se citesc cele patru numerele reale A, B, C, D;

79
z se intr n modulul de prelucrare (M2)
se apeleaz submodulul (M 2.1) pentru perechea A i B
se memoreaz adresa de ntrerupere n stiva sistem;
adresele valorilor A i B sunt depuse n stiva sistem;
se execut submodulul (M 2.1) pentru perechea A i B
lungimea intervalului [A, B], este transmis modulului (M2),
z stiva sistem scade;
se apeleaz submodulul (M 2.1) pentru perechea C i D
se memoreaz adresa de ntrerupere n stiva sistem,
adresele valorilor C i D sunt depuse n stiva sistem;
se execut submodulul (M 2.1) pentru perechea C i D
z lungimea intervalului [C, D], este transmis modulului (M2),
z se revine n modulul (M2)
z stiva sistem scade;
z se intr n modulul de afiare a rezultatelor (M3)
z se compar cele dou lungimi de interval lg1 i lg2 i se tiprete mesajul corespunztor.

# TEME
Stiva sistem
1. Explicai rolul stivei sistem n implementarea fluxului de control modul-submodul atunci cnd
modulele se afl n relaia (R1), respectiv (R2).
2. n ce situaie crete stiva sistem?
3. Ce efecte are ieirea dintr-un modul asupra stivei sistem?
4. Ce semnificaie are stiva sistem goal?
5. n ce mprejurri zona de memorie stiva sistem nu mai are spaiu liber iar procesorul transmite
mesajul <<stack overflow>> (stiva se revars)?
6. Scriei un program modularizat pentru calcularea mediei valorilor energiei cinetice dezvoltate
de un automobil, un autocamion i o motociclet pentru un numr dat n de viteze de rulare
v1, v2, , vn. Cum se modific stiva sistem?

3. LUCRUL CU SUBPROGRAME N PSEUDOCOD

A. STRUCTURA SUBPROGRAMELOR
Structura unui subprogram nu difer de structura unui program. n oricare dintre aceste mo-
dule, ntlnim urmtoarele elemente de structur:
z un antet;
z o seciune (opional) de declaraii (constante, variabile, alte subprograme);
z o seciune de instruciuni executabile (simple sau structurate).

80
B. DEFINIREA SUBPROGRAMELOR
n cele mai multe dintre limbajele de programare, subprogramele sunt plasate naintea
seciunii de instruciuni a programului propriu-zis (numit, de obicei, program principal).
Definirea unui subprogram nseamn:
alegerea unui nume;
stabilirea datelor de intrare i a datelor de ieire proprii subprogramului;
scrierea instruciunilor prin care se realizeaz prelucrarea datelor de intrare n vederea
obinerii datelor de ieire din subprogram.

 Atenie
Mulimea variabilelor care constituie datele de intrare i datele de ieire ale sub-
programului formeaz lista parametrilor formali ai subprogramului.
Aceti parametri apar n interiorul unei perechi de paranteze rotunde (tocmai pen-
tru a sublinia similaritatea dintre subprograme i funciile matematice) i sunt separai
prin punct i virgul.

C. DECLARAREA SUBPROGRAMELOR
Declararea unui subprogram nseamn precizarea prin cuvinte rezervate a elementelor de
interfa care permit comunicarea ntre subprogram i programul apelant. Aceste elemente sunt
descrise n antetul subprogramului prin:
z cuvntul rezervat subprogram;
z numele dat de programator subprogramului;
z lista parametrilor formali.

subprogram nume(par_formal1;par_formal2;;par_formaln)

Exemplu: Subprogramul de calculare a ariei unui dreptunghi:


nceput subprogram arie (Lung; Lat; A)
A Lung * Lat
returneaz (A) Figura 39.
sfrit arie Declararea unui subprogram n pseudocod

cuvntul rezervat pentru declararea subprogramelor


numele subprogramului
date de intrare
date de ieire } lista parametrilor formali

nceput subprogram arie (Lung; Lat; A) Antetul


A Lung * Lat
returneaz (A) Blocul de
sfrit arie instruciuni

81
# TEME
Declararea subprogramelor
Declarai cte un subprogram pentru rezolvarea urmtoarelor cerine:
a) calcularea ariei i volumului unei sfere de raz dat;
b) calcularea perimetrului i ariei unui triunghi, cunoscndu-i laturile;
c) calcularea greutii unui obiect de mas dat;
d) calcularea densitii unui lichid, cunoscndu-i masa i volumul.
Explicai semnificaia parametrilor pentru fiecare dintre subprograme.

D. APELAREA SUBPROGRAMELOR
Orice program care apeleaz un subprogram se numete program apelant, deoarece nu
numai programul principal admite subprograme, ci i un subprogram oarecare poate avea, la rn-
dul su, subprograme (figurile 35 i 36).
Prin apelarea unui subprogram S de ctre un program apelant P nelegem o comand
pe care programul apelant o trimite subprogramului i prin care i cere acestuia s execute pre-
lucrarea din blocul su de instruciuni. Prin aceast comand, programul apelant P trebuie:
(1) s-i furnizeze subprogramului S datele de intrare necesare prelucrrii;
(2) s-i indice datele de ieire n care subprogramul S trebuie s-i furnizeze rezultatul sau
rezultatele prelucrrilor sale.
Toate aceste informaii sunt transmise subprogramului cu ajutorul listei de parametri din
apelul subprogramului. Aceti parametri se numesc parametri actuali. Elementele comenzii de
apel sunt:
cuvntul rezervat apeleaz;
numele subprogramului;
lista parametrilor actuali.

apeleaz nume(par_actual1;par_actual2;;par_actualn)

 Atenie
Parametrii actuali din comanda de apel trebuie s corespund ca tip, numr i
ordine de enumerare parametrilor formali din antetul subprogramului.

Exemplu: Apelarea subprogramului pentru calcularea ariei unui dreptunghi


apeleaz arie(1;5;suprafaa)

# TEME
Apelarea subprogramelor
Formulai comenzile de apel pentru fiecare dintre subprogramele definite n cadrul Temei
anterioare Declararea subprogramelor.

82
 Atenie
De ce este nevoie de dou liste de parametri: o list de parametri formali i o list
de parametri actuali? Dac ne-am limita la o singur list (lista parametrilor formali),
aceasta ar trebui s apar evident! n antetul subprogramului n momentul definirii
sale, iar la apel, toate programele apelante ar trebui s cunoasc i s utilizeze exact
aceast list. Existena celei de-a doua liste, lista parametrilor actuali cu respectarea
conveniilor enumerate mai sus asigur independena subprogamului apelat fa de
oricare dintre programele apelante.

Figura 40 ilustreaz dou cazuri particulare de apelare a subprogramelor.

Modulul M Modulul M
M1
M1
M2 M1

M2 M1...
M1

(a) Module care se apeleaz (b) Modul care se apeleaz pe


unul pe cellalt el nsui
Figura 40. Apelarea subprogramelor cazuri particulare

E. RETURNAREA VALORILOR CTRE PROGRAMUL APELANT


Un subprogram trebuie s produc un rezultat prin prelucrrile efectuate asupra datelor de
intrare. De fapt, un program apeleaz subprogramul atunci cnd are nevoie de acel rezultat.
Transmiterea rezultatului (sau rezultatelor) ctre programul apelant necesit:
(1) includerea n lista parametrilor a unui numr de parametri egal cu numrul de rezultate
care trebuie transmise;
(2) includerea n corpul subprogramului n poziia determinat de fluxul controlului a
unei comenzi care s asigure comunicarea rezultatelor.
Aceast comand conine:
cuvntul rezervat returneaz,
lista de variabile care conin valorile ce trebuie transmise.

returneaz(rez1,rez2,,rezk)

83
Exemplu: Returnarea valorii ariei dreptunghiului ctre programul apelant
returneaz (A)

F. TRANSFERUL PARAMETRILOR LA APEL


Partea cea mai important din instruciunea de apelare a subprogramelor este lista para-
metrilor actuali. n scrierea ei, trebuie s pornim de la lista parametrilor formali i s respectm:
(1) corespondena dintre parametrii formali i parametrii actuali ca tip, numr i ordine;
(2) modul de transmitere a parametrilor: prin valoare sau prin adres.
Condiia (1) este legat de forma apelului. n apel apar variabile de program (simple sau
structurate), caracterizate aici prin nume i tip. Un parametru actual poate avea acelai nume cu
parametrul formal corespunztor sau poate avea un nume diferit. n general, este recomandabil
redenumirea parametrilor formali n lista parametrilor actuali doar acolo unde altfel s-ar crea
confuzii. Tipul de date al parametrului formal trebuie s fie identic sau mai cuprinztor dect
tipul de date al parametrului actual corespunztor. Rezult de aici necesitatea pstrrii ordinii la
nivelul ambelor liste. Revenind la subprogramul pentru determinarea ariei unui dreptunghi, iat
un exemplu i dou contraexemple de apelare:

Exemplu Contraexemple
apeleaz arie(5;suprafaa;12)
apeleaz arie(12;5;suprafaa) apeleaz arie(12;suprafaa)

Condiia (2) este legat de apel. n lista parametrilor trebuie specificat tipul acestora:
parametri care transmit subprogramului datele de intrare;
parametri care transmit programului apelant rezultatele.
Uneori, un acelai parametru poate fi i dat de intrare, necesar subprogramului pentru efectu-
area prelucrrilor, i dat de ieire, prin care s transmit programului apelant rezultatul prelucrrii.
Informaia depus ntr-un parametru-dat de ieire sau ntr-un parametru-dat de intrare-
ieire trebuie s fie accesibil att pentru subprogram, ct i pentru programul apelant (care o
poate prelua n vederea unor noi prelucrri). Din aceast cauz, este necesar s comunicm com-
pilatorului c trebuie s aloce aceeai locaie de memorie att variabilei-parametru formal, ct
i variabilei-parametru actual chiar dac ele au nume diferite. Pentru ca zona de memorie s
fie vizibil (accesibil), subprogramul trebuie s cunoasc adresa acestei zone. n acest caz,
parametrul va fi transmis prin adres, lucru semnalat numai n lista parametrilor actuali
printr-un cuvnt rezervat, adres, care precede numele parametrului n list. Spunem c trans-
mitem acel parametru (dat de ieire sau dat de intrare-ieire) prin adres (sau prin referin).
Un parametru care este dat de intrare pentru subprogram trebuie s fie accesibil acestuia
(este principala modalitate de primire a datelor de ctre subprogram), dar trebuie s fie protejat
mpotriva unor modificri prin prelucrrile din subprogram. Din aceast cauz, este necesar s
comunicm compilatorului c trebuie s aloce acelei variabile dou locaii de memorie: una
accesibil programului definit n segmentul de date pe care subprogramul nu o poate mo-
difica, i una accesibil subprogramului definit pe un nivel de stiv pe care subprogramul o
poate modifica oricum. Spunem c transmitem acel parametru (dat de intrare) prin valoare.

84
Exemplu: Transmiterea parametrilor la apelul subprogramului pentru determinarea ariei
unui dreptunghi:

apeleaz arie (Lung; H; adresa: suprafaa)

primul parametru actual


(are acelai nume ca i al treilea parametru actual (are un
parametrul formal nume diferit de cel al parametrului
corespunztor) formal corespunztor)
y este dat de intrare, y este dat de ieire,
y este transmis prin y transmis prin adres.
valoare.

al doilea parametru actual (are un


nume diferit de cel al parametrului
formal corespunztor)
y este dat de intrare,
y transmis prin valoare.

Transmiterea incorect a parametrilor la apel poate genera erori greu de depistat.

Exemplu: Calcularea lungimii unui interval


Fie un interval de numere reale [A,B]. Se cere s se determine lungimea acestui interval.
1. Analiza problemei
z Date de intrare:
capetele intervalului (A,B R).
z Date de ieire:
lungimea intervalului (lg R).

2. Raionamentul problemei
z se verific dac numerele A i B formeaz interval i, dac este cazul, se interschimb aces-
te valori;
z se calculeaz lungimea intervalului;
z se folosete un submodul pentru interschimbarea capetelor intervalului.

3. Reprezentarea algortimului
nceput program lungime_interval
variabile A,B,lg
nceput subprogram interschimbare(adres:X;adres:Y)
variabile aux
aux X

85
X Y
Y aux
returneaz (X;Y)
sfrit interschimbare
citete A,B
dac A>B atunci
apeleaz interschimbare(A;B)
sfrit dac
lg B-A
scrie [A, B] are lungimea lg
sfrit lungime_interval

4. Verificarea algoritmului
S presupunem c rulm programul pentru valorile A=5, B=2
A B lg
dac A>B atunci 5 2
apeleaz interschimbare(A;B) 2 5
sfrit dac
lg B-A 3

Rezultatele obinute sunt corecte deoarece am transmis parametrii subprogramului inter-


schimbare prin adres (ambii sunt date de intrare-ieire).
S presupunem c transmitem aceti parametri prin valoare, adic antetul subprogramului este:

nceput subprogram interschimbare(X;Y)

n acest caz, rezultatul obinut va fi 3 deoarece programul apelant nu vede zona de me-
morie n care subprogramul a efectuat interschimbarea i calculeaz lg 2 5.

Stiva sistem Segmentul de date


A B A B lg
citete A,B 5 2
dac A>B atunci 5 2
apeleaz interschimbare(A;B) 2 5
sfrit dac
lg B-A 3
scrie [A, B] are lungimea lg

86
# TEME
Transmiterea parametrilor prin adres
1. Explicai de ce un parametru transmis prin valoare nu poate ndeplini rolul de dat de ieire.
2. Modificai antetul din definiia subprogramelor din cadrul Temelor de la paginile 78 i 82
astfel nct s punei n eviden parametrii transmii prin adres.

G. VARIABILE LOCALE I VARIABILE GLOBALE


Orice modul de program prelucreaz date proprii, definite ca variabile locale. Acest aspect
confer subprogramelor independen fa de modulul apelant. Variabilele locale sunt zone de
memorie alocate pe nivelul de stiv sistem corespunztor subprogramului; de aceea nu sunt vi-
zibile din modulul apelant.
Pentru ca o variabil s fie bine definit, trebuie specificate:
z numele;
z tipul de date pe care le va pstra;
z zona de memorie;
z durata de via;
z domeniul de vizibilitate.
Pn acum, definirea variabilelor folosite ntr-un program s-a limitat la precizarea numelui
i a tipului lor.
Prin zona de memorie a unei variabile nelegem tipul de memorie intern n care variabila
este memorat (unde se afl locaia atribuit ei). Variabilele oricrui program pot fi memorate n
una dintre urmtoarele zone de memorie intern:
z segmentul de date;
segmentul
z segmentul de stiv; de date
z heap-ul;
sau ntr-un registru dedicat al microprocesorului. segmentul
de stiv
Prin durata de via a unei variabile nelegem intervalul de
timp n care variabila dispune de locaia de memorie atribuit ei
heap
de compilator (la sfritul intervalului, locaia de memorie va fi
eliberat, deci ultima valoare a variabilei se pierde). Dup acest
criteriu, varibilele se clasific n:
z variabile statice: locaiile de memorie se aloc n momentul compilrii i sunt disponibile
pe toat perioada execuiei programului (alocare static n segmentul de date);
z variabile dinamice: locaiile de memorie se aloc n momentul execuiei (alocare di-
namic n heap).
Prin domeniul de vizibilitate al unei variabile nelegem segmentul de program (blocul de
instruciuni) n care variabila poate fi utilizat. n raport cu segmentul de program n care sunt
definite, variabilele pot fi:
z variabile locale (definite n subprogramul apelat);
z variabile globale (definite n programul apelant).

87
Exemplu: Variabile locale i globale
Fie o matrice ptratic cu elemente numere reale; se cere:
a) s se nlocuiasc fiecare element de pe diagonala principal a matricei cu suma ele-
mentelor de pe linia corespunztoare (inclusiv elementul de pe diagonal);
b) s se afieze indexul liniei pentru care suma elementelor este minim, precum i valoarea
acestei sume.
1. Analiza problemei
z Date de intrare:
numrul de linii i coloane (n),
matricea (A).
z Date de ieire:
valoarea celei mai mici sume (Val),
indexul liniei corespunztoare acestei sume (pMin).

2. Modularizarea rezolvrii
Vom folosi:
un subprogram pentru calcularea sumei elementelor de pe liniile matricei i depunerea
acestor sume pe diagonala principal;
un subprogram de determinare a minimului unui vector cu k elemente i a poziiei sale.

3. Raionamentul problemei
Pasul 1. Se citesc datele de intrare: n, A.
Pasul 2. Se apeleaz subprogramul de calculare a sumei pe linii i nlocuire a elementului de
pe diagonala principal cu suma respectiv.
Pasul 3. Se depun elementele de pe diagonala principal a matricei ntr-un vector.
Pasul 4. Se apeleaz subprogramul de determinare a elementului minim dintr-un vector i a
poziiei sale.
Pasul 5. Se afieaz suma minim i indexul liniei pe care se afl aceasta.

4. Reprezentarea programului cu subprograme


nceput program sumaMinim
variabile n, A, Val,pMin,V,i // globale
nceput subprogram diag(adresa:mat)
variabile suma,i,j // locale
pentru i=1 la n execut
suma mat(i,1)
pentru j=2 la n execut
suma suma+mat(i,j)
sfrit pentru
mat(i,i) suma
sfrit pentru
returneaz mat

88
sfrit diag
nceput subprogram pozMinim(V;k; adresa:pMin)
variabile i // locale
Val V(1)
pMin 1
pentru i=2 la k execut
dac V(i) < Val
atunci
Val V(i)
pMin i
sfrit dac
sfrit pentru
returneaz pMin
sfrit pozMinim
citete n,A
apeleaz diag(A)
pentru i=1 la n execut
V(i) A(i,i)
sfrit pentru
apeleaz pozMinim (V;n;pMin)
scrie Val,pMin
sfrit sumaMinim

5. Analiza programului
Examinnd acest program, observm:
z lista de parametri a subprogramului diag const dintr-un singur element: o matrice. Aceasta
reprezint att datele de intrare (elementele matricei trebuie transmise subprogramului pentru a
permite calcularea sumelor), ct i datele de ieire pentru subprogram (matricea este returnat
dup ce a fost modificat prin depunerea sumelor pe diagonala principal). Ca urmare, matricea
este transmis prin adres nu prin valoare;
z n = numrul de linii din matrice este o variabil global; de aceea aceast variabil nu tre-
buie transmis n lista de parametri a subprogramelor. Totui, n a fost transmis ca dat de intrare
subprogramului pozMin deoarece am folosit forma general a subprogramului de determinare a
poziiei minimului, n care trebuie s apar numrul de elemente pentru care se calculeaz mi-
nimul i poziia acestuia;
z variabila suma din subprogramul diag este necesar numai pentru prelucrrile din acest sub-
program. Aceast variabil a fost declarat n subprogram i este variabil local pentru acesta;
z dac valoarea sumei minime nu trebuia afiat, atunci variabila Val putea fi declarat n
interiorul subprogramului pozMin (deci ar fi fost o variabil local pentru el, la fel ca variabila i).
Fiind declarat n programul principal (apelant) ca variabil global, valoarea ei s-a pstrat i a
putut fi afiat;
z variabilele care apar n lista parametrilor actuali trebuie declarate n programul apelant; dar
variabilele care apar n lista parametrilor formali nu trebuie declarate. Totui, n programul

89
sumaMinim variabila V, parametru formal pentru subprogramul pozMinim a fost declarat n
programul apelant (principal). Motivul: ea este folosit i ca parametru actual pentru apelarea
subprogramului pozMinnim.

# TEME
1. Variabile locale i variabile globale
Fie programul de mai jos:

nceput program test


variabile a, b, c
nceput subprogram S1 (adresa y)
.
returneaz y
.
sfrit S1
nceput subprogram S2 (x, adresa t)
variabile a, y
nceput subprogram S3 (adresa y)
variabile b
.
returneaz y
.
sfrit S3
.
returneaz t
.
sfrit S2
.
sfrit test

Presupunem c plasm urmtoarele instruciuni n blocul de instruciuni executabile al sub-


programului menionat. Precizai care dintre instruciuni va fi corect/incorect plasat i de ce:
a) n subprogramul S3, instruciunea a b
b) n programul test, instruciunea returneaz S3(3.14)
c) n programul test, instruciunea a S2(10)
d) n subprogramul S1, apeleaz S3(d)
e) n subprogramul S1, c S2(c)
f) n programul test, instruciunea apeleaz S1(z)
g) n programul test, instruciunea apeleaz S1(S2(3))
h) n programul test, instruciunea apeleaz S2(c)
i) n subprogramul S2, apeleaz S1(y)
j) n subprogramul S1, y S2(c)

90
2. Variabile locale i variabile globale
Care dintre afirmaiile de mai jos este corect? Corectai afirmaiile greite:
a) nu este permis utilizarea variabilelor globale n interiorul unui subprogram;
b) nu este recomandabil utilizarea variabilelor globale n interiorul unui subprogram;
c) variabilele globale pot fi folosite exclusiv pentru citirea datelor de intrare n program;
d) variabilele globale pot fi folosite exclusiv pentru citirea datelor de intrare n subprogram;
e) datele de intrare ale subprogramelor nu pot fi transmise dect prin variabile globale.

3. Reguli de lucru cu subprogramele


Care dintre afirmaiile de mai jos este corect/greit; justificai rspunsul:
a) fie S1 un subprogram din programul principal P i S2 un subprogram definit n interiorul
lui S1; atunci S2 nu poate conine la rndul su alt subprogram;
b) constantele utilizate ntr-un program cu subprograme urmeaz aceleai reguli privind
domeniul lor de vizibilitate ca i variabilele;
c) ntr-un subprogram putem declara i o variabil i o constant sub acelai nume;
d) ntr-un program cu subprograme putem declara i o variabil i o constant sub acelai
nume, numai dac variabila este global iar constanta este local.

4. Corectarea erorilor n subprograme


Fie programul de mai jos:

nceput program test2


variabile a, b, c
nceput subprogram S1(x, adresa w)
variabile a, y
nceput subprogram S2(adresa y)
variabile b
.
returneaz y
.
sfrit S3
.
returneaz w
.
sfrit S1
nceput subprogram S3 (adresa y)
.
returneaz y
.
sfrit S3
.
sfrit test

91
Presupunem c plasm urmtoarele instruciuni n blocul de instruciuni executabile al sub-
programului menionat. Precizai care dintre instruciuni va fi corect/incorect plasat i de ce
(atenie la domeniul de vizibilitate al variabilelor):
a) n subprogramul S2, instruciunea a b
b) n programul test, instruciunea apeleaz S2(3.14)
c) n programul test, instruciunea a S1(10)
d) n subprogramul S3, apeleaz S2(3.14)
e) n subprogramul S3, c S1(c)
f) n programul test, instruciunea apeleaz S3(a)
g) n programul test, instruciunea apeleaz S1(S3(z))
h) n programul test, instruciunea apeleaz S1(c)
i) n subprogramul S1, instruciunea apeleaz S3(y)
j) n subprogramul S2, instruciunea y S1(c)

APLICAIE
TAPETAREA APARTAMENTULUI
S se calculeze suprafaa de tapet necesar pentru renovarea unei sufragerii, a unui dormi-
tor i a unei buctrii (toate de form paralelipipedic).
1. Analiza problemei
z Date de intrare:
lungimile pereilor sufrageriei (S1, S2), dormitorului (D1, D2) i ai buctriei (B1, B2),
nlimea pereilor (H),
limea sulului de tapet (T).
z Date de ieire:
numrul de metri de tapet necesari pentru sufragerie (NS), dormitor (ND), buctrie (NB),
numrul total (NR).
z Condiii i relaii importante

}
}
}
}

L lungimea l = limea T = limea tapetului


camerei camerei H = nlimea camerei
Figura 41. Acoperirea pereilor camerei cu tapet

92
ncepem cu sufrageria: este suficient s calculm P = 2*(S1+S2) = perimetrul camerei i s-l
mprim la T = limea sulului de tapet pentru a afla m = P / T = cte buci de tapet de lungime
egal cu nlimea camerei sunt necesare. Apoi, NS = m * H = numrul de metri de tapet nece-
sari pentru sufragerie. Analog obinem numrul de metri de tapet necesari pentru dormitor i pen-
tru buctrie. n final, calculm numrul total NR = NS + ND + NB.

2. Raionamentul problemei
Pasul 1. Se citesc datele de intrare: S1, S2, D1, D2, B1, B2, H, T.
Pasul 2. Se calculeaz P 2 * (S1 + S2); m P / T; NS m * H.
Pasul 3. Se calculeaz P 2 * (D1 + D2); m P / T; ND m * H.
Pasul 4. Se calculeaz P 2 * (B1 + B2); m P / T; NB m * H.
Pasul 5. Se calculeaz NR NS + ND + NB.
Pasul 6. Se afieaz NS, ND, NB, NR.

3. Reprezentarea algoritmului
Metoda I Un program fr module
nceput tapet1
variabile S1,S2,D1,D2,B1,B2,H,T,NS,ND,NB,NR,P,m
citete S1,S2,D1,D2,B1,B2,H,T
P 2*(S1 + S2)
m P/T
NS m*H
P 2*(D1 +D2)
m P/T
ND m*H
P 2*(B1 + B2)
m P/T
NB m*H
NR NS+ND+NB
scrie NS,ND,NB,NR
sfrit tapet1
Metoda II Un program modularizat
nceput tapet2
variabile S1,S2,D1,D2,B1,B2,H,T,NS,ND,NB,NR
nceput subprogram calcul(L;l;adresa:N)
variabile P,m
P 2*(L+l)
m P/T
N m*H
returneaz N
sfrit calcul
citete S1,S2,D1,D2,B1,B2,H,T
apeleaz calcul(S1;S2;NS)
93
apeleaz calcul(D1;D2;ND)
apeleaz calcul(B1;B2;NB)
NR NS+ND+NB
scrie NR,NS,ND,NB
sfrit tapet2

nceput tapet2

citete S1,S2,D1,D2,B1,B2,H,T
(1) nceput subprogram calcul
apeleaz calcul (S1; S2; NS) (L; l; adresa: N)
P 2 * (L + l)
apeleaz calcul (D1; D2; ND) (2) m P / T
Nm*H
apeleaz calcul (B1; B2; NB) (3) returneaz (N)
sfrit calcul
NR NS + ND + NB (4)

scrie NR, NS, ND, NB

sfrit tapet2

Figura 42. Programul tapet2 fluxul de execuie

n figura 42 este evideniat fluxul de execuie a programului:


(1) controlul este transferat subprogramului;
(2) se execut instruciunile subprogramului n acelai mod n care s-ar executa dac ar fi
vorba de un program propriu-zis;
(3) dup parcurgerea ntregului flux de execuie al subprogramului, controlul (i rezultatele)
se transfer programului apelant; execuia acestuia continu cu instruciunea aflat imediat dup
instruciunea care apeleaz subprogramul;
(4) fiecare apel determin reluarea fluxului (1), (2), (3).

# TEME
1. Fluxul de execuie
Reprezentai stiva sistem corespunztor fluxului de execuie program subprogram din
figura 42.

2. Rezolvarea problemelor cu ajutorul subprogramelor


Scriei cte un program cu subprograme pentru rezolvarea fiecreia dintre urmtoarele cerine:
a) S se determine numrul p de numere prime dintr-un ir de n numere naturale introduse de
la tastatur. S se verifice dac p este numr prim i s se afieze un mesaj corespunztor.

94
Exemplu: pentru n = 5, irul de numere este: 25, 3, 42, 29, 7. Se determin p = 3 i se
afieaz mesajul: 3 este numr prim.
b) S se calculeze numerele mistice mai mici dect un numr n N dat (x N se numete
numr mistic dac suma cifrelor care l compun este egal cu produsul lor; exemplu: 22,
13131).
c) S se calculeze divizorii primi ai unui numr n N dat.
d) S se calculeze numerele perfecte mai mici dect un numr n N dat (x N se numete
numr perfect dac suma divizorilor si primi este egal cu produsul lor; exemplu: 6 este
un numr perfect deoarece 1+2+3=2*3).
e) Fie M o matrice cu n linii i m coloane. S se afieze n ordine cresctoare elementele de
pe liniile pare.
f) Fie M o matrice cu n linii i m coloane. Pentru fiecare linie, s se afieze cel mai mare divi-
zor comun dintre max i min, unde max reprezint cea mai mare valoare de pe linie iar min
reprezint cea mai mic valoare de pe linie.

MINIPROIECT N ECHIP. COMPANIA EFICIENT


Etapa: Proiectare (stabilirea unitilor de program)
Cerine:
1. Organizai unitile de program necesare rezolvrii modulare a prelucrrilor identificate
n etapa de analiz.
2. Completai documentaia proiectului cu descrierea modulelor i reprezentarea relaiilor
dintre acestea.

4. IMPLEMENTAREA SUBPROGRAMELOR N LIMBAJELE DE PROGRAMARE

A. SUBPROGRAME N LIMBAJUL PASCAL: FUNCII I PROCEDURI


n limbajul Pascal se utilizeaz dou categorii de subprograme:
z funcii,
z proceduri.
Vom prezenta asemnrile i deosebirile dintre aceste dou categorii de subprograme cu aju-
torul programului de calculare a ariei unui dreptunghi

Definiie Funcie =

= un subprogram care primete oricte valori ca date de intrare dar returneaz ca rezultat o
valoare i numai una.
Declarare:
function nume(par_formal1,,par_formaln:tip1;; par_formal1,,par_formalm :tipk): tip;

95
Apelare:
x:= nume(par_actual1;par_actual2;;par_actualw);
sau:
write(nume(par_actual1;par_actual2;;par_actualw));

Definiie Procedur =

= un subprogram care primete oricte valori ca date de intrare i poate returna ca rezultat
o valoare, mai multe valori sau niciuna (poate efectua o prelucrare care s nu aib ca efect
obinerea unei valori).
Declarare:
procedure nume([var] par_formal1,,par_formaln:tip1;; [var] par_formal1,,
par_formalm:tipk);
Apelare:
nume(par_actual1;par_actual2;;par_actualw);

 Atenie
Spre deosebire de pseudocod, n limbajul Pascal:
z cuvntul rezervat pentru transmiterea parametrilor prin adres este var;
z apelarea subprogramelor (ca i returnarea rezultatelor) nu necesit utilizarea niciunui
cuvnt rezervat (altfel spus, cuvintele rezervate apeleaz i returneaz folosite n pseudocod
nu au un corespondent n limbajul Pascal).

Funcii Proceduri
procedure arie(L:Real;
Declarare function A (L:Real; l:Real): Real;
l:Real; var A: Real); eventual
Apelare v:=A (Lung;H); write (A(Lung;H)); arie(Lung;H; suprafata);

Observaii
z Pentru identificarea fiecrui tip de subprogram se utilizeaz cuvinte rezervate diferite:
function i respectiv procedure.
z Declaraia var este indus ntre paranteze drepte deoarece este opional.

96
z Lista de parametri formali a procedurii trebuie s includ un numr de parametri formali
transmii prin adres egal cu numrul de rezultate returnate de procedur ctre programul
apelant. Lista de parametri formali a funciei include parametrii transmii prin valoare (datele de
intrare) sau prin referin (dac exist date de intrare-ieire); valoarea determinat rezultatul
va fi returnat prin numele funciei. De aceea:
funcia are tip (i anume un tip simplu, nestructurat);
n blocul de instruciuni executabile al funciei trebuie s existe cel puin o instruciune de
atribuire avnd ca membru stng numele funciei.
z Funcia se apeleaz prin nume i list de parametri actuali n interiorul unei expresii.
z Procedura se apeleaz prin nume i list de parametri actuali ntr-o instruciune de sine
stttoare.
Exemplu: Funcii i proceduri n limbajul Pascal
Fiind dat numrul real a i numrul ntreg n, s se calculeze an.
1. Analiza problemei
z Date de intrare:
baza (a) i exponentul (n).
Date de ieire:
valoarea an.

2. Modularizarea rezolvrii
Vom utiliza procedura putere1 i funcia putere2 (pentru a ilustra transformarea unei pro-
ceduri ntr-o funcie i reciproc).
Vom valida datele de intrare, tratnd cazul 00 ntr-un mod particular: 00=0 (cazul bazei egale
cu 1 nu va fi tratat separat!).
3. Raionamentul problemei
Pasul 1. Se citesc datele de intrare: a, n.
Pasul 2. Dac a = 0 atunci r 0 i salt la Pasul 9.
Pasul 3. Dac n = 0 atunci r 1 i salt la Pasul 9
Pasul 4. nn n; dac nn < 0 atunci nn nn
Pasul 5. i 1.
Pasul 6. r r * a i i i + 1
Pasul 7. Dac i nn atunci se reia Pasul 6.
Pasul 8. Dac n < 0 atunci r 1/ r
Pasul 9. Se scrie r.

4. Implementarea algoritmului n limbajul Pascal


program ridicareLaPutere;
var a,r:real;
n:integer;
procedure putere1(baza:real; expo:integer; var rez:real);
{ rez parametru transmis prin adres }
var e,i:integer;

97
begin
if (baza = 0.0) then rez:=0.0
else
if (expo=0) then rez:=1.0
else
begin
rez:= baza;
if expo<0 then e:=-expo else e:=expo;
for i:=2 to e do rez:=rez*baza;
if expo<0 then rez:=1/rez;
end;
end; {procedura putere1}
function putere2(baza:real; expo:integer):real; {funcie de tip real}
var e,i:integer;
rez:real;
begin
if (baza = 0.0) then putere2:=0.0
else
if (expo=0) then putere2:=1.0
else
begin
rez:= baza;
if expo<0 then e:=-expo else e:=expo;
for i:=2 to e do rez:=rez*baza;
if expo<0 then rez:=1/rez;
putere2:= rez;
end;
end; {functia putere2}
begin {program principal}
write(a =); readln(a);
write(n =); readln(n);
putere1(a,n,r);
write(Calculul puterii cu procedura putere1: );
writeln(a:4:2, la puterea ,n:2, este ,r:8:3);
write(Calculul puterii cu functia putere2: );
writeln(a:4:2,la puterea ,n:2, este,putere2(a,n):8:3)
end.

5. Analiza programului
Identificatorul putere2 nu desemneaz o variabil (avnd acelai nume i tip ca i funcia),
ci este numele funciei i acestuia i se atribuie valoarea variabilei rez. Acesta este motivul pen-
tru care, n blocul de instruciuni executabile al funciei care nu se apeleaz pe ea nsi,
numele funciei nu poate aprea n membrul drept al unei atribuiri: este necesar utilizarea unei

98
variabile locale, auxiliare. Tabelul de mai jos prezint funciile putere2 i putere3 ca exemplu
i contraexemplu de subprograme de tip funcie.

Exemplu de funcie Pascal: putere2 Contraexemplu de funcie Pascal: putere3


function putere2(baza:real; function putere3(baza:real,
expo:integer):real; expo:integer):real;
var e,i:integer; var e,i:integer;
rez:real;
begin begin
if (baza=0.0) then putere2:=0.0 if (baza=0.0) then putere3:=0.0
else else
if (expo=0) then putere2:=1.0 if (expo=0) then putere3:=1.0
else else
begin begin
rez:= baza; putere3:=baza;
if expo<0 then e:=-expo else e:=expo; if expo<0 then e:=expo else e:= expo;
for i:=2 to e do rez:=rez*baza; for i:=2 to e do putere3:= putere3*baza
if expo<0 then rez:=1/rez; if expo<0 then putere3:=1/putere3;
putere2:= rez;
end; end
end; {functia putere2} end; {functia putere3}

# TEM
De la procedur la funcie
Transformai urmtoarea procedur ntr-o funcie:
procedure Verificare (err,toleranta:real; var accept:boolean);
begin
if err<toleranta then
accept:=true
else
accept:=false;
end;

Observaie
Tipul unui parametru formal nu poate fi un tip anonim:
Exemplu: type matrice=array[1..10,1..20] of real;
function maxim(n,m:integer; A:matrice):real;
Contraexemplu function maxim(n,m:integer; A:array[1..10,1..20] of real):real;

99
# TEME
Proceduri sau funcii?
1. Fie dou numere raionale r1 i r2; se cere s se afieze: suma, produsul i ctul celor dou
numere. Scriei i analizai cele dou soluii posibile: un program cu subprograme de tip
funcie, respectiv cu subprograme de tip procedur (pentru fiecare operaie).
2. Fie M o matrice ptratic de ordin n > 1 cu elemente numere naturale; se cere s se afieze
numerele prime (i poziia lor n matrice) aflate ca valoare ntre cel mai mic numr de pe
diagonala principal i cel mai mare numr de pe diagonala secundar. Care dintre module
poate fi transformat numai ntr-o funcie/numai ntr-o procedur/fie ntr-o procedur/fie ntr-o
funcie. Argumentai.
3. Fie vectorul V cu n > 1 componente, numere naturale; se cere s se afieze:
a) numere pare care se gsesc pe poziii de index impar n V;
b) numerele prime din V;
c) cifrele numrului de pe ultima poziie din vector, n ordine invers.

Domeniul de vizibilitate al variabilelor


4. Examinai programul Pascal de mai jos din punct de vedere al domeniului de vizibilitate al
variabilelor. Completai (dup modelul oferit pe prima linie) toate liniile din tabelul furnizat,
indicnd tipul de date al variabilelor (prin iniiala tipului: I pentru Integer, R pentru real
etc.) i valorile constantelor, n conformitate cu cerinele fiecrui bloc de instruciuni
executabile. Dac un identificator nu este definit ntr-un anumit bloc, atunci introducei n
celula respectiv codul N/A.

program domeniu;
const i=10;
var a,b:integer;
c,f:real;
d,e:char;
g:boolean;
procedure P1(a,e:real; c:boolean);
const k=2.1;
var f:boolean;
begin {P1}
.
end; {P1}
procedure P2(c:integer; g:real);
const b=10;
var a:boolean;
e:char;
procedure P3(a:char; b:real);

100
const d=3.14;
var i,f:integer;
begin {P3}
.
end; {P3}
procedure P4(a:real);
const e=a;
var g,k:integer;
begin {P4}
.
end; {P4}
begin {P2}
.
end; {P2}
procedure P5(e,g: integer; d:boolean);
const k=40;
var i:real;
begin {P5}
.
end; {P5}
begin {program principal}
.
end.

Domeniul a b c d e f g i k
Program princ. I I R C C R B 10 N/A
P1
P2
P3
P4
P5

B. SUBPROGRAME N LIMBAJUL C/C++


Limbajul C/C++ admite un singur tip de subprograme: subprograme de tip funcie (nsui
programul principal este o funcie cu un nume rezervat: main).
Declarare:
tip nume(tip1 [&] par_formal1,, tipm [&] par_formalm);

Declaraia & este inclus ntre paranteze drepte deoarece este opional.
Apelare
v=nume(par_actual1,, par_actualm);
sau
101
nume(par_actual1,, par_actualm);

n limbajul C/C++ exist dou categorii de funcii:


y funcii cu tip acestea transmit ctre programul apelant o valoare atribuit numelui
funciei; dac tipul expresiei din instruciunea
return expresie;
nu este identic cu cel al funciei, atunci se face automat conversia. O astfel de funcie se ape-
leaz ntr-o expresie;
y funcii fr tip acestea nu transmit ctre programul apelant nicio valoare; n acest caz, tipul
funciei este void, rezultatele prelucrrilor sunt depuse n variabile globale (i astfel programul
apelant are acces la ele) iar revenirea n programul apelant se face fie la ntlnirea instruciunii
return;
fie dup executarea tuturor instruciunilor din corpul funciei. O astfel de funcie se apeleaz
printr-o instruciune de sine stttoare.
n descrierea i apelul funciilor trebuie respectate urmtoarele reguli:
y numele funciei este precedat de tipul funciei;
y numele fiecrui parametru formal este precedat de tipul parametrului;
y transmiterea parametrilor prin adres este precizat prin operatorul & care precede numele
parametrului formal, de exemplu:
double arie(double L, double l, double & A));
y n blocul de instruciuni al funciei exist o instruciune special pentru returnarea rezultatului:
return expresie; sau return;
return A;

Exemplul 1: Verificarea paritii sumei a dou numere ntregi.


1. Analiza problemei
y Date de intrare:
numerele ntregi a, b.
y Date de ieire:
un mesaj care indic dac suma celor dou numere este par sau nu.
2. Modularizarea rezolvrii
Varianta I
Vom folosi o funcie care returneaz o valoare (restul mpririi sumei la 2).
Varianta II
Vom folosi o funcie care nu returneaz nicio valoare (variabila n care se calculeaz restul
este declarat variabil global):

3. Raionamentul problemei
Pasul 1. Se citesc datele de intrare: a, b.
Pasul 2. Se apeleaz subprogramul de determinare a paritii sumei celor dou numere.
Pasul 3. Dac restul returnat de subprogram este zero atunci se afieaz mesajul Suma este
par, altfel se afieaz mesajul Suma este impar.

102
4. Implementarea algoritmului

I. Program cu funcie care II. Program cu o funcie care nu


returneaz o valoare returneaz nicio valoare
#include<stdlib.h> #include<stdlib.h>
#include<conio.h> #include<conio.h>
int S;
int par(int a, int b) void par (int a, int b)
{int S;
S=(a+b)%2; {S=(a+b)%2;}
return S;}
void main (void) void main (void)
{int a,b,S; {int a,b;
cout<<Dai ntregii a i b; cout<<Se introduc a i b;
cin>>a>>b; cin>>a>>b;
S=par(a,b); par(a,b);
if (S == 0) cout<<Suma celor doua if (S==0) cout<<Suma celor doua numere
numere este para; este para;
else cout<<Suma celor doua numere else cout<<Suma celor doua numere este
este impara;} impara;}

Exemplul 2: Interschimbarea a dou valori a i b.


n foarte multe prelucrri, este necesar interschimbarea valorilor reinute n dou locaii de
memorie, fie acestea a i b. De aceea, este util s realizm un subprogram care s primeasc
valorile celor dou locaii de memorie i s transmit programului principal noile valori rezul-
tate prin interschimbare. Subprogramul necesit doi parametri care reprezint adresele celor
dou locaii de memorie.
Funcie cu parametri de tip adres
#include<stdlib.h>
#include<conio.h>

void interschimb (int &x, int &y)


{int aux;
aux=x; x=y; y=aux;}
void main (void)
{int a,b;
cout<< se introduc valorile;
// are loc interschimbarea valorilor
interschimb (a, b);
cout << se afieaz noile valori;
cout << a << << b;
}
103
# TEME
Utilizarea subprogramelor n limbajul C/C++
1. Fie dou numere raionale r1 i r2; se cere s se afieze: suma, produsul i ctul celor dou
numere. Scriei i analizai un program cu subprograme (pentru fiecare operaie cte un sub-
program).
2. Fie M o matrice ptratic de ordin n > 1 cu elemente numere naturale; se cere s se afieze
numerele prime (i poziia lor n matrice) aflate n intervalul dintre cel mai mic numr de pe
diagonala principal i cel mai mare numr de pe diagonala secundar. Realizai un program
cu subprograme. Descriei i argumentai tipul fiecrui subprogram.
3. Examinai programul C/C++ de mai jos din punct de vedere al domeniului de vizibilitate al
variabilelor.

#include<iostream.h>
char a,b; int c; float d;
void P1 (float y)
{float b;
}
void P2(char y)
{-}
char F1(int x)
{float a; char y;
P1(y);
return y;}
void main (void)
{}

Presupunem c plasm urmtoarele instruciuni n blocul de instruciuni executabile al sub-


programului menionat. Indicai care dintre instruciuni va fi corect/incorect plasat i de ce:
a) n program, P2(F1(c));
b) n subprogramul F1, P1(a);
c) n subprogramul P2, P1(d);
d) n program, a=F1(c);
e) n subprogramul P1, P2(b).

C. EXERCIII CU SUBPROGRAME

1. Codificai n limbajul de programare studiat urmtoarele secvene i completai tabelul de


variaie pentru a determina valoarea variabilelor pe parcursul execuiei.

104
a) nceput program calcul
variabile a,b,c,d,e a b c d e
nceput subprogram P1(x;y; adresa:z;u;v)
variabile a
a1; b7; xy; za+x; vz+b
returneaz z,u,v
sfrit P1;
a4; b5; c12; db; ec
apeleaz P1(a;b;c;d;e)
scrie a,b,c,d,e
apeleaz P1(1;2;a;b;c)
scrie a,b,c,d,e
sfrit calcul

b) nceput program opuse


variable x,y
x y s i
nceput subprogram F1(x)
variabile i,s
s 0;
pentru i = 1la y execut
s s+i+x
x -1
sfrit pentru
F1 s
sfrit F1
x 0; y 1
ct timp y <= 2
scrie x,y
x xF1(y);
y y+1;
sfrit ct timp
sfrit opuse

c)
nceput program verificare
nceput subprogram verificValori(date de intrare: v1; v2;v3; date de ieire:v3)
dac v1>v2
atunci
scrie v1,v2
v3 v3+1
altfel
scrie v2,v1

105
v3 v3-1
sfrit dac v1 v2 v3 v4 v5
sfrit verificValori
contor0
citete index
pentru i=1 la index execut
citete v1,v2,v3,v4
contorcontor+1
citete v5
ct timp v3<v5
v3v3+2
sfrit ct timp
v5v5+v3
dac v3 este par
atunci
apeleaz verificValori(v2;v4;v5)
altfel
apeleaz verificValori(v1;v3;v5)
sfrit dac
sfrit pentru
scrie v1,v2,v3,v4,v5
sfrit program

2. Corectarea erorilor
Eliminai erorile din programele de mai jos:

a) VARIANTA PASCAL VARIANTA C/C++

program erori; #include<iostream.h>


const limita=10; #include<conio.h>
var index:integer; int limita=10;
function Func(cheie:char): boolean; int Func(char cheie)
var sem:boolean; {
cod:char; int sem,cod;
begin {Func} cout<<Introducei codul ;

106
cin>>cod; cout<<endl;
sem:=false;
if(cod==cheie)
write(Introducei codul);
semaf=1;
read (cod); writeln;
return sem;
if cod=cheie then semaf:=true
}
Func:=sem
end {Func}
void main (void)
begin {program principal}
for (int index=1; index<=limita;index++)
for index:=1 to limita
{if (func(char(index)))
if (func(chr(index)) then
cout<<Da;
writeln (Da);
}
end; {if}
getch();
end. {program principal}
}

b) VARIANTA PASCAL VARIANTA C/C++


program erori2; #include<iostream.h>
var a,b,i:integer;
procedure P1(var x:integer, y:integer); int a,b,i;
begin {P1} void P1(int x, int y)
x=y {x=y}
end {P1} void main (void)
begin {program principal} {s=0;
set s to false while (!s)
while not s {cin>>a>>b;
begin if(a>b) S1(a,b);
readln(a and b); else S1(b, a)
if (a>b) for (i=1;i<=b,i++)
then S1 a, b); {a=a-(b+i);
else S1(b,a); cout<<a+b= <<a+b;}}
for i=1 to b do
begin
a:=a(b+i);
writeln(a+b=,a+b)
end for;
end. {program principal}

3. Stive i cozi
a) Realizai un program cu subprograme pentru simularea unei stive.
b) Realizai un program cu subprograme pentru simularea unui fir de ateptare.

107
Utilizarea funciilor predefinite
4. Scriei cte un program care s utilizeze funciile i procedurile standard enumerate n
Anexa 2/Anexa 4.
5. Identificai funciile predefinite ce se pot folosi n programul de calculare a energiei cinetice
i n problema traiectoriilor (pag. 65 i pag. 70).
6. Se consider un automobil ntr-o curb de raz r; dndu-se unghiurile pantelor i , se cere
s se scrie un program care s afieze viteza maxim i viteza minim cu care poate ataca
automobilul curba n condiii de siguran. Se cunosc urmtoarele formule:
v M = r g tg ( + ) , vm = r g tg ( )

Ce subprograme predefinite se pot folosi?

5. IRURI DE CARACTERE

A. PARTICULARITI DE MEMORARE A IRURILOR DE CARACTERE

Cum procedm pentru a citi i afia, pe rnd, numele inventatorilor primelor calculatoare
mecanice, electromecanice, electronice: John Napier, Wilhelm Schickard, Blaise Pascal,
Gottfried Wilhelm Leibnitz, Charles Babbage, Konrad Zuse, S.P. Eckert, J.W. Mauchly .a.
S ncepem cu C. Babbage: o prim soluie const n utilizarea unui vector cu cel puin 10
componente de tipul predefinit char. Putem citi, prelucra i afia tot vectorul sau numai anumite
elemente ale sale (a se vedea figura 43).
indice n vectorul s 0 1 2 3 4 5 6 7 8 9
caracter tastat C . B a b b a g e
valoare n memorie 9 067 046 066 097 098 098 097 103 101

(a) varianta Pascal


indice n vectorul s 0 1 2 3 4 5 6 7 8 9
caracter tastat C . B a b b a g e null
valoare n memorie 067 046 066 097 098 098 097 103 101 000

(a) varianta C/C++


Figura 43. Memorarea irurilor de caractere
Se observ c n locaiile din memoria intern asociate componentelor vectorului sunt depuse
codurile ASCII (American Standard Code for Information Interchange (ASCII) este codul uni-
versal acceptat pentru memorarea intern a caracterelor) ale caracterelor din ir: s[1] conine
valoarea 067 = codul ASCII al caracterului C, s[3] conine valoarea 066 = codul ASCII al
caracterului B, s[5] i s[6] conin valoarea 098 = codul ASCII al caracterului b etc. (Anexa 7)

108
N PASCAL N C/C++
n primul octet (atenie: s[0] i nu s[1] este ultimul octet (s[9], pentru c indexarea se face
prima component a vectorului!) este depus de la 0!) conine, conform conveniei,
automat lungimea efectiv a irului (aici: 9). valoarea 0 = codul ASCII al caracterului null

LIMBAJUL PASCAL LIMBAJUL C/C++


program sir; #include<iostream.h>
var s:array[1..50] of char; void main (void)
n,i: integer; {char s[50];
begin int n, i;
writeln(n=); readln(n); cout<<n=; cin>>n;
for i:=1 to n do read (s[i]); cout<<Introduceti sirul.<<endl;
writeln(Sirul citit este:); for (i=0; i<n; i++) cin>>s[i];
write (s); s[n]=0;
end. cout<<Sirul este:<<endl;
for (i=0;i<n;i++)cout<<s[i];}

 Atenie
n limbajul Pascal am putut afia vectorul de caractere ca pe o variabil inde-
pendent (nu am mai recurs la indexare, aa cum am fcut la citire).

n limbajul C/C++, dac vectorul este iniializat prin declarare (char


s[10]=C.Babbage), atunci caracterul null este memorat automat n ultima compo-
nent; dac este iniializat prin citire (ca mai sus), atunci trebuie inclus n program o
instruciune explicit de atribuire (s[n]=0;).

B. FACILITI PENTRU PRELUCRAREA IRURILOR DE CARACTERE N LIMBAJUL


PASCAL
Limbajul Pascal ofer un tip de date standard special: tipul string. O variabil de tip string
poate reine pn la 255 caractere i poate fi declarat n dou moduri
1.
type sir=string;
var s:sir;
n acest caz se rezerv n memorie 256 de octei indiferent cte caractere are la citire irul s
primul octet conine lungimea efectiv a irului citit pentru exemplul irului C.Babbage
lungimea irului este 9) ;
2.
type sir=string[n];
var s:sir;
n acest caz se rezerv n memorie n de octei primul octet conine lungimea efectiv a iru-
lui citit; se pot citi iruri cu maximum n-1 caractere.
109
 Atenie
Programatorul nu trebuie s se preocupe de depunerea lungimii efective a irului n
primul octet.
Variabila s de tipul string va fi privit ca o variabil independent dar componen-
tele ei vor putea fi accesate prin indexare, la fel ca i componentele oricrui vector!

# TEME
1. Ce afieaz urmtorul program?

program sir2;
var s: string;
begin
writeln(Introduceti sirul: );
readln (s);
writeln(Sirul,s,are,ord(s[0]), caractere);
writeln(s[3]=,s[3],s[5]=,s[5],s[6]=,s[6]);
writeln
end.

Operaia de atribuire pentru iruri


2. Variabilele de tip string pot fi iniializate ca orice variabile prin citire sau atribuire.
Fie variabilele g i k inializate cu irurile Leibnitz i respectiv Zuse. Care dintre urm-
toarele moduri de declarare permite efectuarea corect (fr trunchiere la dreapta) a oricreia
dintre atribuirile: a b , b a:

(1) var a:string; (2) var a:string[4]; (3) var a:string[8];


b:string; b:string[4]; b:string[8];
(4) var a:string; (5) var a:string[15]; (6) var a:string[20];
b:string[4]; b:string[13]; b:string[20];

C. FACILITI PENTRU PRELUCRAREA IRURILOR DE CARACTERE N LIMBAJUL


C/C++
Limbajul C/C++ permite citirea i scrierea irurilor de caractere, fr a mai preciza adresa
elementelor. Astfel, primul program care exemplific prelucrarea irurilor de caractere devine:

#include<iostream.h>
void main (void)
{ char s[50];
cout<<Introduceti sirul fara spatii<<endl;

110
cin>>s;
cout<<Sirul introdus:<<endl;
cout<<s;
}

Aceast metod prezint un dezavantaj: irul citit nu poate conine mai multe spaii (nu poate
fi citit o fraz n care cuvintele s fie separate prin spaii).
Pentru nlturarea acestui dezavantaj, vom folosi o funcie special care permite citirea
irurilor de caractere de orice lungime care conin orice caracter, inclusiv spaii.
S presupunem c trebuie s citim i s prelucrm urmtorul text ir de caractere:
John Napier a inventat nu numai logaritmii naturali dar i primul calculator mecanic, n
stare s reduc efectuarea nmulirilor i mpririlor la efectuarea de adunri i scderi.
Acest ir are 182 de caractere, deci poate fi declarat astfel:
char secv[183];
Prezentm mai jos cteva exemple de citire a acestui ir cu ajutorul funciei cin.get.
(ex1)cin.get(secv,183,.);
(ex2)cin.get(secv,183);
(ex3)cin.get(secv,183,,);
(ex4)cin.get(secv,86);
n primele dou cazuri, este citit ntregul ir; n ultimele dou cazuri este citit numai subirul
John Napier a inventat nu numai logaritmii naturali dar i primul calculator mecanic,. Aceast
funcie predefinit are urmtorul antet:

Definiie
cin.get(ir, int nr, char=\n)

Semnificaia parametrilor:
y primul parametru actual trebuie s fie o variabil de tip ir de caractere, declarat
anterior, de exemplu, prin char v[n];
y al doilea parametru actual trebuie s fie un numr cuprins ntre 0 i n, care s indice
numrul de caractere din ir care trebuie citite;
y al treilea parametru actual este opional; dac nu apare, atunci se subnelege c este \n.
Efectele apelrii funciei (n oricare dintre variante) sunt:
y se citesc nr-1 caractere (iat de ce am folosit 183 dei irul nostru are 182 caractere),
inclusiv spaiile;
y caracterul null este inserat automat dup ultimul caracter din ir;
y atunci cnd apare, caracterul transmis ca al treilea parametru actual foreaz sfritul iru-
lui (de aceea n exemplul (ex3) de mai sus, citirea se oprete la ntlnirea virgulei).

111
 Atenie
Pentru a citi numai un prefix al irului, nu ntreg irul, putem folosi:
y varianta (ex3): se citete irul secv pn la ntlnirea primului caracter ,;
y varianta (ex4): se citesc primele 85 componente din irul secv.
Pentru a citi un singur caracter, fie c este spaiu sau nu, putem folosi funcia cin.get fr
parametri: cin.get(); acest apel este folosit frecvent la citirea succesiv a mai multor iruri de
caractere pentru preluarea separatorului de sfrit de ir.

D. SUBPROGRAME PREDEFINITE PENTRU PRELUCRAREA IRURILOR DE CARACTERE

y Atribuirea de valori
LIMBAJUL PASCAL LIMBAJUL C/C++
operatorul := funcia strcpy
program atribuire1; #include<iostream.h>
var s1,s2,s3:string; #include<string.h>
begin #include<conio.h>
s1:=Charles; void main (void)
s2:=Babbage; {clrscr();
writeln(Sirurile citite:); char s1[10]=Charles, s2[10]=Babbage,
writeln(s1, ,s2); s3[10];
s3:=s2; cout<<s1<<s2<<endl;
s2:=s1; strcpy(s3,s2);
s1:=s3; strcpy(s2,s1);
writeln(Sirurile dupa interschimbare:); strcpy(s1,s3);
writeln(s1, ,s2); cout<<Sirurile dupa
end. interschimbare:<<endl;
cout<<s1<<s2<<endl;
getch();}
Definiia funciei:
char *strcpy(char *destinaie, char *sursa);
Apelarea:
strcpy(s1,s2);
Ca urmare, irul s2 este depus n irul s1;
irul s2 rmne nemodificat; irul s1 va conine
rezultatul operaiei i va fi returnat ctre pro-
gramul apelant.

Ambele programe afieaz secvenele Charles Babbage i Babbage Charles

112
 Atenie (C/C++)
Caracterul * care precede numele funciei i al parametrilor formali indic faptul c
acetia nu reprezint valori ci adrese. Cu alte cuvinte, *sursa reprezint adresa primei locaii
din zona de memorie atribuit acestui parametru al funciei strcpy.

y Compararea irurilor de caractere


irurilor de caractere li se pot aplica operatorii relaionali (<, >, = etc). Cum putem ns com-
para litera a cu cifra 7 sau cu paranteza deschis?! Dar irul aX cu irul Ax?! Metoda const
n compararea codurilor ASCII prin care se reprezint n memorie caracterele din ir (aa cum
am observat n reprezentarea irului C.Babbage, codul literei a, 097, este predecesorul n sens
aritmetic al codului literei b, 098).
Fie dou variabile x i y de lungime n, respectiv m, care trebuie comparate. Distingem urm-
toarele cazuri:
y codul primului caracter din x este mai mare dect codul primului caracter din y; atunci x>y
(de exemplu: bit > Octet deoarece ASCII(b) = 098 > 079 = ASCII(O));
y codul primului caracter din x este mai mic dect codul primului caracter din y; atunci x<y
(de exemplu: Bit < octet deoarece ASCII(B) = 066 < 111 = ASCII(o));
y codul primului caracter din x este egal cu codul primului caracter din y (este practic acelai
caracter); distingem urmtoarele subcazuri:
n=m=1; atunci x=y;
n>m=1; atunci x>y (de exemplu: if>i);
m>n=1; atunci y>x;
nm>1; atunci se continu cu compararea codurilor caracterelor de pe poziiile urmtoare
din x i y. S presupunem c pentru toate primele h poziii codurile au fost egale:
dac h=m=n atunci x=y;
dac h=m<n atunci x>y;
dac h<m atunci relaia dintre x i y este relaia dintre codurile ASCII ale carac-
terelor aflate n x i y pe poziia h+1.
mn>1; se procedeaz analog.

Compararea n Limbajul Pascal Compararea n Limbajul C/C++


operatorii relaionali funcia strcmp
program comparare1; #include<iostream.h>
var s1,s2:string; #include<string.h>
begin void main(void)
writeln(s1:);readln(s1); {char s1[20],s2[20];
writeln(s2:);readln(s2); int v;
if(s1<s2) then cout<<\n s1:;cin.get(s1,20);
writeln(s1,<,s2) cin.get(); cout<<\n s2:;cin.get(s2,20);

113
else cout<<endl;
if(s1>s2) then v=strcmp(s1, s2);
writeln(s1,>,s2) if (v < 0) cout<<s1<<<<<s2;
else else
writeln(s1,=,s2); if (v >0) cout<<s1<<><<s2;
end. else cout<<s1<<=<<s2;
}
Definiia funciei:
int strcmp(const char *sir1, const char
*sir2);
Apelarea:
v=strcmp(s1,s2);
Funcia compar sirurile s1 i s2 i
returneaz ctre programul apelant o valoare
ntreag care este:
< 0 , dac s1 < s2,
= 0 , dac s1 = s2,
> 0 , dac s1 > s2.
Pentru s1 = abc i s2 = aac, ambele programe afieaz abc > aac

y Determinarea lungimii unui ir de caractere


LIMBAJUL PASCAL LIMBAJUL C/C++
funcia length sau valoarea coninut n funcia strlen
primul octet din ir
program length1; #include<iostream.h>
var s1:string; #include<string.h>
begin void main (void)
s1:=Acest sir are 27 caractere.; {char s1[28]=Acest sir are 27 caractere.;
writeln(Acest sir are ,ord(s1[0]),caractere.); cout<<Acest sir are << strlen(s1)<<
writeln(Acest sir are ,length(s1),caractere.); caractere.;
end. }
Definiia funciei: Definiia funciei:
function length (sursa:string): :Integer; size_t strlen (char *sursa);
Apelarea:
n:= length(s); Apelarea:
Funcia returneaz ctre programul apelant n = strlen (s);
numrul de caractere din irul s (primul Funcia returneaz ctre programul apelant
octet, rezervat automat numrului de carac- numrul de caractere din irul s (ultimul octet,
tere din ir, nu este numrat). rezervat automat caracterului null, nu este
numrat).
Ambele programe afieaz textul Acest ir are 27 caractere.

114
y Concatenarea irurilor de caractere

LIMBAJUL PASCAL LIMBAJUL C/C++


funcia concat sau funcia strcat
operatorul +

program concat1; #include<iostream.h>


var s1,s2,r1,r2:string; #include<string.h>
begin void main (void)
s1:=Turbo;s2:=Pascal; {char s1[10]=Borland,s2[10]=C;
r1:=s1+ +s2; strcat (s1, );
r2:=concat(s1, ,s2); strcat (s1, s2);
writeln(Cu operatorul + : ,r1); cout<<\n<<s1;
writeln(Cu functia concat: ,r2); }
end.

Definiia funciei: Definiia funciei:


function concat(s1[,s2,,sn]:string):string; char *strcat (char *destinaie, char *sursa);
Apelarea: Apelarea:
s:=concat(a1,a2,,ak); strcat (a1, a2);
Ca urmare, irurile a1, a2, , ak sunt con- Ca urmare, irul a1 este concatenat la dreapta
catenate n aceast ordine i de la stnga la cu irul a2; irul s2 rmne nemodificat; irul
dreapta. Dac irul rezultat are mai mult de s1 va conine rezultatul operaiei i va fi
255 caractere, atunci el este trunchiat la returnat ctre programul apelant. Pentru a
dreapta. concatena n iruri, funcia trebuie apelat de
n-1 ori:
strcat(a1,a2); strcat(a1,a3); . . .; strcat(a1,an);

Programul afieaz secvena Turbo Pascal Programul afieaz secvena Borland C


(de dou ori!) (o singur dat)

 Atenie
Operaia de concatenare a irurilor NU este comutativ.

115
y Conversia literelor mici n majuscule

LIMBAJUL PASCAL LIMBAJUL C/C++


funcia upcase funcia strupr
program upcase1; #include<iostream.h>
var s1:string; #include<string.h>
i:integer; void main (void)
begin {char s1[13]=Clasa a XI-a;
s1:=Clasa a XI-a; cout<<\n Sirul initial: <<s1<<endl;
writeln(Sirul initial: , s1); strupr (s1);
for i:=1 to length(s1) do cout<<Sirul cu majuscule: <<s1;
s1[i]:= upcase(s1[i]); }
writeln(Sirul cu majuscule: , s1);
end.
Definiia funciei: Definiia funciei:
function upcase (car: Char):Char; char *strupr(char *sursa);
Apelarea: Apelarea:
w:= upcase (c); adr=strupr (s1);
Funcia returneaz majuscula corespunz- Funcia returneaz irul s1, n care toate ca-
toare literei c primit ca parametru actual; racterele aflate n domeniul a..z au fost
dac acest parametru nu se afl n domeniul transformate n majuscule. Cele din afara
a..z atunci el rmne neschimbat. acestui domeniu rmn neschimbate.
Ambele programe afieaz Clasa a XI-a i, apoi, CLASA A XI-A

y Cutarea unui subir ntr-un ir de caractere

LIMBAJUL PASCAL LIMBAJUL C/C++


funcia pos funcia strstr
program pos1; #include<iostream.h>
var s1,s2:string; #include<string.h>
n:integer; void main (void)
begin {char s1[11]=imprimanta,
s1:=imprimanta; s2[5]=prim,s3[5]=rima,
writeln(s1); s4[6]=prima;
n:=pos(prim,s1); char s5[6]=manta,s7[5]=mira, s6[8]=
writeln(prim incepe din pozitia:,n); imprima, *adr;
writeln(rima incepe din adr=strstr(s1,s2);
pozitia:,pos(rima,s1)); if (adr) cout<<adr-s1+1<<endl;
n:=pos(prima,s1); else cout<<Nu apare in sir <<endl;
writeln(prima incepe din pozitia:,n); adr=strstr(s1,s3);
writeln(manta incepe din if (adr) cout<<adr-s1+1 <<endl;

116
pozitia:,pos(manta,s1)); else cout<<Nu apare in sir<<endl;
writeln(imprima incepe din adr=strstr(s1,s4);
pozitia:,pos(imprima,s1)); if (adr) cout<<adr-s1+1<<endl;
n:= pos(mira,s1); else cout<<Nu apare in sir<<endl;
writeln(mira incepe din pozitia:,n,, adr=strstr(s1, s5);
adica nu se afla in sir); if (adr) cout<<adr-s1+1<<endl;
end. else cout<<Nu apare in sir<<endl;
adr = strstr(s1, s6);
if (adr) cout<<adr-s1+1<<endl;
else cout<<Nu apare in sir<<endl;
adr = strstr(s1, s7);
if (adr) cout<<adr-s1+1<<endl;
else cout<<Nu apare in sir<<endl;}
Definiia funciei: Definiia funciei:
function pos(subsir: String; sir: String): char *strstr(char *sir, char *subsir);
Byte; Apelarea:
Apelarea: adr=strcstr(s1,s2);
n:=pos(s1,s2); Funcia verific (de la stnga la dreapta) dac
Funcia verific (de la stnga la dreapta) dac secvena s2 apare n ntregime n
secvena s1 apare n ntregime n secvena s1. n caz afirmativ, returneaz
secvena s2. n caz afirmativ, returneaz adresa caracterului din s1 care este i primul
indicele caracterului din s2 care este i primul caracter din s2; altfel returneaz valoarea
caracter din s1; altfel returneaz valoarea 0. null.
Programele afieaz numerele 3, 4, 3, 6, 1, 0

y Conversia unei valori numerice ntr-o secven de caractere


LIMBAJUL PASCAL LIMBAJUL C/C++
procedura str funciile itoa
program str1; #include<iostream.h>
var s1:string; #include<stdlib.h>
a:integer; void main (void)
begin {int a=2006;
a:= 2006; char s1[100];
str(a:4,s1); itoa(a,s1,10);
writeln(Numarul ,a:4); cout<<Numarul:<<a;
writeln(Sirul ,s1); cout<<Sirul:<<s1<<endl;
end. }

117
Definiia procedurii: Definiia funciilor:
procedure str(numar:i; var sursa:string); char *itoa(int valoare, char *sir, int baza);
Apelarea: Apelarea:
str(nr:n,s); itoa(v1, s1, b1);
Procedura returneaz irul s obinut prin con- Funcia itoa returneaz irul s1 obinut prin
vertirea numrului nr de la tipul ntreg la conversia numrului ntreg v1 din baza b1 la
tipul string. Parametrul n indic numrul tipul char (dac b1=10 atunci se reine i
total de caractere pe care se face conversia semnul lui v1).
(numrul de octei ai s). Exist dou funcii similare funciei itoa:ltoa
i ultoa. prima convertete n ir o valoare de
tip long int, a doua convertete o valoare de
tip unsigned long.
Ambele programe afieaz secvena 2006.

y Conversia unei secvene de caractere ntr-o valoare numeric


LIMBAJUL PASCAL LIMBAJUL C/C++
procedura val funciile atol, atof
program val1; #include<iostream.h>
var s1:string; #include<stdlib.h>
i,c:integer; void main (void)
r:real; {long l; float f;
begin char s1[5]=2006;
s1:=2006; char s2[6]=-1.23;
writeln(Sirul: ,s1); l=atol(s1);
val(s1,i,c); cout<<s1: <<s1<<;l: <<l<<endl;
if c=0 then writeln(Numarul:,i:4) l=atol(17ani);
else cout<< l: <<l<<endl;
writeln(Eroare: s1= ,s1); f=atof(s2);
s1:= -1.23; cout<<s2: <<s2<<; f: <<f<<endl;
writeln(Sirul: ,s1); f=atof(3.02*7);
val(s1, r, c); cout<< f: <<f<<endl;
if c=0 then writeln(Numarul:,r:5:2) }
else
writeln(Eroare: s1= ,s1);
s1:=17 ani;
writeln(Sirul: ,s1);
val(s1,r,c);
if c=0 then writeln(Numarul:,r:5:2)

118
else
writeln(Eroare la conversie.);
end.
Definiia procedurii: Definiia funciilor:
procedure val(sursa; var v:integer; var long atol(char *sursa);
cod:integer); double atof(char *sursa);
Apelarea: Apelarea:
val(s1,nr,c); n = atol(s1);
Procedura returneaz numrul nr (ntreg sau n = atof(s1);
real) la care a fost convertit irul s1 i va- Funcia atol (atof) convertete irul s1 la un
loarea ntreag c, indicnd modul n care s-a ntreg de tip long (la un real de tip float);
realizat conversia: dac s1 a putut fi convertit dac s1 nu se poate converti, atunci funcia
(nu a coninut dect cifre, virgul, punct zeci- returneaz valoarea 0.
mal, semnul + sau -) atunci c = 0; altfel c ? 0
(conversia nu s-a realizat). Observaie
Exist i funciile atoi, strtol, strtoul, strtod
care convertesc un ir la: un ntreg, un ntreg
de tip long, un ntreg de tip long fr semn,
respectiv la un real de tip double.

Programul afieaz - pe 3 rnduri - 2006, - Programul afieaz - pe 4 rnduri - 2006, 17,


1.23 i Eroare: s1= 17 ani -1.23 i 3.02

PROBLEME PROPUSE
Realizai, n limbajul de programare studiat, cte un program pentru rezolvarea fiecreia din-
tre urmtoarele probleme:

1. Pentru fiecare elev din clas se citesc, pe rnd, numele i prenumele (scrise cu litere mici i/
sau mari).
S se afieze (pentru fiecare elev), pe un singur rnd, numele (cu majuscule) i prenumele
(doar prima liter s fie majuscul).
S se afieze numele elevului cu cel mai lung prenume i prenumele elevului cu cel mai lung
nume.
S se ordoneze cresctor elevii dup numele de familie.
S se ordoneze descresctor elevii dup prenume.

2. S se verifice dac o fraz este de tip palindrom (exemple: Au o nava noua. Icre, pui, ciuperci.
Ele fac cafele. Sa nu iei un as. O rama maro.) n acest scop se vor elimina spaiile (codul
ASCII al spaiului este 032).

119
3. Se citete o fraz. Se cere s se afieze:
y numrul cuvintelor care apar n fraz;
y cel mai lung i cel mai scurt cuvnt precum i poziia ncepnd cu care apar acestea n
fraz;
y s se tearg din fraz primul cuvnt care ncepe cu litera I;
y s se insereze n fraz, dup fiecare cuvnt, acelai cuvnt dar scris cu majuscule.
4. Se citete o fraz. Se cere s se afieze:
y toate perechile de cuvinte adiacente care rimeaz;
y toate perechile de cuvinte neadiacente care rimeaz, mpreun cu poziia primei lor
litere n fraz (considerm c dou cuvinte rimeaz dac cel puin ultimele lor dou litere
coincid).
5. Se citete un ir format numai din litere i spaii. Se cere s se afieze irul, dup ce toate
vocalele consecutive au fost nlocuite cu majuscule.
6. Se citete un ir de cifre zecimale. Se cere s se afieze irul dup ce toate cifrele pare p care
apar au fost nlocuite cu cifrele corespunztoare (9p) iar cifrele impare i cu cifrele cores-
punztoare (i-1). Exemplu: pentru irul 143265 se va afia irul 052734.
7. Statisticile arat c fiecare utilizator de e-mail are 1,8 (!!) csue de pot electronic. S se
citeasc toate adresele e-mail ale unei persoane i s se afieze separat numele-utilizator i
adresa serverului (codul ASCII al caracterului @ este 064).
8. Se citesc mai multe adrese Web. S se afieze separat subirul care reprezint: schema (http//
, ftp:// etc.), numele serverului, calea, numele fiierului care trebuie ncrcat.
9. Se citesc dou iruri. Se cere s se afieze un subir comun de lungime maxim.
10. Se citete un ir. Se cere s se afieze cel mai lung subir format din litere ordonate alfabetic
(ab, abbc, afgk etc.).

MINIPROIECT N ECHIP. COMPANIA EFICIENT


Etapa: Realizare i testare (implementarea unitilor de program n limbajul de programare
studiat)
Cerine:
1. Realizarea i testarea individual a programelor.
2. Integrarea programelor ntr-o aplicaie unitar.
3. Completarea documentaiei cu specificaiile tehnice de programare.

120
6. RECURSIVITATEA

A. DEFINIRE. EXEMPLIFICARE

Toi algoritmii sunt reprezentai printr-o succesiune logic i finit de pai descrii prin struc-
turi specifice: structuri secveniale, structuri decizionale sau structuri repetitive.
Un algoritm care conine structuri repetitive poate fi reprezentat: iterativ sau recursiv.
Reprezentarea iterativ a unui algoritm repetitiv implic reluarea parcurgerii secvenei de
operaii pn cnd este ndeplinit condiia de oprire. n limbajele de programare cunoscute,
structurile repetitive sunt implementate iterativ cu ajutorul instruciunilor corespunztoare.

LIMBAJUL PASCAL LIMBAJUL C/C++

for i:=1 to n do for (i=1; i<=n; i++)


begin { secvena de operaii }
secvena de operaii
end;
for i:=n to downto 1 do for (i=n; i>=1; i)
begin { secvena de operaii }
secvena de operaii
end;

while (cond_logic) do while (cond_logic) do


begin { secvena de operaii}
secvena de operaii
end;

repeat do {}while(cond_logic)
secvena de operaii
until (cond_logic);

Repetarea unei secvene de instruciuni (S) poate fi determinat i prin organizarea modular
a programului astfel nct S s aparin unui modul care se autoapeleaz (cap. 2, fig. 40b).
Autoapelul este n acest caz comanda de execuie a secvenei S pentru prelucrarea unor alte date
de intrare. Ieirea din secvena de autoapeluri este controlat printr-o condiie de oprire.
Definirea n matematic a unor relaii recurente (iruri recurente) i prelucrarea acestora au
stat la baza construirii mecanismului recursivitii pentru reprezentarea algoritmilor.

121
Exemplu:
Se consider un numr n natural nenul. S se calculeze i s se afieze n! (factorialul numru-
lui natural n).
Varianta iterativ:
Pentru implementarea iterativ se folosete relaia:
n! = 1*2**n , unde 0!=1
Se apeleaz din programul principal, respectiv din funcia principal, funcia fact care
returneaz valoarea lui n!. n corpul funciei, variabila p se iniializeaz cu valoarea 1 i apoi
ntr-o instruciune repetitiv cu contor se repet de n ori operaia p=p*i, i=1,n. Funcia va
returna valoarea final a produsului p.
IMPLEMENTAREA ITERATIV
LIMBAJUL PASCAL LIMBAJUL C/C++
uses crt; #include<iostream.h>
var n:integer; #include<conio.h>

function fact(n:integer):longint; long fact(int n)


var i:integer; { int i;
p:longint; long p=1;
begin for (i=1;i<=n;i++)
p:=1; p=p*i;
for i:=1 to n do return p;
p:=p*i; }
fact:= p;
end; void main()
{ int n;
begin; clrscr();
clrscr; cout<< n = ;cin>>n;
write( n = );readln(n); cout<< Factorialul <<n<<! = <<fact(n);
writeln( Factorialul ,n,! = , fact(n)); }
end.

Varianta recursiv:
Se folosete umtoarea relaie de recuren:

1, pentru n = 0
fact (n ) =
n fact(n
+ 1)

Exemplu: Pentru n=4, atunci n! se determin astfel:


Se apeleaz din programul principal, respectiv din funcia principal funcia fact care
returneaz valoarea lui n!. Funcia fact are ca parametru formal numrul natural n. Funcia este

122
construit pe baza relaiei de fact(4)
recuren, definit n enunul ?
x nn == 00 ? nu
nu
problemei. Dup apel, funcia se
autoapeleaz cu parametrul for- 4 fact(3)
?

REVENIRE DIN AUTOAPELURI


mal (n-1) multiplicat cu n adic: x nn = 0 ?nu
nu
n*fact(n-1). Dac n>0 atunci se
continu autoapelul (n p n-1 , iar 3 fact(2)

AUTOAPELURI
parametrul funciei are valoarea x ?
n-2). irul de autoapeluri se nn==00 ? nu
nu
2
ncheie cnd este ndeplinit fact(1)
condiia de oprire.
x ?
Conform relaiei de recuren 1 nn == 0 ? nu
nu
a factorialului deducem condiia
fact(0)
de oprire: n=0.
Autoapelurile au loc de sus n ?
nn = 0 ?da
da
jos, (apelul principal p condiia
de oprire) iar construcia soluiei Figura 44 1
se face de jos n sus (condiia de
oprire p apelul principal ), adic:

4!= fact(4)=4*fact(3)=4*(3*fact(2))=4*(3*(2*fact(1)))=4*(3*(2*(1*fact(0))))=

Autoapeluriale
Autoapeluri alesubprogramului
subprogramul fact
factpn
pnlalantlnirea
ntlnireacondiiei de
condiiei deoprire
oprire n=0
n =0

= 4*(3*(2*(1*1))) = 4*(3*(2*1))= 4*(3*2)=4*6=24

Construirea solu
Construirea iei dup
soluiei ntlnirea
dup condi
ntlnirea iei dede
condiiei oprire
oprire

IMPLEMENTAREA RECURSIV
LIMBAJUL PASCAL LIMBAJUL C/C++
uses crt; #include<iostream.h>
var n:integer; #include<conio.h>

function fact(n:integer):longint; long fact(int n)


begin { int i;
p:=1; if (!n) return 1;
if n=0 then fact:=1 else
else fact:=n*fact(n-1) return n*fact(n-1);
end; }

123
begin; void main()
clrscr; { int n;
write( n = );readln(n); clrscr();
writeln( Factorialul ,n,! = , fact(n)); cout<< n = ;cin>>n;
end. cout<< Factorialul <<n<<! = <<fact(n);
}
Un algoritm recursiv conine un bloc procedural care se autoapeleaz, altfel spus se apeleaz
pe el nsui din interiorul su. Din afara blocului procedural se face un prim apel al acestuia,
dup care blocul se autoapeleaz de un anumit numr de ori; la fiecare nou autoapelare se exe-
cut secvena de instruciuni din codul su, eventual cu alte date, realizndu-se un aa-numit
lan de apeluri recursive.
Pentru a defini corect recursivitatea trebuie urmrite urmtoarele aspecte:

1. Condiia de oprire: n corpul subprogramului recursiv exist unul sau mai multe teste
prin care se verific condiiile de ieire din autoapelul recusiv. Aceste teste de ieire formeaz
condiia de oprire.
n subprogramul fact condiia de oprire este n=0.
2. Prelucrarea progresiv: Esena definiiei recursive const n rezolvarea cazului curent
apelnd la cazul precedent. n acest fel, celelalte cazuri ale autoapelului recursiv, diferite de
condiia de oprire, trebuie rezolvate prin tratarea lor astfel nct procesul apelului recursiv s
le orienteze ctre una dintre condiiile de oprire.
n exemplul prezentat, valoarea parametrului formal n este decrementat pn cnd atinge
valoarea 0 (condiia de oprire).

# TEME
1. Stabilii care dintre urmtoarele afirmaii sunt adevrate sau false, prin marcarea csuei cores-
punztoare:

Nr. Rspuns
Afirmaii
crt.
A F
Un algoritm care nu conine structuri repetitive poate fi reprezentat att ite-
1
rativ, ct i recursiv.
Executarea unor secvene de operaii, de un numr cunoscut de ori, este
2 tratat iterativ prin intermediul unor structuri repetive corespunztoare.

Executarea unor secvene de operaii, de un numr cunoscut de ori, este


3 tratat recursiv prin intermediul autoapelurilor aceluiai subalgoritm de un
numr finit de ori.
4 Subalgoritmul se autoapeleaz pn cnd este ndeplinit condiia de oprire.

124
2. Se consider urmtoarea definiie (relaie de recuren):
1, daca n = 1

f(n) = f(n 1 ) , daca n > 1, a R*
a + f(n 1 )

a) Stabilii care este condiia de oprire din autoapel.
b) Pentru n=4 construii toate autoapelurile realizate.
3. Analizai urmtorul enun i punei n eviden aspectele recurente:
Succesorul oricrui numr natural este un numr natural: zero este numr natural.

B. MECANISMUL DE IMPLEMENTARE A RECURSIVITII

n capitolul Subprograme s-a precizat c orice apel de subprogram are ca efect salvarea ntr-o
zon de memorie denumit stiv (segment de stiv) a adresei de revenire de dup apel, a valo-
rilor parametrilor formali transmii prin valoare i a adresei parametrilor transmii prin adres,
precum i alocarea de spaiu pe stiva sistemului pentru variabilele locale ale subprogramului.
La revenirea n subprogramul apelant, se extrag n ordine invers valorile salvate pe stiv
(att ale variabilelor locale, ct i ale parametrilor).
n cazul subprogramelor recursive, la apelul subprogramului se depun pe primul nivel al stivei
sistemului, n ordine, parametrii formali transmii, se aloc spaiu pentru variabilele locale (dac este
cazul) i adresa de revenire dup apel. La fiecare autoapel al subprogramului, se urc cu cte un nivel
n stiv; pe acest nivel se depun noile valori ale parametrilor transmii, se aloc spaiu pentru vari-
abilele locale. Cnd se ntlnete condiia de oprire se ncheie autoapelul subprogramului, se extrag
din stiv (prin vrful stivei, de sus n jos) n ordine invers valorile depuse i se efectueaz prelu-
crrile impuse n secvena de operaii executat la fiecare autoapel. Cnd se revine n modulul
apelant, stiva sistemului este vid.
Exemplificarea mecanismului recursivitii pentru determinarea valorii funciei 4!=fact(4).
Figura 45. Apelul din
Apelul din modulul
modululapelant
apelanti i
autoapelurile
autoapelurile
Condiia
Condi de
ia de
oprire
oprire
modul fact(4) fact(3) fact(2) fact(1) fact(0)
apelant
1
2 2
3 3 3
4 4 4 4
1
extrage n=4 extrage n=3 extrage n=2 extrage n=1
calculeaz
calculeaz : calculeaz:
calculeaz calculeaz:
calculeaz calculeaz:
calculeaz
4x6 3x2 2x1 1x1

Extragerea
Extragerea valorilor
valorilor depuse
depuse pe
pefiecare
fiecarenivel
nivelalalstivei
stiveiiicalculul
calcululfactorialului
factorialului

125
# TEME
1. Stabilii care dintre urmtoarele afirmaii sunt adevrate sau false, prin marcarea csuei cores-
punztoare:

Nr. Rspuns
Afirmaii
crt.
A F
Prin apelul unui subprogram se salveaz n segmentul de date adresa de
revenire de dup apel, valorile parametrilor formali transmii prin valoare
1
i adresele parametrilor transmii prin adres i variabilele locale (dac este
cazul) ale subprogramului.
La fiecare autoapel al subprogramului se urc cu cte un nivel n stiv pe
2 care se depun noile valori ale parametrilor formali i se aloc spaiu pentru
variabilele locale.
Cnd se ntlnete condiia de oprire se ncheie autoapelul subprogramului,
3 se extrage din stiva sistemului n ordinea depunerii lanul de valori depuse
i se efectueaz prelucrrile impuse.
n modulul apelant se revine din subprogramul recursiv cnd s-au extras
4
toate valorile depuse n stiva sistemului (stiva este vid).

2. Reprezentai coninutul stivei pe durata executrii apelului principal, al autoapelurilor


extragerii valorilor din stiv, construirea valorii returnate i revenirea n subprogramul
apelant pentru urmtoarea definiie (relaie de recuren):

dac n = 1
1, daca

f(n) = f(n 1 ) , daca
dac n > 1, a R
*

a + f(n 1 )

C. TIPURI DE RECURSIVITATE

Exist dou tipuri de recursivitate (fig. 46):


a) Recursivitate direct
Dac un subprogram se autoapeleaz pn la ntlnirea condiiei de oprire se spune c recur-
sivitatea este direct. n acest caz se execut urmtorii pai:
Pasul 1. Apelul subprogramului recursiv.
Pasul 2. Autoapelul subprogramului pn la ndeplinirea condiiei de oprire.
Pasul 3. Revenirea la modulul apelant.

126
b) Recursivitate indirect
Dac exist dou sau mai multe subprograme care se apeleaz reciproc pn cnd se
ntlnete condiia de oprire n cel puin unul dintre ele, recursivitatea este indirect sau ncru-
ciat. n acest caz se execut urmtorii pai:

Pasul 1. Apelul subprogramului.


Pasul 2. Apeluri ncruciate pn la ntlnirea condiiei de oprire.
Pasul 3. Revenirea la modulul apelant.

Figura 46

Reprezentarea recursivitii directe Reprezentarea recursivitii indirecte

(I) Apelul
subprogramului
(II)
apel 1-2

(II) Autoapelul (II)


apel 1-3
(I) Apelul
subprogramului

condiia de oprire (II) apel 2-3


(III) Revenire la modulul apelant

(III) Revenirea la modulul apelant din cel puin unul dintre


cele trei subprograme care se autoapeleaz reciproc

127
Implementarea recursivitii indirecte n limbajele de programare are anumite particulariti:

LIMBAJUL PASCAL LIMBAJUL C/C ++


n limbajul Pascal se poate apela un subpro- n limbajul C/C++ se poate apela o funcie
gram care nu a fost declarat, folosind o care nu a fost declarat, folosind o declaraie
declaraie fictiv (convenional) care este fictiv (convenional) care este format din
format din antet (numele subprogramului antet (numele subprogramului urmat eventual
urmat eventual de lista parametrilor formali) de lista parametrilor formali). Aceast decla-
i cuvntul rezervat FORWARD, care este raie de funcie permite referirea la ea fr a fi
separate de antet prin ;. Aceast declaraie definit n momentul apelrii. Corpul funciei
de funcie sau procedur permite referirea la se va scrie fiind precedat din nou de antetul
ea fr a fi definit n momentul apelrii. acesteia.
Corpul subprogramului se va scrie fiind pre-
cedat din nou de antetul acestuia fr a mai fi
necesar declararea parametrilor formali.

Exemplu de implementare a recursivitii indirecte:


S se afieze toate numerele naturale cuprinse n intervalul dat [a, b].
De pe prima linie a fiierului text rec_ind.in se citesc numerele naturale a i b (a<b) sepa-
rate prin cte un spaiu. Numerele naturale din intervalul [a, b] sunt afiate n fiierului text
rec_ind.out, separate prin cte un spaiu.
Rezolvare:
Din programul principal, respectiv din funcia principal se apeleaz subprogramul incre-
ment(a) cu parametrul efectiv a. Acest subprogram are rolul de a genera toate numerele naturale
consecutive, ncepnd cu a. Din acest subprogram se apeleaz subprogramul scrie(n), care are
rolul de a scrie n fierul rec_ind.out valoarea parametrului formal n transmis i apoi apeleaz
subprogramul increment(a) pn cnd este ndeplinit condiia de oprire (n<b).
Implementarea problemei:
LIMBAJUL PASCAL LIMBAJUL C/C++
var a,b:integer; #include<fstream.h>
f,g:text;
ifstream f (rec_ind.in);
procedure increment(n:integer); forward; ofstream g (rec_ind.out);

procedure scrie(n:integer); int a,b;


begin
write(g,n, ); void increment(int n);
if(n<b) then
increment(n+1); void scrie(int n)
end; { g<<n<< ;
if(n<b)

128
LIMBAJUL PASCAL LIMBAJUL C/C++
increment(n+1);
procedure increment(n:integer); }
begin
scrie(n); void increment(int n)
end; {
scrie(n);
begin }
assign(f,rec_ind.in);reset(f);
assign(g,rec_ind.out);rewrite(g); void main()
read(f,a,b); {f>>a>>b;
increment(a); increment(a);
close(f);close(g); f.close();g.close();
end. }
Rec_ind.in Rec_ind.out
12 20 12 13 14 15 16 17 18 19 20

D. APLICAII IMPLEMENTATE RECURSIV

Recomandri pentru elaborarea unui subprogram recursiv:


1. nainte de a trece la implementarea unui subprogram recursiv este necesar s se identifice
corect relaia recursiv; pot exista dou situaii:
y relaia recursiv este o formul de recuren matematic;
y relaia de recuren trebuie determinat din enunul problemei.
2. Necesitatea existenei n subprogram a unei condiii corecte de oprire din autoapeluri pentru a
se evita autoapelarea la infinit.
3. Reducerea listei parametrilor formali ai subprogramului poate elimina riscul unei recursi-
viti dezavantajoase. Pot fi eliminate din lista parametrilor formali acele argumente care nu
trebuie stocate n stiv, declarndu-le ca variabile globale.
4. Greeli frecvente n elaborarea unui program recursiv:
y dac subprogramul recursiv conine parametrii formali transmii prin valoare sau prin
referin (prin adres) i/sau variabile locale care ocup spaiu mare de memorie, stiva sis-
temului se va umple foarte repede, ajungndu-se la depirea spaiului rezervat acesteia
chiar i pentru un numr mic de autoapeluri;
y un autoapel incorect conduce la un rezultat eronat;
y condiia de ieire din autoapel greit formulat conduce la autoapel infinit i umplerea
stivei sistem (mesajul: Stack overflow).

129
Concluzie:
Pentru anumii algoritmi este posibil s se transforme reprezentarea recursiv ntr-o
reprezentare simpl, iterativ.
3 Recursivitatea reduce complexitatea unor algoritmi.
3 Dei programele recursive sunt mai dificil de elaborat, totui ele sunt foarte puternice,
formnd baza limbajelor inteligenei artificiale.
3 La alegerea ntre metoda recursiv i iterativ n elaborarea unui program, trebuie s
se in seama de eficiena oferit programului de ctre fiecare dintre variante, urmrind
timpul de rulare i spaiul de memorie necesar. Nu n ultimul rnd, trebuie urmrit
claritatea programului.

1. IRUL LUI FIBONACCI


S se afieze al n-lea termen al irului lui Fibonacci, folosind un program care s respecte
urmtoarea definiie:
dac n < 2
1, daca
fibo(n ) =
fibo(n - 1) + fibo (n - 2) , altfel
Soluie:
Se scrie o funcie recursiv fibo(n), care va returna al n-lea termen al irului. Conform
definiiei, acesta este egal cu predecesorul su fn-1 pe care l-ar returna apelul fibo(n-1) plus
anteprecedentul su fn-2 pe care l-ar returna apelul fibo(n-2). Deci n interiorul apelului fibo(n)
apar dou apeluri recursive. Condiia de oprire din lanul de apeluri recursive este
n=1 sau n=2.

LIMBAJUL PASCAL LIMBAJUL C/C++


var n:integer; #include<iostream.h>

function fibo(n:integer):integer; int fibo(int n)


begin {
if n>1 then fibo:=fibo(n-1)+fibo(n-2) if (n>1)
else fibo :=1; return (fibo(n-1)+fibo(n-2));
end; else
return 1;
begin; }
write( n = );readln(n); void main()
writeln( Elementul ,n, = , fibo(n)); { int n;
readln cout<< n = ; cin>>n;
end. cout<< Elementul <<n<< = <<fibo(n);
}

130
2. CEL MAI MARE DIVIZOR COMUN
Dndu-se dou numere ntregi a i b s se determine cel mai mare divizor comun al celor
dou numere, folosind:
a) algoritmul lui Euclid (se aplic algoritmul lui Euclid, cunoscut la matematic);
b) algoritmul lui Nicomachus, descris de urmtoarea relaie:
a, dac a = b
cmmdc(a,b) =
{
cmmdc((ab),b), dac a > b
cmmdc(a, (ba)), n rest

a) Algoritmul lui Euclid


Se construiete funcia recursiv cmmdc(a,b) care va returna valoarea ultimului rest diferit
de zero, respectiv b sau r. Algoritmul prelucreaz perechi de date ntregi, de orice semn i cu
orice relaie de ordine ntre ele. Se observ c la fiecare autoapel funcia va executa aceeai
secven de instruciuni (un pas al algoritmului), dar cu alte valori ale lui a i b. Oprirea lanu-
lui de apeluri recursive are loc cnd restul mpririi ntregi al celor doi parametri este zero.

LIMBAJUL PASCAL LIMBAJUL C/C++


var a,b:integer; #include<iostream.h>

function cmmdc(a,b:integer):integer; int cmmdc(int a, int b)


begin {
if a mod b <>0 then if ((a%b)!= 0)
cmmdc:=cmmdc(b, a mod b) return (cmmdc(b,a%b));
else cmmdc:=b; else return b;
end; }

begin; void main()


write( a = );readln(a); { int a,b;
write( b = );readln(b); cout<< a = ;cin>>a;
writeln( ( ,a, , ,b, ) = , cmmdc(a,b)); cout<< b = ;cin>>b;
end. cout<< ( <<a<<, <<b<< ) = <<cmmdc(a,b);
}

b) Algoritmul lui Nicomachus


Se construiete funcia recursiv cmmdc(a,b), la fiecare autoapel funcia va executa aceeai
secven de instruciuni (un pas al algoritmului), dar cu alte valori ale lui a i b. Oprirea lanu-
lui de apeluri recursive are loc cnd cei doi parametri au devenit egali. Pe baza acestor obser-
vaii, definiia recursiv a algoritmului este evident, iar funcia recursiv transpune efectiv
ntr-o instruciune if aceast definiie. Algoritmul prelucreaz perechi de date ntregi, de orice
semn i cu orice relaie de ordine ntre ele, dar la apelul din programul principal sau din funcia
principal parametrii efectivi trebuie s fie n valoare absolut.

131
LIMBAJUL PASCAL LIMBAJUL C/C++
var a,b:integer; #include<iostream.h>
#include<math.h>
function cmmdc(a,b:integer):integer;
int cmmdc(int a, int b)
begin {
if (a = b) then cmmdc:=a if (a==b) return a;
else if (a>b) then cmmdc:= cmmdc(a-b,b) else if (a>b) return (cmmdc(a-b,b));
else cmmdc:=cmmdc(a,b-a); else return (cmmdc(a,b-a));
end; }
void main()
begin; { int a,b;
clrscr; cout<< a = ;cin>>a;
write( a = );readln(a); cout<< b = ;cin>>b;
write( b = );readln(b); cout<< (<<a<<,<<b<<) = ;
writeln( ( ,a, ,,b,) = , cmmdc(abs(a),abs(b))); cout<<cmmdc(abs(a),abs(b));
end. }

3. CITIREA ELEMENTELOR UNUI TABLOU UNIDIMENSIONAL


S se scrie un program pentru citirea i afiarea elementelor unui ir y cu m elemente reale.
Dimensiunea irului i elementele acestuia se citesc de la tastatur, iar afiarea se va face pe monitor.
Rezolvare:
Pentru citirea elementelor irului de numere se utilizeaz subprogramul recursiv citire care
are ca paramnetru indicele primului element citit. Acest indice este incrementat la fiecare
autoapel, pn cnd devine egal cu dimensiunea n a irului. Condiia de oprire este i=n. n mod
asemntor se construiete i subprogramul recursiv de afiare a elementelor tabloului.

LIMBAJUL PASCAL LIMBAJUL C/C++


var y:array[1..20] of real; m: integer; #include<iostream.h>
procedure citeste(i : integer); float y[20];
begin int m;
if( i<=m) then void citire(int i)
begin {
read( y[i]); if(i<=m)
citire(i+1) { cin>>y[i];
end; citire(i+1);
end; }

begin void main()


read(m) ; citeste(1); { cin>>m;
end. citire(1); }

132
APLICAII DE LABORATOR
1. Scriei un program pentru completarea elementelor unui ir y de numere naturale i afiarea
acestora, utiliznd subprograme recursive. Numrul de elemente t este citit de la tastur,
fiecare element al irului este generat aleatoriu (0<y[i]< 80, i=1,t ). Elementele irului se vor
afia pe monitor (separate prin cte un spaiu).
2. Stabilii care este efectul programului urmtor. Formulai un enun al unei aplicaii care se
poate rezolva cu ajutorul acestui program.
LIMBAJUL PASCAL LIMBAJUL C/C++
var a:array[1..20,1..20] of integer; #include<fstream.h>
m,n:integer; ifstream f(cit_mat.in);
f,g:text; ofstream g(cit_mat.out);
procedure citire(i,m,j,n:integer); int a[20][20];
void citire(int i,int m,int j,int n)
begin
{
if(i<=m) then if(i<=m)
if(j<=n) then if(j<=n)
begin { f>>a[i][j];
read(f,a[i][j]); citire(i,m,j+1,n); citire(i,m,j+1,n);
end }
else else
citire(i+1,m,1,n); citire(i+1,m,1,n);
end; }
void afisare(int i, int m, int j, int n)
procedure afisare(i,m,j,n>integer);
{
begin if(i<=m)
if(i<=m) then if(j<=n)
if(j<=n) then { g<<a[i][j]<< ; afisare(i,m,j,+1,n);
begin }
write(g,a[i][j], ); afisare(i,m,j+1,n); else
end; { g<<endl; afisare(i+1,m,1,n);
end; }
begin void main()
{ int m,n;
assign(f,cit_mat.in);reset(f);
f>>m>>n;
assign(g,cit_mat.out);rewrite(g); citire(1,m,1,n);
read(f,m,n); citire(1,m,1,n); afisare(1,m,1,n);
afisare(1,m,1,n); close(f);close(g); g.close();
end. f.close();
}

3. Din fiierul matrice.in se citete o matrice a cu m x n elemente ntregi, astfel: de pe prima


linie a fiierului se citesc numerele naturale nenule m i n separate prin cte un spaiu, iar de
pe urmtoarele m linii se citesc n numere ntregi separate prin cte un spaiu.
Datele de ieire se vor afia, pe linii distincte, n fiierul matrice.out.
S se scrie un program pentru :
a) citirea elementelor matricei din fiierul matrice.in
b) afiarea elementelor matricei n fiierul matrice.out

133
4. SUMA ELEMENTELOR UNUI IR
Se consider un ir x cu n numere reale. S se calculeze suma celor n elemente ale tabloului.
Datele de intrare se citesc din fiierul suma.in, astfel: de pe prima linie se citete dimen-
siunea n a tabloului numeric (n N, 1<n<100), iar de pe urmtoarea linie se citesc n numere
reale separate prin cte un spaiu.
n fiierul suma.out se va afia irul dat, pe prima linie, iar urmtoarea linie un numr real,
cu trei zecimale, reprezentnd suma elementelor.

LIMBAJUL PASCAL LIMBAJUL C/C++


var x:array[1..20] of real; n:integer; #include<fstream.h>
f,g:text; #include<iomanip.h>
procedure citire(i:integer); ifstream f(suma.in);
begin ofstream g(suma.out);
if(i<=n) then float x[20]; int n;
begin void citire(int i)
read(f,x[i]); citire(i+1); {
end; if(i<=n)
end; { f>>x[i]; citire(i+1); }
procedure afisare(i:integer); }
begin void afisare(int i)
if(i<=n) then {
begin if(i<=n)
write(g,x[i]:2:3, ); afisare(i+1); { g<<setprecision(3)<<x[i]<< ;
end; afisare(i+1); }
end; }
function suma(i:integer):real; float suma(int i)
begin {
if(i<=n) then if(i<=n)
suma:= x[i]+suma(i+1) return x[i]+suma(i+1);
else else
suma:=0; return 0;
end; }
begin void main()
assign(f,suma.in);reset(f); { f>>n;
assign(g,suma.out);rewrite(g); citire(1); afisare(1);
read(f,n); citire(1); afisare(1); writeln(g); g<< suma = <<setprecision(3)<<suma(1);
writeln(g, suma = , suma(1):2:3); g.close();f.close();
close(f); close(g); }
end.

134
APLICAIE DE LABORATOR
Se consider un ir x cu n elemente ntregi. Datele de intrare se citesc din fiierul
min_max.in astfel: de pe prima linie un numr n natural nenul (care reprezint numrul de
elemente din ir), iar de pe urmtoarea linie n valori ntregi separate prin cte un spaiu (care
reprezint elementele irului x) .
S se se scrie cte un program pentru fiecare cerin :
a) Determinarea simultan (n acelai subprogram) a minimului i a maximului.
Maximul i minimul se vor afia n fiierul min_max.out.
Exemplu: min_max.in min_max.out
5 Minimul = -3
6 2 1 7 -3 Maximul = 7
b) Modificai programul construit la punctul a) (salvai-l cu un alt nume) astfel nct s
determinai simultan (n acelai subprogram) minimul i poziia acestuia n ir. Minimul i po-
ziia acestuia se vor afia n fiierul min_poz.out.
Exemplu: min_max.in min_poz.out
5 Minimul = -3
6 2 1 7 -3 Poziia = 5
c) Modificai programul construit la punctul a) sau b) (salvai-l cu un alt nume) astfel nct
s determinai simultan (n acelai subprogram) minimul, poziia minimului n ir, maximul i
poziia maximului n ir. Minimul, poziia minimului, maximului i poziia maximului n ir se
vor afia n fiierul min_max3.out.
Exemplu: min_max.in mip_map.out
5 Minimul = -3 pe poziia 5
6 2 1 7 -3 Maximul = 7 pe poziia 4

5. PRODUSUL SCALAR
Se consider dou iruri de n numere ntregi x i y, avnd amndou acelai numr de ele-
mente n, s se calculeze produsul lor scalar.
Produsul scalar se definete ca fiind un numr rezultat prin nsumarea produselor elementelor
cu aceiai indici din cele dou tablouri.
Pentru datele problemei, produsul scalar = x1y1 + x2y2 + + xnyn.
Datele de intrare se citesc din fiierul scalar.in astfel: de pe prima linie un numr natural
nenul n (dimensiunea celor dou tablouri), de pe urmtoarea linie cte n valori ntregi, separate
prin cte un spaiu reprezentnd elementele tabloului x, iar de pe ultima linie n valori ntregi,
separate prin cte un spaiu reprezentnd elementele tabloului y. Valoarea produsului scalar se va
afia pe monitor.
Observaie: Problema are scopul de a exemplifica un proces recursiv n care particip mai
multe tipuri de date.

135
Rezolvare:
Funcia recursiv primete ca parametru indicele curent al elementelor din cele dou
tablouri, al cror produs este depus pe nivelul curent al stivei sistem. Condiia de oprire este
ndeplinit atunci cnd indicele este egal cu n . Tablourile au fost declarate global.

LIMBAJUL PASCAL LIMBAJUL C/C++


type vect=array[1..20]of integer; include<fstream.h>
ifstream f(scalar.in);
var n:integer; int n, vect x[20] ,y[20];
x,y: vect;
f:text ; int prod_sc(int i)
{
function prod_sc(i:integer):integer; if (i<=n)
begin return (x[i]*y[i] + prod_sc(i+1));
if (i<=n) then else return 0 ;
prod_sc:= x[i]*y[i] + prod_sc(i+1) }
else prod_sc:= 0 ;
end; void citeste( int n, vect x)
{int i;
procedure citeste(n : integer; var x:vect); for (i=1;i<=n;i++)
begin f>>x[i];
for i:=1 to n do }
read(f, x[i])
end; void main()
end; {
begin f>>n;
assign(scalar.in); reset(f); read(f,n); citeste(n,x);
citeste(n,x); citeste(n,y); citeste(n,y);
write( produsul scalar = , prod_sc(1)); cout<< Produsul scalar = <<prod_sc(1);
close(f) f.close();
end. }

APLICAII DE LABORATOR
1. Se consider un ir x cu n (0<n<10) elemente reale. Datele de intrare se citesc din fiierul
operatii.in astfel: de pe prima linie un numr n natural nenul (care reprezint numrul de ele-
mente din ir), iar de pe urmtoarea linie n valori ntregi separate prin cte un spaiu (care
reprezint elementele irului x).
Datele de ieire se vor afia, pe linii distincte, n fiierul operatii.out.

136
S se scrie un program:
a) citirea elementelor irului din fiierul operatii.in
b) afiarea elementelor irului n fiierul operatii.out
c) determinarea i afiarea sumei elementelor irului (cu exact trei zecimale);
d) determinarea i afiarea produsului elementelor irului (cu exact trei zecimale);
e) determinarea i afiarea numrului de elemente strict negative din ir (cu exact dou
zecimale);
f) determinarea i afiarea mediei aritmetice a elementelor strict pozitive din ir (cu exact
patru zecimale).
Exemplu:
operatii.in operatii.out
6 3 154 23 2 4
12 3 154 23 2 4 Suma = 198
Produsul = 1020096
Numarul de elemente impare = 2
Suma ultimelor cifre = 18

2. Se consider o matrice An,n cu elemente ntregi. Datele de intrare se citesc din fiierul
matrice.in astfel: de pe prima linie se citete numrul natural n nenul, iar de pe urmtoarele
n linii se citesc n numere ntregi separate prin cte un spaiu. Datele de ieire se vor afia n
fiierul matrice.out. Cerine:
a) Citirea elementelor matricei din fiier.
b) Afiarea elementelor matricei n fiierul de ieire.
c) Determinarea i afiarea sumei elementelor de pe diagonala principal.
d) Determinarea i afiarea produsului elementelor de pe diagonala secundar.
e) Afiarea elementelor situate deasupra diagonalei principale.
f) Afiarea elementelor situate sub diagonala secundar.
g) Dup interschimbarea liniei 1 cu linia n s se afieze noua matrice.
Pentru fiecare cerin scriei cte un subprogram recursiv.

Exemplu:

matrice.in matrice.out
4 2 3 1 5 Elementele situate Elementele situate Matricea dup
2 3 1 5 4 6 0 7 deasupra diagonalei sub diagonala interschimbare
4 6 0 7 9 5 8 1 principale secundar 3 4 1 0
9 5 8 1 3 4 1 0 3 1 5 7 4 6 0 7
3 4 1 0 Suma Dp= 16 0 7 8 1 9 5 8 1
Produsul Ds= 0 1 4 1 0 2 3 1 5

137
6. ORDONAREA ELEMENTELOR UNUI IR
Se consider un ir x cu n numere ntregi. S se ordoneze cresctor elementele irului.
Dimensiunea irului i cele n elemente ale sale se citesc de la tastatur, iar irul ordonat se
afieaz pe ecran.
Rezolvare:
Subprogramul recursiv ordon(a,n) va returna irul ordonat cresctor, prin metoda inter-
schimbrii. Autoapelurile se ncheie cnd este ndeplinit condiia de oprire i=n.
LIMBAJUL PASCAL LIMBAJUL C/C++
type vect=array[1..20]of integer; #include<iostream.h>

var n,i:integer; int vect[20],n;


a:vect;
void ordon(int x,int n, int i)
procedure ordon(var x:vect; n,i:integer) { int aux;
var aux:integer; if(i<n)
begin if (x[i]>x[i+1])
if i<n then { aux=x[i];
if x[i]>x[i+1] then x[i]=x[i+1];
begin x[i+1]=aux;
aux:=x[i]; ordon(x,n,1);
x[i]:=x[i+1]; }
x[i+1]:=aux; else ordon(x,n,i+1);
ordon(x,n,1) }
end
else ordon(x,n,i+1) void citeste( int n, int x)
end; {int i;
for (i=1;i<=n;i++)
procedure citeste(n,x); {
begin cout<< elementul <<i<< ;
for i:=1 to n do cin>>x[i];
begin }
write( elementul ,i, = ); readln(x[i]) }
end;
end; void main()
{ cout<< n = ;cin>>n;
begin; cout<< citirea sirului a <<endl;
write( n = );readln(n); citeste(n,a);
writeln( Elementele sirului a );writeln; cout<<endl;
citeste(n,a);writeln; ordon(a,n,1);
ordon(a,n,1); cout<< Sirul ordonat = <<endl;
writeln( sirul ordonat crescator : ); for(i=1;i<=n;i++) cout<<a[i]<< ;
for i:=1 to n do write(a[i], ) }
end.

138
7. SCRIEREA UNUI NUMR NTR-O BAZ
Se citete un numr natural nenul n. S se transforme n baza b, unde b=2..9.
Rezolvare:
Subprogramul recursiv baza(n) memoreaz pe fiecare nivel al stivei restul mpririi lui n la
b i ctul mpririi lui n la b (care reprezint noua valoare a lui n). Condiia de oprire este n=0
(ultimul ct este 0).

LIMBAJUL PASCAL LIMBAJUL C/C++


uses crt; #include<iostream.h>
var n,b:integer #include<conio.h>

procedure baza(n:integer; b:integer); void baza(int n, int b )


var r:integer; { int r=n%b;
begin if (n>=b)
r:=n mod b; baza(n/b,b);
if (n>=b) cout<<r;
baza(n div b,b); }
write(r);
end; void main()
{ int n, b;
begin clrscr();
clrscr; cout<< n = ;cin>>n;
write( n = );readln(n); do
repeat { cout<< baza = ;cin>>b;
write( baza = );readln(b); }while((b<2) && (b>10 ));
until(b<2 and b>10 ); cout<<n<< <<baza(n,b);
write(n,, baza(n,b); }
end.

8. INVERSAREA UNUI CUVNT


S se inverseze caracterele unui cuvnt citit de la tastatur, liter cu liter pn la ntlnirea
caracterului spaiu.
Rezolvare:
Se scrie un subprogram fr parametri formali, invers()/invers. La fiecare autoapel, se citete
un nou caracter c. Condiia de oprire a lanului de apeluri este ndeplinit cnd caracterul citit
este spaiu. Afiarea caracterelor n ordine invers este realizat printr-o operaie de scriere
(write/cout). Cnd este ndeplinit condiia de oprire, caracterele depuse n stiv la fiecare
autoapel sunt extrase i afiate (n ordine invers).

139
LIMBAJUL PASCAL LIMBAJUL C/C++
procedure inver; #include<iostream.h>
var c:char;
begin void inver()
readln(c); { char c;
if (c<> ) then inver; cin>>c;
write(c); if (c!=0)
end; {inver();
cout<<c;
begin }
inver; }
end. void main()
{
inver();
}

PROBLEME PROPUSE
1. Se consider urmtorul program :

LIMBAJUL PASCAL LIMBAJUL C/C++


var x,y:integer; #include <iostream.h>
int x,y:integer;
procedure t( x:integer; y:integer); void t(int x, int y)
begin { if (x>0)
if x>0 then { x = x-1 ; y = y+1;
begin t(x,y);
x:=x-1; y:=y+1; t(x,y); }
end; }
end;
begin void main()
x:=3;y:=1; { x = 3; y = 1;
write(x, ,y, ); cout<<x<< <<y<< ;
t(x,y); t(x,y);
writeln(x, ,y); cout<<x<< <<y<< <<endl;
end. }

Precizai ce va tipri programul de mai sus:


a) 3 1 1 1; b) 3 1 0 3; c) 3 1 0 2; d) 3 1 3 1; e) 3 1 0 1.
Scriei modificrile n program astfel nct dup execuie s se tipreasc 3 1 0 1.
Scriei modificrile n program astfel nct dup execuie s se tipreasc 3 1 0 4.

140
2. Scriei subprograme recursive pentru calculul valorii urmtoarelor polinoame care verific
relaiile de recuren, ntr-un punct x real, cunoscut.

1. Polinomul Cebev de spea I 2. Polinomul Cebev de spea II


dac nn==00
1 , daca dac n = 0
1 , daca

Tn ( x ) = x , daca
dac nn==11 U n ( x ) = 2 x , daca
dac n = 1
2 xT ( x ) - T ( x ) , 2 xU ( x ) - U ( x ) ,
n 1 n- 2 n 1 n- 2

3. Polinomul lui Legendre

daca n = 0
1 , dac

( n + 1) Pn +1(x) = x , daca
dac n = 1
( 2n + 1) xP ( x ) - nP ( x ) , daca
dac n = 0
n n-1

3. a) S se stabilileasc care este efectul urmtorului subprogram recursiv pentru apelul s(4):

VARIANTA PASCAL/BORLAND PASCAL VARIANTA C++/C


procedure s(y: integer) ; void s(int y)
begin { if (y>0)
if (y>0) then { cout<<***<<endl;
begin s(y-1) ;
writeln(***); cout<<aaa<<endl;
s(y-1); }
writeln(aaa); }
end
end;

b) Modificai subprogramul i precizai apelul din programul principal/funcia principal ast-


fel nct s se afieze :
**aa
**aa
**aa
**aa
4. Se d urmtoarea funcie recursiv care calculeaz valoarea polinomului lui Hermite n punc-
tul x real. Cerine:
a) Scriei expresia dup care se calculeaz valoarea polinomului, punnd n eviden recurena
matematic.

141
VARIANTA PASCAL/BORLAND PASCAL VARIANTA C++/C
function her(x:real; n: integer) : real; float her(float x, int n)
begin { if (n==0) return 1;
if (n=0) then her:=1 else
else if (n==1) return 2*x;
if (n=1) then her :=2*x else
else return 2*x*her(x,n-1) - 2*(n-1)*her(x,n-2);
her:=2*x*her(x,n-1)- 2*(n-1)*her(x,n-2); }
end;

b) Care este valoarea afiat pentru apelul her(1,3):


(i) 4; (ii) 2; (iii) 0; (iv) 8; (v) 4.
c) S se scrie un subprogram iterativ echivalent cu cel dat.

5. Se consider urmtorul subprogram:

Varianta Pascal/Borland Pascal Varianta C++/C

a) procedure u(k: integer);


var d,p:integer;
void u(int k)
begin
{ int d,p;
if k>1 then
if (k>1)
begin
{ d =s+1; p=0;
d:=s+1; p:=0;
while (k % d = =0)
while (k mod d =0) then
{ k =k div d;
begin
p =p+1
k:=k div d;
}
p:=p+1
cout<<d<< <<p<< ;
end;
s = d;
write(d, ,p, );
u(k);
s:=d;
}
u(k)
else cout<<k<<endl;
end
}
else writeln(k);
end;

a) Ce se va afia pentru n=18 i s=1 ?


(i) 2 1 9 3 2 1; (ii) 2 1 3 2 1; (iii) 18 2 1 3 2 1; (iv) 2 1 9 3 1; (v) 2 1 3 1 1.
b) Scriei instruciunea sau instruciunile necesare apelului acestui subprogram, preciznd
limbajul utilizat.
c) Formulai un enun pe baza cruia s poat fi aplicat acest subprogram.

142
6. Fie irul de numere definit astfel:

dacann==00 si m R
m, dac
a
an +1 = n , dac
dacanneste estepar
par
4
4an 11,, altfel
altfel

a) S se scrie un subprogram recursiv pentru calculul termenului n, n>0, pentru o valoare


cunoscut a parametrului real m.
b) Care este valoarea termenului a5 , dac m=2:
(i) 5; (ii) 6; (iii) 12; (iv) 7; (v) 2.
7. Fie urmtorul subprogram recursiv:

VARIANTA PASCAL VARIANTA C++


procedure u(a:integer) void u(int a)
begin { if (a/8 >0 ) u(a div 8);
if a div 8 > 0 then u(a div 8); cout<<a%8;
write(a mod 8) }
end;

a) Pentru apelul u(39) precizai : numrul de autoapeluri ce se va afia la revenirea din sub-
program:
(i) 2 / 74; (ii) 1 / 74; (iii) 2 / 47; (iv) 1 / 47; (v) 3 / 47.
b) Transformai subprogramul recursiv ntr-un subprogram iterativ, precizndu-se varianta
de limbaj utilizat.

8. Se d urmtorul subprogram recursiv pentru calculul valorilor unei funcii:

VARIANTA PASCAL VARIANTA C++


function f(x:integer):integer; int f(int x)
begin { if (x >15 ) return x-2;
if x >= 15 then f:=x-2 else return f(x+4) ;
else f:=f(x+4) }
end;

a) S se identifice care este varianta corect a coninutului stivei pentru calculul valorii
funciei n punctul x=5 i care este valoarea funciei.

143
a)
(i)
17 15 13
17 15 13 13 13 13
13 13 13 13 13 13
9 9 9 9 9 9
5 5 5 5 5 5 f=13

b)
(ii)

17
13 15
9 9 13 17
5 5 4 5 15 f=13

c)
(iii)
22
17 20
13 13 18
9 9 16 18
5 5 4 14 14 16 f=14

d)
(iv)

15 16
12 13 13 15
8 9 9 9 13
5 5 4 5 5 5 f=5

Figura 47.

b) Care sunt valorile posibile pe care le poate lua f ?


(i) {13,14,15,16}; (ii) {12,13,15,16}; (iii) {12, 14,16,18}; (iv) {14, 15, 16,18};
(v) o infinitate de valori.
9. Implementai recursiv prelurile specifice structurii dinamice de tip coad.
10. Implementai recursiv prelucrrile specifice structurii dinamice de tip stiv.
11. Explicai aspectul recurent al structurilor dinamice arborescente (arborele de familie).

144
3
Capitolul
METODE
DE PROGRAMARE

I. DIVIDE ET IMPERA
1. STUDIU DE CAZ CAMPIONAT DE BASCHET
Anual are loc Campionatul Naional de baschet al liceenilor. La acest concurs particip
echipele clasate pe locul I din fiecare jude i echipa ctigtoare din municipiul Bucureti.
La nscriere fiecare echip primete un numr de nregistrare, ncepnd de la 1 la n.
Toate echipele sunt mprite n dou grupe. Fiecare grup se mparte n alte dou sub-
grupe ctigtorul unei grupe se stabilete n urma meciului dintre echipa ctigtoare din
prima semigrup i echipa ctigtoare din semigrupa a doua. La rndul ei fiecare semigrup
este mprit n subgrupe, pn cnd se obin semigrupe formate din dou echipe sau dintr-o
singur echip. Echipa care este singur ntr-o semigrup va juca cu echipa ctigtoare din
semigrupa corespunztoare.
Finala are loc ntre echipele ctigtoare ale fiecrei grupe.
S presupunem c n anul acesta s-au nscris 10 echipe, nregistrate cu numere de la 1 la
10. Prima grup este format din echipele numerotate de la 1 la 5, iar grupa a doua din
echipele cu numere de nregistrare de la 6 la 10.
Organizatorii afieaz, pe site-ul concursului, planificarea meciurilor.

Formarea semigrupelor i desfurarea meciurilor din concurs pot fi urmrite i pe diagrama de


mai jos.
Planificarea desfurrii meciurilor
Grupa 1 Grupa 2
Nr. meci Echipele care joac meciul Nr. meci Echipele care joac meciul
1.1 echipa 1 - echipa 2 2.1. echipa 6 echipa 7
echipa ctigtoare echipa ctigtoare
1.2 2.2.
din meciul 1.1. echipa 3 din meciul 2.1. echipa 8
1.3 echipa 4 - echipa 5 2.3. echipa 9 joac echipa 10
echipa ctigtoare din meciul 2.2.
echipa ctigtoare din meciul 1.2.
1.4 2.4. echipa ctigtoare
echipa ctigtoare din meciul 1.3.
din meciul 2.3.
1-2 Finala are loc ntre echipa ctigtoare din meciul 1.4. i echipa ctigtoare din meciul 2.4.
3-4 Semifinala are loc ntre echipele care au pierdut n meciurile 1.4. i 2.4.

145
Figura 48
110
Grupa 1 Grupa 2

1-5 6-10

Semigr. 1.1 Semigr. 1.2 Semigr. 2.1 Semigr. 2.2

1..3 4 -5 6-8 9-10

Semigr. 1.1.1 Semigr. 1.1.2 Semigr. 2.1.1 Semigr. 2.1.2

1-2 3 6-7 8

2. DESCRIEREA GENERAL A METODEI DIVIDE ET IMPERA

Pentru organizarea campionatului s-au folosit elemente specifice metodei Divide et Impera.
Aceast metod se aplic n rezolvarea problemelor care pot fi descompuse n subprobleme inde-
pendente, asemntoare problemei iniiale, de dimensiuni mai mici i care pot fi rezolvate mai
uor. n studiul de caz, problema iniial este planificarea meciurilor dintre cele 10 echipe. Prin
descompunere, se ajunge la subprobleme din ce n ce mai mici, pn la planificarea meciurilor
dintre doar dou echipe. Dup fiecare meci, echipa ctigtoare este desemnat s susin meciul
cu echipa din semigrupa corespunztoare. n acest mod, prin compunerea rezultatelor, se ajunge
la meciul final i desemnarea echipei campioane.
n rezolvarea problemei s-au parcurs dou etape:
Etapa 1: descompunerea problemei este o etap analitic prin care problema iniial este
redus prin divizare pn la problema elementar.
Etapa 2: compunerea soluiilor este o etap de sintez prin care soluiile problemelor pariale
conduc la obinerea soluiei finale.

Generalizare
Fie P(n) problema iniial care necesit prelucrarea a n elemente:
Etapa I Divide (mparte): Descompunerea problemei iniiale P(n) de dimensiune n ntr-un
numr de subprobleme de acelai tip, independente, dar de dimensiuni mai mici, P1(n1),
P2(n2),, Pk(nk ). Prin dimensiunea problemei se nelege numrul de elemente prelucrate pen-
tru rezolvarea acesteia.
Etapa II Impera (Stpnete):
z Rezolvarea subproblemelor P1, P2,, Pk i obinerea soluiilor pariale S1, S2,, Sk.
z Combinarea soluiilor pariale S1, S2,, Sk pentru obinerea soluiei S a problemei iniiale.

146
Observaii:
z n funcie de dimensiunile rezultate, subproblemele P1, P2,, Pk se rezolv direct sau se
descompun la rndul lor n alte subprobleme.
z Descompunerea n subprobleme se oprete atunci cnd se ajunge la subprobleme suficient

de simple pentru a putea fi rezolvate direct, prin metode elementare (pentru exemplul dat,
condiia de oprire a descompunerii n subgrupe este cazul n care subgrupa este format din
dou sau o singur echip).

3. ALGORITMUL METODEI

Repetarea divizrii unei probleme n subprobleme de acelai fel, care se rezolv pe domenii
(intervale de valori) din ce n ce mai mici, este un procedeu recursiv cu condiia de oprire la
nivelul subproblemelor elementare.

Se consider un ir de valori X=(x1, x2, , xn) asupra cruia se aplic o prelucrare impus
de cerinele problemei P. Se poate demonstra c pentru orice p i u {1, 2, , n}, p < u, exist
o valoare poz (p<poz<u) astfel nct prin prelucrarea subirurilor {xp, xp+1, , xpoz} i
{xpoz+1, xpoz+2, , xu} se obin soluiile corespunztoare. Prin combinarea acestor soluii se
obine soluia prelucrrii secvenei pariale{xp, xp+1, , xu}. Valoarea poz, numit i pivot, este,
n cele mai frecvente cazuri, poziia elementului median aflat la jumtatea intervalului [p,u].
Algoritmul metodei folosete un subprogram recursiv cu parametri de intrare p i u; la primul
apel, p = 1 i u = n. Soluia fiecrei subprobleme se transmite prin parametrul de ieire, sol.

ALGORITMUL DIVIDE et IMPERA

algoritm divide_et_impera(p,u, sol)


dac (p<u) atunci
mparte(p,u,poz) // determin poziia pivotului
divide_et_impera(p, poz, sol1); // se aplic algoritmul
divide_et_impera(poz+1, u, sol2); // pentru fiecare subproblem
sol = combin(sol1, sol2); // formarea soluiei
altfel
rezolv(sol) //rezolv subproblema elementar
sfritdac
stop algoritm divide_et_impera

NTREBRI:
1. Stabilii care dintre urmtoarele afirmaii sunt adevrate sau false, prin marcarea csuei
corespunztoare:

147
Nr. Rspuns
Afirmaii
crt. A F
Metoda Divide et Impera este o metod general de programare care poate fi aplicat
problemelor care se pot rezolva prin descompunerea problemei iniiale n subpro-
1
bleme diferite de problema iniial, de dimensiuni mai mici i care pot fi rezolvate
mai uor.

Subproblemele n care a fost divizat problema iniial sunt de dimensiuni mai mari
2
dect cele ale problemei date.

Descompunerea n subprobleme se oprete atunci cnd se ajunge la subprobleme sufi-


3
cient de simple pentru a putea fi rezolvate direct, prin metode elementare.

Soluia final se obine prin combinarea soluiilor pariale ale subproblemelor ele-
4
mentare.

2. Justificai aspectul recursiv al raionamentului de rezolvare a problemelor prin metoda Divide


et Impera.
3. Aplicai algoritmul metodei Divide et Impera pentru rezolvarea urmtoarelor probleme:
a) Cutarea unui abonat n cartea de telefoane.
b) Cutarea unui punct ntr-o suprafa plan.
c) Determinarea celui mai mare divizor comun a 4 numere. Generalizare.
Exemplu: cmmdc (6, 18, 12, 15) = 3.

4. IMPLEMENTAREA METODEI DIVIDE ET IMPERA

Implementarea metodei depinde de limbajul de programare i de specificul problemei.


Aspectul recursiv al metodei se regsete n subprogramul recursiv care reprezint nucleul pro-
gramului. Subprogramul recursiv are, obligatoriu, cei doi parametri de intrare p i u care repre-
zint adresele primului i ultimului element din domeniul pe care se rezolv, la un moment dat,
problema. Dac subprogramul este de tip funcie, parametrul de ieire pentru soluie nu mai este
necesar, soluia e returnat prin chiar numele funciei.
Implementarea metodei va fi exemplificat prin urmtoarele aplicaii.

APLICAIA 1
Determinarea elementului minim
1. S se determine valoarea minim dintr-un ir x cu n elemente ntregi, utiliznd metoda Divide
et Impera.
Datele de intrare se citesc de la tastatur sau din fiierul minim.in astfel: de pe prima linie
numrul n natural nenul, iar de pe urmtoarea linie n valori ntregi separate prin cte un
spaiu. Minimul determinat se va afia pe ecran.

148
Exemplu: minim.in Pe ecran se va afia -3
5
6 2 1 7 -3
Rezolvare:
Pentru determinarea valorii minime din irul de n numere, descompunerea problemei revine
la mprirea irului n dou subiruri: subirul (x1, x2, , xpoz) i subirul (xpoz+1, xpoz+2, , xn),
unde poz este indicele elementului din mijloc: poz=[(1+n)/2]. Pentru determinarea minimului din
fiecare dintre cele dou subiruri, se va mpri fiecare subir n alte dou subiruri, i la rndul
lor, cele dou subiruri n altele, pn cnd se obin subiruri de dimensiune 1 (cu un singur ele-
ment). Se obin astfel, soluiile elementare min1 i min2. Combinarea rezultatelor se face prin
compararea valorilor min1 i min2 obinute din fiecare pereche de subiruri formate prin divizare.
Dac min1 este mai mic dect min2, atunci minimul este min1, altfel minimul este min2.
Justificarea corectitudinii soluiei:
z Dac minim=min1 atunci orice alt valoare din subirul (x , x , , x ) este mai mare sau
1 2 poz
egal cu min1.
z Dac minim=min2 atunci orice alt valoare din subirul (x
poz+1, xpoz+2, , xn) este mai mare
sau egal cu min2.
z Dac min1<min2 atunci min1<x pentru k{poz+1, , n} i min1 determinat prin
k
rezolvarea subproblemelor este cel mai mic element din subirul (x1, x2, , xpoz). n acest
caz, min1 este cea mai mic valoare din irul dat.
z Dac min1>min2 atunci min2<x pentru k{1, , poz} i min2 determinat prin
k
rezolvarea subproblemelor este cel mai mic element din subirul (xpoz+1, xpoz+2, , xn). n
acest caz, min2 este cea mai mic valoare din irul dat.

n diagrama de mai jos sunt reprezentate toate subirurile obinute prin divizarea irului din
exemplul numeric.

min1<min2 nu Figura 49.


minim = -3

1...5
min1 = 1 min2=-3
Descompunerea problemei

poz= [(1+5)]/2
1-3 4-5
Combinarea soluiilor

min1<min2 nu min1<min2 nu
minim = min2 = 1 minim = min2 = -3
min1 = 2
1-2 3 4 5
min1<min2 nu min2=x[3] = 1 min1=x[4]=7 min2=x[5] = -3
minim = min2 = 2

1 2
min1=x[1] = 6 min2=x[2] = 2

149
Implementarea algoritmului

LIMBAJUL PASCAL LIMBAJUL C/C++

var x: array[1..20] of integer; #include<fstream.h>


n, i:integer; ifstream f(minim.in);
f:text; int x[20],n;
procedure citire; {citirea din fiier} void citire() // citirea din fiier
begin { f>>n;
read(f,n); for(int i=1;i<=n;i++)
for i:=1 to n do f>>x[i];
read(f,x[i]); f.close();
close(f); }
end; int divide_et_impera(int p, int u)
function divide_et_impera( p:integer; u:integer): { int poz,min1,min2;
integer; if(p<u)
var poz,min1,min2:integer; { poz=(p+u)/2;
begin min1=divide_et_impera(p,poz);
if(p<u) then begin min2=divide_et_impera(poz+1,u);
poz:=(p+u) div 2; if(min1<min2)
min1:=divide_et_impera(p,poz); return min1;
min2:=divide_et_impera(poz+1,u); else
if(min1<min2) then divide_et_impera:= min1 return min2;
else divide_et_impera:= min2; }
end else
else divide_et_impera:=x[p]; return x[p];
end; }
begin void main()
assign(f,'minim.in');reset(f); { citire();
citire; cout<< minim = <<divide_et_impera(1,n);
writeln('minim = ',divide_et_impera(1,n)); g.close();
end. }

# TEME
1. Modificai subprogramul divide_et_impera din programul prezentat mai sus astfel nct, pro-
gramul s afieze valoarea maxim dintr-un ir.
2. Se consider un ir x cu n elemente ntregi. Datele de intrare se citesc din fiierul min_max.in
astfel: de pe prima linie un numr n natural nenul (care reprezint numrul de elemente din
ir), iar de pe urmtoarea linie n valori ntregi separate prin cte un spaiu (care reprezint
elementele irului x) .
Cerine:
a) Determinai n acelai subprogram valoarea minim i valoarea maxim.

150
Exemplu: min_max.in
5 Minimul = -3
6 2 1 7 -3 Maximul = 7
b) Modificai programul construit la punctul a) astfel nct s determinai simultan (n acelai
subprogram) elementul minim i poziia acestuia n ir.
Exemplu: min_max.in
5 Minimul = -3
6 2 1 7 -3 Poziia = 5
c) Modificai programul construit la punctul a) sau b) astfel nct s determinai simultan (n
acelai subprogram) elementul minim i poziia sa n ir, precum i elementul maxim i poziia
sa n ir.
Exemplu: min_max.in
5 Minimul = -3 pe poziia 5
6 2 1 7 -3 Maximul = 7 pe poziia 4

EXERCIII
1. Se consider un ir x cu n numere ntregi.
a) Ce va afia urmtorul program pentru n=7 i valorile irului x: 12, -4, 13, 7, 8, 11, 2?
b) Formulai un enun pentru o problem care se poate rezolva cu ajutorul acestui program.
LIMBAJUL PASCAL LIMBAJUL C/C++
var x: array[1..20] of integer; #include<iostream.h>
n:integer; int x[20],n;
.. ..
function s( p:integer; u:integer):integer; int s(int p, int u)
var poz :integer; { int poz;
begin if(p==u)
if(p=u) then if(x[p]%2==0)
if (x[p] mod 2 = 0) then s:=1 return 1;
else s:=0 else
else return 0;
begin else
poz:=(p+u) div 2; { poz=(p+u)/2;
s:= s(p,poz)+ s(poz+1,u); return s(p, poz)+ s(poz+1,u);
end }
end; }

begin void main()


.. {.
writeln(s(1,n)); cout<<s(1,n);
.. ..
end. }
2. Se consider un ir x cu n numere ntregi.
a) Ce va afia urmtorul program pentru n=8 i valorile irului x: 21, -14, 3, 5, 18, 11, 12, 8?
b) Formulai un enun al unei probleme care se poate rezolva cu ajutorul acestui program.

151
LIMBAJUL PASCAL LIMBAJUL C/C++

var x: array[1..20] of integer; #include<iostream.h>


n:integer; int x[20],n;
.. ..
function s( p:integer; u:integer):integer; int s(int p, int u)
var poz :integer; { int poz;
begin if(p==u)
if(p=u) then if(x[u]%3==0)
if (x[u] mod 3 = 0) then s:=x[u] return x[u];
else s:=0 else
else return 0;
begin else
poz:=(p+u) div 2; { poz=(p+u)/2;
s:= s(p,poz)+ s(poz+1,u); return s(p, poz)+s (poz+1,u);
end }
end; }
begin void main()
.. {.
writeln(s(1,n)); cout<<s(1,n);
.. ..
end. }

3. Se citesc de la tastatur un ir y cu p elemente ntregi i un numr natural nenul r.


a) S se determine cte elemente din ir sunt numere perfecte. Un numr perfect este egal cu
suma divizorilor si (fr el nsui).
b) S se determine suma elementelor din ir care sunt divizibile cu r (rN).
c) S se determine cte numere sunt prime.
d) S se determine produsul p= c1*c2**cp unde (ci)i=1,p este ultima cifr a numrului yi
din irul dat.
Justificai necesitatea metodei Divide et impera n rezolvarea acestei probleme.

APLICAIA 2
Cutarea unei valori ntr-un ir ordonat Cutare binar
Se consider un ir x cu n numere ntregi. S se verifice dac o valoare c (numr ntreg) se
gsete n ir.
Datele de intrare se citesc de la tastatur sau din fiierul caut.in, astfel: de pe prima linie se
citesc dimensiunea n a tabloului numeric (n numr natural nenul) i valoarea c cutat, iar de pe
urmtoarea linie se citesc cele n numere ntregi separate prin cte un spaiu.

152
Pe ecran se va afia un mesaj corespunztor rezultatului cutrii.
Exemplul 1:
caut.in Pe ecran se va afia
7 3
1 3 5 23 30 42 67 Valoarea 3 exist n ir

Exemplul 2:
caut.in Pe ecran se va afia
7 10
1 3 5 23 30 42 67 Valoarea 10 nu exist n ir
Rezolvare:
Cutarea unei valori ntr-un ir ordonat se realizeaz dup modelul cutrii n dicionar a unui
cuvnt. Pagina n care trebuie s identificm cuvntul se determin printr-un proces de reducere
a domeniului de cutare, n funcie de litera cu care ncepe cuvntul i apoi de ordinea lexi-
cografic a literelor cuvntului i de ordonarea alfabetic a cuvintelor din dicionar.
Reducerea domeniului de cutare prin njumtirea acestuia conduce la rezolvarea proble-
mei printr-un algoritm de complexitate logaritmic numit cutare rapid sau cutare binar.
Pentru a verifica dac valoarea c exist n irul x de numere ordonat (presupunem c este
ordonat cresctor) descompunerea problemei revine la a mpri irul n dou subiruri. irul x
are n elemente i el este mprit n subirul (x1, x2, , xpoz) i subirul (xpoz+1, xpoz+2, , xn),
unde poz=[(1+n)/2] este indicele elementului din mijloc.
Dac valoarea c este mai mic dect elementul din mijlocul irului (c< x[poz]) atunci
cutarea continu n subirul (x1, x2, , xpoz-1); se continu procesul de divizare n acest subir.
Dac valoarea c este mai mare dect elementul din mijlocul irului (c> x[poz]) atunci cutarea
continu n subirul (xpoz+1, xpoz+2, , xn); se continu procesul de divizare n acest subir.
Dac valoarea c este egal cu elementul din mijlocul irului (c = x[poz]), atunci cutarea se
oprete; elementul cutat a fost gsit.
Cutarea se ncheie
fr succces (elemen- 7 3 Figura 50.
17
tul cutat nu este n ir) 1 3 5 23 30 42 67
atunci cnd subirul n
care se face cutarea Poz = [(1+7)/ 2]=4
c = x[4] = 23 nu
curent este vid (p>u). c < x[4]
Iniial, p=1 i u=n.

n figura 50 sunt
reprezentate subirurile
1-3
obinute prin divizare
Poz = [(1+3)/ 2]=2
n procesul de cutare c =x[2] = da
binar pentru exem-
valoareaaafost
valoarea fost gsit
gsit
plul 1.

153
n continuare este prezentat doar subprogramul prin care se face cutarea binar i apelul
acestuia (irul se presupune ordonat cresctor):

LIMBAJUL PASCAL LIMBAJUL C/C++


var x:array[1..20]of integer; #include<fstream.h>
n,c:integer; ifstream f(caut_bin.in);
f:text; int x[20],n,c;
.. ..
function cautare_binara(p:integer;u:integer):integer; int cautare_binara(int p,int u)
var poz:integer; {int poz=(p+u)/2;
begin if(c==x[poz])
poz:=(p+u) div 2; return 1;
if(c=x[poz]) then cautare_binara:=1 else
else if(p<u)
if(p<u) then if(k<x[poz])
if(c<x[poz]) then return cautare_binara(p,poz-1);
cautare_binara:=cautare_binara(p,poz-1) else
else return cautare_binara(poz+1,u);
cautare_binara:=cautare_binara(poz+1,u); return 0;
cautare_binara:=0; }
end;
begin void main()
.. {
if(cautare_binara(1,n)<>0) then if(cautare_binara(1,n))
writeln(' Valoarea ',c,' exista in sir') cout<< Valoarea <<c<< exista in sir;
else else
writeln(' Valoarea ',c,' exista in sir'); cout<< Valoarea <<c<< nu exista in sir;
..
end. }

# TEME
1. Rescriei subprogramul cautare_binara astfel nct acesta s returneze poziia n ir a valorii
cutate (cnd valoarea cutat este n ir) sau un mesaj corespunztor n caz contrar.
2. Justificai eficiena cutrii unei valori ntr-un ir ordonat, prin metoda cutrii binare.

PROBLEME PROPUSE
1. Punct fix.
Se consider un ir a ordonat cresctor cu n numere ntregi distincte. S se determine un
indice m, (1 m n), astfel nct a[m] = m. Datele de intrare se citesc de la tastatur sau din
fiierul fix.in astfel: de pe prima linie un numr natural nenul n, iar de pe urmtoarea linie n
valori naturale, separate prin cte un spaiu.

154
Pe ecran se va afia un mesaj corespunztor rezultatului cutrii indicelui m.
Exemplu: pentru valorile: -2, 0, 3, 6 se va afia m =3;
pentru valorile: -2, 0, 1, 2 se va afia mesajul nu exist soluie.
2. Ghicirea unui numr ascuns.
tefan i propune colegului su Andrei s ghiceasc un numr natural g cuprins ntre 1 i n
(1 n 1000). Andrei poate s adreseze lui tefan urmtoarele ntrebri:
numrul este egal cu numrul ales?
numrul este mai mare dect numrul ales?
numrul este mai mic dect numrul ales?
Andrei poate rspunde doar prin da sau nu.
Scriei un program pentru simularea acestui joc.
Rspunsurile lui tefan sunt date de calculator. Numrul n se citete de la tastatur, numrul
g (1 g n) este generat aleator de calculator. Dup fiecare ncercare de ghicire, s se afieze pe
ecran unul dintre mesaje: numrul este prea mare, sau numrul este prea mic, sau ai ghicit.
S se afieze i numrul de ncercri dup care s-a ghicit numrul. (Pentru generarea aleatoare
se vor folosi subprogramele specifice limbajului de programare.)

APLICAIA 3
Citirea elementelor unui ir
S se scrie un program pentru citirea elementelor unui ir y cu m elemente reale, aplicnd
metoda Divide et Impera. Dimensiunea irului i elementele acestuia se citesc de la tastatur.

Rezolvare:
Rezolvarea acestei probleme se reduce la citirea element cu element a valorilor unui ir; n
termenii specifici metodei Divide et Impera, citirea unui element este chiar rezolvarea problemei
elementare la care se ajunge prin divizare.
Descompunerea problemei revine la a mpri irul n dou subiruri. irul y are m elemente
i el este mprit n subirul (y1, y2, , ypoz) i subirul (ypoz+1, ypoz+2, , ym), unde
poz = [(1+m)/2] este indicele elementului din mijlocul irului.
Procesul de divizare se aplic fiecrui subir, pn cnd se obin subiruri de dimensiune 1
(cu un singur element): pentru acest subir valoarea elementului este citit de la tastatur.
Dup citirea fiecrui element al subirurilor de lungime 1, combinarea rezultatelor va con-
duce la completarea tuturor elementelor irului.

Exemplu: dimensiunea irului m = 5;


irul de valori citite de la tastatur 16.24 21.34 7.5 -3.2 14.30.

155
n figura 51 sunt reprezentate toate subirurile obinute prin divizare:

1....5

1-3 4-5

1-2 3 4 5

citete>>y[3] citete>>y[4] citete>>y[5]

1 2

citete>>y[1] citete>>y[2] Figura 51.

LIMBAJUL PASCAL LIMBAJUL C/C++


var y:array[1..20] of float; #include<iostream.h>
m:integer; float y[20];
procedure citire(p:integer;u:integer); int m;
var p:integer; void citire(int p, int u)
begin { int poz;
if(p<u) then if(p<u)
begin { poz=(p+u)/2;
poz=(p+u)/2; citire(p,poz);
citire(p,poz); citire(poz+1,u); citire(poz+1,u);
end }
else else
read(y[p]); cin>>y[p];
end ; }
begin void main()
read(m); citire(1,m); { cin>>m;
end. citire(1,m);}

# TEME
1. Realizai un subprogram pentru afiarea elementelor unui ir folosind metoda Divide et
Impera.
2. Justificai eficiena metodei Divide et Impera din punct de vedere al folosirii resurselor calcu-
latorului (timp de lucru, memorie), pentru rezolvarea problemelor de citire/afiare a unor
iruri de valori.

156
APLICAIA 4
Suma elementelor unui ir
Se consider un ir x cu n numere reale. S se calculeze produsul celor n elemente ale iru-
lui folosind metoda Divide et Impera.

Datele de intrare se citesc de la tastatur sau din fiierul suma.in, astfel: de pe prima linie se
citete dimensiunea n a tabloului numeric (n N, 1 n 100), iar de pe urmtoarea linie se citesc
n numere reale separate prin cte un spaiu.

n fiierul suma.out se va afia, pe prima linie, irul dat, iar pe urmtoarea linie un numr
real, cu trei zecimale, reprezentnd suma elementelor.
suma.in suma.out
7 12 0.33 15.4 2.3 0.2 5.442
12 0.33 15.4 2.3 0.2 5.442 Suma = 35.672

Rezolvare:
n figura 52 sunt reprezentate toate subirurile obinute prin divizarea irului iniial pn la
obinerea subirului cu un singur element.

12 0.33 15.5 2.3 0.2 5.442 S1-7= S1-4 + S5-7


Figura 52.

1...7

S5-7= S5-6 + x[7]


S1-4= S1-2+S3-4 1-4 5-7

1-2 5-6 7
3-4
S1-2= x[1] + x[2]
S3-4= x[3] + x[4] S5-6= x[5] + x[6] x[7]

1 2 3 4 5 6

x[1] x[2] x[3] x[4] x[5] x[6]

157
Subalgoritmul pentru determinarea sumei elementelor irului :

subalgoritm suma(p,u)
dac p=u atunci
suma x[p]
altfel
poz [(p+u)/2]
s1 suma(p,poz)
s2 suma(poz+1,u)
suma s1+s2
sfrit dac
sfrit subalgoritm.

# TEME
1. Descriei semnificaia etapelor metodei Divide et Impera pentru rezolvarea acestei probleme.
2. Precizai numrul i tipul subprogramelor necesare pentru implementarea algoritmului de
rezolvare a problemei.
3. Implementai algoritmul descris n limbajul de programare studiat.

EXERCIII I PROBLEME PROPUSE


1. Stabilii ce realizeaz urmtorul program. Formulai un enun de problem care se poate rezol-
va cu ajutorul acestui program.
LIMBAJUL PASCAL LIMBAJUL C/C++
var a:array[1..20,1..20] of integer; #include<iostream.h>
m,n:integer; int a[20][20],m,n;
procedure sub1(pl,ul,pc,uc:integer);
var poz:integer; void sub1(int pl,int ul,int pc,int uc)
begin { int poz;
if(pl=ul) then if(pl==ul)
if(pc=uc) then if(pc==uc)
read(a[pl,pc]) cin>>a[pl][pc];
else else
begin { poz=(pc+uc)/2;
poz:=(pc+uc) div 2; sub1(pl,ul,pc,poz);
sub1(pl,ul,pc,poz); sub1(pl,ul,poz+1,uc);
sub1(pl,ul,poz+1,uc); }
end else
else { poz=(pl+ul)/2;
begin sub1(pl,poz,pc,uc);
poz:=(pl+ul) div 2; sub1(poz+1,ul,pc,uc);
sub1(pl,poz,pc,uc); }

158
sub1(poz+1,ul,pc,uc); }
end;
end; void main()
begin { cin>>m>>n;
read(m,n); citire(1,m,1,n); sub1(1,m,1,n);
end. }

2. Se citete de la tastatur un numr n natural nenul. S se scrie un program pentru calculul i


afiarea pe ecran a urmtoarei sume:
S = 12 + 23 + n(n+1).
Exemplu:
Pentru n=8, se va afia S = 240.
3. Se citete de la tastatur un numr n natural nenul. S se scrie un program pentru calculul i
afiarea pe ecran a urmtoarei sume (cu o precizie de patru zecimale):
1 1 1
S= + + ... +
1 2 2 3 n (n + 1)
Exemplu:
Pentru n=8, se va afia S = 0.8888.
4. Se citete de la tastatur un cuvnt format din cel mult 250 de caractere. S se verifice dac
acest cuvnt are proprietatea de a fi palindrom.
Un cuvnt este palindrom dac prin inversarea lui se obine un cuvnt identic.
Exemplu: Cuvntul iniial: rotor.
Cuvntul este palindrom.
5. Se consider un ir z cu t numere ntregi. S se verifice dac irul este simetric. Datele de
intrare se citesc din fiierul palin.in astfel: de pe prima linie un numr natural nenul care
reprezint dimensiunea t a irului, iar de pe urmtoarea linie se citesc t valori ntregi separate
prin cte un spaiu. Mesajul prin care se arat dac irul are sau nu are proprietatea cerut se
va afia pe ecran.
Un ir are proprietatea de a fi simetric dac:
x[i]= x[n-i+1], pentru i {1, 2,, [(n+1)/2]}
Exemplu:
palin.in Se va afia:
7 irul este simetric.
5 7 2 9 2 7 5
6. Fie matricea a cu n (n N*) linii i n coloane cu elemente reale i un numr natural k dat
(1 k n).
a) Precizai ce realizeaz urmtorul subprogram:

159
LIMBAJUL PASCAL LIMBAJUL C/C++
.. ..
procedure s ( p, u, k:integer); void s (int p, int u, int k)
var poz:integer; aux:float; { int poz; float aux;
begin if(p<=u)
if(p<=u) then begin { poz=(p+u)/2;
poz=(p+u)/2; aux=a[k][poz];a[k][poz]=a[poz][k];
aux=a[k][poz];a[k][poz]:=a[poz][k]; a[poz][k]=aux;
a[poz][k]:=aux; s (p,poz-1,k); s (poz+1,u,k);
s (p,poz-1,k); s (poz+1,u,k); }
end }
end; void main()
begin { ..
.. s (1,n,k);
s (1,n,k); }

end.

b) ncercuii varianta corespunztoare prelucrrilor realizate n matricea a dup apelul sub-


programului s.

n=4 k=2 Matricea dup apelul s(1,n,k)


matricea iniial a) b) c) d)
3 4 5 6 3 4 9 6 3 8 9 9 3 8 5 6 3 4 5 9
8 2 1 0 8 2 7 0 4 2 1 0 4 2 7 5 8 2 1 5
9 7 2 4 5 1 2 2 5 7 2 4 9 1 2 4 9 7 2 2
9 5 2 1 9 5 4 1 6 5 2 1 9 0 2 1 6 0 4 1

c) Formulai un enun de problem care se rezolv cu ajutorul subprogramului s.

APLICAIA 5
Determinarea celui mai mare divizor comun
Fie irul y cu m numere naturale. S se determine cel mai mare divizor comun al elementelor
acestui ir (cmmmdc(y1, y2, , ym)) utiliznd metoda Divide et Impera. Dimensiunea irului i
elementele acestuia se citesc de la tastatur. Cel mai mare divizor comun se va afia pe ecran.
Exemplu:

m=5 Se va afia pe monitor


12 102 54 36 93 Cmmdc = 3

160
Rezolvare:
irul iniial se mparte n dou subiruri, primul subir este (y1, y2, , ypoz) i subirul
(ypoz+1, ypoz+2, , ym), unde poz=[(1+p)/2] este indicele elementului din mijloc. La rndul lor
aceste subiruri sunt divizate pn cnd se obin subiruri de lungime 1 (elementul acesta este
chiar cmmmdc din subirul generat) sau de lungime 2 (se determin cmmdc dintre cele dou
elemente).
Dup determinarea cmmdc al subirurilor formate dintr-un singur element sau din dou ele-
mente, combinarea rezultatelor va conduce la determinarea cmmdc al tuturor elementelor iru-
lui dat.
n figura 53 se prezint determinarea cmmdc pentru exemplul dat.
Figura 53.
12 102 54 36 93 cmmdc(6, 3) = 3
1 2 3 4 5

1...5

cmmdc(36, 93) = 3
cmmdc(6, 54) = 6 1-3 4-5

1-2 4 5
3

cmmdc(y[1], y[2]) = 6 cmmdc(y[3], y[3]) = 54 cmmdc(y[4], y[4]) = 36 cmmdc(y[5], y[5]) = 93

LIMBAJUL PASCAL LIMBAJUL C/C++


var y:array[1..20]of integer; #include<iostream.h>
n:integer; int y[20],m;

procedure citire(p,u:integer); void citire(int p, int u)


var poz:integer; { int poz;
begin if(p<u)
if(p<u) then { poz=(p+u)/2;
begin citire(p,poz);
poz:=(p+u)div 2; citire(poz+1,u);
citire(p,poz); citire(poz+1,u); }
end else
else cin>>y[p];
read(y[p]); }
end;

161
function cmmdc(a,b:integer):integer; int cmmdc (int a, int b)
var r:integer; { int r;
begin if(a%b)
if(a mod b <>0) then cmmdc:=cmmdc(b,a mod b) return cmmdc(b,a%b);
else cmmdc:=b; else
end; return b;
}
function divide_et_impera(p,u:integer):integer;
var poz:integer; int divide_et_impera(int p,int u)
begin {int poz;
if((u-p)<=1) then if((u-p)<=1)
divide_et_impera:=cmmdc(y[p],y[u]) return cmmdc(y[p], y[u]);
else else
begin { poz=(p+u)/2;
poz:=(p+u) div 2; return cmmdc(divide_et_impera(p,poz),
divide_et_impera:=cmmdc(divide_et_impera(p,poz), divide_et_impera(poz+1,u));
divide_et_impera(poz+1,u)); }
end }
end;
begin void main()
read(n); citire(1,n); { cin>>m;
writeln(' cmmdc = ',divide_et_impera(1,n)); citire(1,m);
end. cout<< cmmdc = <<divide_et_impera(1, m);

# TEM
Analizai programul prezentat pentru rezolvarea acestei probleme i rspundei urmtoarelor
cerine:
a) Justificai aplicarea metodei Divide et Impera n rezolvarea acestei probleme.
b) Identificai subprogramele recursive i descriei rolul acestora n rezolvarea problemei.
c) Apreciai eficiena fiecrui subprogram din punct de vedere al timpului de execuie.
d) Transformai subprogramele recursive apreciate ca ineficiente n subprograme iterative.

APLICAIA 6
Sortarea prin interclasare a elementelor unui ir
Se consider un ir x cu n elemente ntregi. S se ordoneze irul cresctor prin metoda inter-
clasrii. Dimensiunea irului i elementele acestuia se citesc din fiierul interclas.in. irul iniial
i cel ordonat cresctor se vor afia pe linii distincte n fiierul interclas.out.

162
Exemplu:
interclas.in interclas.out
7 irul iniial:17 8 12 -7 5 42 2
17 8 12 -7 5 42 2 irul ordonat: -7 2 5 8 12 17 42

Observaie:
Prin interclasarea a dou sau mai multe iruri, ordonate dup acelai criteriu, se obine un ir
ordonat, format din reuniunea elementelor irurilor iniiale (a se revedea din manualul de clasa
a X-a interclasarea a dou iruri).
Rezolvare:
Se mparte irul iniial n dou subiruri, primul subir este (x1, x2, , xpoz) i subirul
(xpoz+1, xpoz+2, , xn), unde poz=[(1+n)/2] este indicele elementului din mijloc. La rndul lor
aceste subiruri sunt divizate pn cnd se obin subiruri de lungime 1 (ordonate) sau de
lungime 2, ordonate. Subirurile ordonate se interclaseaz succesiv pn cnd se obine irul
final, cu elementele n ordinea cerut.
n figura 54, sunt reprezentate toate subirurile obinute prin divizare n procesul de
interclasare, pentru exemplul numeric.

17 8 12 -7 5 42 2
x [1] = -7, x[2] = 2, x [3] = 5, x[4] = 8, x [5] =12, x[6] = 17, x [7] = 42
1 2 3 4 5 6 7

1-7

x [1] = -7, x[2] = 8, x [3] = 12, x[4] = 17 x [5] = 2, x[6] = 5, x [7] = 42

U

1-4 5-7

U

x [1] = 8, x[2] = 17 x [3] =-7, x[4] = 12

x [5] =5, x[6] = 42 U


x[7] = 2

1-2 3-4 5-6 7

xx[1]
[1] << x[2] nu xx[3]
[3] << x[4] nu x [5] << x[6]
x[5] x[6] nu
da x[7] = 2
1717 << 88 nunu 1212 << -7
-7 nu
nu 55 << 4242 da
da
Atunci x [1]
Atunci x[1] ? x[2]
x[2] Atunci
Atuncixx[3]
[3] ?x[4]
x[4] Deci
Decix [1]
x[1]? x[2]
x[2]
x [1]==8
x[1] 8 i
i x[2]
x[2] == 17
17 xx[3]
[3] ==-7
-7iix[2]
x[2]==1212 xx[5]
[5] == 55iix[6]
x[6]==4242

Figura 54.

163
# TEME
1. Realizai interclasarea pentru irurile de valori s1: 1, 7, 10, 15, 35 i s2: 5, 8, 9, 13, 23, 44.
2. Justificai cerina ca irurile s fie ordonate dup acelai criteriu.
3. Justificai rezolvarea acestei probleme prin metoda Divide et Impera.
4. Realizai programul pentru rezolvarea acestei probleme.

LIMBAJUL PASCAL LIMBAJUL C/C++


procedure divide_et_impera(p,u:integer); void divide_et_impera(int p,int u)
var poz:integer; {int poz;
begin if((u-p)<=1)
if((u-p)<=1)then ordon(p,u) ordon(p,u);
else else
begin { poz=(p+u)/2;
poz:=(p+u)div 2; divide_et_impera(p,poz); divide_et_impera(p,poz);
divide_et_impera(poz+1,u); interclasare(p,u,poz); divide_et_impera(poz+1,u);
end interclasare(p,u,poz);
end; }}
begin void main()
end. {
divide_et_impera(1,4);
}

APLICAIA 7
Sortarea rapid (quick-sort). (Facultativ)
Se consider un ir x cu n elemente ntregi. S se ordoneze irul cresctor prin metoda de
sortare rapid. Dimensiunea irului i elementele acestuia se citesc din fiierul quick.in. irul
iniial i cel ordonat cresctor se vor afia pe linii distincte n fiierul quick.out.
Exemplu:
quick.in quick.out
7 irul iniial:7 8 2 -7 42 5 12
7 8 2 -7 42 5 12 irul ordonat: -7 2 5 7 8 12 42

Rezolvare:
Algoritmul de sortarea rapid a fost elaborat n anul 1962 de C.A.R. Hoare i se bazeaz pe
mecanismul metodei Divide et Impera.
Pentru nceput, vom aplica direct algoritmul pentru irul de valori din exemplul numeric.
Primul element se compar cu ultimul element din ir.
7 8 2 -7 42 5 12.

164
ntruct x[1] este mai mic dect x[7] (se respect relaia de ordine cerut), atunci se compar
x[1] cu x[6]:
7 8 2 -7 42 5 12.
x[1] este mai mare dect x[6] atunci cele dou elemente se interschimb, i irul devine:
5 8 2 -7 42 7 12.
Dup ce a avut loc o interschimbare urmtoarea comparare se realizeaz ntre x[6] i x[2]
(urmtorul element situat dup elementul x[1] care a participat la interschimbare):
5 8 2 -7 42 7 12.
ntruct x[2]>x[6] cele dou valori se interschimb:
5 7 2 -7 42 8 12.
Dup ce a avut loc o interschimbare, urmtoarea comparare se realizeaz ntre x[2] i x[5]
(urmtorul element situat dup elementul x[1] care a participat la interschimbare):
5 7 2 -7 42 8 12.
ntruct x[2] este mai mic dect x[5] (se respect relaia de ordine cerut) atunci se compar
x[2] cu x[4]:
5 7 2 -7 42 8 12.
Dar x[2]>x[4] cele dou valori se interschimb:
5 -7 2 7 42 8 12.
Ultima comparare are loc ntre x[3]i x[4]:
5 -7 2 7 42 8 12.
Se observ c x[3] < x[4] (se respect relaia de ordine cerut):
5 -7 2 7 42 8 12.
Dup aceast parcurgere numrul 7 se afl pe poziia sa final n irul ordonat (poz = 4).
Toate elementele din subirul din stnga lui 7 sunt mai mici dect 7 i toate cele din subirul din
dreapta lui 7 sunt mai mari dect el.
Se obin dou subiruri care vor fi ordonate separat, pe baza aceluiai raionament:
( 5 -7 2) 7 (42 8 12).
Figura 55.

(5, -7, 2) 7 (42, 8, 12)

5 -7 2 sem1I0 sem2I -1 42 8 12 sem1I0 sem2I -1


sem1I1 sem2I 0 sem1I1 sem2I 0

2 -7 5 sem1I1 sem2I 0 12 8 42 sem1I1 sem2I 0

sem1I0 sem2I -1 (2 -7) 5 sem1I0 sem2I -1 (12 8) 42


sem1I1 sem2I 0 sem1I1 sem2I 0

(-7 2) (8 12)

165
Metoda de sortare rapid folosete mprirea irului n dou subiruri, astfel nct toate ele-
mentele din primul subir s fie mai mici dect toate elementele din al doilea subir.
mprirea irului n subiruri se oprete cnd se obin subiruri de lungime 1 (care sunt ordo-
nate). Se observ c subirurile se ordoneaz direct i combinarea rezultatelor pariale nu se
realizeaz.
Algoritmul quick_sort:

algoritm quick_sort(p, u)
dac p<u atunci
divide(p,u, poz)
quick_sort(p, poz-1)
quick_sort(poz+1, u)
sfrit dac
sfrit algoritm

Cea mai important component a algoritmului este apelul subprogramului divide prin care se
determin pivotul (poz) cu proprietatea: toate elementele din subirul (xp, x2,, xpoz-1) sunt mai
mici dect x[poz] i toate elementele din subirul (xpoz+1, xpoz+2,, xu) sunt mai mari dect x[poz].
Indicele poz reprezint poziia final a elementului x[poz] n irul ordonat.
Din exemplul numeric prezentat, se observ c la fiecare interschimbare se modific direcia
de deplasare n ir:

subalgoritm divide(p,u,poz)
ip
ju
sem10
sem2-1
ct timp i<j execut
dac xi>xj atunci
aux xi
xi xj
xj aux
aux sem1
sem1 -sem2
sem2 -aux
sfrit dac
ii + sem1
jj + sem2
sfrit ct timp
pozi
sfrit subalgoritm

166
Pentru controlul direciei se pot folosi dou variabile cu rol de semafor:
(1) sem1 controleaz deplasarea n ir, de la stnga la dreapta;
(2) sem2 controleaz deplasarea n ir, de la dreapta la stnga.
O variabil semafor are doar dou stri: activ i blocat. Pentru a diferenia cele dou variabile
semafor, acestea sunt definite astfel:
0 blocat 0 blocat
sem1 = sem2 =
1 activ 1 activ

La un moment dat este activ un singur semafor.


Iniial, am ales s fie activ semaforul sem2.
Pentru adresarea elementelor care se compar, se folosesc doi indici i i j. Iniial, i = p i j = u.
Ct timp indicele i este mai mic dect indicele j, se compar elementele x[i] i x[j]; dac
relaia de ordine corespunztoare criteriului de sortare nu este ndeplinit (pentru sortarea cresc-
toare x[i] < x[j]), se interschimb cele dou valori i se modific starea semafoarelor. La prima
interschimbare, semaforul sem2 devine blocat iar semaforul sem1 devine activ. Prin acest pro-
cedeu, indicele i i indicele j i modific alternativ valorile (i crete cnd sem1 este activ; j scade
cnd sem2 este activ).
Cnd indicii i i j devin egali, s-a determinat elementul aflat pe poziia final n irul ordo-
nat: x[poz], unde poz = i.
Execuia subprogramului divide pentru primul apel, divide (1, 7, poz), din exemplul nume-
ric, poate fi urmrit cu ajutorul tabelului de variaie.

Tabel de variaie

i j sem1 sem2 interschimb poz


1 7 0 -1
6 da
2 1 0 da
5 0 -1
4 da
3 1 0
4 4

Turnurile din Hanoi. (Facultativ)


Varianta 1:
Se consider trei tije verticale 1, 2, i 3. Pe tija 1 se gsesc n discuri de diametre diferite, per-
forate central, aranjate n ordine descresctoare a diametrelor discurilor, de la baz ctre vrf. S
se mute toate discurile de pe tija 1 pe tija 2, folosind ca tij auxiliar tija 3, respectnd urm-
toarele reguli:

167
la fiecare pas se va muta un singur disc (cel care se afl deasupra celorlalte discuri pe o tij);
un disc poate fi aezat pe o tij doar peste un alt disc avnd diametru mai mare dect al su;
Numrul n (0<n10) de discuri se citete de la tastatur. n fiierul de ieire hanoi.out se vor
scrie, pe linii distincte, mutrile efectuate prin perechi de dou numere astfel: prima cifr reprezint
tija de pe care se ia discul, iar a doua cifr reprezint tija pe care se aaz discul respectiv.

Exemplu:
n=3 hanoi.out
1 2
13
1 2 3 23
12
31
32
12

Rezolvare:
O mutare se va nota astfel ij, unde i, j {1, 2, 3} i i j, cu semnificaia discul de pe tija
i se mut pe tija j.
Dac n=1 se execut o unic mutare discul de pe tija 1 se mut direct pe tija 2 (problema ele-
mentar).

Dac n>1, se mparte problema n subprobleme astfel:


zse mut primele n-1 discuri de pe tija 1 pe tija 3;
z se mut ultimul disc (cel cu diametrul cel mai mare) de pe tija 1 pe tija 2;
z se mut cele n-1 discuri de pe tija 3 pe tija 2.

n acest moment s-au generat dou subprobleme mai simple i anume mutarea a n-1 discuri
de pe tija 1 pe tija 3, i mutarea celor n-1 discuri de pe tija 3 pe tija 2. La rndul lor aceste sub-
probleme se pot mpri n subprobleme pn cnd rmne de mutat un singur disc. Rezolvarea
acestei probleme se poate implementa cu ajutorul metodei Divide et Impera.
Pentru a muta discul de diametru maxim de pe tija i , trebuie s fie mutate cele n-1 discuri
situate peste acest disc pe tija auxiliar. Cele trei tije sunt numerotate distinct cu valori de la 1 la
3, suma acestor numere este 6; tija auxiliar are valoarea 6-i-j. Cnd discul de diametru maxim
poate fi mutat pe tija j, se poate trece la mutarea celor n-1 discuri de pe tija 6-i-j pe tija j, folosind
tija i (care nu mai are niciun disc pe ea) drept tij auxiliar. irul de mutri necesare pentru a
deplasa n discuri de pe tija i pe tija j se noteaz prin hanoi(n, i, j) i poate fi definit astfel:

i j , daca
dac n = 1
hanoi ( n, i , j ) =
hanoi ( n 1, i, 6 i j ) i j hanoi ( n 1, 6 i j, j ), daca
dac n > 1

168
n continuare este prezentat algoritmul de generare a mutrilor posibile:

algoritm hanoi (n, i, j )


dac n=1 atunci
mut disc de pe tija i pe tija j
altfel
hanoi(n-1, i, 6-i-j)
mut disc de pe tija i pe tija j
hanoi(n-1, 6-i-j, j)
sfrit dac
stop algoritm

Urmeaz subprogramul corespunztor algoritmului i apelul acestuia din programul princi-


pal, respectiv din funcia principal.

LIMBAJUL PASCAL LIMBAJUL C/C++


procedure hanoi( n, i, j:integer); void hanoi(int n, int i, int j)
var poz:integer; {int poz;
begin if(n==1)
if(n=1) then g<<i<< <<j<<endl;
writeln(g, i , , j ) else
else {
begin hanoi( n-1, 6- i-j, j);
hanoi( n-1, 6- i - j , j ); g<<i<< <<j<<endl;
writeln(g, i , , j ) ; hanoi( n-1, i, 6- i-j);
hanoi( n-1, i, 6 i j ); }
end; }
end; void main()
begin {

hanoi(n, 1, 2); hanoi(n, 1, 2);

end. }

169
Varianta 2:
Se consider trei tije verticale A, B, i C. Pe tija A se gsesc n discuri de diametre diferite,
perforate central, aranjate n ordine descresctoare a diametrelor discurilor, de la baz ctre vrf.
S se mute toate discurile de pe tija A pe tija B, folosind ca tij auxiliar tija C, respectnd urm-
toarele reguli:
la fiecare pas se va muta un singur disc (cel care se afl deasupra celorlalte discuri pe o tij);
un disc poate fi aezat pe o tij doar peste un alt disc avnd diametru mai mare dect al su.
Numrul n (0<n10) de discuri se citete de la tastatur. n fiierul de ieire hanoi.out se vor
scrie, pe linii distincte, mutrile efectuate prin perechi de dou litere astfel: prima liter reprezint
tija de pe care se ia discul, iar a doua liter reprezint tija pe care se aaz discul respectiv.

Exemplu:

n=3 hanoi.out
AB
AC

A B C BC
AB
CA
CB
AB

O mutare se va nota astfel AB, cu semnificaia discul de pe tija A se mut pe tija B.


Dac n=1, se execut o unic mutare: discul de pe tija A se mut direct pe tija B (problema
elementar).

Dac n>1, se mparte problema n subprobleme astfel:


z se mut primele n-1 discuri de pe tija A pe tija C;
z se mut ultimul disc (cel cu diametrul cel mai mare) de pe tija A pe tija B;
z se mut cele n-1 discuri de pe tija C pe tija B.

n acest moment s-au generat dou subprobleme mai simple, i anume mutarea a n-1 discuri
de pe tija A pe tija C, respectiv cele n-1 discuri de pe tija C pe tija B. La rndul lor aceste sub-
probleme se pot mpri n subprobleme pn cnd rmne de mutat un singur disc. Deci
rezolvarea problemei se poate implementa cu ajutorul metodei Divide et Impera.

n continuare este prezentat algoritmul de generare a mutrilor posibile:

170
algoritm hanoi (n, A, B, C )
dac n=1 atunci
mut disc de pe tija A pe tija B
altfel
hanoi(n-1, A,C, B)
mut disc de pe tija A pe tija B
hanoi(n-1, C, B, A)
sfrit dac
stop algoritm

# TEME
1. Rezolvai numeric problema turnurilor din Hanoi pentru n = 3 discuri i n = 4 discuri. Reinei
numrul de mutri necesare pentru rezolvarea problemei.
2. Care este numrul de mutri pentru un numr oarecare n de discuri?
3. Formulai problema elementar la care se ajunge prin aplicarea metodei Divide et Impera.
4. Justificai aplicarea metodei n rezolvarea acestei probleme.

APLICAII DE LABORATOR
1. S se scrie programul complet pentru rezolvarea problemei turnurilor din Hanoi varianta 1.
Numrul natural nenul n (1n10) de discuri se citete de la tastatur. Mutrile se vor afia n
fiierul hanoi1.out, pe linii distincte.
S se afieze pe ultima linie cte mutri s-au executat
2. S se scrie programul complet pentru rezolvarea problemei turnurilor din Hanoi varianta 2.
Numrul natural nenul n (1n10) de discuri se citete de la tastatur. Mutrile se vor afia
n fiierul hanoi2.out, pe linii distincte.
S se afieze pe ultima linie cte mutri s-au executat.

171
II. BACKTRACKING

1. STUDIU DE CAZ PLANIFICAREA EXAMENELOR

Pentru mbuntirea pregtirii n domeniul Programrii paginilor Web, un elev se


nscrie la cursurile on-line organizate de o firm atestat. Acest curs este format din mai
multe module. Pentru a obine Certificatul de absolvire al unui modul, elevul trebuie s
susin on-line n teste finale n termen de m zile consecutive (n[m/2]). Examenele sunt
numerotate de la 1 la n (n aceast ordine trebuie s fie susinute). Elevul poate da testele n
ce zi dorete, cu condiia de a nu susine dou teste n zile consecutive. Elevul ncearc s
realizeze mai multe planificri i apoi s o aleag pe cea mai avantajoas. Pentru primul
modul, n 4 zile, elevul trebuie s susin dou teste.

Rezolvare:
S vedem cum i planific elevul suinerea testelor pentru cazul n care n = 2 i m = 4.
n prima zi, elevul planific exemenul 1. n a doua zi, nu mai poate s planifice niciun
examen. Ultimul examen este planificat n ziua a treia.
S-a obinut prima programare: n ziua 1 examenul 1,
n ziua 3 examenul 2.
Elevul observ c poate s-i planifice cel de-al doilea test i n ziua a patra. Se obine:
Programarea 2: n ziua 1 examenul 1,
n ziua 4 examenul 2.
ntruct nu mai sunt zile n care s-i mute ultimul test, elevul se gndete s reprogrameze
susinerea primului test n ziua 2. Testul 2 poate fi susinut doar n ziua a patra.
Programarea 3: n ziua 2 examenul 1,
n ziua 4 examenul 2.
Examenul 2 nu mai poate fi programat n alt zi. Elevul ncearc s programeze examenul 1
n ziua a treia; n acest caz, testul 2 ar putea fi programat doar n ziua a patra, ns condiia de a
nu susine examenele n zile consecutive nu este respectat. Elevul ncearc s programeze testul 1
n ziua a patra, dar testul 2 nu poate fi susinut n aceeai zi i nici nu mai sunt zile disposibile.
n ziua 1 nu poate fi planificat testul 2 pentru c testele se susin n ordinea prestabilit.

Elevul poate s susin cele dou teste conform uneia dintre cele trei programri posibile :

Posibiliti de Ziua 1 Ziua 2 Ziua 3 Ziua 4 Programare


programare bun
1 Examen 1 Examen 2 Da
2 Examen 1 Examen 2 Da
3 Examen 1 Examen 2 Da
4 Examen 1 Examen 2 Nu

172
Concluzii:
z Pentru a realiza programarea testelor, elevul face verificri (examenele nu pot fi planificate
n zile consecutive, ordinea susinerii testelor este cresctoare nu se poate da testul 2
naintea testului 1). Elevul face reveniri n construirea unei programri. Dac la un moment
dat testul 2 nu mai poate fi planificat n alt zi, atunci se ncearc reprogramarea primului
test n alt zi i apoi se trece din nou la programarea testului 2. Sunt posibile reveniri suc-
cesive, pn se gsete o zi n care poate fi programat testul 2. Aceste cutri cu avans i
cu reveniri se termin cnd testul 1 nu mai poate fi planificat n nicio alt zi.
z Elevul a construit cele trei programri utiliznd metoda backtracking.

Numele acestei metode este foarte sugestiv i poate fi tradus prin cutare cu revenire, generarea
unei soluii fcndu-se pe baza urmelor precedente (n limba englez back nseamn napoi,
iar track urm).

2. DESCRIEREA GENERAL A METODEI BACKTRACKING

Metoda Backtracking se utilizeaz pentru rezolvarea unor probleme n care:


z se obin mai multe soluii;
z soluia este format din unul sau mai multe elemente, fiind reprezentat printr-un tablou

X=(x1, x2, , xn) unde x1 M1, x2 M2, , xn Mn;


z tabloul X este o structur liniar de tip stiv;
z mulimile M , M , , M sunt mulimi finite avnd c , c , , c elemente;
1 2 n 1 2 n
z elementele depuse n tablou ndeplinesc anumite condiii impuse de enunul fiecrei pro-

bleme.
Generarea tuturor tablourilor X cu elementele produsului cartezian M1 M2 Mn
numit spaiul soluiilor posibile conduce la un timp de execuie foarte mare.

Metoda Backtracking are la baz o strategie prin care se genereaz doar soluiile care
ndeplinesc condiiile specifice problemei, denumite condiii interne.
Soluiile posibile care respect condiiile interne se numesc soluii rezultat.
Dac un element xj primete o valoare din mulimea Mj care este admis n soluia rezultat,
aceast valoare se numete valoare valid. Condiiile de validare sunt deduse din condiiile
interne.
Exemplu:
S se determine toate modalitile de colorare a rilor de pe o hart, folosind un numr
minim de culori precizat, spre exemplu, 4 culori. Condiia intern rezult din aezarea rilor pe
hart; pentru a fi vizibile, zonele geografice nvecinate rile trebuie colorate distinct.
Condiiile de validare se obin prin compunera urmtoarelor condiii simple: dac ara i este
vecin cu ara j (n matricea de vecinti M[i][j] =1) atunci culoarea folosit pentru ara i
trebuie s difere de culoarea folosit pentru ara j (n tabloul soluie, X[i] <> X[j]).

173
Problemele care se rezolv cu aceast metod pot avea anumite particulariti:
z numrul n de elemente care pot participa la construirea unei soluii nu este o valoare con-

stant (fix);
z se poate obine i o singur soluie, denumit soluie optim;
z elementele x , x , , x ale unei soluii pot fi i ele tablouri;
1 2 n
z mulimile M , M , , M pot avea aceleai elemente.
1 2 n

Exemplu:
S se genereze toate numerele naturale cu trei cifre distincte din mulimea {1,2,4}.
Soluie:
Spaiul soluiilor posibile S=({1,2,4}{1,2,4}{1,2,4}= {1,1,1},{1,1,2}, {1,1,4}, {1,2,1},
{1,2,2},,{4,4,4})
Rezolvarea problemei prin generarea tuturor soluiilor conduce la 27 de soluii posibile, din-
tre care doar 6 sunt soluii rezultat. n tabel s-au generat toate soluiile posibile fiind marcate
soluiile rezultat.

Soluie 111 112 114 121 122 124 141 142 144 211 212 214 221 222
posibil
Soluie
rezultat
Soluie 224 241 242 244 411 412 414 421 422 424 441 442 444
posibil
Soluie
rezultat

3. MECANISMUL METODEI BACKTRACKING

Soluiile problemei sunt generate ntr-un tablou X de tip stiv:


z se alege din mulimea M , elementul valid x ;
1 1
z se presupune c n tabloul X s-au depus elementele x M , x M , , x M
1 1 2 2 k-1 k-1 i se
caut prima valoare candidat la construirea soluiei xk Mk;
z elementul x pstreaz valoarea candidat doar dac aceasta verific condiiile de validare
k
(condiiile interne);
z dac x a fost depus n tabloul X, se verific dac s-a obinut o soluie rezultat, n caz afirma-
k
tiv soluia este pstrat i se trece la construirea unei alte soluii, altfel se incrementeaz k (stiva
crete) i se caut o valoare candidat pentru xk+1 din mulimea Mk+1;
z dac n mulimea M nu se mai gsesc valori valide (s-au testat toate valorile) se decre-
k
menteaz k (stiva scade) i se caut o alt valoare pentru xk-1 din mulimea Mk-1;
z algoritmul se oprete atunci cnd n mulimea M nu mai exist nicio valoare candidat pen-
1
tru x1 (cnd stiva este vid).

174
4. REPREZENTAREA ALGORITMULUI N PSEUDOCOD

Algoritmul metodei Backtracking poate fi reprezentat att iterativ, ct i recursiv.

A) VARIANTA ITERATIV

ALGORITMUL BACKTRACKING ITERATIV


Algoritm generare
k 1
x[k] valoare iniial // se iniializeaz primul nivel al stivei
ct timp ( k>0 ) execut
sem0
ct timp (n mulimea Mk mai sunt valori candidat pentru xk) i (sem=0) execut
x[k] x[k]+1
dac (x[k] are o valoare valid) atunci // valoarea respect condiiile interne
sem 1
sfrit dac
sfrit ct timp
dac (sem =1) atunci
dac (k= numrul de elemente cerut) atunci
s-a construit o soluie i se tiprete // stiva este plin
altfel
kk+1 // stiva crete
x[k] valoare iniial
sfrit dac
altfel
k k-1 // stiva scade
sfrit dac
sfit ct timp
stop algoritm

Descrierea algoritmului iterativ

Pe prima poziie din tabloul soluie X (k=1) se pune o valoare iniial. n cazul general,
aceast valoare iniial este valoarea minim admisibil pe care o poate lua primul element X[1]
din mulimea de valori M1 din care se scade o unitate.
Iniializarea unui element xk se face astfel pentru ca la prima incrementare a acestuia s i se
atribuie prima valoare din mulimea Mk de valori.
Variabila k pstreaz poziia curent din tabloul X n care se va depune un nou element.

175
Variabila sem are rolul de a semnala situaia n care elementul xk respect condiiile interne. Se
caut n mulimea Mk de valori (prin incrementarea valorii curente a elementului xk : X[k]=X[k]+1)
prima valoare care respect condiiile interne. Aceast valoare, xk, se compar cu elementele
depuse n talou pentru a se verifica condiiile de validare (valid(xk )). Dac valoarea este valid,
atunci sem 1.
Dac valoarea gsit pentru xk poate participa la generarea soluiei (sem=1), atunci se veri-
fic dac s-au completat cu valori toate elementele din soluie; dac s-a generat o soluie, aceas-
ta este tiprit; astfel, se trece la urmtorul element candidat la generarea soluiei (k k+1);
X[k+1] este iniializat cu o valoare corespunztoare i sunt reluate verificrile precedente.
Dac n mulimea Mk nu mai exist valori pe care s le poat prelua xk, sem rmne 0 i se
caut o nou valoare pentru elementul xk-1 (kk-1).
Generarea soluiilor are loc ct timp pentru primul element al tabloului soluie mai exist
valori n mulimea M1 de valori. Dac nu mai exist astfel de valori, poziia curent k, n tablou,
devine zero i algoritmul de generare se oprete.

B) VARIANTA RECURSIV

ALGORITMUL BACKTRACKING RECURSIV

Algoritm generare(k)
pentru i valoare iniial, valoare maxim admisibil din mulimea Mk de valori execut
X[k] i
dac (x[k] are o valoare valid) atunci // valoarea respect condiiile interne
dac (k = numrul de elemente cerut) atunci
s-a construit o soluie i se tiprete // stiva este plin
altfel
generare(k+1)
sfrit dac
sfrit dac
sfrit pentru
stop algoritm

Descrierea algoritmului recursiv

Se depune pe prima poziie din tabloul soluie (k=1, generare(1)) o valoare iniial (X[1] i ).
Variabila k pstreaz poziia curent din tabloul X n care se va depune un nou element.
Se caut n mulimea Mk de valori prima valoare (prin incrementarea valorii curente a ele-
mentului xk, X[k]=X[k]+1) care respect condiiile interne. Aceast valoare xk se compar cu
elementele depuse n tablou pentru a se verifica condiiile de validare (valid(xk )).

176
Dac valoarea gsit pentru xk poate participa la generarea soluiei, atunci se verific dac s-au
completat cu valori toate elementele din soluie; dac s-a generat o soluie, aceasta este tiprit;
astfel, se trece la urmtorul element candidat la generarea soluiei prin autoapelul algoritmului
(generare(k+1)). Prin autoapel se trece la un nou element din tabloul soluie X (se urc n stiv).
Dac n mulimea Mk nu mai exist valori pe care s le poat prelua xkse caut o nou valoare
pentru elementul xk-1 (kk-1). Aceast trecere la elementul xk-1 se face pe baza mecanismului
recursivitii la revenirea dintr-o instan a subprogramului recursiv (prin extragerea din vrful
stivei a fiecrei valori depuse, se coboar n stiv).
Generarea soluiilor are loc ct timp, pentru primul element al tabloului soluie, mai exist
valori n mulimea M1. Dac nu mai exist astfel de valori, poziia curent k, n tablou, devine
zero i algoritmul de generare se oprete.

# TEME
1. Explicai generarea soluiilor ntr-un tablou unidimensional de tip stiv.
2. Evideniai aspectele recursive ale Metodei Backtracking.
3. Stabilii care dintre urmtoarele afirmaii sunt adevrate sau false, prin marcarea csuei
corespunztoare:

Nr. Rspuns
Afirmaii
crt. A F
Metoda Backtracking se utilizeaz pentru rezolvarea unor probleme care
1 admit doar o unic soluie.

Soluia generat de metod este pstrat ntr-o structur liniar de tip coad.
2

Mulimea valorilor Mk pentru un element xk al soluiei are un numr finit de


3
elemente.

Un element xk face parte dintr-o soluie rezultat dac i numai dac este diferit
4 de elementele xk-1i xk-2.

Spaiul soluiilor posibile este format din reuniunea tuturor mulimilor de


5 valori posibile pentru fiecare element al tabloului soluie X.

Metoda Backtracking genereaz doar soluiile care ndeplinesc condiiile


6 specifice problemei.

177
4. Asociai fiecrei definiii din coloana 1 denumirea corect din coloana 2:

Nr.
Definiie Denumire
crt.
Condiiile specifice pe care trebuie s le respecte o soluie Valoare valid
1
rezultat se numesc:
2 Soluiile posibile care respect condiiile interne se numesc: Condiii de continuare

3 O valoare xk pstrat n tabloul soluie se numete: Condiii interne

Un nou element este adugat n tabloul soluie numai dup Soluii rezultat
4
verificarea unor condiii denumite:

5. Utiliznd mecanismul Metodei Backtracking, stabilii care dintre urmtoarele afirmaii sunt
adevrate sau false, prin marcarea csuei corespunztoare:

Nr. Rspuns
Afirmaii
crt. A F
1 Iniializarea unui element xk se face cu valoarea 0.

Variabila sem are rolul de a semnala cazul n care elementul xk respect


2
condiiile interne corespunztoare.
Dac sunt ndeplinite condiiile interne corespunztoare pentru elementul xk,
3
atunci se trece la urmtorul element din tabloul soluie.
Generarea soluiilor are loc ct timp pentru primul element al tabloului soluie
4
nu mai exist valori n mulimea M1 de valori.

6. Formulai condiiile de validare pentru urmtoarele probleme:


a) S se genereze toate irurile de lungime n, formate numai din literele C, P i T , iruri care
s nu aib dou litere T alturate. Numrul natural n (0<n<12) se citete de la tastatur. Exemplu:
pentru n=3 se vor afia (nu neaprat n aceast ordine) irurile: CCP,CCT, CPT, CTC etc.
b) S se genereze toate numerele prime de n cifre (n N, n<10) formate doar din cifrele 3,
0 i 7. Numrul natural n (0<n<10) se citete de la tastatur. Exemplu: n = 3, se vor afia (nu
neaprat n aceast ordine) numerele: 337, 307, 373, 733, 773.
c) S se genereze toate posibilitile de aezare a n dame pe o tabl ah de dimensiune
n n astfel nct ele s nu se atace (dou dame se atac dac sunt pe aceeai linie, coloan sau
diagonal).
Exemplu: pentru n=4 o aezare posibil este: *
*
*
*

178
d) O hart cuprinde n ri, iar pentru colorarea acestora se utilizeaz doar patru culori, astfel
nct dou ri cu frontier comun vor fi colorate diferit. Culorile alese pentru realizarea
acestei hri sunt albastru, galben, portocaliu, i verde. S se determine toate posibilitile de
colorare a hrii.
Exemplu: pentru n=4 ri avnd urmtoarea hart:
Figura 56.

ara
ara 4
4

ara
ara 3
3
ara
ara 11

ara 2
ara 2

O soluie a acestei probleme este: ara1 culoarea albastru, ara 2 - culoarea galben;
ara 3 culoarea albastru; ara 4 culoarea portocaliu.

5. EXEMPLU DE IMPLEMENTARE A ALGORITMULUI

S se genereze toate numerele naturale cu trei cifre distincte din mulimea {1,2,4}.
Soluie:
Etapa I: Identificarea elementelor specifice metodei
Mulimea cifrelor se noteaz cu C = { 1, 2, 4}, iar mulimea valorilor este M={1,2,3}, care
reprezint indicii elementelor din tabloul C (C[1]=1, C[2]=2, C[3]=4).
Tabloul X are doar trei elemente (numrul are doar trei cifre), deci hmax = 3,(X[i] M)i=1,3
Condiii interne: cifrele numrului trebuie s fie distincte.
Condiii de validare: valoarea elementului xk (o cifr) candidat la soluia rezultat trebuie s
fie diferit de celelalte elemente x1, x2,,xk-1din tabloul X.

Etapa II: Generarea soluiilor


n casetele 1, 2, 3, 4 i 5 se reprezint generarea primelor dou soluii. n fiecare caset sunt
descrise operaiile de urcare i coborre n stiv conform algoritmului prezentat.

179
Caseta 1 Nr. sol. 0

sem=0 sem=1

k=1 X[1] 3
0 1
k>0 da X[1] valid da

Se iniializeaz primul element din X cu 0 i apoi se verific dac este mai mic dect
valoarea maxim admisibil. X[1]=0<3.
Atunci X[1]=X[1] +1=1, care este o valoare valid i deci este pstrat n X, iar variabila
sem=1.
ntruct k3 atunci k=k+1=2 i elementul X[2] se iniializeaz cu 0.

Caseta 2 Nr. sol. 0

sem=0 sem=0 sem=1

k=2 X[2] 3 X[2] 3


0 1 2
k>0 da X[2] valid nu X[2] valid da
1
1 1

k > 0, sem=0 i X[2]=0 3 (valoarea maxim admisibil).


Atunci X[2]=X[2] +1=1, care nu este o valoare valid i deci se caut o alt valoare.
Cum X[2]=1<3, atunci X[2]=X[2] +1=2, care este o valoare valid, iar variabila sem=1.
ntruct k3 atunci k=k+1 (se urc n stiv), k=3 i elementul X[3] iniializat cu 0.

180
Caseta 3 Nr. sol. 1 Numrul: 124

sem=0 sem=0 sem=0 sem=1

k=3 X[3] 3 1 X[3] 3 X[3] 3


0 2 3
k>0 da X[3] valid nu X[3] valid nu X[3] valid da
2 2 2 2
1
1 1 1

k>0, sem=0 i X[3]=0< 3. Atunci X[3]=X[3] +1=1, care nu este o valoare valid i sem
rmnnd 0 X[3]=X[3] +1=2, care nu este o valoare valid (2 se regsete pe nivelul 2).
X[3]=2<3 i sem=0 X[3]=X[3] +1=3, care este o valoare valid i sem=1.
ntruct k=3 s-a gsit o soluie care se pstreaz.
Dar k>0, sem=0, dar X[3] nu mai poate lua alt valoare atunci k=k-1 (se coboar n
stiv).

Caseta 4 Nr. sol. 1

sem=0 sem=1

k=2 X[2] 3
2 3
k>0 da X[3] valid da
1
1

k>0, sem=0, X[2]=2<3


X[2]=X[2] +1=3, care este o valoare valid i sem=1.
ntruct k3 atunci k=k+1 i elementul X[3] este iniilizat cu 0.

181
Caseta 5 Nr. sol. 2 Numrul 142

sem=0 sem=0 sem=1

k=3 X[3]<=3 1 X[3]<=3


0 2
k>0 da X[3] valid nu X[3] valid da
3 3 3
1
1 1

k>0, sem=0 i X[3]=0<3 X[3]=X[3] +1=1, care nu este o valoare valid i deci se
caut o alt valoare.
sem = 0 i X[3]=1<3 X[3]=X[3] +1=2, care este o valoare valid.
ntruct k=3 s-a gsit a doua soluie soluie care se pstreaz.

n caseta 6 se reprezint construirea soluiei 5 a problemei.

Caseta 6 Nr.sol. 5
Numrul 412

sem=0 sem=0 sem=1

k=3 0 X[3]<=3 X[3]<=3


1 2
k>0 da X[3] valid nu X[3] valid da
1 1 1
3
3 3

k>0, sem=0 i X[3]=0<3, atunci X[3]=X[3] +1=1, care nu este o valoare valid.
ntruct X[3]<3 X[3]=X[3] +1=3 care este o valoare valid, se pstreaz n tablou i
sem =1.
ntruct k=3 i sem=1 s-a gsit o nou soluie care se pstreaz.

182
n caseta 7 se reprezint construirea ultimei soluii posibile a problemei.

Caseta 7 Nr. sol. 6 Numrul 421

sem=0 sem=1

k=3 X[3]<=3
0 1
k>0 da X[3] valid da
2
1
3
3

k>0, sem=0 i X[3]=0<3 atunci X[3]=X[3]+1=1 care este o valoare valid i sem=1.
ntruct k=3 i s-a construit o nou soluie care se pstreaz.

n casetele 8, 9 i 10 se descrie amnunit, conform algoritmului Backtracking, coborrea n


stiv pn la golirea ei complet algoritmul de generare s-a ncheiat.

Caseta 8 Nr. sol. 6

sem=0 sem=0 sem=0

k=3 X[3]<=3 X[3]<=3


1 2 3
k>0 da X[3] valid nu X[3] valid nu
2 2 2
3
3 3

k>0, sem=0 i X[3]=1<3. Atunci X[3]=X[3]+1=2 care nu este o valoare valid.


ntruct X[3]=2<3 i sem = 0 atunci X[3]=X[3]+1=3 care nu este o valoare valid (este
egal cu valoare depus n X[1]). Acum X[3]=3 i nu mai poate lua alt valoare, iar
sem=0. Deci k=k-1 (se coboar n stiv) i se caut o nou valoare valid pentru X[2].

183
Caseta 9 Nr. sol. 6

sem=0 sem=0

k=2 X[3]<=3
2 3
k>0 da X[3] valid nu
3
3

k>0, sem = 0 i X[2]=2<3. Atunci X[2]=X[2]+1=3 care nu este o valoare valid.


ntruct X[2]=3 i sem = 0 i X[2] nu mai poate lua valoare atunci k=k-1 (se coboar n
stiv) i se caut o nou valoare valid pentru X[1].

Caseta 10 Nr. sol. 6


sem=0 sem=0

k=1
3
k>0 da

k=0

k>0, sem=0 i X[1]=3.


X[1]=3 (valoarea maxim admisibil)
Atunci k=k - 1= 0 i algoritmul se termin.
S-au generat 6 soluii.

Se observ cum algoritmul de generare se termin cnd tabloul soluie X este gol.

Etapa III: Implementarea algoritmului Backtracking.

Pentru problema dat, citirea datelor de intrare se face din fiierul exemplu.in (de pe prima
linie se citete n iar de pe urmtoarea linie n cifre separate prin cte un spaiu), iar afiarea solu-
iilor pe linii distincte i a numrului de soluii se va face n fiierul exemplu.out

184
VARIANTA ITERATIV
LIMBAJUL PASCAL LIMBAJUL C++
var c,X :array[1..20]of integer; #include<fstream.h>
i,n,k:integer; ifstream f(exemplu.in);
f,g:text; ofstream g(exemplu.out);
procedure citire; int c[20],X[20],i,n,k;
begin
read(f,n); void citire()
for i:=1 to n do { f>>n;
read(f,c[i]); for(i=1;i<=n;i++)
end;
f>>c[i]; f.close();
function mult_val:boolean;
}
begin
mult_val:=false;
if(x[k]<n) then int mult_val()
begin {if(X[k]<n)
inc(x[k]); mult_val:=true; { X[k]++; return 1; }
end; return 0;
end; }
function valid:boolean;
begin int valid()
valid:=true; {for(i=1;i<k;i++)
for i:=1 to k-1 do if(X[i]==X[k]) return 0;
if(X[i]=X[k]) then valid:=false; return 1;
end; }
procedure afisare; void afisare()
begin { for(i=1;i<=n;i++)
for i:=1 to n do g<<c[X[i]];
write(g,c[X[i]]); writeln(g); g<<endl;
end; }
procedure generare;
void generare()
var sol:integer; sem, sev:boolean;
{ int sol=0,sem,sev;
begin
k=1; X[k]=0;
k:=1; sol:=0; X[k]:=0;
while(k>0) do while(k)
begin { do{sem=mult_val();
repeat sev=valid();
sem:=mult_val; }while((sem & !sev);
sev:=valid; if(as)
until not(sem) or (sem and sev); if(k==n)
if(sem=true)then { sol++; afisare(); }
if(k=n) then else
begin {k++; X[k]=0; }
inc(sol); afisare; else
end !k--;
else }
begin g<< s-au generat <<sol<< solutii ;
inc(k); X[k]:=0; }

185
LIMBAJUL PASCAL LIMBAJUL C++
else dec(k); void main()
end; { citire(); generare(); g.close();}
writeln(g, s-au generat ,sol, solutii );
end;
begin
assign(f,exemplu.in);reset(f);
assign(g,exemplu.out);
rewrite(g); citire; back; close(f); close(g);
end.

Descrierea implementrii iterative


Funcia generare()/generare reprezint implementarea algoritmului Backtraking, prin care
sunt construite soluiile, din care sunt apelate funciile mult_val()/mult_val, valid()/valid i
afiare()/afisare. Funcia mult_val()/mult_val are rolul de a verifica dac mulimea Mk de valori
posibile pentru elementul xk a fost parcurs n totalitate. Dac mai sunt valori atunci elementul
X[k] preia elementul curent din mulimea Mk i funcia returneaz valoarea 1, altfel funcia
mult_val()/mult_val returneaz valoarea 0 (nu mai sunt valori posibile pentru xk n muimea Mk).
Funcia valid()/valid are rolul de a verifica dac noua valoare depus n tabloul X, pe poziia k,
ndeplinete condiiile interne ale problemei. Funcia afiare()/afiare are rolul de a reprezenta
fiecare soluie generat n fiier (sau pe ecran, dup cum este formulat cerina fiecrei
aplicaii).
n funcia generare()/generare s-au definit variabilele semafor sem i sev care pot avea
valori doar n mulimea {0,1}. Variabilei sem i se atribuie valoarea returnat de funcia
mult_val()/malt_val, iar variabilei sev i se atribuie valoarea returnat de funcia valid()/valid.

Implementarea recursiv
VARIANTA RECURSIV
LIMBAJUL PASCAL LIMBAJUL C++
var c,X:array[1..20] of integer; #include<fstream.h>
n,k,sol:integer; ifstream f(exemplu.in);
f,g:text; ofstream g(exemplu.out);
procedure citire; int c[20], X[20],n,k,sol;
var i:integer;
begin void citire()
read(f,n); { f>>n;
for i:=1 to n do for(int i=1;i<=n;i++)
read(f,c[i]);
f>>c[i];
end;
function valid(k:integer):boolean; f.close();
var i:integer; }
begin
valid:=true; int valid(int k)
for i:=1 to k-1 do {for(int i=1;i<k;i++)

186
LIMBAJUL PASCAL LIMBAJUL C++

if(X[i]=X[k])then valid:=false;
if(X[i]==X[k]) return 0;
end;
procedure afisare(k:integer);
return 1;
var i:integer; }
begin void afisare(int k)
for i:=1 to k do { for(int i=1;i<=k;i++)
write(g,c[X[i]]); g<<c[X[i]];
writeln(g); g<<endl;
end; }
procedure generare(k:integer); void generare(int k)
var i:integer;
{ for(int i=1;i<=n;i++)
begin
for i:=1 to n do
{X[k]=i;
begin if(valid(k))
X[k]:=i; if(k==n)
if(valid(k)=true) then { sol++; afiare(k); }
if(k=n) then begin else
inc(sol); afisare(k); generare(k+1);
end }
else }
generare(k+1);
end;
end;
void main()
begin { citire();
assign(f,exemplu.in);reset(f); generare(1);
assign(g,exemplu.out); g<< s-au generat <<sol<< solutii ;
assign(g,back1.out);rewrite(g); g.close();
citire; generare(1); }
writeln(g, s-au generat ,sol, solutii );
close(f);close(g);
end.

Descrierea implementrii recursive


Funcia generare(int k)/generare(k:integer) reprezint implementarea algoritmului
Backtraking recursiv, prin care sunt construite soluiile, din care sunt apelate funciile
valid(int k)/valid(k:integer) i afiare(int k)/afiare(k:integer). Mulimea de valori este generat
n corpul funciei generare(int k)/generare(k:integer). Funciile valid(int k)/valid(k:integer) i
afiare(int k)/afiare(k:integer) au aceleai roluri ca i n implementarea iterativ.

187
# TEME
1. Stabilii valoarea de adevr a urmtoarelor afirmaii:
Nr. Rspuns
Afirmaii
crt. A F
Indicele k din tabloul soluie crete cu o unitate dup fiecare determinare din
1
mulimea de valori a unei valori valide pentru X[k].
O valoare depus pe nivelul k este valid, chiar dac cele depuse pe nivelurile
2
anterioare nu sunt valide
3 Dup obinerea unei soluii, nivelul k din tabloul X continu s creasc.
4 Afiarea unei soluii are loc cnd sunt ndeplinite condiiile interne.
5 Elementul X[k] ia ntotdeauna o singur valoare
Dup construirea ultimei soluii, indicele curent al tabloului soluie, k, devine 0
6
(tabloul este gol).

2. Asociai fiecrei aciuni descrise n coloana 1 subprogramul corespunztor din coloana 2:

Nr. Subprogram
Aciune
crt.
1 Vizualizarea unei soluii. afisare

2 Verific dac noua valoare depus pe nivelul curent k al initializare


tabloului soluie poate participa la construirea soluiei.
valid
3 Construirea soluiilor pentru o problem dat.

4 Alegerea din mulimea de valori posibile pentru X[k]. mult_val

generare

APLICAII REZOLVATE
1. GENERAREA PERMUTRILOR permut.out
Se citete de la tastatur un numr n natural nenul. S se 123
genereze toate permutrile posibile ale elementelor mulimii 132
M={1,2,3,,n}. Soluiile generate se vor afia pe linii dis- 213
tincte fiierul permut.out, iar pe ultima linie a fiierului se 231
va afia numrul de soluii gsite. 312
Exemplu: n = 3 321
6

188
Rezolvare:
Etapa I: Identificarea elementelor specifice metodei;
a) mulimea valorilor este M={1, 2, 3, ,n}, i reprezint elementele care se permut;
b) tabloul X are n elemente, deci hmax = n, (X[i] M)i=1,n ;
c) condiii interne: elementele mulimii trebuie s fie distincte;
d) condiii de validare: valoarea elementului xk candidat la soluia rezultat trebuie s fie
diferit de celelalte elemente x1, x2,,xk-1din tabloul X.

Etapa II: Generarea soluiilor pentru exemplul numeric n=4 ; se completeaz urmtorul tabel:

?
?
2
1
Sol 1 Sol 2 Sol 3 Sol 4 Sol 5 Sol 6 Sol 7 Sol 8 Sol 9 Sol 10 Sol 11 Sol 12 Sol 13

Sol 14 Sol 15 Sol 16 Sol 17 Sol 18 Sol 19 Sol 20 Sol 21 Sol 22 Sol 23 Sol 24 Sol 25 Sol 26

Etapa III: Implementarea algoritmului Backtracking iterativ

VARIANTA ITERATIV // PERMUTRI


LIMBAJUL PASCAL LIMBAJUL C++
var X :array[1..20]of integer; i,n,k:integer; #include<fstream.h>
g:text; ofstream g(perm.out);
function mult_val:boolean; int X[20],i,n,k;
begin int mult_val()
mult_val:=false; {if(X[k]<n)
if(X[k]<n) then { X[k]++; return 1; }
begin return 0;
inc(X[k]); mult_val:=true; }
end; int valid()
end; {for(i=1;i<k;i++)
function valid:boolean; if(X[i]==X[k]) return 0;
begin return 1;
valid:=true; }
for i:=1 to k-1 do void afisare()
if(x[i]=x[k]) then valid:=false; { for(i=1;i<=n;i++)
g<<X[i]<< ;

189
LIMBAJUL PASCAL LIMBAJUL C++
end; g<<endl;
procedure afisare; }
begin void generare()
for i:=1 to n do { int sol=0,sem, sev;
write(g,X[i], ); writeln(g); k=1; X[k]=0;
end; while(k)
procedure generare; { do
var sol:integer; sem,sev:boolean; {sem=mult_val();
begin sev=valid();
k:=1; sol:=0; x[k]:=0; }while((sem & !sev);
while(k>0) do if(sem)
begin if(k==n)
repeat { sol++; afisare(); }
sem:=mult_val; sev:=valid; else
until not(sem) or (sem and ev); {k++; X[k]=0; }
if(sem=true)then else
if(k=n) then !k--;
begin }
inc(sol); afisare; g<< s-au generat <<sol<< solutii ;
end }
else void main()
begin { cin>>n; generare(); g.close();}
inc(k); X[k]:=0;
end
else
dec(k);
end;
writeln(g, s-au generat ,sol, solutii );
end;
begin
assign(g,permut.out);rewrite(g);
read(n); generare; close(g);
end.

2. GENERAREA ARANJAMENTELOR
Se citesc de la tastatur dou numere n i p (p < n) naturale aranj.out
nenule. S se genereze toate aranjamentele elementelor mulimii 12
13
M={1,2,3,,n} luate cte p.
21
Soluiile generate se vor afia pe linii distincte, fiierul 23
aranj.out, iar pe ultima linie a fiierului se va afia numrul de 31
soluii gsite. 32
Exemplu: n = 3, p=2. 6

190
Rezolvare:
Etapa I: Identificarea elementelor specifice metodei
Mulimea valorilor este M={1, 2, 3, ,n}, care reprezint elementele care se permut.
Tabloul X are p elemente, pentru c se formeaz submulimi doar cu p elemente, deci
hmax = p, (X[i] M)i=1,p
Condiii interne: elementele mulimii trebuie s fie distincte.
Condiii de validare: valoarea elementului xk candidat la soluia rezultat trebuie s fie dife-
rit de celelalte elemente x1, x2,,xk-1din tabloul X.

Etapa II: Generarea soluiilor se va face ca exerciiu, pentru n = 4 i p = 3 prin completarea


urmtorului tabel, pe baza algoritmului Backtracking:

2
1
Sol 1 Sol 2 Sol 3 Sol 4 Sol 5 Sol 6 Sol 7 Sol 8 Sol 9 Sol 10 Sol 11 Sol 12 Sol 13

Sol 14 Sol 15 Sol 16 Sol 17 Sol 18 Sol 19 Sol 20 Sol 21 Sol 22 Sol 23 Sol 24 Sol 25 Sol 26

Etapa III: Implementarea algoritmului Backtracking iterativ

LIMBAJUL PASCAL LIMBAJUL C++


var X :array[1..20]of integer; i,n,k,p:integer; #include<fstream.h>
g:text; ofstream g(aranj.out);
function mult_val:boolean; int X[20],i,n,k;
begin int mult_val()
mult_val:=false; {if(X[k]<n)
if(X[k]<n) then { X[k]++; return 1; }
begin return 0;
inc(X[k]); mult_val:=true; }
end; int valid()
end; {for(i=1;i<k;i++)
if(X[i]==X[k]) return 0;
return 1;

191
LIMBAJUL PASCAL LIMBAJUL C++

function valid:boolean; }
begin void afisare()
valid:=true; { for(i=1;i<=p;i++)
for i:=1 to k-1 do g<<X[i]<< ;
if(x[i]=x[k]) then valid:=false; g<<endl;
end; }
procedure afisare; void generare()
begin { int sol=0,sem, sev;
for i:=1 to p do k=1; X[k]=0;
write(g,X[i], ); writeln(g); while(k)
end; { do
procedure generare; {sem=mult_val();
var sol:integer; sem, sev:boolean; sev=valid();
begin }while((sem & !sev);
k:=1; sol:=0; x[k]:=0; if(sem)
while(k>0) do if(k==p)
begin { sol++; afisare(); }
repeat else
sem:=mult_val; sev:=valid; {k++; X[k]=0; }
until not(sem) or (sem and ev); else
if(sem=true)then !k--;
if(k=p) then }
begin g<< s-au generat <<sol<< solutii ;
inc(sol); afisare; }
end void main()
else { cin>>n>>p;
begin generare();
inc(k); X[k]:=0; g.close();
end }
else dec(k);
end;
writeln(g, s-au generat ,sol, solutii );
end;
begin
assign(g,aranj.out); rewrite(g); read(n,p);
generare; close(g);
end.

192
3. GENERAREA COMBINRILOR
Se citesc de la tastatur dou numere n i p (p n) naturale nenule. S se genereze toate com-
binrile elementelor mulimii M={1,2,3,,n} luate cte p.
Soluiile generate se vor afia pe linii distincte, fiierul combin.out, iar pe ultima linie a
fiierului se va afia numrul de soluii gsite.

Exemplu: n = 3, p=2. combin.out


12
13
23
3

Rezolvare:
Etapa I: Stabilirea urmtoarelor elemente
a) Mulimea valorilor este M={1, 2, 3, ,n}, care reprezint elementele care se permut.
b) Tabloul X are p elemente, pentru c se formeaz submulimi doar cu p elemente,
hmax = p, (X[i] M)i=1,p
c) Condiii interne: elementele mulimii trebuie s fie distincte.
d) Condiii de validare:
y valoarea elementului xk candidat la soluia rezultat trebuie s fie diferit de celelate ele-
mente x1, x2,,xk-1din tabloul X ;
y o submulime nu conine aceleai elemente luate n alt ordine, n oricare alt submulime
(x1< x2<xk-1< xk).

Etapa II: Generarea soluiilor se va face ca exerciiu, pentru n = 4 i p = 3 prin completarea


urmtorul tabel, pe baza algoritmului Backtracking:

2
1
Sol 1 Sol 2 Sol 3 Sol 4 Sol 5 Sol 6 Sol 7 Sol 8 Sol 9 Sol 10 Sol 11 Sol 12 Sol 13

Sol 14 Sol 15 Sol 16 Sol 17 Sol 18 Sol 19 Sol 20 Sol 21 Sol 22 Sol 23 Sol 24 Sol 25 Sol 26

193
Etapa III: Implementarea algoritmului Backtracking iterativ

VARIANTA ITERATIV // combinri

LIMBAJUL PASCAL LIMBAJUL C++

var X :array[1..20]of integer; i,n,k,p:integer; #include<fstream.h>


g:text; ofstream g(combin.out);
function mult_val:boolean; int X[20],i,n,k;
begin int mult_val()
mult_val:=false; {if(X[k]<n)
if(X[k]<n) then { X[k]++; return 1; }
begin return 0;
inc(X[k]); mult_val:=true; }
end; void afisare()
end; { for(i=1;i<=p;i++)
procedure afisare; g<<X[i]<< ;
begin g<<endl;
for i:=1 to p do }
write(g,X[i], ); void generare()
writeln(g); { int sol=0,sem;
end; k=1; X[k]=0;
procedure generare; while(k)
var sol:integer; sem :boolean; { sem=mult_val();
begin if(sem)
k:=1; sol:=0; x[k]:=0; if(k==p)
while(k>0) do { sol++; afisare(); }
begin else
sem:=mult_val; {k++; X[k]=X[k-1]; }
if(sem=true)then else
if(k=p) then !k--;
begin }
inc(sol); afisare; g<< s-au generat <<sol<< solutii ;
end }
else void main()
begin { cin>>n>>p;
inc(k); X[k]:=X[k-1]; generare();
end g.close();
else dec(k); }
end;
writeln(g, s-au generat ,sol, solutii );
end;

begin
assign(g,combin.out);rewrite(g); read(n,p);
generare; close(g);
end.

194
# TEME
1. Stabilii valoarea de adevr a urmtoarelor afirmaii:

Nr. Rspuns
Afirmaii
crt. A F
Nivelul curent X[k] al tabloului soluie este iniializat cu valoarea minim din
1
mulimea Mk de valori posibile.

2 O soluie pentru generarea permutrilor elementelor mulimii {1, 2,,n} are


exact n elemente.
Fie mulimea { 1, 2, , m}. Prin generarea tuturor aranjamentelor, respectiv a
3 tuturor combinrilor elementelor acestei mulimi n submulimi de cte
t elemente (t m), se obin n1 soluii, respectiv n2 soluii. Atunci n1>n2.
Prin generarea combinrilor mulimii {1,2,,m} n submulimi de cte
4 t elemente (t m) se obin soluii care au m elemente.

Numrul de soluii obinut la generarea tuturor permutrilor unei mulimi cu p


5
elemente este p!

Numrul de soluii obinut la generarea tuturor aranjamentelor de cte k


6 elemente ale unei mulimi cu p (k p) elemente este: k p!
Cp =
k! (p - k)!
Numrul de soluii obinut la generarea tuturor combinrilor de cte k
7 elemente ale unei mulimi cu p (k p) elemente este: k p!
Ap =
(p - k)!
Submulimile obinute prin generarea tuturor combinrilor de cte k elemente
8
ale unei mulimi cu p (k p) sunt distincte.

2. Se consider urmtorul program:

LIMBAJUL PASCAL LIMBAJUL C++


var X :array[1..20]of integer; i,n,k,p:integer; #include<fstream.h>
g:text; ofstream g(date.out);
procedure citire; int X[20],n,k,p;
begin
read(n,p); void citire()
end; { cin>>n>>p;
}

195
LIMBAJUL PASCAL LIMBAJUL C++
function mult_val:boolean; int mult_val()
begin {if(X[k]>1)
mult_val:=false; { X[k];
if(X[k]<n) then return 1;
begin }
dec(X[k]); mult_val:=true; else return 0;
end; }
end; void afisare()
procedure afisare; { int i;
begin for(i=1;i<=p;i++)
for i:=1 to p do g<<X[i]<< ;
write(g,X[i], ); g<<endl;
writeln(g); }
end;
procedure generare; void generare()
var sol:integer; sem:boolean; { k=1;
begin int sol=0,sem;
k:=1; sol:=0; X[k]:=n+1; X[k]=n+1;
while(k>0) do while(k)
begin { sem=mult_val();
sem:=mult_val; if(sem)
if(sem=true)then if(k==p)
if(k=p) then { sol++;
begin afisare();
inc(sol); afisare; }
end else
else {k++; X[k]=X[k-1];
begin }
inc(k); X[k]:=X[k-1]; else
end k--;
else }
dec(k); g<< s-au generat <<sol<< solutii ;
end; }
writeln(g, s-au generat ,sol, solutii );
end; void main()
begin { citire(); generare(); g.close(); }
citire; generare; close(g);
end.

a) Dac valorile citite de la tastatur sunt n = 4 i p = 3, stabilii ce se afieaz dup execuia


programului.
b) Formulai un enun pentru o problem al crei algoritm de rezolvare se implementeaz cu
ajutorul programului dat.
c) Construii varianta recursiv a programului.

196
3. Se citete un numr natural nenul t (0<t<5). Se genereaz numere naturale cu t cifre distincte.
Alegei varianta corect de rspuns pentru urmtoarele ntrebri:
a) Care este valoarea minim care poate fi depus pe primul nivel al tabloului soluie? Justificai.
1) -1 sau 0; 2) 9; 3) 0; 4) 0 sau 1.
b) Care este valoarea maxim care poate fi depus pe nivelul curent al tabloului soluie?
Justificai.
1) 4; 2) 9; 3) 10; 4) 5.
c) Dac t = 4, precizai care dintre urmtoarele numere poate fi soluie a problemei:
1) 5678; 2) 1019; 3) 1239; 4) 1234.
d) Dac t = 4 i s-a generat soluia 2798 (numr natural cu 4 cifre distincte), care este urm-
torul numr generat?

e) Se genereaz toate numerele naturale cu 4 cifre distincte pare. Precizai care dintre urm-
toarele numere nu poate fi soluie a problemei:
1) 5678; 2) 2046; 3) 2034; 4) 4240.
f) La baza generrii numerelor naturale cu t cifre distincte st algoritmul de generare a:
1) permutrilor primelor t numere naturale;
2) aranjamentelor mulimii {1, 2, ,10} n submulimi de cte t elemente;
3) combinrilor mulimii {0, 1, 2, ,9} n submulimi de cte t elemente;
4) aranjamentelor mulimii {0, 1, 2, ,9} n submulimi de cte t elemente.

APLICAII DE LABORATOR
1. S se scrie programele pentru aplicaiile rezolvate i, dup execuia lor, s se completeze
numrul de soluii gsite :
a) permutri: pentru n = 4 numrul de soluii gsite =
b) aranjamente: pentru n = 4 i p = 3 numrul de soluii gsite =
c) combinri: pentru n = 4 i p = 3 numrul de soluii gsite =
Modificai programul de generare iterativ a permutrilor mulimii primelor n numere na-
turale, astfel nct iniializarea nivelului curent al tabloului soluie s porneasc de la valoarea
maxim admisibil din mulimea de valori (folosii ca model programul de la tema 2).
2. Scriei varianta recursiv a programului de generare a tuturor aranjamentelor cu p elemente
din elemente mulimii M={1,2,3,,n}. Se citesc de la tastatur dou numere naturale nenule
n i p (p n). Soluiile generate se vor afia pe linii distincte n fiierul aranj.out, iar pe ulti-
ma linie a fiierului se va afia numrul de soluii gsite.
3. Scriei varianta recursiv a programului de generare a tuturor combinrilor cu p elemente din
elemente mulimii M={1,2,3,,n}. Se citesc de la tastatur dou numere naturale nenule
n i p (p n). Soluiile generate se vor afia pe linii distincte n fiierul combin.out, iar pe
ultima linie a fiierului se va afia numrul de soluii gsite.

197
4. Se citete de la tastatur un numr natural t (0 < t < 6).
a) S se scrie un program (iterativ sau recursiv) pentru generarea tuturor numerelor naturale
cu t cifre distincte. Soluiile se vor afia pe linii distincte n fiierul numere1.out, iar pe ultima
linie se va afia numrul de soluii.
Exemplu: Pentru t =3 se obin astfel de numere: 123, 124, 125,
b) Modificai programul scris la punctul a) astfel nct s se genereze doar numerele natu-
rale cu t cifre distincte pare. Soluiile se vor afia pe linii distincte n fiierul numere2.out, iar
pe ultima linie se va afia numrul de soluii.
Exemplu: Pentru t =3 se obin astfel de numere: 204, 206, 208,
c) Modificai programul scris la punctul b) astfel nct s se genereze doar numerele natu-
rale cu t cifre distincte pare, dispuse n ordine cresctoare. Soluiile se vor afia pe linii distincte
n fiierul numere3.out, iar pe ultima linie se va afia numrul de soluii.
Exemplu: Pentru t = 4 se obin astfel de numere: 246, 248, 468,
d) Modificai programul scris la punctul a) astfel nct s se genereze doar numerele natu-
rale cu t cifre distincte care au cifra cea mai semnificativ 8. Soluiile se vor afia pe linii dis-
tincte n fiierul numere4.out, iar pe ultima linie se va afia numrul de soluii.
Exemplu: Pentru t = 3 se obin astfel de numere: 801, 802, 803,

PROBLEME PROPUSE
1. Se citete de la tastatur un cuvnt cu cel mult 20 de caractere. cuvinte.out
S se genereze toate cuvintele obinute prin permutarea cor
literelor cuvntului dat. Cuvintele generate vor fi afiate n cro
fiierul cuvinte.out, pe linii distincte, iar pe ultima linie se va ocr
afia numrul de cuvinte generate. orc
Exemplu: Se citete cuvntul cor. rco
roc
n fiierul cuvinte.out vor fi afiate urmtoarele cuvinte:
S-au generat 6 cuvinte

2. Se citete de la tastatur un numr natural nenul k (2<k<9). S dif_doi.out


se genereze toate numerele naturale formate din k cifre dis- 135 246 357
tincte astfel nct diferena n valoare absolut ntre oricare 420 468 531
dou cifre consecutive s fie 2. Numerele generate vor fi afiate 579 642 753
pe linii distincte n fiierul dif_doi.out, iar pe ultima linie se va 864 975
S-au generat 11 numere
afia numrul de soluii.
Exemplu: k = 3
3. Fie irul a cu n (n>=3) numere reale. S se genereze cu elementele irului a toate
permutrile vale.
Datele de intrare se citesc din fiierul vale.in astfel: de pe prima linie se citete dimensiunea
irului n, iar de pe urmtoarea linie n numere reale separate prin cte un spaiu.

198
Permutrile vale generate se vor afia pe O permutare
permutarevale valeareare urmtoarea
urmtoarea definiie:
definiie:
linii distincte n fiierul vale.out, pe linii distincte, a[i] > a[i+1] , pentru i=1, 2,, k-1
iar pe ultima linie a fiierului se va afia numrul a[i] < a[i+1] , pentru i= k, k+1, ,n
de soluii determinat. n
, daca
dac nn este
estepar
par
2
unde k =
n + 1 , daca
dac nn este
esteimpar
impar
2
Exemplu:
vale.in vale.out
6 13 12 2 4 5 7
4 12 13 7 5 2 13 7 2 4 5 12
13 5 2 4 7 12
.

4. Fie irul a cu n (n>=3) numere reale. S se OOpermutare permutaremunte


munte sese definete
definete astfel:
astfel:
genereze cu elementele irului a toate per- a[i] < a[i+1] , pentru i=1, 2,, k-1
a[i] > a[i+1] , pentru i= k, k+1, ,n
mutrile munte .
Datele de intrare se citesc din fiierul n
, daca
dac nn este
estepar
par
munte.in astfel: de pe prima linie se citete 2
unde k =
dimensiunea irului n, iar de pe urmtoarea linie n + 1 , daca este impar
dac n este impar
n numere reale separate prin cte un spaiu. 2
Permutrile munte generate se vor afia n
fiierul munte.out, pe linii distincte, iar pe ultima linie a fiierului se va afia numrul de
soluii determinat.

Exemplu: munte.in munte.out


6 2 4 13 12 7 5
4 12 13 7 5 2 13 7 2 4 5 12
13 5 2 4 7 12
.

5. S se genereze toate tablourile ptratice de Exemplu : n = 3 c=m Matrice.out


ordin n, care au proprietatea c pe fiecare S1: m 0 0 S3: 0 m 0 S5: 0 0 m
linie ct i pe fiecare coloan se afl un ca- 0 m0 m00 m00
racter citit c. Ordinul n (n numr natural 0 0m 0 0m 0m0
nenul) al tabloului i caracterul c se citesc de S2: m 0 0 S4: 0 m 0 S6: 0 0 m
la tastatur, iar toate tablourile generate se 0 0m 00m 0m0
vor afia n fiierul matrice.out, separate 0 m0 m00 m00
printr-o linie goal. Pe ultima linie din fiier S-au generat 6 soluii
se va afia numrul de tablouri generate.

199
Indicaie: n tabloul soluie X se vor genera permutrile mulimii {1, 2, , n}, nivelul X[k]
va pstra indicele coloanei pe care se va afla caracterul c, iar nivelul k reprezint linia pe care
se va pune caracterul (caracterul c se afl pe poziia (i, j) = (k, X[k]) n tabloul generat).
6. S se genereze toate numerele cu n cifre distincte (nN*, n<=10) cu proprietatea c au suma
cifrelor egal cu 3n+1. Numrul n se citete de la tastatur, iar numerele generate sunt afiate
pe linii distincte n fiierul numere.out. Pe ultima linie a fiierului se va afia numrul de
soluii.
Exemplu: n=2 , n fiierul numere.out se genereaz 7 numere, i anume:
16, 25, 34, 43, 52, 61, 70.
7. S se genereze toate numerele cu n cifre distincte (nN*, n<=10) cu proprietatea c au suma
cifrelor egal cu S. Numerele n i S se citesc din fiierul date.in, iar numerele generate sunt
afiate pe linii distincte n fiierul date.out. Pe ultima linie a fiierului se va afia numrul de
soluii.
Exemplu: n=4 , S=30 n fiierul date.out se genereaz 24 numere, i anume:
6789, 6798, 6879, , 9876.
Care este valoarea maxim a sumei S pentru generarea numerelor cu 6 cifre distincte?
Care este formula pentru determinarea valorii maxime admisibile pentru S, atunci cnd se
genereaz numere cu n cifre distincte (cazul general)?
8. Fie un ir z cu p (pN*) numere ntregi. S se genereze toate posibilitile de rearanjare a ele-
mentelor irului dat astfel nct:
a) s nu existe dou elemente consecutive negative;
b) s nu existe dou elemente consecutive pozitive.
Datele de intrare se citesc din fiierul sir.in astfel: de pe prima linie se citete dimensiunea p
a irului, iar de pe urmtoarea linie se citesc p numere ntregi separate prin cte un spaiu.
irurile generate la punctul a se vor afia pe linii distincte n fiierul sir.out, iar pe ultima linie
se va afia numrul de iruri determinate. irurile generate la punctul b se vor afia pe linii dis-
tincte la sfritul fiierului sir.out, iar pe ultima linie se va afia numrul de iruri determinate.

9. S-a construit un nou centru de locuine format din t (tN*, t>20) cldiri sub forma unor
piramide patrulatere regulate. Arhitectul i designer-ul aleg s (sN* , s>= 4) culori de vopsea
special pentru exteriorul cldirilor. Apoi i propun s vopseasc fiecare fa lateral a unui
bloc utiliznd culori diferite din cele s disponibile, dar faada principal (notat cu 2 faa
ABB1A1) trebuie s aib aceeai culoare c (inclus n cele s culori alese). S se genereze
toate posibilitile de colorare a unei cldiri cu cele s culori.

Datele de intrare se citesc din fiierul culori.in astfel: de pe prima linie se citesc dou numere
naturale nenule t i s i un ir de caractere c separate prin cte un spaiu, iar de pe urmtoarea
linie se citesc s iruri de caractere de lungime maxim 12 care reprezint culorile alese de
arhitect.
n fiierul culori.out se vor afia toate soluiile generate pe linii distincte, iar pe ultima linie
numrul de soluii generate.

200
Figura 57
D1 C1
4
1
A1 B1

2
3

culori.in culori.out
5 portocaliu Faa 1 Faa2 Faa 3 Faa 4
galben portocaliu albastru alb verde Galben Portocaliu Albastru Alb
Galben Portocaliu Albastru Verde
Galben Portocaliu Alb Albastru

Exemplu:
Figura 58
inject.in inject.out 10. S se genereze toate funciile injective f: A B,
unde A={1, 2, , m} i B = {1, 2, , n} sunt
23 f(1) = 1 f(2) = 2
f(1) = 1 f(2) = 3 dou mulimi de numere (m n).
f(1) = 2 f(2) = 1 Datele de intrare se citesc astfel: din fiierul
f(1) = 2 f(2) = 3 inject.in se citesc dou numere naturale nenule m i n
f(1) = 3 f(2) = 1 separate prin cte un spaiu (care reprezint cardinalele
f(1) = 3 f(2) = 2 celor dou mulimi A i B).
s-au generat 6 soluii n fiierul inject.out se vor scrie toate funciile
injective, iar pe ultima linie numrul de funcii injec-
Figura 59
tive determinat. Afiarea se va face ca n exemplul din
biject.in biject.out figura 58.
3 f(1) = 1 f(2) = 2 f(3) = 3 11. S se genereze toate funciile bijective f: A B,
f(1) = 1 f(2) = 3 f(3) = 2
unde A={1, 2, , m} i B = {1, 2, , m} sunt
f(1) = 2 f(2) = 1 f(3) = 3
dou mulimi de numere.
f(1) = 2 f(2) = 3 f(3) = 1
f(1) = 3 f(2) = 1 f(3) = 2 Din fiierul biject.in se citete numrul natural
f(1) = 3 f(2) = 2 f(3) = 1 nenul m (care reprezint numrul de elemente al celor
s-au generat 6 soluii dou mulimi A i B).

201
n fiierul biject.out se vor scrie toate funciile bijective, iar pe ultima linie numrul de funcii
bijective determinat. Afiarea se va face ca n exemplul din figura 59.
12. Identificai varianta corect de rspuns la urmtoarele ntrebri:
i) Care este relaia matematic care determin numrul de funcii injective f: A B, unde
A={1, 2, , m} i B = {1, 2, , n}:
a) nm ; b) mn; c) nu exist; d) mn; e) m! + n!.
ii) Care este relaia matematic care determin numrul de funcii bijective f: A B, unde
A={1, 2, , m} i B = {1, 2, , m}
a) nu exist; b) mm; c) m2; d) m! ; e) 2m.

4. GENERAREA PRODUSULUI CARTEZIAN

Se consider n mulimi M1, M2, , Mn. Mulimile au un cartez.out


{1, 1, 1}
numr finit de elemente: c1= M1 , c2 = M2 ,, cn= Mn . S
{1, 1, 2}
se genereze mulimile produsului cartezian M1 M2 Mn. {1, 2, 1}
Datele de intrare se vor citi din fiierul cartez.in astfel: de pe {1, 2, 2}
prima linie numrul natural n, iar de pe urmtoarea linie n valori {1, 3, 1}
naturale separate prin cte un spaiu, care reprezint cardinalele {1, 3, 2}
celor n mulimi. {2, 1, 1}
{2, 1, 2}
Soluiile generate se vor afia pe linii distincte n fiierul
..
cartez.out, iar pe ultima linie a fiierului se va afia numrul de {2, 3, 2}
soluii gsite. {3, 1, 1}
Exemplu: {3, 1, 2}
cartez.out {3, 2, 1}
2 {3, 2, 2}
232 {3, 3, 1}
{3, 3, 2}
Rezolvare: 18
Etapa I: Identificarea elementelor specifice metodei
Tablou X=(x1, x2, , xn) unde x1 M1, x2 M2, , xn Mn.
Mulimile M1, M2, , Mn sunt mulimi finite avnd c1, c2, , cn elemente.
Mulimile au urmtoarele elemente: M1 = {1, 2,, c1 }, M2 = {1, 2,, c2 }, , Mn = {1,
2,, cn }. n aceast aplicaie se observ c mulimile de valori nu mai coincid.
Tabloul X are n elemente, pentru c se formeaz submulimi doar cu n elemente,
hmax = n, (X[i] Mi)i=1,n

202
Etapa II: Generarea soluiilor se va face ca exerciiu, pentru n=4 i M1 = {1, 2}, M2 = {1, 2, 3},
M3 = {1, 2}, M4 = {1, 2}prin completarea urmtorului tabel, pe baza algoritmului Backtracking:

Sol 1 Sol 2 Sol 3 Sol 4 Sol 5 Sol 6 Sol 7 Sol 8 Sol 9 Sol 10 Sol 11 Sol 12 Sol 13

Sol 14 Sol 15 Sol 16 Sol 17 Sol 18 Sol 19 Sol 20 Sol 21 Sol 22 Sol 23 Sol 24 Sol 25 Sol 26

Etapa III: Implemetarea algoritmului Backtracking iterativ:

LIMBAJUL PASCAL LIMBAJUL C++

var X,card:array[1..20] of integer; #include<fstream.h>


i,n,m,k:integer; ifstream f(cartez.in);
f,g:text; ofstream g(cartez.out);
function mult_val:boolean; int X[20], card[20],i,n,k;
begin int mult_val()
mult_val:=false; {if (X[k]<card[k] )
if(X[k]<card[k]) then { X[k]++ ; return 1 ; }
begin return 0;
inc(X[k]) ; mult_val:=true; end }
end; void afisare()
procedure afisare; { for(i=1;i<=p;i++)
begin g<<X[i]<< ;
for i:=1 to n do g<<endl;
write(g,X[i], ); writeln }
end;

203
procedure generare; void generare()
var sol:integer; sem:boolean; { int sol=0,sem;
begin k=1; X[k]=0;
k:=1; sol:=0; X[k]:=0; while(k)
while(k>0) do { sem=mult_val();
begin if(sem)
sem:=mult_val; if(k==n)
if(sem=true) then { sol++; afisare(); }
if(k=n) then begin else
inc(sol); afisare; {k++; X[k]=0; }
end else
else begin k- -;
inc(k); X[k]:=0; end }
else dec(k); g<< s-au generat <<sol<< solutii ;
end; }
writeln(g, s-au generat ,sol, solutii ); void main()
end; { f>>n;
begin for(i=1;i<=n;i++)
assign(f,cartez.in);reset(f); f>>card[i];
assign(g,cartez.out);rewrite(g); generare();
read(f,n); f.close();
for i:=1 to n do read(f,card[i]); g.close();
generare; close(g); close(f); }
end.

# TEME
1. Stabilii valoarea de adevr a urmtoarelor afirmaii legate de generarea produsului cartezian
a n mulimi:

Nr. Rspuns
Afirmaii
crt. A F
Produsul cartezian este un tablou n care fiecare element se obine ca produs al ele-
1 mentelor din cele n mulimi.

2 Produsul cartezian este o mulime de mulimi ce conin elemente din cele n mulimi
date.
Produsul cartezian este o mulime de mulimi ce conin cte un element din fiecare
3 dintre cele n mulimi date.

204
Fiecare element dintr-o soluie care se genereaz depinde de elementele anterioare.
4

Fiecare element dintr-o soluie care se genereaz depinde de elementele urmtoare.


5

6 Un element al soluiei care se genereaz nu depinde de restul elementelor.

O soluie generat are numrul de elemente egal cu maximul cardinalelor celor n


7
mulimi date.

8 O soluie generat are numrul de elemente egal cu numrul n de mulimi date.

O soluie generat are numrul de elemente egal cu produsul cardinalelor celor n


9
mulimi date.

2. Se consider trei mulimi A, B i C avnd cardinalele a, b respectiv c.


i) Numrul de mulimi generate prin produsul cartezian al celor trei mulimi este:
a) a+b+c; b) a*b*c; c) nedeterminat; d) 3 * (a+b+c).
ii) Elementul X[2] al tabloului soluie:
a) poate lua doar valoarea b;
b) poate s ia valori care sunt cuprinse n intervalul [1,b];
c) poate s ia valori care sunt cuprinse n intervalul (1,b);
d) poate s ia valori care sunt cuprinse n intervalul [1,c].

APLICAII DE LABORATOR

nr_fct.in nr_fct1.out
1. S se genereze toate funciile f: A B, unde
A={1, 2, , n} i B = {1, 2, , m} sunt dou 32 f(1) = 1 f(2) = 1 f(3) = 1
mulimi de numere. Programul se va salva cu f(1) = 1 f(2) = 1 f(3) = 2
numele nr_fct.pas sau nr_fct.c sau nr_fct.cpp. f(1) = 1 f(2) = 2 f(3) = 3
f(1) = 1 f(2) = 2 f(3) = 1
.........................................

Datele de intrare se citesc astfel: din fiierul nr_fct.in se citesc dou numere naturale nenule
n i m separate prin cte un spaiu (care reprezint cardinalele celor dou mulimi A i B).
n fiierul nr_fct.out se vor scrie toate funciile, iar pe ultima linie numrul de funcii deter-
minate. Afiarea se va face ca n exemplul din figura alturat .
Care este formula matematic care determin numrul de funcii :
a) nm; b) n*m; c) mn; d) nu exist.

205
2. S se genereze toate funciile surjective surject1.in surject1.out
f: A B, unde A={1, 2, , n} i 32 f(1) = 1 f(2) = 1 f(3) = 2
B = {1, 2, , m} sunt dou mulimi de f(1) = 1 f(2) = 2 f(3) = 1
numere. Programul se va salva cu numele f(1) = 1 f(2) = 2 f(3) = 2
surject1.pas sau surject1.c sau f(1) = 2 f(2) = 1 f(3) = 1
surject1.cpp. f(1) = 2 f(2) = 1 f(3) = 2
f(1) = 2 f(2) = 2 f(3) = 1
s-au generat 6 soluii

Datele de intrare se citesc astfel: din fiierul surject1.in se citesc dou numere naturale nenule
n i m separate prin cte un spaiu (care reprezint cardinalele celor dou mulimi A i B).
n fiierul surject1.out se vor scrie toate funciile surjective, iar pe ultima linie numrul de
funcii surjective determinate. Afiarea se va face ca n exemplul din figura de mai sus.
Indicaie: Se poate modifica programul construit la prima problem dup salvarea lui cu
numele de surject1.pas sau surject1.c sau surject1.cpp.

3. S se genereze toate funciile surjective f: A B, unde A={a1, a2, , an} i


B = {b1, b2, , bm} sunt dou mulimi de numere reale. O funcie generat trebuie s
v
ndeplineasc condiia: f v,
i=1 (ai)

surject2.in surject2.out
unde v este o valoare real cunoscut.
32 f(-2) = -3 f(3) = -3 f(7) = 1
Datele de intrare se citesc din fiierul
-2 3 7 f(-2) = -3 f(3) = 1 f(7) = -3
surject2.in astfel: de pe prima linie se citesc
-3 1 f(-2) = 1 f(3) = -3 f(7) = -3
dou numere naturale nenule n i m separate
-3 s-au generat 3 soluii
prin cte un spaiu (care reprezint cardinalele
celor dou mulimi), de pe a doua linie se
citesc n numere reale separate prin cte un spaiu (care reprezint elementele mulimii A), de pe
linia a treia se citesc m numere reale separate prin cte un spaiu (care reprezint elementele
mulimii B), iar de pe ultima linie numrul real v.
n fiierul surject2.out se vor scrie toate funciile surjective, iar pe ultima linie numrul de
funcii surjective determinate.
Afiarea se va face ca n exemplul din figura de mai sus.
Indicaie: Se poate modifica programul construit la problema 2 dup salvarea lui cu numele
de surject2.pas sau surject2.c sau surject2.cpp.

206
PROBLEME PROPUSE
1. S se genereze toate cuvintele de lungime n (n<=10) ale alfabetului Morse (formate doar din
caracterele - i .) care nu ncep i nu se termin cu caracterul .
2. S se genereze toate subirurile de c (c 6) cuvinte dintr-un ir x format din p cuvinte de
lungime maxim 20 (cN*, pN* , 0<c<p<10).
Datele de intrare se citesc din fiierul cuvinte.in astfel: de pe prima linie dou numere natu-
rale p i c separate prin cte un spaiu, iar de pe urmtoarea linie se citesc p cuvinte de lungime
maxim 20, separate prin cte un spaiu. Subirurile generate vor fi afiate pe linii distincte n
fiierul cuvinte.out.
3. S se determine toate soluiile ecuaiei 4x+ 2y = 41 , unde (x, y) N2
4. S se determine toate soluiile ecuaiei 3 x+ 2 y +5 z =100, unde (x, y, z) N3,

5. GENERAREA PARTIIILOR UNEI MULIMI


(GENERAREA SUBMULIMILOR UNEI MULIMI )

Se citete de la tastatur un numr n natural nenul. S se submult.out


genereze toate partiiile (submulimile ) mulimii {1, 2, 3, 4, , partiia 1
{123}
n}. Partiiile (submulimile) vor fi afiate pe linii distincte n
partiia 2
fiierul submult.out, iar pe ultima linie se va afia numrul de {12} {3}
partiii (submulimi) generate. partiia 3
Exemplu: Pentru n= 3 submulimile generate sunt reprezen- {13} {2}
tate n caseta alturat. partiia 4
{1} {23}
partiia 5
{1} {2} {3}
Rezolvare: S-au generat 5 partiii
Definiie: Se numete partiie a mulimii P = {1, 2, 3,,n}
o familie P1, P2,,Pm de submulimi ale sale care ndeplinesc urmtoarele condiii:
y Pi pentru i {1, 2, , m};
y Pi Pj = pentru i, j {1, 2, , m}, i j (submulimile sunt disjuncte ntre ele sau
nu au elemente comune);
y P1 P2 Pm = P.
Reprezentarea partiiilor mulimii P se poate face n tabloul X=(x1, x2, , xn), n care ele-
mentul xk (X[k]) reprezint indicele clasei din care face parte elementul k. Clasa elementului 1
este submulimea P1. Clasa elementului 2 este submulimea P1 dac elementul 2 face parte tot
din submulimea P1, altfel clasa elementului 2 este submulimea P2 . Clasa elementului k este P1,
sau P2,, sau Pk.

207
Pentru exemplul dat mai sus soluia 3 afiat : { 1, 3 } { 2 } corespunde urmtoarelor
valori din tabloul soluie X : X[1] = 1, X[2]=2, X[3]=2. Elementele 1 i 3 din mulimea
P={1, 2, 3} fac parte din submulimea 1, iar elementul 2 face parte din submulimea 2 a partiiei
curente.

Etapa I: Identificarea elementelor specifice metodei


Tabloul X=(x1, x2, , xn) unde x1 P1, x2 P2, , xn Pm.
Mulimile P1, P2, , Pm (denumite i clase) sunt mulimi finite avnd cel mult m elemente.
Mulimile de valori nu coincid.
Tabloul X are n elemente, pentru c se construiesc partiiile cu cele n elemente ale mulimii
P, deci hmax = n, (X[i] Pj)i=1,n ; j=1,m
Condiii interne: Dac toate elementele mulimii P={1, 2,, n} fac parte din aceeai clas
(aceeai submulime a partiiei curente) atunci toate elementele tabloului X au aceeai valoare.
Clasele (submulimile) partiiei curente se numeroteaz cu valori consecutive (cresctoare), fr
salturi. Deci pentru oricare i {1, 2,, n} exist un element j al acestei mulimi astfel nct
X[i] X[j] 1. De exemplu: dac n=10 i P1={1, 5, 9} P2={2, 3, 7, 8, 10}, P3 = {4, 6}atunci
tabloul soluie X are urmtoarele valori : X= {1, 2, 2, 3, 1, 3, 2, 2, 1, 2}.
Fie max valoarea maxim a elementelor (x1, x2,, xk-1). Elementul xk poate lua valori din
mulimea de valori {1, 2, , max} (elementul k poate s aparin uneia dintre submulimile
(clasele) elementelor 1, 2, , k-1) sau max +1 (elementul k genereaz o nou clas (sub-
mulime) a partiiei curente). Indicele fiecrei clase xk nu trebuie s depeasc valoarea
indicelui k al elementului.
Afiarea unei partiii se face prin identificarea, pe rnd, a tuturor elementelor unei submulimi,
acestea fiind caracterizate prin aceeai valoare n componentele corespunztoare din tabloul
soluie X.
Etapa II: Generarea soluiilor se va face ca exerciiu, pentru n=4 i P = {1, 2, 3, 4} prin com-
pletarea urmtorului tabel, pe baza algoritmului Backtracking:

1 2
1 1
1 1
1 1
S1 S 2 S 3 S 4 S 5 S 6 S 7 S 8 S 9 S 10 S 11 S 12 S 13 S 14 S 15 S 16 S 17 S 18

Partiia 1 { 1, 2, 3, 4} Partiia 10
Partiia 2 { 1, 2, 3} {4} Partiia 11
Partiia 3 Partiia 12
Partiia 4 Partiia 13
Partiia 5 Partiia 14

208
Partiia 6 Partiia 15
Partiia 7 Partiia 16
Partiia 8 Partiia 17
Partiia 9 Partiia 18
S-au generat partiii

Etapa III: Implemetarea algoritmului Backtracking iterativ

LIMBAJUL PASCAL LIMBAJUL C++


var X :array[1..20]of integer; i,n,k:integer; #include<fstream.h>
g:text; ofstream g(submult.out);
function mult_val:boolean; int X[20],n,k;
var max:integer; int mult_val()
begin {int max,i;
if(k=1) then max:=1 if(k==1) max=1;
else else
begin { max=X[1];
max:=X[1]; for(i=2;i<k;i++)
for i:=1 to k-1 do if(max<X[i])
if max<X[i] then max:=X[i] max=X[i];
end; }
if(X[k]<max+1)and (X[k]<k) then if((X[k]<max+1) &&(X[k]<k))
begin { X[k]++;
inc(X[k]); mult_val:=true; return 1;
end }
else mult_val:=false; else
end; return 0;
procedure afisare; }
var max,j:integer; void afisare()
begin { int max,i,j;
max:=X[1]; max=X[1];
for i:=2 to n do for(i=2;i<=n;i++)
if max<X[i] then max:=X[i]; if(max<X[i]) max=X[i];
for i:=1 to max do for(i=1;i<=max;i++)
begin { g<< { ;
write(g, { ); for(int j=1;j<=n;j++)
for j:=1 to n do if(X[j]==i)
if X[j]=i then g<<j<< ;
write(g,j, ); g<<} ;
write(g,}); }
end; g<<endl;

209
LIMBAJUL PASCAL LIMBAJUL C++
writeln(g) }
end; void generare()
procedure generare; { k=1;
var sol:integer; sem,ev:boolean; int sol=0,sem;
begin X[k]=0;
k:=1; sol:=0; while(k)
x[k]:=0; { sem=mult_val();
while(k>0) do if(sem)
begin if(k==n)
sem:=mult_val; { sol++; g<< partitia <<sol<<endl;
if(sem=true)then afisare();
if(k=n) then }
begin else
inc(sol);writeln(g, partitia ,sol); {k++; X[k]=0; }
afisare; else
end k - -;
else }
begin g<< s-au generat <<sol<< partitii ;
inc(k); X[k]:=0; }
end void main()
else { cin>>n;
dec(k); generare();
end; g.close();
writeln(g, s-au generat ,sol, solutii ); }
end;

begin
assign(g,submult.out);rewrite(g); read(n);
generare; close(g);
end.

# TEME
1. Stabilii valoarea de adevr a urmtoarelor afirmaii, legate de generarea partiiilor unei
mulimi P = {1, 2, 3, ..., n}.

210
Nr. Rspuns
Afirmaii
crt. A F
Se numete partiie a mulimii P = {1, 2, 3, ..., n} o familie P1, P2, Pm, de
submulimi ale sale care ndeplinesc urmtoarele condiii:
1 y Pi = pentru i {1, 2, ..., m};
y Pi Pj pentru i, j {1, 2, ..., m} i j;
y (P1 P2 ... Pm = P

Dac toate elementele mulimii P = {1, 2, ..., n} fac parte din aceeai clas
2 (aceeai submulime a partiiei curente) atunci toate elementele tabloului X
au aceeai valoare.
Elementul xk poate lua valori din mulimea de valori {1, 2, ..., max}
3 (elementul k poate s aparin uneia dintre submulimile (clasele) elementelor
1, 2, ..., k-1) sau max + 1 (elementul k genereaz o nou clas (submulime)
a partiiei curente).

Indicele fiecrei clase xk poate s depeasc valoarea indicelui k al elemen-


4
tului.

Clasele (submulimile) partiiei curente se numeroteaz cu valori consecutive


5 (cresctoare), fr salturi. Pentru oricare i {1, 2, ..., n} exist un element
j al acestei mulimi astfel nct X[i] X[j] 1.

Reprezentarea partiiilor mulimii P se poate face n tabloul X = (x1, x2, ...,


6 xn), n care elementul xk(X[k]) reprezint indicele clasei din care face parte
elementul k.
7 Mulimile de valori coincid.

Mulimile P1, P2, Pm, (denumite i clase) sunt mulimi finite avnd cel mult
8
n elemente.

9 Tabloul soluie X are n elemente (hmax = n, (X[i]Pj)i=1,n; j=1,m).

211
2. Se citete un numr n natural de la tastatur (intrarea standard).
a) S se determine descompunerile numrului n ca sum de numere naturale. Toate descom-
punerile i numrul acestora se vor afia pe linii distincte n fiierul descomp.out.

descomp.out
4=1+1+1+1
4=1+1+2
4=1+2+1
Exemplu: n = 4 4=1+3
4=2+1+1
4=2+2
4=3+1
4=4
S-au generat 8 descompuneri

b) S se determine descompunerile distincte ale numrului n ca sum de numere naturale.


Toate descompunerile i numrul acestora se vor afia pe linii distincte n fiierul
descomp1.out.
Descomp1.out
4=1+1+1+1
4=1+1+2
Exemplu: n = 4 4=1+3
4=2+2
4=4
S-au generat 5 descompuneri

c) S se determine descompunerile numrului n ca sum de numere naturale distincte. Toate


descompunerile i numrul acestora se vor afia pe linii distincte n fiierul descomp2.out.

Exemplu: n = 4
Descomp2.out
4=1+3
4=3+1
4=4
S-au generat 4 descompuneri

d) S se determine descompunerile numrului n ca sum de k numere naturale. Numrul k


este citit tot de la tastatur. Toate descompunerile i numrul acestora se vor afia pe linii
distincte n fiierul descomp3.out.

212
Exemplu: n = 9 i k=3 Descomp3.out
9=1+2+6 9= 2 + 4 + 3
9=1+3+5
9=2+1+6
9=2+3+4
S-au generat soluii

e) S se determine descompunerile distincte ale numrului n ca sum de k numere naturale


distincte. Numrul k este citit tot de la tastatur. Toate descompunerile i numrul acestora se vor
afia pe linii distincte n fiierul descomp4.out.

f) n tabelul de mai jos s se completeze numrul de soluii obinut dup execuia pro-
gramelor scrise la punctele a), b), c), d) i e) pentru datele de intrare indicate.

Programul a) Programul b) Programul c) Programul d)


N= 8 N=12 N= 16 i k = 4 N=24 si k = 3
Nr. Soluii = Nr. Soluii = Nr. Soluii = Nr. Soluii =

PROBLEME PROPUSE
1. Se citete de la tastatur un numr natural nenul n. S se genereze toate descompunerile
numrului n ca sum de numere prime distincte. n fiierul s_prim.out se vor afia pe linii
distincte toate descompunerile generate.
Exemplu: pentru n=30 o parte dintre soluiile generate sunt: (17,13), (7,23), (2, 5, 11, 13) etc.
2. Fie n un numr natural nenul. S se genereze toate descompunerile numrului n ca sum doar
de dou numere naturale nenule a i b (a,b<n). Datele de intrare: n, a i b se citesc din fiierul
date.in. de n fiierul date.out se vor afia pe linii distincte toate descompunerile generate.
Exemplu: n = 38, a= 3, b=7 atunci soluiile generate sunt: (3, 3, 3, 3, 3, 3, 3, 3, 7, 7), (3, 7,
7, 7, 7, 7).
3. De la tastatur se citete un numr natural nenul n. S se determine toate posibilitile de
reprezentare a numrului ca sum de numere naturale, cu proprietatea c suma numerelor
(din descompunerea curent) inversate este subunitar. Toate descompunerile determinate se
vor afia pe monitor, pe linii distincte.
Exemplu: n=10 soluiile generate sunt: (2, 8), (3, 3, 4), (3, 7),, (4, 6), (5, 5), (10).
4. Se citete de la tastatur un numr natural nenul m. S se genereze toate descompunerile
numrului m ca sum de numere naturale distincte al cror cel mai mare divizor comun este
maxim. Descompunerile generate vor fi afiate pe linii distincte n fiierul date.out.
Exemplu: m=68 soluia : (17,51).

213
5. S se genereze toate irurile strict cresctoare formate din numerele naturale cu proprietatea
c primul element din ir este p, iar ultimul element al irului este p+k. Numerele naturale
nenule p i k (0<p<20, 0<k<15) se citesc de la tastatur. irurile generate se vor afia pe linii
distincte n fiierul sir.txt, iar pe ultima linie a fiierului se va afia numrul de iruri deter-
minate. Exemplu: pentru n = 7 i k = 3 se vor afia irurile: (7,8,10), (7,9,10) (7,10),
(7,8,9,10) (ordinea generrii poate s nu coincid cu cea afiat).

MINIPROIECT N ECHIP. COMPANIA EFICIENT


Managerul companiei Eficient dorete s afle rapid vnzrile realizate de oricare dintre
angajai i s organizeze distribuitorii n grupe de cte trei membri, astfel nct vrsta medie
a unui grup s nu depeasc 21 de ani.

Cerine:
1. Analizai noile solicitri ale managerului i stabilii prelucrrile necesare pentru
rezolvarea acestora.
2. Determinai efectele adugrii acestor prelucrri la programele existente.
3. Implementai unitile de program corespunztoare noilor prelucrri.
4. Completai documentaia proiectului cu concluziile rezultate din analiza i rezolvarea
noilor cerine.

214
4
Capitolul
ELEMENTE DE
TEORIA GRAFURILOR

1. SCURT ISTORIC

Primele elemente de teoria grafurilor au aprut nc din anul 1736, cnd matematicianul
Leonhard Euler a publicat, la Academia de tiine din Petersburg, un articol n care propunea,
sub form de joc matematic, rezolvarea problemei podurilor din Knigsberg (astzi oraul
Kaliningrad). Aici existau apte poduri peste delta rului Pregel, desenate ca n figura 60:

Figura 60.

Problema lui Euler:


Se poate face o plimbare, care s includ n traseul su, toate cele apte poduri, astfel nct
fiecare pod s fie traversat o singur dat, iar punctul de oprire s coincid cu punctul de
plecare?

215
Euler a demonstrat c acest lucru este imposi-
bil: indiferent de punctul de la care se ncepe
plimbarea, nu se poate parcurge tot traseul fr a
trece de dou ori pe un pod.

n anul 1857, matematicianul William


Hamilton a inventat un joc ce are la baz noiuni
de teoria grafurilor. Acest joc avea o pies de
lemn n forma unui dodecaedru: poliedru cu
12 fee care sunt toate pentagoane regulate, iar n
fiecare din cele 20 de vrfuri se ntlnesc cte
3 muchii.
Figura 61.

Fiecare vrf al dodecaedrului lui Hamilton era marcat cu numele unui ora. Jocul consta n
determinarea unui drum de-a lungul muchiilor dodecaedrului, care s treac prin fiecare din cele
20 de orae exact o dat i s se ntoarc n oraul din care a plecat. Pentru a uura memorarea
trecerilor efectuate, n fiecare vrf al dodecaedrului era cte un cui cu o floare, astfel nct n
jurul acestor cuie putea s se ntind un fir care s indice drumul parcurs n aceast cltorie
imaginar.
O problem mai general este aceea a voiajorului comercial: Un voiajor comercial trebuie s
prezinte n n orae produsele firmei pe care o reprezint, dup care se ntorce n oraul din care
a plecat. Cunoscndu-se costul deplasrii ntre oricare dou dintre cele n orae, se cere s se
determine un traseu care s viziteze o singur dat cele n orae i care s aib un cost total
minim.

Figura 62.

216
Elemente din lumea real ce pot fi modelate prin teoria grafurilor:
puncte distribuite pe o suprafa i legturile dintre ele: insule-poduri, orae-drumuri;
relaiile interpersonale;
ordonarea unor activiti;
circuite electrice: la mijlocul secolului trecut, fizicianul Kirchhoff a studiat reelele
electrice bazndu-se pe elemente de teoria grafurilor i a contribuit astfel la dezvoltarea
acesteia;
harta cilor ferate este o reprezentare sub form de graf a legturilor feroviare dintre
localiti:

Satu Mare Suceava


Baia Mare
Iai
Beclean
Oradea Pacani
Cluj Dej Bicaz Vaslui
Arad Apahida Bacu
Ika Teiu Vntori Brlad
Ciceu Adjud
Deva Vntu
Timioara
Simeria de Jos Mreti Tecuci
Lugoj
Podul-Olt Braov
Galai
Caransebe Subcetate Curteade Buzu Furei Tulcea
Arge Ploieti
ndrei
Titu
Orova Urziceni Medgidia
Piteti
Filiai Piatra-Olt Bucureti Feteti Constana
Craiova
Roiori Giurgiu
Mangalia

CHO
Figura 63.

H C OH

y formulele de structur ale substanelor chimice sunt gra-


furi pentru care legturile dintre vrfuri corespund legturilor HO C H
dintre gruprile sau atomii care compun molecula.
H C OH

H C OH
n figura 64 este prezentat molecula de glucoz.

Figura 64. OH
CH2

217
2. GRAFURI NEORIENTATE

2.1. Noiuni de baz

Definiie
Se numete graf neorientat o pereche ordonat de mulimi (X,U) cu semnificaia: X este o
mulime finit i nevid de elemente numite noduri, U este o mulime de perechi neordonate
(submulimi cu dou elemente din X), numite muchii.

Un graf neorientat se noteaz cu G=(X,U), unde X se numete mulimea nodurilor grafului G,


iar U se numete mulimea muchiilor.
O submulime {x,y} de vrfuri din X se noteaz cu u=[x,y] (u este muchie iar x i y sunt
extremitile), u U.
n cazul general, ntr-un graf neorientat G = (X,U), se folosesc notaiile:

y card (X) = n numrul de noduri din graf;

y card (U) = m numrul de muchii din graf.

Multe dintre problemele de interes practic pot fi reprezentate prin grafuri. Structura unui
website poate fi reprezentat folosind un graf: nodurile sunt paginile website-ului; exist o
muchie care leag pagina oarecare A de pagina oarecare B, dac i numai dac pagina A conine
un link ctre pagina B.
5 1 3

Pentru vizualizare i nelegere intuitiv, un 7


6 2 4
graf poate fi reprezentat cu ajutorul unei figuri
Figura 65
plane, n care fiecrui nod xX i se asociaz un
punct n plan, iar fiecrei muchii u=[x,y] i se aso- Figura 66
ciaz o linie ce unete punctele corespunztoare 6 3
nodurilor x i y.
5 1 4
Grafurile din figura 65 i figura 66 sunt echiva-
lente. 7 2

Exemplul 1:
Fie G=(X,U) un graf neorientat cu reprezentarea din
figura 67. 1 2 7
Definiie
Fie uU , u=[x,y] . Nodurile x i y din X sunt 3
adiacente n G iar u i x sunt incidente (la fel u i y). 6

Nodul 1 este adiacent cu nodul 2 deoarece ele sunt 4 5 Figura 67


extremiti ale muchiei [1,2].

218
Nodul 2 este adiacent cu nodul 6 deoarece ele sunt extremiti ale muchiei [2,6].
Nodul 3 este incident cu muchia [2,3] deoarece el este extremitate a muchiei.

Observaie:
Nu exist diferen ntre muchia [1,2] i muchia
[2,1] (nu exist orientare a muchiei).
a d

Exemplul 2:
X = {a, b, c, d, e, f, g, h, i, j}
b c
U = { [a,b]; [a,c]; [a,d]; [f,g]; [f,h]; [g,h]; [g,j];
[h,i]; [j,i] } e

g j

Exemplul 3 (transpus din fizic): i


X = {1, 2, 3, 4, 5, 6, 7,8} h

U = { [1,2]; [1,3]; [1,5]; [2,4]; [2,8]; [3,4]; [5,6]; Figura 68.


[6,7];[6,8]; [7,8] }

5 R3 1 R1 3
5 1 3
R8

6 R2 6
R5 R6 R4

7 8 2 4
7 8 2 4

Figura 69. Figura 70.

2.2. Gradul unui nod

Definiie:
prin gradul unui nod x, notat d(x), se nelege numrul de muchii incidente cu nodul x.

Exemplul 1:
Fie graful neorientat G=(X,U) (figura 71),
X = {1, 2, 3, 4, 5, 6} i U = { [1,2] ; [1,3] ; [1,4] ; [1,5] ; [3,4] ; [3,5] ; [4,6]};
n = 6 (numrul de noduri),
m = 7 (numrul de muchii).
Se determin gradul fiecrui nod:

219
d(1)=4, deoarece muchiile incidente cu nodul 1 sunt n
1
numr de 4
( [1,2], [1,3], [1,4] i [1,5]) ;
d(2)=1, deoarece exist o singur muchie incident cu
nodul 2 ([1,2]) ; 2 3 4
d(3)=3, deoarece muchiile incidente cu nodul 3 sunt n
numr de 3 5 6
( [1,3], [3,4] i [3,5]) ;
d(4)=3, deoarece muchiile incidente cu nodul 4 sunt n Figura 71
numr de 3
( [1,4], [3,4] i [4,6]) ;
d(5)=2, deoarece muchiile incidente cu nodul 5 sunt n numr de 2
( [1,5] i [3,5]) ;
d(6)=1, deoarece exist o singura muchie incident cu nodul 6([4,6]).

Definiie:
Se numete nod izolat un nod cu gradul 0.
Se numete nod terminal un nod cu gradul 1.
a d

Exemplul 2 (figura 72):


d(a)=d(g)=d(h)=3 ;
b c
d(b)=d(c)=d(d)=1; b,c,d sunt noduri terminale;
d(f) = d(j)=d(i)=2; e
d(e) = 0, deci nodul e este nod izolat (nu exist
nicio muchie incident cu nodul (e). g j

# TEME f
1. Fie G = (X,U), un graf neorientat;
X = { 1, 2, 3, 4, 5} i i
h Figura 72
U = { [1,3]; [1,6]; [2,4]; [2,5]; [3,6]; [4,5]}
Cerine:
a) Realizai reprezentarea grafic a acestui graf. 1
b) Determinai nodurile de grad par.
c) Determinai muchiile incidente cu nodul 2 i nodul de
grad maxim.
2 3 4
2. Pentru graful din figura 73, determinai nodul cu cel mai
mare grad.
5 6
3. Pentru graful neorientat din figura 74, determinai: Figura 73

220
a) Mulimea muchiilor i mulimea
nodurilor. 1 2
b) Nodurile izolate.
4
c) Nodurile cu grad impar.
d) Nodurile adiacente cu nodul 3. 6
3
e) Nodurile impare de grad par. 5
4. Se cunosc contractele ncheiate ntre 7
Figura 74
firmele A, B, C, D, E, F:
Firma A a ncheiat contracte cu firmele C i D.
Firma B a ncheiat contracte cu firmele C, E, F.
Firma E a ncheiat un contract cu firma F.
Cerine:
a) asociai datelor din problem reprezentarea grafic corespunztoare;
b) determinai mulimea de noduri i mulimea de muchii pentru graful obinut;
c) determinai firma ce a ncheiat cele mai multe contracte i firma ce a ncheiat cele mai
puine contracte;
d) determinai numrul de contracte ncheiate ntre firmele A, B, C, D, E, F;
e) precizai care este semnificaia numrului de contracte ncheiate de o firm.
5. S se determine mulimea U a grafului neorientat G = (X,U), unde,
X = {1, 2, 3} i d(1) = 1, d(2) = 2, d(3) = 1.
6. Fie funcia f: {1, 2, 3, 4, 5} {2, 3} definit

3, dac
daca x este numar par
f ( x) =
5, daca
dac x este numar impar

S se determine mulimea U a grafului G= (X,U) obinut prin asocierea cu funcia f.


Realizai reprezentarea grafic a lui G.

7. Fie G = (X,U) un graf neorientat cu 10 noduri. Toate nodurile sunt izolate. Precizai numrul
de muchii ale grafului.

2.3. Reprezentarea n memorie a grafurilor neorientate

Fie G = (X,U) un graf neorientat, unde X = {1, 2, 3, , n}, nN*, este mulimea nodurilor,
iar U este mulimea muchiilor. Reprezentarea n memoria calculatorului a unui graf neorientat se
poate face prin mai multe modaliti; alegerea formei de reprezentare a unui graf depinde de
problema pentru care se solicit algoritmul de rezolvare.

221
2.4. Memorarea grafurilor folosind matricea de adiacen

Matricea de adiacen ataat unui graf este o matrice ptrat cu n linii i n coloane (n este
numrul de noduri din mulimea X), cu elementele:

A[i, j] = { 1,0,[i,[i,j]j]U;U.
Observaii:
1. Matricea de adiacen ataat unui graf neorientat este o matrice simetric fa de diago-
nala principal, deoarece pentru orice muchie [i,j] U este adevarat relaia
A[i,j] = A[j,i].
2. Muchia [i,j] exist n graful neorientat G = (X,U) reprezentat prin matricea de adiacen,
dac A[i,j] = 1.
3. Suma valorilor din matricea de adiacen ataat unui graf neorientat este egal cu 2*m,
unde m este numrul muchiilor din graf.
4. Fie xX. Gradul nodulului x este egal cu suma valorilor elementelor matricei de adiacen
ataat grafului neorientat, de pe linia x sau coloana x.
Figura 75
Exemplul 1: 1
Fie G = (X,U) , din figura 75.
X = {1, 2, 3, 4, 5, 6} i U = { [1,2], [1,3], [1,4], [1,5], [3,4],
[3,5], [4,6]};
n = 6 (numrul de noduri), 2 3 4
m =7 (numrul de muchii).
Matricea de adiacen asociat acestui graf este: 5 6


0 1 1 1 1 0
1 0 0 0 0 0 Elementele din matricea de adiacen situate pe
diagonala principal au valoarea 0. Acestea sunt de


1 0 0 1 1 0 forma A[i,i] i, cum nu exist muchie de la un nod
A=
1 0 1 0 0 1 la el nsui pentru grafurile studiate, rezult


c A[i,i] = 0.
1 0 1 0 0 0
Se observ c d(1) = 4 (numrul elementelor
0 0 0 1 0 0 egale cu 1 de pe prima linie), d(2) = 1 (numrul ele-
mentelor egale cu 1 de pe linia 2).

Pentru graful dat, suma elementelor din matricea ataat este 14, adic 2*m.
Matricea de adiacen ataat unui graf neorientat poate fi citit direct de la tastatur sau din
fiierul de intrare sau poate fi completat iniial cu 0, urmnd a fi citite din fiierul de intrare m
perechi de vrfuri ce reprezint muchiile de forma [x,y]; se completeaz A[x,y] = 1 i A[y,x] = 1.
Exemplu de citire a matricei de adiacen ataat unui graf neorientat dintr-un fiier dat:

222
Matrice.txt

1 2 7 7
0110000
1010111
1101100
3 0010000
6
0110000
0100000
4 5 0100000
Figura 76

Varianta Pascal Varianta C++


procedure citirematrice(var a :matrice ; void citirematrice(int a[11][11], int &n)
var n :integer); {int i,j;
var i,j:integer; fstream f(c:\\matrice.txt,ios::in);
begin f>>n;
assign(f,matrice.txt); for (i=1;i<=n;i++)
reset(f); for (j=1;j<=n;j++)
readln(f,n); f>>a[i][j];
for i:=1 to n do f.close();
for j:=1 to n do }
read(f,a[i,j]);
close(f);
end;

Exemplul 2:

Fie G = (X,U) un graf neorientat,


n este numrul de noduri din G, m este numrul de muchii din G.

Urmtoarea secven de program calculeaz gradul pentru fiecare nod al grafului G reprezen-
tat prin matricea de adiacen:

Varianta Pascal Varianta C ++


for i :=1 to n do for (i=1;i<=n;i++)
begin { gr=0 ;
gr:=0; for (j=1;j<=n;j++)
for j:=1 to n do if (a[i][j]) gr++;
if a[i,j]=1 then gr:=gr+1; cout<<Gradul lui <<i;
writeln(Gradul lui ,I, este ,gr) cout<< este <<gr<<endl;
end ; }

223
# TEME
1. Construii matricea de adiacen pentru fiecare dintre grafurile de mai jos:

a) G1 b) G2 c) G3

1 1 2 2 5
2 7
1 4 7
3
3 5 7 3 6
6 6
8
4 5 4

2. Determinai valoarea de adevr a urmtoarelor afirmaii:


a) Matricea de adiacen a unui graf neorientat are un numr impar de valori de 1.
b) Orice matrice de adiacen a unui graf neorientat are pe diagonala secundar numai valori
nule.
c) Din matricea de adiacen a unui graf neorientat se poate afla gradul oricrui nod.
d) Suma componentelor matricei de adiacen ataat unui graf neorientat este egal cu 2*n,
unde n = numrul de noduri ale grafului.
e) Din matricea de adiacen ataat unui graf neorientat se poate determina numrul de
muchii din graf.
f) Matricea de adiacen a unui graf neorientat este simetric fa de diagonala principal.

3. Fie un graf G = (X, U) reprezentat prin matricea de adiacen:



0 1 1 1 0 0
Precizai care dintre urmtoarele muchii aparin grafului: 1 0 1 0 0 0


1 1 0 0 0 0
a) [3,4] b) [2,3] c) [1,2] d) [4,5] A=
1 0 0 0 1 1


0 0 0 1 0 0
0 0 0 1 0 0

4. Fie un graf G = (X,U) unde X = {1, 2, 3, 4, 5, 6, 7, 8}.


n graf exist muchii ntre perechile de noduri x i y cu proprietatea ca x i y sunt prime ntre
ele.
a) Determinai mulimea muchiilor U.
b) Construii matricea de adiacen ataat grafului dat.
c) Determinai suma elementelor matricei de adiacen.

224
2.5. Memorarea grafurilor folosind listele de adiacen

Reprezentarea unui graf neorientat se poate realiza utiliznd listele de adiacen a nodurilor:
pentru fiecare nod se alctuiete lista nodurilor adiacente cu el.
Figura 77.
Exemplu: 1
Pentru graful G = (X,U)
se formeaz urmtoarele liste de adiacen:

Lista vecinilor lui 1: 2, 3, 4, 5 2 3 4


Lista vecinilor lui 2: 1
Lista vecinilor lui 3: 1, 4, 5 5 6
Lista vecinilor lui 4: 1, 3, 6
Lista vecinilor lui 5: 1, 3
Lista vecinilor lui 6: 4.

Observaii:
1. Numrul de elemente din lista vecinilor unui nod reprezint gradul su. Dac nodul este
izolat, atunci lista lui de adiacen este vid.
2. Memorarea grafului prin intermediul listelor de adiacen prezint avantajul c, n gene-
ral, ocup mai puin spaiu. Dezavantajul utilizrii listelor de adiacen l constituie accesul la
informaii.
3. Suma lungimilor listelor este egal cu 2*m, unde m reprezint numrul de muchii.

Urmtoarea secven de program construiete listele de adiacen pentru un graf neorientat


G, pornind de la matricea de adiacen ataat acestuia. Se obine o matrice ce va conine pe
linia i (1<=i<=n) lista de adiacen a nodului i. Se obine o matrice de liste.
Varianta Pascal Varianta C ++
type matrice=array[1..20,1..20] of integer ; int a,liste[21][21]
var a,liste:matrice;

Se iniializeaz cu 0 toate elementele matricei de liste.


Varianta Pascal Varianta C ++
procedure liste_de_adiac(a :matrice ; void liste_de_adiac(int a[21][21],
n :integer ;var liste :matrice) ; liste[21][21])
var i,j,k:integer; int i,j,k ;
begin {
for i:=1 to n do for (i=1;i<=n;i++)
for j:=1 to n do for (j=1;j<=n;j++)
liste[i,j]:=0; liste[i][j]=0;
for i :=1 to n do for (i=1;i<=n;i++)
begin {k=1;
k:=1; for (j=1;j<=n;j++)

225
for j:=1 to n do if (a[i][j])
if a[i,j]=1 then {liste[i][k]=j;
begin k++;
liste[i,k]:=j; }
k:=k+1; }
end; }
end;
end;

# TEME
1. Construii listele de adiacen pentru fiecare dintre grafurile de mai jos:

a) G1 b) G2 c) G3

1 1 2 2 5
2 7
1 4 7
3
3 5 7 3 6
6 6
8
4 5 4


0 1 1 1 0 0
2. Fie un graf G = (X, U) reprezentat prin matricea de 1 0 1 0 0 0
adiacen:

1 1 0 0 0 0
a) Specificai dac graful G are noduri izolate. A=
1 0 0 0 1 1
b) Cte muchii are graful G?

0 0 0 1 0 0
c) Determinai gradul fiecrui nod.
0 0 0 1 0 0
d) Determinai listele de adiacen pentru graful G.
1
3. Fie graful lui Petersen (figura 78):
a) Construii listele de adiacen. 7
b) Analizai listele construite; ce observai ? 5 2
6 8

4. Fie un graf G = (X,U), unde X = {1, 2, 3, 4, 5, 6, 7, 8}.


n graf exist muchii ntre perechile de noduri x i y cu 10 9
proprietatea ca x i y sunt prime ntre ele. Determinai lis- 4 3
tele de adiacen pentru graful G.
Figura 78

2.6. Memorarea grafurilor neorientate folosind lista muchiilor


Fie G = (X,U) un graf neorientat cu n noduri i m muchii.
Lista extremitilor muchiilor este format dintr-o matrice de dou coloane i m linii, n
care pe fiecare linie exist dou valori ce reprezint nodurile componente ale unei muchii.
Pentru memorarea acestei matrice sunt necesare 2*m locaii de memorie.

226
Exemplu: 1 5
Fie graful G = (X,U) (figura 79).
Pentru acest graf, lista muchiilor este reinut n
matricea A: 2 3 4


1 2
1 3 Figura 79

A=
1 4


1 5
2 3

Secvena urmtoare de program construiete lista muchiilor pentru un graf neorientat.


Citirea datelor se face dintr-un fiier organizat astfel: pe prima linie se precizeaz numrul de
noduri i numrul de muchii, iar pe fiecare dintre urmtoarele linii cele dou extremiti ale
unei muchii:

Muchii.txt
78
1 2 12
7
13
23
3 25
6 26
27
4 5 34
35

Varianta Pascal Varianta C ++

type matrice=array[1..20,1..2] of integer ; int a[21][3]


procedure citire_muchii(var a :matrice ; Void citire_muchii(int a[21][3],
var n,m :integer) ; int &n, int &m)
var i:integer; int i;
begin {
assign(f,muchii.txt); fstream f(c:\\muchii.txt,ios::in);
reset(f); f>>m;
readln(f,n,m); f>>n;
for i:=1 to m do for (i=1;i<=n;i++)
begin {
read(f,a[i,1]); f>>a[i][1];
read(f,a[i,2]); f>>a[i][2];
end; }
close(f); f.close();
end; }

227
# TEME
1. Construii lista muchiilor pentru fiecare dintre grafurile de mai jos:
a) G1 b) G2 c) G3

1 1 2 2 5
2 7
1 4 7
3
3 5 7 3 6
6 6
8
4 5 4

2. Fie un graf G = (X,U), unde X = {1, 2, 3, 4, 5, 6, 7, 8}.


n graf exist muchii ntre perechile de noduri x i y cu proprietatea c x i y sunt prime ntre
ele. Determinai lista muchiilor pentru graful G.
3. Fiind dat un graf neorientat memorat prin matricea sa de adiacen, s se scrie cte un subpro-
gram pentru rezolvarea urmtoarelor cerine:
afiarea nodurilor de grad maxim;
afiarea nodurilor de grad minim;
afiarea nodurilor izolate;
afiarea nodurilor terminale.
4. Se cunosc listele de adiacen corespunztoare unui graf neorientat. S se scrie un program
care construiete matricea sa de adiacen.
5. Harta unei ri este format din mai multe regiuni. O parte dintre regiuni au frontiera comun.
Scriei un program care s afieze regiunea care se nvecineaz cu cele mai multe dintre regiuni.
6. Implementai memorarea grafurilor neorientate prin lista muchiilor, folosind un vector de articole.
(Indicaie: fiecare articol conine dou cmpuri corespunztoare extremitilor unei muchii.)

3. CLASE SPECIALE DE GRAFURI

3.1 Grafuri complete


Definiie: 1
Un graf G=(X,U) se numete graf complet
dac ntre oricare dou noduri ale sale exist
muchii. Un graf complet se noteaz Kn. 2 5
Exemplu:
Graf complet cu 5 noduri :
Proprieti:
1. d(1)=d(2)=...=d(n)=n-1;
3 4
2. Graful Kn are n*(n-1) muchii;
2 Figura 80.
3. Dintre toate grafurile cu n noduri, Kn are numrul maxim de muchii.

228
Aplicaie: S se verifice dac exist un graf cu 100 de noduri i 4951 de muchii.
Rezolvare:
Un graf complet cu 100 de noduri are 4950 de muchii; un graf complet are numrul
maxim de muchii dintre toate grafurile cu 100 de noduri; rezult c nu exist niciun graf cu
100 de noduri i 4951 de muchii.

3.2. Grafuri pariale


Definiie:
Fie graful G=(X,U). Un graf parial al lui G este un graf G1=(X,V), unde VU.
Se observ c G1 se obine din G pstrnd toate nodurile i eliminnd un numr de muchii.
Exemplu :
G=(X,U) G1=(X,V)-graf parial al lui G
1 1

2 9 6 2 6
9

8 7 8 7
3 5 3 5

4 4

Din graful neorientat G au fost eliminate muchiile [7 ,8], [7,9], [8,9] i a rezultat graful
parial G1.

3.3. Subgrafuri

Definiie:
Fie graful G=(X,U). Un subgraf al lui G este un graf G1=(X1,U1), unde
X1X i U1U, iar U1 va conine numai muchiile care au ambele extremiti n X1.

Se observ c G1 se obine din G eliminnd unele noduri i pstrnd doar acele muchii
care au ambele extremiti n mulimea nodurilor rmase.
1 G=(X,U) G1=(X1,U1) 1

2 6 2 9 6
9

8 7
8 7
3 5
3 5 X={1,2,3,4,5,6,7,8,9}
4
4
X1={1,2,3,4,5,6,7,8}
229
Se observ c din mulimea X a fost eliminat nodul 9. Mulimea U1 va conine aceleai
elemente ca i U mai puin muchiile [9,1], [9,8] i [9,7].

# TEME
1. Fie G i G1 dou grafuri neorientate ce au matricele de adiacen A, respectiv A1.


0 1 0 0 0 0 1 0 0 0
1 0 1 0 1 1 0 1 0 0


A= 0 1 0 1 1

A1 = 0 1 0 1 0


0 0 1 0 1


0 0 1 0 1
0 1 1 1 0 0 0 0 1 0

Stabilii valoarea de adevr pentru urmtoarele afirmaii :


a) G este un graf complet cu 5 noduri.
b) G1 este subgraf al grafului G.
c) G1 este graf parial pentru graful G.
d) Dac la graful G1 se adaug nc 4 muchii, acesta va deveni graf complet.
2. Fie G un graf ce conine patru noduri i zero muchii. Cte muchii trebuie adugate gra-
fului G, asfel nct acesta s devin graf complet?
3. Stabilii valoarea de adevr a urmtoarelor afirmaii :
Un graf este complet dac:
a) Fiecare nod are cel puin o muchie adiacent.
b) Are n*(n-1)/2 muchii (n reprezint numrul de noduri).
c) Gradele tuturor nodurilor sale sunt pare.
d) Are n*(n+1)/2 muchii (n reprezint numrul de noduri).
4. Fie G=(X,U) un graf neorientat.
Stabilii valoarea de adevr a urmtoarelor afirmaii :
a) Un graf parial se obine prin suprimarea unor noduri.
b) Un subgraf se obine prin suprimarea unor muchii.
c) Orice subgraf al lui G este graf parial al grafului G.
5. Cte noduri are graful complet cu 15 muchii?
a) 10; b) 5; c) 6; d) 12.
6. Fie G=(X,U) un graf neorientat reprezentat prin listele de adiacen:
Lista vecinilor lui 1: 3, 4.
Lista vecinilor lui 2: 3, 4.
Lista vecinilor lui 3: 1, 2.
Lista vecinilor lui 4: 1, 2.
Cte muchii trebuie adugate la graful G astfel nct acesta s devin graf complet?
7. Fie G un graf neorientat cu n noduri i m muchii i G1 un graf neorientat cu n1 noduri
i m1 muchii. Se citesc de la tastatura m perechi de numere ntregi reprezentnd

230
extremitile muchiilor grafului G i m1 perechi de numere ntregi reprezentnd extre-
mitile muchiilor grafului G1. S se verifice dac G1 este graf parial al lui G.
8. Din cauza unor probleme provocate de vremea nefavorabil, mai multe relee de amplifi-
care i retransmitere a semnalului pentru o telefonie mobil au fost avariate. Cunos-
cndu-se legturile iniiale de transmitere a semnalului i releele avariate, s se determine
care sunt legturile de transmitere a semnalului care nc mai funcioneaz.

4. PARCURGEREA GRAFURILOR NEORIENTATE

Prin parcurgerea sau traversarea unui graf neorientat se urmrete examinarea nodurilor
sale, plecnd dintr-un nod dat x, astfel nct fiecare nod, la care se poate ajunge din x pe
muchii adiacente dou cte dou, s fie marcat o singur dat.

4.1. Metoda de parcurgere Breadth First (BF) parcurgerea n lime


Fie G = (X,U) un graf neorientat. Algoritmul BF realizeaz o traversare n lime a
grafului: se marcheaz nodul iniial x, apoi vecinii acestuia, apoi vecinii nevizitai ai aces-
tora i aa mai departe.
1

Exemplul 1:
Pentru graful din figura 81, dac nodul de start este 1, 2 3 4
ordinea de parcurgere a nodurilor va fi: 1, 2, 3, 4, 5, 6, 7, 8.
Dac nodul de start este 4, atunci prin metoda BF se obine 5 6 7
urmtoarea ordine de parcurgere a grafului: 4, 1, 6, 7, 2, 3, 5, 8.
Algoritmul folosete o structur de tip coad (fir de Figura 81.
8
ateptare), c, n care se introduc pe rnd nodurile vizitate i un
vector vizitat definit astfel:
1, daca
dac nodul ii a fost vizitat
vizitat[i] =
0, altfel
Raionamentul metodei BF
Iniial, vectorul vizitat are toate valorile nule (nu a fost vizitat niciun nod).
Nodul de start este 4 i se memoreaz n coad pe poziia 1.

Se marcheaz nodul 4 ca fiind vizitat.

231
p = marcator ce indic nodul ai crui vecini nevizitai
1
urmeaz s fie memorai n coad.
Se memorez n coad, pe poziiile urmtoare, vecinii
nodului 4, adic 1, 6, 7. 2 3 4

5 6 7

8 Figura 82.

Se marcheaz nodurile 1, 6 i 7 ca fiind vizitate. 2 3 4

5 6 7

8 Figura 83.
Marcatorul p se deplaseaz cu o poziie n coad.

Se memoreaz n coad, pe poziiile urmtoare, vecinii nevizitai ai nodului 1, adic


nodurile 2 i 3:

Se marcheaz nodurile 2 i 3 ca fiind vizitate:


2 3 4

5 6 7

8
Figura 84.

232
Marcatorul p se deplaseaz cu o poziie n coad:

Se memoreaz n coad, pe poziiile urmtoare, vecinul nevizitat al nodului 6, adic 5:

2 3 4

Se marcheaz nodul 5 ca fiind vizitat. 5 6 7

8 Figura 85.

Marcatorul p se deplaseaz cu o poziie n coad:

Nodul 7 are toi vecinii vizitai.


Marcatorul p se deplaseaz cu o poziie n coad:

Nodul 2 are toi vecinii vizitai.


Marcatorul p se deplaseaz cu o poziie n coad:

233
Nodul 3 are toi vecinii vizitai. Marcatorul p se deplaseaz cu o poziie n coad:

Se memoreaz n coad, pe poziia urmtoare, vecinul nevizitat al nodului 5, adic 8:

2 3 4
Se marcheaz nodul 8 ca fiind vizitat.

5 6 7

8 Figura 86.
Marcatorul p se deplaseaz cu o poziie n coad:

Nodul 8 are toi vecinii vizitai.


Marcatorul p se deplaseaz cu o poziie n coad:

Au fost vizitate (marcate) toate nodurile. Figura 87.


1
Exemplul 2:
Fie graful G = (X,U): 9
2 3 4

6
5

8 7

234
Dac nodul de start este 2, atunci ordinea de parcurgere a nodurilor grafului n parcurge-
rea BF este 1, 5, 3, 4.
Observaie:
Nodurile 6, 7, 8, 9 nu vor fi atinse.

Reprezentarea algoritmului BF n pseudocod


pentru j = 1 la n execut
vizitat[j] 0
sfrit pentru;
citete i;
c[1] i;
/*se memoreaz n coad nodul i pe prima poziie*/
p 1 /*p reprezint poziia elementului cheie*/
u 1 /*u reprezint poziia ultimului element din coad*/
vizitat[i] 1;
ct timp p u execut
/*ct timp coada nu e vid*/
x c[p];
/*x este elementul cheie, adic nodul ai crui succesori nevizitai vor fi memorai
n coad*/
pentru toi j Listei vecinilor lui x nevizitai nc execut
/*pentru toi vecinii nodului x nevizitai nc*/
u u+1;
c[u] j;
/*se memoreaz n coada vecinul j nevizitat nc*/

prelucrare (j);
/*de regul se face afiarea nodului j*/
vizitat[j] 1;
sfrit pentru;
p p+1;
/*se alege urmtorul nod ca fiind nod cheie*/
sfrit ct timp;

Ordinul de complexitate al algoritmului de parcurgere n lime a grafurilor neorien-


tate este 0(n) deoarece instruciunile din ciclul atta timp ct se execut de cel mult n-1 ori,
iar cele interioare, structura pentru se execut de cel mult n ori.

# TEME
1. Alctuii lista nodurilor n ordinea dat de vizitarea lor prin metoda parcurgerii
BF(Breadth First), pentru grafurile din figura 88 i figura 89:
235
Figura 88. Figura 89.

2. Parcurgei graful urmtor n lime (BF),


completai vectorul vizitat i coada (firul de
ateptare) cu nodurile vizitate, dar ai cror
vecini nu au fost vizitai nc.

Figura 90.

3. Implementai n limbajul de programare studiat algoritmul BF.


4. Justificai necesitatea tabloului de tip coad pentru implementarea metodei BF.
5. Dezvoltai un algoritm de parcurgere a unui graf n lime (BF) care, testat i pe graful
de la problema 3, s viziteze toate nodurile.
6. Dezvoltai un algoritm recursiv de parcurgere n lime a unui graf.

4.2. Metoda de parcurgere Depth First (DF) parcurgerea n adncime


Fie G = (X,U) un graf neorientat unde n reprezint numrul de noduri ale sale.
Algoritmul DF realizeaz o parcurgere n adncime a grafului: se pornete de la un
nod x i se atinge primul dintre vecinii nevizitai ai acestuia; algoritmul continu pn se
ajunge la un nod ce are toi vecinii vizitai. n acest moment, se revine la nodul anterior i
se caut un nod nevizitat.

Exemplul 1:
Fie G = (X,U), un graf neorientat. (Figura 91)
Pentru graful dat, ordinea de parcurgere a nodurilor prin metoda DF, pornind din nodul
unu, este: 1, 2, 3, 5, 6, 4, 7, 8.

236
Dac nodul de start este 4, atunci prin metoda DF se
obine urmtoarea ordine de parcurgere a grafului:
4, 1, 2, 3, 5, 6, 8, 7.
Algoritmul folosete o structur de tip stiv n care va
introduce (sau elimina) nodurile vizitate din graf i un vec-
tor cu n componente, pentru marcarea nodurilor vizitate
definit astfel:

Figura 91.
1, daca
dac varful
nodul ii a fost vizitat;
vizitat[i] =
0, altfel .

Raionamentul metodei DF
Iniial vectorul vizitat are toate valorile nule:

Se introduce n stiv nodul de start. Fie acesta nodul 4. Figura 92.


Se afieaz nodul 4 i se marcheaz ca fiind vizitat.

Se determin primul dintre vecinii nodului din vrful stivei, se mrete cu o unitate
vrful stivei i pe aceast poziie se nregistreaz nodul 1.
Se afieaz nodul 1 i se marcheaz ca fiind vizitat.

Figura 93.

237
Se determin primul dintre vecinii nevizitai ai nodului 1; acesta este nodul 2, se mrete
cu o unitate vrful stivei (stiva crete); pe noua poziie din stiv se nregistreaz nodul 2.
Se afieaz nodul 2 i se marcheaz nodul 2 ca fiind vizitat.

Se ncearc determinarea unui vecin


nevizitat al nodului 2. Singurul vecin al
nodului 2 este nodul 1 care a fost deja
vizitat. Se extrage din stiv nodul 2 i se
micoreaz cu o unitate vrful stivei. Figura 94.

Se determin primul dintre vecinii nevi-


zitai ai nodului 1; acesta este nodul 3 (nodul
2 a fost deja vizitat); se mrete cu o unitate Figura 95.
vrful stivei i pe noua poziie se nregis-
treaz nodul 3.
Se afieaz nodul 3 i se marcheaz nodul 3 ca fiind vizitat.

Se determin primul dintre vecinii


nevizitai ai nodului 3; acesta este nodul
5, se mrete cu o unitate vrful stivei i
pe noua poziie din stiv se nregistreaz
nodul 5.
Figura 96.

Se afieaz nodul 5 i se marcheaz ca fiind vizitat.

238
Figura 97.

Se determin primul dintre vecinii nevizitai ai nodului 5; acesta este nodul 6, se mrete
cu o unitate vrful stivei i pe noua poziie din stiv se nregistreaz nodul 6.
Se afieaz nodul 8 i se marcheaz ca fiind vizitat. Algoritmul continu pn cnd stiva
devine vid.

Reprezentarea n pseudocod a algoritmului DF de parcurgere a grafurilor


pentru i = 1 la n execut
vizitat [i] 0;
sfrit pentru;
ps 1;
citete x;
s[ps] x;
vizitat[x] 1;
scrie x;
/*se memoreaz n stiv pe poziia 1 nodul de plecare, se marcheaz ca fiind vizitat i se prelu-
creaz informaia ataat afiare n acest caz*/
ct timp ps > 0 execut
/*ct timp stiva nu este vid se ncearc determinarea primului nod vecin cu nodul indicat
de ps din stiv i care nu e vizitat nc*/
gsit false;
i 2;
ct timp (i <= n) AND (gsit = false) execut
dac (A[s[ps],i] = 1) i (vizitat[i] = 0) atunci
gsit true
altfel i i+1
sfrit dac
sfrit ct timp;
dac gsit = true atunci
scrie(i);
vizitat[i] 1;
ps ps+1;
s[ps] i;
altfel ps ps-1;
sfrit dac
sfrit ct timp

239
# TEME
1. Alctuii lista nodurilor n ordinea dat de vizitarea lor prin metoda parcurgerii DF, pen-
tru grafurile din figura 98 i din figura 99.

Figura 98.
Figura 99.

2. Parcurgei graful din figura 100 n adncime (DF) i completai vectorul vizitat i stiva
nodurilor vizitate, dar ale cror vecini nu au fost vizitai nc.

Figura 100.

3. Implementai n limbajul de programare studiat algoritmul DF.


4. Justificai necesitatea tabloului de tip stiv pentru implementarea metodei DF.
5. Descriei metoda de programare care st la baza parcurgerii DF.
6. Dezvoltai un algoritm de parcurgere a unui graf n adncime (DF) care, testat i pe gra-
ful de la problema 2, s viziteze toate nodurile.
7. Dezvoltai un algoritm recursiv de parcurgere n adncime a unui graf.

240
5. NOIUNEA DE CONEXITATE N GRAFURI NEORIENTATE

Studiu de caz: Traseu turistic.

Pe harta unei regiuni apar puncte turistice legate prin drumuri ca n figura 101. Dac un
grup de turiti se afl n punctul turistic A, se cere s se determine toate posibilitile de
constituire de trasee turistice care s i conduc n punctul turistic B, fr s viziteze de dou
ori acelai punct turistic.

Graful asociat acestei probleme:

Figura 101. Figura 102.

Exemple de trasee: Figura 103.

a) b)

Definiie :
Fie G=(X,U) un graf neorientat. Se numete lan n graful G o succesiune de noduri
L=(x1, x2, x3. ,xk), unde x1, x2, x3. ,xkX cu proprietatea c oricare dou noduri conse-
cutive sunt adiacente ([xi, xi+1]U unde i=1, k-1) i muchiile sunt distincte dou cte dou.
Lungimea lanului este egal cu numrul de muchii componente.

241
Exemple: Figura 104.
1. Pentru graful G=(X,U), unde
X={A,B,C,D,E,F}
U={[A,C];[A,E];[B,C];[B,D];[B,F];[C,D];[E,F]}
exist urmtoarele exemple de lanuri :
L=(A,C,D,B) de lungime 3;
L=(C,D,B,C,A) de lungime 4;
2. Fie G=( X ,U) (figura 104):
L=(3, 4, 6, 5, 4, 2) este un lan de lungimea 5.

Definiie:
Se numete lan elementar un lan n care nodurile componente sunt distincte dou
cte dou.

Exemplu:
Fie graful din figura 105.
L=(b,d,e,f) este lan elementar.
L=(a,b,f,d,b,e) este un lan neelementar.
Figura 105.

Definiie:
Se numete ciclu ntr-un graf un lan L=(x1, x2, x3. ,xk), unde x1, x2, x3. ,xkX cu
proprietatea c x1= xk i muchiile componente sunt distincte dou cte dou.

Definiie:
Un ciclu elementar este un ciclu n care toate nodurile, cu excepia primului i a ulti-
mului, sunt distincte dou cte dou.

Exemplu :
Fie G=( X ,U) un graf neorientat ce are
reprezentarea din figura 106.
L = (3,4,5,6,3) este ciclu elementar
L = (1,2,3,4,5,6,3,1) este ciclu neelementar
Figura 106.

Definiie:
Fie G=(U,V) un graf neorientat. G este un graf conex dac, oricare ar fi dou noduri
ale sale x i y, exist cel puin un lan prin care se poate ajunge de la nodul x la nodul y.

242
Exemple: Figura 107.
1. Fie G=(X,U) un graf neorientat (figura 107):
Se observ c, pentru oricare dou noduri, exist un
lan care le unete.
Prin parcurgerea acestui graf, se observ c vor fi
marcate toate nodurile: exist lanuri ce unesc oricare
dou noduri din acest graf.

Observaii:
y La parcurgerea BF a grafului, ordinea de parcur-
gere a nodurilor este 1,2,4,3,6,5,7,8,9 i vectorul vizitat
va avea toate componentele completate cu valoarea 1.
y La parcurgerea DF a grafului ordinea de parcugere a nodurilor este: 1, 2, 3, 5, 4, 6, 7,
8, 9, iar vectorul vizitat va avea toate nodurile completate cu valoarea 1.
2. Fie graful G=(X,U) din figura 108:

Prin parcurgerea DF pornind din


nodul 3, se obine urmtoarea ordine a
nodurilor: 3,1,4,5,8. Vectorul vizitat este:

Figura 108.

Concluzie
Se observ c, nodurile 2, 6, 7 nu au fost vizitate, graful nu este graf conex.
Dac se aplic acestui graf un algoritm de parcurgere BF pornind din nodul 3, atunci
ordinea de parcurgere a nodurilor sale este: 3, 1, 4, 8, 5. Vectorul vizitat este:

Nodurile 2, 6 i 7 nu au fost vizitate i nu se poate ajunge la ele pornind din nodul 3 i


mergnd pe muchii adiacente.
Concluzie
Graful G nu este graf conex.
Dac se reia parcurgerea grafului pornind dintr-un nod care nu a fost vizitat se obine,
pentru o parcurgere BF, ordinea 2, 6, 7; Vectorul vizitat este:

243
Pentru a putea fi marcate toate nodurile, au fost necesare dou parcurgeri ale grafului G.

Definiie:
Se numete componenta conex a grafului neorientat G=(X,U) un subgraf conex
G1 = (X1,U1) a lui G, cu proprietatea c nu exist niciun lan care s lege un nod din
mulimea X cu un nod din mulimea complementar X-X1.

Pentru graful G=(X,U) din figura 109:


Se obin subgrafurile:
G1 =(X1,U1),
cu X1 ={1,3,4,5,8}
U1 ={[1,3];[1,4];[1,5];[4,8]}
i
G2=(X2,U2),
cu X2={2,6,7}
U2={[2,6];[2,7];[6,7]} Figura 109.

Observaii:
y G1, G2 sunt grafuri conexe deoarece exist cel puin un lan ntre oricare dou noduri
din G1 respectiv G2.
y Pentru X1 ={1,3,4,5,8}, obinem mulimea complementar
X- X1={2,6,7}; se observ c nu exist niciun lan care s lege un nod din X1 cu un nod
din X-X1.
y Pentru X2={2,6,7} obinem mulimea complementar X-X2={1,3,4,5,8} i se observ
c nu exist niciun lan care s lege un nod din X2 cu un nod din X-X2.

Concluzie
G1 i G2 sunt componente conexe pentru graful G.

Observaie:
Un graf conex are o singur component conex.

244
Reprezentarea n pseudocod a algoritmului de verificare a conexitii unui
graf neorientat.

pentru j = 2 la n execut
vizitat [j] 0;
sfrit pentru
c[1] 1;
vizitat [1] 1;
p 1;
u 1;
ct timp p u execut
pentru toti j Lx nevizitati execut
u u+1;
c[u] j;
vizitat[j] 1;
sfrit pentru;
p p+1;
sfrit ct timp;
conex true;
i 1;
ct timp (conex=true) AND (i<=n) execut
dac vizitat[i] = 0 atunci
conex false
altfel i i+1;
sfrit dac
sfrit ct timp
dac conex=true atunci
scrie (Graful este conex.);
altfel scrie (Graful nu este conex.)
sfrit dac;

Arhipelag
aplicaie conexitate
Harta unui arhipelag este codificat printr-o matrice binar ptrat unde
suprafeele terestre sunt marcate cu 1 i cele marine cu 0. S se determine cte insule
fac parte din arhipelag. O insul este compus din unul sau mai multe elemente ale
matricei marcate cu 1 care se nvecineaz pe direciile N, S, E, V.

Date de intrare: se citesc din fiierul Date.in:


Pe prima linie: n = dimensiunea matricei ptratice.
Pe urmtoarele linii, elementele matricei.
Date de ieire: nr (numrul de insule).

245
Exemplu:
Date.in Date de ieire:
5 5
11011
00001
00010
10000
10111
Varianta Pascal Varianta C++
program insule; #include <fstream.h>
type matrice=array[0..100,0..100] of byte; int n,a[100][100];
var A:matrice; void citire() {
n,i,j:byte int i,j;
procedure citire; fstream f(date.in,ios::in);
var f:text; f>>n
begin from (i=1; i<=n; i++)
assign(f,date.in); for(j=1;j<=n;j++)
reset(f); f>>a[i,j];
readln(f,n); f.close();
for i:=1 to n do }
for j:=1 to n do void df(int x, int y){
read(f,A[i,j]); int i;
close(f); a[x][y]=2;
end; if (a[x-1][y])
procedure df(x,y:integer); df(x-1,y);
begin if (a[x+1][y])
A[x,y]:=2; df(x+1,y);
if A[x-1,y]=1 then df(x-1,y); if (a[x][y-1])
if A[x+1,y]=1 then df(x+1,y); df(x,y-1);
if A[x,y-1]=1 then df(x,y-1); if (a[x][y+1])
if A[x,y+1]=1 then df(x,y+1); df(x,y+1);
end; }
begin void main() {
citire; int i,j,nr=0;
for i:=0 to n+1 do citire();
begin A[0, i]:=0; A[n+1, i]:=0 end; for (i=0; i<n=1; i++)
for i:=1 to n do {A[0][i]=0; A[n+1][i]=0};
begin A[i, 0]:=0; A[i, n+1]:=0 end; for (i=0; in+1; i++)
nr:=0; {A[i][0]=0; A[i][n+1]=0};
for i:=1 to n do for (i=1;i<=n;i++)
for j:=1 to n do for (j=1;j<=n;j++)
if A[i,j]=1 then begin if (a[i][j]==1){
nr:=nr+1; nr++;
df(i,j); df(i,j);
end; }
write(numarul de insule este: ,nr); cont<<nr. de insule este<<nr<<endl;
readln; }
end.

246
# TEME
1. Fiind dat un graf G=(X,U), s se determine un lan elementar al acestuia de lungime
maxim.
2. S se determine dac ntr-un graf cu n noduri i m muchii exist un ciclu care s conin un
nod oarecare k introdus de la tastatur. Elementele geafului se citesc din fiierul graf.in cu
urmtoarea structur: pe prima linie, valorile pentru n i m; pe urmtoarele m linii, cte dou
valori reprezentnd extremitile unei muchii.
3. S se verifice dac un graf este hamiltonian- conine un circuit hamiltonian: circuit elemen-
tar care trece prin toate nodurile grafului.
4. Implementai n limbajul studiat algoritmul de verificare a conexitii unui graf.
5. Explicai metoda de verificare a conexitii folosit n algoritmul prezentat.
6. Formulai exemple de probleme care s conduc la determinarea conexitii.
7. ntr-un grup de persoane se cunosc relaiile de prietenie. S se determine cercurile de per-
soane cu proprietatea c ntre oricare dou persoane din acelai cerc sunt relaii de prie-
tenie (aplicnd principiul prietenul prietenului meu este prietenul meu) i numrul
minim de relaii de prietenie (precum i prieteniile respective) care ar trebui realizate
pentru a exista un singur cerc de prieteni.
8. n fiierul Date.in, pe prima linie, se afl numrul de noduri n ale unui graf neorientat
G=(X,U) , pe urmtoarele n linii, matricea de adiacen ataat grafului, iar pe ultima
linie dou noduri (v1 i v2). S se determine lanurile elementare de lungime minim
existente ntre nodurile v1 i v2.

6. GRAFURI ORIENTATE

Structura unui graf poate fi extins prin asocierea unei funcii pentru fiecare muchie a gra-
fului. Grafurile cu funcii pot fi folosite pentru reprezentarea a diferite situaii; de exemplu:
dac un graf reprezint o reea de drumuri, funcia poate reprezenta lungimea fiecrui drum.
Alt mod de a extinde un graf simplu este asocierea unei direcii muchiilor grafului
(A e legat de B, dar B nu e neaprat legat de A, ca ntr-o pagin web), un astfel de graf se
numete graf orientat sau digraf.

Simpozion. Studiu de caz

La un simpozion pe teme de IT se ntlnesc profesori din diverse judee ale rii. n grupul
respectiv exist profesori ce sunt cunoscui de ali participani la simpozion. S se gseasc
profesorul (profesorii) cel mai cunoscut din grup i profesorul (profesorii) ce nu este cunos-
cut de niciun alt membru al grupului.

247
Exemplu:

Popescu
Pop Ion Pavel
Simona
Simionescu George
Victor

Pop
Manuel

Sima
Ilinca

Solomon
Maria

Interpretarea reprezentrii grafice:


y Domnul Popescu Ion l cunoate pe domnul Pavel George, pe doamna Pop Simona i
pe doamna Sima Ilinca.
y Domnul Simionescu Victor l cunoate pe domnul Pop Manuel i o cunoate pe doamna
Sima Ilinca.
y Doamna Solomon Maria o cunoate pe doamna Sima Ilinca.
y Domnul Pop Manuel o cunoate pe doamna Pop Simona.

Observaii:
Doamna Sima Ilinca este cea mai cunoscut persoan din grup.
Domnii Popescu Ion i Simionescu Victor i doamna Solomon Maria nu sunt cunoscui
de niciun alt membru al grupului.

Concluzie:
Persoanele i relaiile dintre ele formeaz un graf orientat.

Definiie
Se numete graf orientat o pereche ordonat de mulimi G=(X,U), unde:
X este o mulime finit i nevid de elemente numite vrfuri.
U este o mulime format din perechi ordonate de elemente ale lui X, numit
mulimea arcelor.

Observaii:
y Arcul [x,y] este diferit de arcul [y,x].
y Pentru fiecare arc u=[x,y], x reprezint extremitatea iniial, iar y reprezint extremi-
tatea final a arcului.
y Se spune c arcul iese din vrful x i intr n vrful y.
y Vrfurile x i y sunt adiacente.

248
y Arcul u este incident cu vrful x (respectiv y).
y Vrful y se numete succesor al vrfului x.
y Vrful x se numete predecesor al vrfului y.
y Dac G=(X,U) este un graf orientat i U este o mulime nevid, atunci spunem c G
este graf nul i reprezentarea lui n plan se reduce la puncte izolate.

Exemplul 1:
Graful asociat problemei din studiul de caz este:
G=(X,U)
X={1,2,3,4,5,6,7}
U={[1,2];[1,3];[1,7];[4,3];[4,6];[5,3];[6,7]}

Figura 110
# TEME
1. Formulai un exemplu de situaie care s poat fi modelat prin graful din figura 111
(explicai semnificaia vrfurilor i a arcelor).

Fie G1=(X1,U1) unde


X1={1,2,3,4,5,6,7,8}
U1={[1,6];[2,3];[2,7];[3,2];[3,4];[4,7];[4,5];[7,2];[7,6];[8,5];[8,6]}

Figura 111.

2. Se cunosc n localiti i m drumuri ntre aceste localiti.


a) Formulai un exemplu de graf neorientat care s aib la baz aceste date.
b) Formulai un exemplu de graf orientat care s aib la baz aceste date.

249
Gradul unui vrf

Definiie
Fie G=(X,U) un graf orientat i x X. Se numete grad exterior vrfului x numrul
arcelor care ies din vrful x, adic numrul arcelor de tipul [x,y] U, y X.
Gradul exterior se noteaz cu d+(x),
Se numete grad interior al vrfului x numrul arcelor care intr n vrful x, adic
numrul arcelor de tipul [y,x] U, y X. Gradul interior se noteaz d-(x),

Exemple
Fie graful din figura 112.
Se determin gradele vrfurilor:
d+(1)=3; d-(1)=0
d+(2)=0; d-(2)=1
d+(3)=0; d-(3)=3
d+(4)=2; d-(4)=0
d+(5)=1; d-(5)=0
d+(6)=1; d-(6)=1
d+(7)=0; d-(7)=2 Figura 112.
Revenind la studiul de caz, putem spune c:
y profesorul cel mai cunoscut este definit de vrful cu gradul interior cel mai mare.
y profesorul care nu este cunoscut de niciun alt membru al grupului va fi definit de vr-
ful cu gradul exterior egal cu 0.

Pentru fiecare profesor putem alctui lista cu persoanele pe care le cunoate precum i
lista cu persoanele care l cunosc. n acest sens se obin mulimile:

+(x)={y X | [x,y] U} mulimea succesorilor vrfului x.


-(x)={y X | [y,x] U} mulimea precedenilor vrfului x. Figura 113.

Exemple
Pentru graful din figura 113.
Se obine:
d+(4)=2; +(4)={5,7};
d-(4)=1; -(4)={3}
d+(6)=0; +(6)={};
d-(6)=3; -(6)={1,7,8}

250
Observaie:
card(+(x))= d+(x) card(-(x))= d-(x) pentru x X.

Reprezentarea n memorie a grafurilor orientate

Fie G=(X,U), unde X este o mulime cu n vrfuri, iar U este o mulime cu m arce.
Pentru reprezentarea n memorie a grafurilor orientate se pot folosi mai multe moda-
liti: matricea de adiacen, listele de adiacen, matricea vrfuri-arce i vectorul de arce.

6.1. Memorarea grafurilor orientate prin matricea de adiacen

Matricea de adiacen asociat unui graf orientat este definit prin:

1, dac [i,j] U
A[i,j] = { 0, altfel.

Observaie:
Deoarece [x,y]<>[y,x] pentru x,y X, atunci se constat c matricea de adiacen
ataat unui graf neorientat nu este simetric.
Exemple:
Pentru graful din figura 114, matricea de adiacen ataat este:

0 1 0 0

0 0 1 1
A=
0 1 0 1

0 0 0 0

Figura 114.

Observaii:
Matricea de adiacen este o matrice ptrat cu n linii i n coloane.
Multe elemente ale matricei de adiacen sunt nule; folosind o astfel de reprezentare se
consum spaiu de memorie (matricea este rar).
Numrul de valori egale cu 1 de pe linia i din matrice (1 i n), reprezint gradul exte-
rior al vrfului i.
Numrul de valori egale cu 1, de pe coloana j din matrice (1 j n), reprezint gradul
interior al vrfului j.
Numrul de valori egale cu 1 din matrice reprezint numrul de arce existente n graful
orientat.

251
# TEME
1. Precizai care dintre urmtoarele variante reprezint matricea de adiacen ataat grafu-
lui orientat din figura 115:
a) 100100 b) 100100
101111 111111
000010 Figura 115.
001010
001000 001100
000001 000011 1 3
100000 100001

c) 010100 d) 001000 2
101111 101111
101000 000100 6 4
010001 000010
100000 000001 5
010100 100000

2. Pentru graful din figura 115, determinai mulimea vrfurilor cu proprietatea c diferena
dintre gradul exterior i gradul interior este -1:
a) {} b) {2} c) {1,3,4,5,6} d) {1,2,3,4,5,6}
3. Pentru graful din figura 115, determinai numrul de vrfuri cu gradul interior egal cu 2.
a) 1; b) 5; c) 0; d) 4.
4. Se d matricea de adiacen ataat unui graf orientat:
0101
A = 0000
0100
0110
Care este numrul de vrfuri cu proprietatea c gradul exterior este mai mare sau egal
cu gradul interior?
a) 0; b) 1; c) 2; d) 3.
5. Fie G un graf orientat, ca n figura 116:
Se dau doi vectori dext i dint unde dext[i] Figura 116.
memoreaz gradul exterior al vrfului i, iar dint[i]
gradul interior, 1<=i<=5. 2
Care dintre perechile de vectori de mai jos se refer la
graful din figura 116: 1
dext=(3,0,2,1,0); dint=(1,2,1,0,1) 3
dext=(2,0,2,2,0); dint=(1,0,0,0,2)
dext=(3,0,2,0,0); dint=(1,2,1,1,1)
dext=(2,0,2,0,0); dint=(0,2,0,0,0) 5
4

252
6. Determinai valoarea de adevr pentru urmtoarele afirmaii:
a) Matricea de adiacen ataat unui graf orientat este ptrat i simetric.
b) Numrul de valori egale cu 1 din matricea de adiacen ataat unui graf orientat este
egal cu numrul de arce corespunztor acelui graf.
c) Numrul de valori egale cu 1 de pe coloana j din matrice (1<=j<=n) reprezint gradul
interior al vrfului j.
d) Matricea de adiacen ataat unui graf orientat conine pe diagonala principal
numai valori egale cu 1.
7. Realizai un program, n limbajul studiat, pentru rezolvarea problemei propus n
studiul de caz (simpozion).

6.2. Memorarea unui graf orientat folosind listele de adiacen


Prin aceast metod, se reine, pentru fiecare vrf, mulimea succesorilor si.

Exemplu
Pentru graful din figura 117,
listele de adiacen vor fi:
Lista vrful 1: 2, 3, 7
Lista vrfului 2:-
Lista vrfului 3:-
Lista vrfului 4: 3, 6
Lista vrfului 5: 3
Lista vrfului 6: 7
Lista vrfului 7:- Figura 117.

# TEME
1. Fie G un graf orientat (figura 118). 1 3
Pentru fiecare vrf determinai listele de adiacen.
2. Se d urmtoarea matrice de adiacen a unui graf
orientat: 2
0101 6 4
A= 0000
0100
5
0110
Pentru fiecare vrf determinai listele de adiacen.
Figura 118.
3. Se d urmtoarea matrice de adiacen a unui graf orientat:
0111
A= 0000
0101
0000

253
Determinai vrful a crui list de adiacen are un numr maxim de componente:
a)1; b)2; c)3; d)4.

6.3. Reprezentarea unui graf orientat folosind matricea vrfuri-arce


Matricea vrfuri-arce este o matrice cu n linii i m coloane definit astfel:

{
1, dac vrful i este extremitate iniial a arcului uj

a[i,j]= -1, dac vrful i este extremitate final a arcului uj

0, dac vrful i nu este extremitate a arcului uj

Exemplu:
Fie G=(X,U) (figura 119).
Matricea vrfuri arce este:

1 1 1 0 0 1 0

1 0 0 1 1 0 1
A= 0 0 0 1 0 0 0
Figura 119.
0 1 0 0 0 0 0
0 0 1 0 1 1 1

Interpretarea matricei vrfuri-arce.


Cum a fost determinat ultima linie din matrice? Aceast linie corespunde vrfului 5.
a[5,1]= 0 deoarece vrful 5 nu este incident cu arcul u1.
a[5,2]= 0 deoarece vrful 5 nu este incident cu arcul u2.
a[5,3]= -1 deoarece vrful 5 este extremitate final a arcului u3.
a[5,4]= 0 deoarece vrful 5 nu este incident cu arcul u4.
a[5,5]= -1 deoarece vrful 5 este extremitate final a arcului u5.
a[5,6]= 1 deoarece vrful 5 este extremitate iniial a arcului u6.
a[5,7]= 1 deoarece vrful 5 este extremitate iniial a arcului u7.

Observaii:
Numrul de valori egale cu 1 din linia i a matricei vrfuri-arce reprezint gradul exte-
rior al vrfului i.
Numrul de valori egale cu -1 din linia i a matricei vrfuri-arce reprezint gradul inte-
rior al vrfului i.

254
Pe fiecare coloan i a matricei vrfuri-arce exist o singur valoare egal cu 1 (pe linia
x din matrice deoarece x este extremitate iniial a arcului ui) i o singur valoare egal cu
-1 (pe linia y din matrice deoarece y este extremitate final a arcului ui), pentru ui=[x,y];
1x, yn, ui U, 1im.

# TEME
1. Determinai matricea vrfuri-arce corespunztoare grafului orientat din figura 120.
a) 1 -1 0 0 b) 1 1 0 1 0
1 0 0 -1 -1 0 -1 0 0
0 -1 1 0 0 0 1 -1 -1
1 0 -1 0 0 0 1 -1 -1
0 0 1 -1 0 -1 0 0 1

u1
1 2

u4 u3
u2

u5 3
4 Figura 120.

c) 1 1 0 1 0 d) 1 1 0 1
-1 0 -1 0 0 -1 0 -1 0
0 0 1 -1 1 0 0 1 -1
0 -1 0 0 -1 0 -1 0 0

2. Determinai valoarea de adevr pentru urmtoarele afirmaii:


a) Matricea vrfuri-arce ataat unui graf orientat este o matrice ptrat.
b) Numrul de valori egale cu 1 din linia i a matricei vrfuri-arce reprezint gradul exte-
rior al vrfului i.
c) Numrul de valori egale cu -1 din coloana i a matricei vrfuri-arce reprezint gradul
exterior al vrfului i.
d) Pe fiecare coloan a matricei vrfuri-arce exist o singur valoare egal cu 1 i o sin-
gur valoare egal cu -1.

255
6.4. Reprezentarea unui graf orientat ca un vector de arce

Un arc poate fi privit ca o celul cu dou cmpuri componente reprezentnd extre-


mitile sale: vrful iniial i vrful final.
Fie ui U; 1im; ui=[x,y]; 1x,yn.
Se obine un vector de nregistrri numit vector de arce.
Figura 121.
Exemplu:
G=(X,U) (figura 121)
X={1,2,3,4,5}
U={[1,2];[1,5];[2,1];[2,3];[3,4];[5,4]}
va avea urmtoarea reprezentare
folosind un vector de arce.

# TEME
1. Fie G un graf orientat (figura 122). Figura 122.
Determinai vectorul de arce corespunztor.
2. Se d urmtoarea matrice de adiacen a unui
graf orientat: 1 3
0111
A= 0000
2
0101
0000 6 4
Determinai vectorul de arce corespunztor.
5

Parcurgerea grafurilor orientate

Pentru prelucrarea informaiilor ataate vrfurilor unui graf orientat se folosesc cele
dou parcurgeri studiate la grafurile neorientate: parcurgerea n lime BF i parcurgerea n
adncime DF.
Diferena fa de parcurgerea grafului neorientat const n urmrirea direciilor impuse
de arce.

256
Parcurgerea n lime a grafurilor orientate
(BF) 1 2
Fie G=(X,U) un graf orientat (figura 123).

Pornind din vrful 1 parcurgerea va fi: 1,2,3,5,4. 4


5 3

Figura 123.
Parcurgerea n adncime a grafurilor orientate (DF)
Pentru graful de mai sus ordinea de parcurgere a vrfurilor, pornind din vrful 1, este:
1, 2, 3, 4, 5.

# TEME
1. Alctuii lista vrfurilor n ordinea dat de vizitarea lor prin metoda parcurgerii BF
(respectiv DF) pentru grafurile din figura 124:
Figura 124.

a) b) c)

2. Pentru graful din figura 125, rezolvai urmtoarele ce-


rine:
a) parcurgei graful pe lime-BF i completai vectorul
vizitat i firul de ateptare folosit n algoritm;
b) ce particulariti au vrful 4 i vrful 5?
Figura 125.
c) ce semnificaie are noiunea de conexitate pentru un graf orientat?

3. Parcurgei graful din figura 125 n adncime-DF i completai vectorul vizitat al vr-
furilor vizitate i stiva folosit n algoritm.
4. Implementai n limbajul de programare studiat algoritmul BF (respectiv DF), folosind
listele de adiacen pentru memorarea grafului orientat.
5. Dezvoltai un algoritm recursiv de parcurgere n lime a unui graf orientat.
6. Dezvoltai un algoritm recursiv de parcurgere n adncime a unui graf orientat.

257
Drumuri i circuite n grafuri orientate

Definiie
Fie G=(X,U) un graf orientat. Se numete drum n graful G, D=(x1,x2,...xk) o succe-
siune de vrfuri cu proprietatea ca [xi,xi+1 ] U, unde 1<=i<=k-1.

Observaii:
y Vrfurile x1 i xk sunt numite extremitile drumului.
y Lungimea drumului este dat de numrul de arce componente. Figura 126.

Exemple: 2
1
D1=(1,6,1,3,5,4) este un drum de
lungime 5. 4
D2=(4,2,1,6) este un drum de lungime 3. 6
D3=(3,5,4,2,1,6,1,3) este un drum de 3
lungime 7.
5

Definiie
Se numete drum elementar ntr-un graf orientat, un drum pentru care vrfurile compo-
nente sunt distincte dou cte dou.

Exemple:
D2=(4,2,1,6) este un drum elementar.
D1=(1,6,1,3,5,4) este drum neelementar.

Definiie
Se numete circuit ntr-un graf orientat un drum pentru care cele dou extremiti coincid.

Exemplu: D4=(5,4,2,1,3,5).

Definiie
Se numete circuit elementar un circuit n care toate elementele sunt distincte dou cte
dou, cu excepia primului i a ultimului element.

Exemple: D4 =(5,4,2,1,3,5) este circuit elementar.


D3=(3,5,4,2,1,6,1,3) este circuit neelementar.

258
# TEME Figura 127.

1. Pentru graful din figura 127, determinai


un drum ce are extremitate iniial vrful
1 i extremitate final vrful 2.

Figura 128.
2. Pentru graful din figura 128, determinai
toate drumurile elementare de lungime 3.

3. Pentru graful din figura 129, determinai


toate circuitele. Figura 129.

Matricea drumurilor ataat unui graf orientat


Fie G=(X,U) un graf orientat cu n vrfuri. Asociem acestui graf o matrice ptrat cu n
linii i n coloane denumit matricea drumurilor i definit astfel:

M[i, j] ={ 1, dac exist drum de la vrful i la vrful j


0, altfel.

Exemplu:
Pentru graful din figura 130 matricea drumurilor este:

6 0 1 1 1 1 0
1
2
0 0 1 0 0 0
0 0 0 0 0 0
3
M =
4 0 0 0 10 10 0
0 0
5
Figura 130.
0 0 1 10
Se observ c M[1,3]=1 deoarece exist drumul 0 1 1 0 0 0

(1,2,3) ntre vrful 1 i vrful 3.

259
Observaie:
n urma parcurgerii DF a grafului din figura 130, se vor atinge urmtoarele vrfuri, n
ordinea: 1, 2, 3, 4, 5.
Deci 2, 3, 4, 5 sunt vrfurile la care putem ajunge, pornind din vrful 1 i urmrind sensul arcelor.
Astfel, pe linia 1 din matricea drumurilor vom obine valoarea 1 pe coloanele 2, 3, 4 i 5.
Pentru completarea matricei drumurilor se aplic parcurgerea DF pentru celelalte vrfuri
(2, 3, 4, 5 i 6).

Matricea costurilor ataat unui graf orientat


n multe situaii reale legturile (arcele) dintre dou puncte (vrfuri) au asociat un cost cu
diferite semnificaii: lungime, timp de parcurgere.
Pentru astfel de grafuri se construiete matricea costurilor:
Exemplu: Fie G = (X,U) un graf orientat: cos t (i, j ) , [i, j ] U ;
C[i, j ] =
6 1 4 0, [i, j ] U .
2
2 3
10 3 0 6 2 0 10
7 3
0 0 0 0 7
5
2
4 C = 4 0 0 3 0

3 0 0 0 0

0 0 0 2 0
# TEME
1. Pentru grafurile din figura 131 (a, b, c), determinai matricea drumurilor.

a) b) c)

Figura 131.
0 10 0 0 0

2. Determinai graful orientat ce 4 0 2 0 0
are matricea costurilor: C = 0 0 0 0 4

2 0 5 0 0
0 0 9 0 0

260
7. ARBORI
Definiie
Un arbore este un graf conex aciclic ( fr cicluri).

O structur de date de tip arbore devine intuitiv dac ne imaginm modalitatea de orga-
nizare a directoarelor i fiierelor ntr-un sistem de operare.

Asemntor acestui exemplu este i modelul arborelui genealogic al unei familii:

Figura 132.

Dup modelul arborelui genealogic de mai sus, putem obine graful din figura 133.

261
Figura 133. Observaii:
Graful este conex.
Graful nu conine cicluri.
Concluzii:
G este un arbore.
Un arbore poate fi aezat pe niveluri.
Se alege un vrf care se aaz pe nivelul 1
i acesta se va numi rdcina.
Pe nivelul 2 vor fi aezate acele vrfuri
Figura 134. care sunt legate printr-o muchie direct de
rdcin i procedeul continu pn vor fi
aezate toate nodurile pe nivelele cores-
punztoare (figura 134).
Notaii:
X= vrf printe sau predecesor, tat;
Y= vrf fiu sau copil, succesor.
Vrfurile care se afl pe ultimul nivel se
numesc vrfuri terminale sau frunze.
Vrfurile pot conine o informaie util
(cheie) care poate fi de orice tip.

Exemplu:

Fie arborele din figura 135. Se observ c:


y Vrful 1 este rdcina arborelui.
y Vrful 1 este printe pentru vrful 2 i vrful 3.
y Vrful 2 este descendent (fiu, copil) pentru vrful 1.
y Vrful 3 este descendent (fiu, copil) pentru vrful 1.
y Vrfurile 3, 4, 6 i 7 sunt vrfuri terminale (frunze).
Figura 135.

Teorem
Un arbore cu n vrfuri are n-1 muchii.

Demonstraie prin inducie matematic:


1. P(n): este o propoziie adevrat. Un arbore care conine doar un singur vrf are un
numr de muchii egale cu 0.
2. S demonstrm c P(m) este adevrat, cu m>1, presupunnd c afirmaiile P(k) sunt
adevrate pentru k<m.
Dac se elimin o muchie dintr-un arbore, atunci se ajunge la un graf care nu va mai fi
conex i se obin doi arbori. Fie p, respectiv q, numrul de vrfuri din cei doi arbori, unde:
m=p+q; p<m, q<m
262
Primul arbore va avea p-1 muchii iar cel de-al doilea va avea q-1 muchii. n total, dac
se adaug i muchia iniial eliminat, se obine:
p-1+q-1+1=m-1 muchii, fapt ce probeaz afirmaia P(m).
Pentru reprezentarea n memorie a arborilor, pot fi utilizate aceleai reprezentri pe care
le folosim pentru grafuri.

Arbori binari

Studiu de caz
Andrei are o hart montan (figu-
ra 136). El se afl n cabana Vrful cu
brazi i dorete s ajung mpreun
cu prietenii si la Cascada binar.
Traseul pe care urmeaz s l parcurg
se poate ramifica, n diferite puncte,
n dou crri. Ei observ c drumul
spre cascad corespunde alegerii
repetate a potecii din stnga.
Ajutai-i s descopere numrul de
intersecii ce trebuie traversate pre-
cum i lungimea traseului.
Figura 136.

Rezolvarea problemei conduce la noiunea de arbore binar.


Definiie:
Un arbore binar este un arbore cu proprietatea c oricare vrf, n afar de frunze, are cel
mult doi descendeni (succesori).
Exemplu:
Arborele binar din figura 137 are drept rdcin nodul 1.
Nodul 1 are doi descendeni direci: nodul 2 (descendent
stng) i nodul 3 (descendent drept).
Nodul 2 are un singur descendent direct: nodul 4
(descendent stng).
Nodul 3 are doi descendeni direci: nodul 5 (descendent
stng) i nodul 6 (descendent drept).
Nodurile 4, 5 i 6 sunt noduri terminale (frunze) pentru
arborele binar dat.
Un arbore binar poate fi reprezentat n memorie prin
dou tablouri: Figura 137.
S i D cu n elemente (n= numrul de noduri din graf), unde:
S[i]= succesorul stng nodului i.
D[i]= succesorul drept al nodului i.

263
Exemplu:
Pentru arborele din figura 138 vectorii S i D vor avea
urmtoarele valori:

Figura 138.

Observaii:
n tablourile S i D, nodurile terminale au valori nule.
Rdcina este singurul nod care nu apare ca valoare n tabourile S i D.

# TEME
1. Verificai dac graful G=(X,U), X = {1, 2, 3, 4, 5, 6, 7}
U = { [1,2]; [1,3]; [2,5]; [2,6]; [2,7]} este arbore.
2. Aezai pe niveluri arborele din figura 139. Fixai drept rdcin nodul 4.

Figura 139.

3. Determinai numrul de niveluri ce se obin


prin rearanjarea arborelui din figura 140 pentru
a avea drept rdcin vrful 3.

Figura 140.

264
4. Verificai care dintre urmtoarele matrice de adiacen corespunde unui arbore binar.

0 1 1 0 0 0 1 1 0 0 0 1 1 1 0

1 0 0 0 0 1 0 0 0 0 1 0 0 0 0
A1 = 1 0 0 1 1 A2 = 1 0 0 1 1 A3 = 1 0 0 1 1

0 0 1 1 0 0 0 1 0 0 1 0 1 0 0
0 0 0
0 1 0 0 0 1 0 0 0 1 0 0

5. S se determine vectorii S i D pentru arborele binar


din figura 141.

6. Determinai rdcina unui arbore binar reprezentat


prin urmtorii vectori:
S=(0,4,0,0,3); D=(0,1,0,0,2).
Figura 141.

Arborele parial de cost minim

Studiu de caz APECEM


eful tribului Apecem dorete s construiasc poteci care s lege corturile supuilor si ast-
fel nct resursele folosite s fie minime i n final s existe un traseu ntre oricare dou corturi.
Dac l vei ajuta, v va trimite o invitaie la petrecea tribal anual.

Se cunosc:
y n = numrul de corturi 17
12

y m = numrul de poteci ce pot fi


10
construite precum i lungimea acestora.
13
Se cere: determinarea unui traseu de
cost minim care s cuprind toate 13
9
corturile.
12

265
Rezolvare
Se ataeaz grafului neorientat obinut G o matrice de costuri.
Vom determina un graf parial al grafului G (toate corturile) care s fie conex, de cost
minim (suma costurilor muchiilor sale s fie minim) i s nu existe circuite (s nu se treac
de dou ori prin acelai punct).
Acesta va fi un arbore parial de cost minim (APM).

Algoritmul lui Kruskal de determinare a APM


Pentru nceput, se consider cele n corturi izolate (n arbori disjunci care conin fiecare
cte un nod al grafului iniial).
La fiecare pas al algoritmului, se introduce cte o potec de cost minim (unificarea a doi
dintre arborii existeni); se selecteaz din graf acea muchie, u, de cost minim, dintre cele
nealese nc, ce are o extremitate ntr-un arbore i cealalt extremitate n alt arbore. n urma
unificrii celor doi arbori, se constituie un alt arbore ce va conine toate nodurile i muchi-
ile celor doi arbori iniiali precum i muchia u.
Exemplu: Fie graful ataat problemei din studiul de caz (figura 142).

Figura 142.

Se folosete o matrice A cu m coloane (corespunztoare celor m muchii) i 3 linii (care


corespund celor dou extremiti x,y i costului muchiei c).

x 1 1 2 2 2 3 3

A = y 2 3 3 5 4 4 5
c 17 12 10 12 13 13 9

Costul APM este iniializat cu 0 (cost = 0).


Se organizeaz matricea realizndu-se o ordonare cresctoare a muchiilor dup cost.

x 3 2 1 2 2 3 1

A = y 5 3 3 5 4 4 2
c 9 10 12 12 13 13 17

266
Se folosete un tablou unidimensional S unde, S[i]= indicele arborelui din care face
parte nodul i la un moment dat.
Iniial fiecare nod este n propriul su arbore:
S = (1, 2, 3, 4, 5). Figura 143.
Se alege muchia de cost minim ce are o extre-
mitate ntr-un arbore i alt extremitate n alt
arbore dintre cei existeni ([3,5]).
Se realizeaz unificarea celor doi arbori i vec-
torul S devine:
S = (1, 2, 3, 4, 3).

Costul APM va fi: cost = 0 + 9 + 9.


Muchia selectat la pasul urmtor va fi [2,3] (este de cost minim dintre cele neselectate
nc i are extremitatea 2 n arborele cu indicele 2 i extremitatea 3 n arborele indice 3).
Se realizeaz unificarea celor doi arbori i Vectorul S devine:
S = (1, 2, 2, 4, 2). Figura 144.
Costul APM va fi:
Cost= 9+10=19.
Muchia selectat la pasul urmtor va fi [1,3]
(este de cost minim dintre cele rmase neselectate
nc i are extremitatea 1 n arborele etichetat cu 1
i extremitatea 3 n arborele etichetat cu 2).
Se realizeaz unificarea celor doi arbori i vec-
torul S devine:
S = (1, 1, 2, 4, 1). Figura 145.
Costul APM va fi:
Cost =19+12 =31.

Muchia selectat la pasul urmtor va fi [2,4]


(este de cost minim dintre cele rmase neselectate
nc i are extremitatea 2 n arborele etichetat cu 1
i extremitatea 4 n arborele etichetat cu 4).
Se realizeaz unificarea celor doi arbori i vec-
torul S devine:
Figura 146.
S = (1, 1, 1, 1, 1).
Costul APM va fi:
Cost= 31+13= 44.
Algoritmul se oprete deoarece au fost selec-
tate n-1 muchii (un arbore cu n noduri conine n-1
muchii).

267
Observaie:
APM pentru un graf dat nu este unic.

Reprezentarea algoritmului n pseudocod

citete (n);
citete (m);
pentru i=1, m execut
citeste (x,y,c);
A[1,i]x;
A[2,i]y;
A[3,i]c;
sfrit pentru;
pentru i=1, n execut
S[i]i;
/*Se pozitioneaza fiecare nod n propriul sau arbore*/
sfrit pentru;
cost0; /*cost APM/*
sorteaz_matrice;
/*Se sorteaza matricea dupa ultima linie corespunzatoare costului muchiilor*/
k0;
/*K reprezinta numarul de muchii ce vor fi adaugate n APM*/
i0;
ct timp k< n-1 execut
dac S[A[1,i]]<>S[A[2,i]] atunci
kk+1;
costcost + A[3,i];
scrie(A[1,i]);
scrie(A[2,i]);
xA[1,i];
yA[2,i];
pentru j=1,n execut
dac S[j]=x atunci S[j]y
sfrit dac
sfrit pentru
sfrit dac
ii+1;
sfrit ct timp
scrie (cost);

268
# TEME
1. S se determine dac un graf
G este arbore.
2. Determinai, folosind algorit-
mul lui Kruskal, arborele
parial de cost minim pentru
grafurile din figura 147. Figura 147.

3. Formulai un exemplu de graf neorientat G pentru care arborele parial de cost minim nu
este unic.
4. Codificai n limbajul de programare studiat algoritmul lui Kruskal. Citirea datelor se
face din fiierul date.in ce va avea pe prima linie numrul de noduri, pe a doua linie
numrul de muchii, iar pe urmtoarele m linii trei valori (extremitile muchiei i
costul su).
5. Justificai ordonarea cresctoare a muchiilor, dup cost.
6. Formulai exemple de probleme care s conduc la determinarea arborelui parial de cost
minim.

PROBLEME PROPUSE
Asociai fiecrei probleme modelul de graf corespunztor. Identificai elementele speci-
fice i algoritmul care conduce la rezolvarea problemei.
1. Un grup de n copii i-au interconectat calculatoarele personale astfel nct ei i pot trans-
mite mesaje i date din calculator n calculator. Se cunosc calculatoarele ntre
care exist legturi directe. S se precizeze dac:
a) Oricare dintre copii poate transmite mesaje ctre ceilali n-1 copii.
b) Exist posibilitatea ca cel puin unul dintre copii s primeasc napoi mesajul trans-
mis n reea.
2. ntr-un grup de n persoane se formeaz un lan al slbiciunilor sau lanul influenei.
Cunoscnd persoanele care se influeneaz direct, s se determine cel mai lung lan
al influenei din grupul respectiv.
3. Se cunoate amplasarea a celor n localiti ale unui jude i drumurile care leag ntre ele
cte dou localiti. S se determine:
a) localitile izolate;
b) toate posibilitile de deplasare ntre dou localiti oarecare.
4. La un simpozion particip n persoane care nu se cunosc direct dar pot face cunotin
unele cu altele prin intermediul unei cunotine comune. tiindu-se persoanele care se
cunosc, s se determine dac:

269
a) O persoan oarecare poate s i fac cel puin o cunotin nou la acest simpozion.
b) Exist persoane care cunosc dinainte toate celelalte persoane.
c) Exist persoane care se cunosc dinainte ntre ele, formnd un grup nchis, n care
nu poate s ptrund nicio cunotin nou.
5. Se cunoate amplasarea conductelor de gaz prin care o central alimenteaz blocurile
unui nou cartier i costurile corespunztoare fiecrui segment de conduct (un segment
de conduct face legtura ntre dou blocuri). S se determine cel mai ieftin traseu pen-
tru alimentarea cu combustibil gazos a noului cartier.
6. Fiind date cele n puncte din teritoriul de paz al unei patrule i cile de acces ntre aces-
tea, s se determine traseul pe care se poate deplasa patrula astfel nct s verifice
ntr-un singur rond toate punctele o singur dat. Dac problema nu are soluie, s se
determine, dac exist, zonele n care se poate instala o astfel de patrul (numrul
zonelor i numrul punctelor din care este format fiecare zon).
7. O agenie de turism are spaii de cazare i agrement n n orae. Pentru atragerea clienilor
i mbuntirea aprovizionrii, agenia are de rezolvat urmtoarele probleme:
y S ofere clienilor, pentru sfritul sptmnii (vineri, smbt i duminic), ct mai
multe variante de excursii n circuit cu oprire cte o zi n fiecare ora.
y S ofere clienilor, pentru vacan, excursii n circuit cu posibilitatea de a vizita toate
cele n orae trecnd o singur dat prin fiecare.
y S-i construiasc un sistem propriu de comunicare ntre cele n orae, astfel nct ori-
care dou orae s comunice direct sau prin intermediul altora, printr-un numr minim
de ci de acces.
Cerine:
Asociai cerinelor din problem modelul de graf corespunztor i rezolvai problemele
acestei agenii, folosind metodele de lucru specifice teoriei grafurilor.

PROIECT N ECHIP
Elemente de teoria grafurilor abordare interdisciplinar
Scopul proiectului: aplicarea cunotinelor de teoria grafurilor n rezolvarea unor
probleme concrete de fizic, biologie, geografie, sociologie i altele.
Sugestie de lucru: se formeaz echipe de 68 elevi; fiecare elev trateaz o pro-
blem/domeniu; rezolvarea conduce la realizarea de programe i o documentaie scris.
Proiectul poate fi susinut i prin prezentare PowerPoint.

Aplicaii propuse pentru rezolvarea proiectului


A. Circuite electrice
1) Identificarea elementelor specifice grafurilor pentru un circuit electric
Cerine:
y Asociai circuitului electric tipul de graf corespunztor.
y Identificai elementele specifice grafurilor i descriei semnificaia acestora n circu-
itul electric.

270
Sugestie de rezolvare
Nodurile unui circuit electric corespund vrfurilor grafului (1,2,3,4).
Ramura ce leag dou noduri ale circuitului electric reprezint arcul grafului
([1,2], [1,3], [2,3], [2,4], [3,4], [4,1]).
Ochiul unui circuit electric reprezint circuitul (ciclul) unui graf.

Fie graful G=(X,U) , X mulimea vrfurilor grafului i U mulimea arcelor grafului.


Gradul exterior (al vrfului x): numrul arcelor de forma [x,y] (exist legtura orien-
tat de la x la y).
Gradul interior (al vrfului x): numrul arcelor de forma [y,x] (exist legtura orien-
tat de la y la x).
Exemplu (vrf 2):
Grad exterior = 2
Grad interior = 1

2) Evidenierea Legilor lui Kirchhoff folosind graful asociat

271
Cu ajutorul grafului corespunztor, prin stabilirea gradului interior i a gradului exte-
rior al unui vrf, stabilim semnul curenilor electrici i automat sensul acestora (intr sau
ies din nodul respectiv).

B. Grupele de snge
1. Realizai o scurt prezentare a grupelor de snge, urmrind planul de idei i graful asociat.
y De ce trebuie s i cunoti grupa de snge?
y Pierderile mari de snge pot fi recuperate prin transfuzii?
y Orice alte combinaii dect cele indicate n schem provoac accidente grave, mortale?
2. Care este semnificaia urmtoarelor elemente:
y gradul unui vrf;
y gradul exterior al unui vrf;
y gradul interior al unui vrf.

Grad exterior al vrfului 0=7.


Grad interior al vrfului 0=0
=> nu poate primi snge de la
nicio alt grup.
Grad exterior vrf AB=0 => nu
poate dona niciunei persoane.

272
C. Hri
1. Harta rutier
Noduri = Orae.
Muchii = Drumuri.
Graf conex = Exist lan (drum) ntre
oricare dou orae.
Graf neorientat = accesul ntre dou orae
se face n ambele sensuri.

Muchiilor li se pot asocia costuri;


fiecare cost reprezint distana ntre dou
orae.
Lan de cost minim = drumul cel mai
scurt dintre dou orae.
Cerine:
Pornind de la Harta rutier:
y formulai probleme care se pot rezolva prin aplicarea elementelor de teoria grafurilor;
y construii i caracterizai graful asociat hrii rutiere.

2. Rute aeriene

Nod = ora.
Muchie = linie aerian.
Graf conex = Exist lan (traseu
aerian) ntre oricare dou orae.
Graf neorientat = accesul ntre
dou orae se face n ambele sen-
suri de zbor.

273
Graf asociat rutelor aeriene
Muchiilor li se pot asocia costuri; fiecare cost reprezint preul zborului ntre dou orae.
Lan de cost minim = preul minim al zborului ntre dou orae.

Cerine:
y Pornind de la harta rutelor
aeriene, formulai probleme care
se pot rezolva prin aplicarea ele-
mentelor de teoria grafurilor.
y Caracterizai graful asociat
hrii rutelor aeriene.

3. Harta rurilor

274
Graful asociat rurilor

Cerine:
y Caracterizai graful asociat hrii rurilor.
y Construii matricea vrfuri-arce corespunztoare acestui graf.

D. Clase de echivalen
Pentru elementele unei mulimi se definete relaia de echivalen a~b cu proprietile:
reflexivitate (a~a) i tranzitivitate (a~b, b~c implic a~c). Pentru o mulime dat, s se
determine clasele de echivalen cunoscndu-se relaiile directe de echivalen.
Exemplu:
X={1,3,5,7,9}
Pentru echivalene: 1~3 ; 5~9 ; 3~7 vor exista 2 clase de echivalen:
C1={1,3,7} i C2={5,9} .
Cerine:
y Asociai problemei un graf i precizai semnificaia elementelor.
y Cum poate fi recunoscut proprietatea de tranzitivitate?
y Care este semnificaia claselor de echivalen?
y Realizai un program pentru determinarea claselor de echivalen i a elementelor din
fiecare clas.

E. Sociograma
1. Realizai un sondaj de opinie pentru determinarea relaiilor de afectivitate, simpatie,
colaborare, respingere dintre elevii unei clase. Pentru claritatea i concizia datelor ce vor
fi prelucrate, formulai o singur ntrebare (exemplu: Cu cine ai dori s mergi n
excursie?).
2. Codificai de la 1 la n membrii grupului participani la sondaj.

275
3. ntocmii sociograma: reprezentare grafic prin puncte i sgei cu semnificaia AB: A
l simpatizeaz pe B (dac prin sondaj s-au urmrit relaii de simpatie). Dac sondajul
s-a aplicat unui grup mare (n>30), folosii, pentru reprezentare, hrtia milimetric.

Echipa perfect

y Completai urmtorul enun: Sociograma este un model ................................format


din ....................... i .................. reprezentnd.................. .
y Ce model de reprezentare a datelor poate fi asociat sociogramei?
y Care ar fi semnificaia sociogramei dac i-am asocia modelul unui graf neorientat?
De ce nu se poate folosi acest model?
y Construii matricea de adiacen pentru sociograma realizat n urma sondajului.
y Analizai matricea de adiacen.
y Care este semnificaia elementelor de pe diagonala principal?
y Care este semnificaia sumei elementelor de pe o linie oarecare i?
y Ce reprezint suma elementelor de pe o coloan oarecare j?
y Ce semnificaie are o linie zero?
y Ce semnificaie are o coloan zero?
y Concretizai analiza matricei de adiacen pentru grupul de elevi pe care ai efectuat
sondajul.
4. Analiza coeziunii grupului:
y Ce semnificaie are noiunea de lan ntr-un graf orientat?
y Completai enunul: Un lan n care toate arcele au aceeai orientare se
numete.................... .
y Ce semnificaie are proprietatea de conexitate ntr-un graf orientat?
y Cum putem determina numrul de subgrupuri dintr-un grup?
y Cum determinm liderul grupului?
y Calculai indicele de coeziune a grupului:
IC=(2*(numar_relatii_reciproce))/(n*(n-1)).

276
PROBLEME RECAPITULATIVE

Pentru fiecare dintre urmtoarele probleme, stabilii structurile de date necesare si rezolvai
cerinele prin programe modularizate n variant iterativ i recursiv, dup caz.

1. S se afieze linie cu linie o matrice rar; se cunoate lista cu valorile nenule i poziia aces-
tora n matrice.

2. Se d o greutate G i alte n greuti gi, i1, n, n<= 50. S se stivuiasc greutile n ordinea
de la1 la n i s se compare suma lor cu G.

3. Se nregistreaz, ntr-o list L1, datele (numele i media general) depre elevii programai la
un interviu pentru un job de vacan. S se formeze dou liste noi: L2 numai cu fete i L3
numai cu biei. Toate numele fetelor se termin cu litera a.

4. Se cunosc relaiile de prietenie dintre toi elevii unei clase. S se determine dac toi elevii cla-
sei sunt prieteni ntre ei i, dac este cazul, numrul de grupuri de prieteni din clas.

5. Se cunosc cile directe de acces dintre cele n localiti dintr-un teritoriu. S se determine dac
se poate ajunge din orice localitate n oricare alta, nu neaprat prin legturi directe.

6. S se determine toate modalitile de descompunere a unui numr natural n n sum de


numere naturale distincte.

7. Pe o suprafa format din n*n puncte se afl un singur punct colorat distinct. S se determine
coordonatele acestui punct printr-un numr minim de cutri.

8. S se transforme un numr natural n n sum de alte numere naturale, fiecare dintre ele nede-
pind o valoare m specificat, corespunztor relaiei:

{
1 dac n=1 sau m=1
S(n,m) = 1 + S (n,n-1) dac n<=m
S(n,n-1) +S(n-m,m) dac n>m

9. S se determine valoarea expresiei: E = 1+ 1*3 + ....+1*3*....*(2n-1)

10. S se determine dac dou cuvinte introduse de la tastatur sunt anagrame ntre ele.
Exemplu: cuvintele apolodor i radopolo sunt anagrame.

277
11. Un curier trebuie s transmit zilnic corespondena ctre cei n clieni. n prima zi de lucru,
curierul primete cele n adrese i harta oraului.
Dup ce a gsit pe hart toate modalitile de a ajunge de la o adres la alta, el i propune s
caute un traseu prin care s ajung la toate adresele fr s treac de mai multe ori pe la un client.
12. S se determine toate numerele naturale care se pot forma din k cifre, k<=5 introdus de la
tastatur.
13. O banc are n clieni; se cunosc relaiile bncii cu fiecare dintre clieni: un client are mpru-
mut de la banc; banca pstreaz economiile unui client.
Un client se poate afla, fa de banc, n oricare dintre cele dou relaii.
S se determine:
a) toi clienii care au mprumut la banc;
b) toi clieni care au economii la banc;
c) valoarea celui mai mare mprumut;
d) clienii al cror mprumut depete jumtate din valoarea economiilor.
14. Se cunosc relaiile de colaborare dintre cei n membri ai unei oranizaii.
S se determine:
a) membrul sau membrii cu cel mai mare numr de colaboratori;
b) membrul sau membrii care nu au participat la nicio activitate colectiv.
15. ntr-un grup de n copii, exist x copii care spun ntotdeauna adevarul i y copii mincinoi.
S se formeze toate grupurile de cte z copii astfel nct, n fiecare grup, s existe cel mult un
mincinos; acesta trebuie aezat ntre doi copii care spun adevrul. Valorile pentru n, x, y i z se
citesc de la tastatur.
16. Un copil primete n cuburi. Se cunosc laturile i culoarea pentru fiecare dintre cele n cuburi.
Exist cuburi roii, galbene, albe i verzi.
S se determine toate modalitile de a construi turnuri stabile de nlime h n care s nu existe
dou cuburi nvecinate colorate la fel.
Datele problemei se citesc din fiirul turn.in cu structura: pe prima linie, valorile n i h sepa-
rate prin spaiu; pe fiecare dintre urmtoarele n linii, latura i culoarea unui cub. Soluiile pro-
blemei se scriu n fiierul turn.out; fiecare soluie pe cte o linie.
17. S se determine toate elementele unui ir de lungime n definit astfel:
1, 21, 123, 4321, 12345, ....
18. S se determine toate cuvintele de n litere (3<=n<=5) care se pot forma cu literele mulimii
{a, e, f, g, h, i, m, n, t, u} astfel nct s fie respectate urmtoarele restricii:
a) fiecare cuvt s nceap i s se termine cu o vocal;
b) s nu existe mai mult de dou consoane alturate;
c) s nu conin grupul ghi.
19. S se determine toate elementele unui ir de lungime n definit astfel:
1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5.....
20. S se determine toate modalitile de a urca o scar cu n trepte, tiind c scara poate fi urcat
trept cu treapt sau cte dou trepte o dat.

278
ANEXA 1

PROBLEMA OPRIRII

Aceast problem a fost formulat n anul 1946 i publicat n articolul A variant of a recur-
sively unsolvable problem, n volumul 52 al Bulletin of the American Mathematical Society.
Fiind mai simpl dect problema opririi programelor, problema corespondenei Post este
frecvent folosit pentru demonstrarea prin reducere a nedecidabilitii unor probleme din
informatic.
Problema Opririi cere s se decid algoritmic (dup un numr finit de pai) dac un program
arbitrar se oprete sau nu. Matematicianul Alan Turing1 a artat, n 1936, c aceast problem
este nerezovabil algoritmic: nu exist niciun algoritm capabil s rezolve Problema Opririi.
Exist programe care rezolv parial Problema Opririi (pentru clase de programe), dar nu exist
niciun program care s rezolve Problema Opririi pentru orice program.
Vom prezenta demonstraia propus de matematicianul Gregory Chaitin2. Vom lucra numai
cu programe care manipuleaz numere naturale.
Presupunem, prin absurd, c exist un program numit programul de oprire care decide
dac un program arbitrar se oprete sau nu. n memorie, programele apar ca secvene de bii
corespunztoare codului intern al instruciunilor. Rezult c fiecare program are n memorie o
lungime exprimat n bii. Considerm programul:
Pasul 1. Se citete numrul natural n.
Pasul 2. Se listeaz toate programele care n binar se scriu cu cel mult n bii.
Pasul 3. Se aplic programul de oprire i se elimin din list toate programele care nu se
opresc.
Pasul 4. Se execut programele rmase n list pn cnd toate programele se opresc;
rezultatul este cel mai mic numr natural, diferit de toate rezultatele produse de
fiecare program din list.
Programul de mai sus se oprete pentru fiecare intrare n. Dac scriem acest program n binar,
vom avea nevoie de aproximativ log (n) plus o constant constnd din numrul de bii (singura
parte variabil a programului este n). Dac executm programul cu o intrare n foarte mare,
atunci n va fi mai mare dect numrul de bii necesari pentru a scrie programul: programul se va
genera pe sine i la Pasul 4 vom obine o contradicie.
1 Alan M. TURING (19121954), matematician englez, considerat printele informaticii. A introdus
noinea de maina Turing, unul din principalele modele teoretice de calcul discret. A inventat testul
Turing care a fost folosit n inteligena artificial pentru a decide dac exist maini care gndesc.
2 Gregory CHAITIN (n. 1947), matematician i informatician american la IBM, New York, unul din-

tre ntemeietorii teoriei algoritmice a informaiei. A obinut rezultate importante privind irurile aleatoare
i limitele formale ale matematicii.

279
Anexa 2

Funcii predefinite n Pascal

Nr Nume Parametri Tipul funciei Returneaz


boolean valoarea
odd(7) = True;
1 odd un ntreg True, dac parametrul
odd(8) = False
este impar
real sau integer
abs(3) = 3;
2 abs un real sau un ntreg valoarea absolut a
abs(-3) = 3
parametrului
real sau integer
3 sqr un real sau un ntreg sqr(2.5) = 6.25
ptratul parametrului
real rdcina ptrat a
4 sqrt un real sau un ntreg sqrt(2.56) = 1.6
parametrului
real exponeniala de exp(1) = e; exp(0) = 1
5 exp un real sau un ntreg
baz e a parametrului exp(5*ln(2)) = 25
6 ln un real sau un ntreg real logaritmul natu- ln(e) = 1; ln(1) = 0;
ral al parametrului ln(exp(5.6)) = 5.6
7 random un ntreg pozitiv n integer un numr
random(18) = un
aleator cuprins ntre 0
ntreg ntre 0 i 17
i n-1
8 random fr parametru real un real din intervalul
[0, 1)
9 sin un real sau un ntreg sinusul trigonometric
real
al parametrului
10 cos un real sau un ntreg cosinusul trigonome-
real
tric al parametrului
11 arctan un real sau un ntreg arctangenta
real trigonometric a
parametrului
12 ord un tip ordinal integer poziia para-
ord(a) = 97;
metrului n interiorul
ord(A) = 65
tipului

280
13 chr un ntreg chr(33) = !;
char caracterul
chr(ord(x)) = x;
corespunztor
ord(chr(33)) = 33
14 trunc un real integer partea
trunc(3.9) = 3;
ntreag a
trunc(-4.2) = -4
parametrului
15 round un real integer cel mai
round(3.9)=4;
apropiat ntreg de
round(-4.2)= -5;
valoarea parametrului

 Atenie
Subprogramele predefinite se supun unor reguli diferite de cele care se refer la subpro-
gramele definite de utilizatori; aceste subprograme sunt doar apelate (declararea i definiia
lor nu trebuie inclus n corpul programului apelant), numrul i tipul parametrilor poate
varia de la un apel la altul etc.

ANEXA 3

PROCEDURI PREDEFINITE
N PASCAL

Nume Parametri Efect


write orici i de orice tip afieaz valorile parametrilor pe linia curent
afieaz valorile parametrilor pe linia curent i
writeln orici i de orice tip
o ncheie, determinnd saltul la o linie nou
read orici i de orice tip citete valorile parametrilor de pe linia curent
citete valorile parametrilor de pe linia curent i
readln orici i de orice tip
la final o abandoneaz
iniializeaz variabila de pornire a generatorului
randomize niciun parametru
de numere aleatoare

281
Anexa 4

Funciile predefinite
n c/c++

Funciile standard din C/C++ se afl n bibliotecile stdio.h, conio.h, iostream.h, ctype.h,
stdlib.h, math.h, complex.h, mem.h i n alte aproximativ 30 de fiiere cu extensia .h .

Nr Nume Parametri Biblioteca Efect

orici i de citete valorile parametrilor de pe


1 scanf stdio.h
orice tip linia curent
orici i de afieaz valorile parametrilor pe
2 printf stdio.h
orice tip linia curent
returneaz un intreg pozitiv strict
3 random un ntreg stdio.h
mai mic dect parametrul
doi reali sau math.h sau ridic primul parametru la o putere
4 pow
doi compleci complex.h dat de al doilea parametru
un real sau math.h sau returneaz rdcina ptrat
5 sqrt
un complex complex.h a parametrului
un real sau math.h sau returneaz exponeniala de baz
6 exp
un complex complex.h e a parametrului
un real sau math.h sau returneaz logaritmul natural al
7 ln
un complex complex.h parametrului
stdlib.h,
un ntreg sau returneaz valoarea absolut a
8 abs math.h sau
un complex parametrului
complex.h
min, returneaz minimum, maximum
9 doi ntregi stdlib.h
max dintre parametri
un ntreg i calculeaz valoarea unui polinom
10 poly cel puin doi math.h de o variabil, de grad i
reali coeficieni dai

282
Anexa 5

sUBPROGRAME Predefinite
pENTRU
PRELUCRAREA IRURILOR de
caractere n Pascal

Operaia Funcia Definiia funciei

Lungimea irului length function length (sursa: string): integer;

function concat (s1[,s2,,sn]: string):


Concatenarea concat
string;

Cutarea unui subir ntr-un sir function pos (subsir: string; sir:
pos
de caractere string): byte;
Extragerea unui subir dintr-un function copy (sursa: string; pozitia:
copy
ir de caractere integer; numar: integer): string;
Inserarea unui subir ntr-un ir procedure insert (sursa: string; var
insert
de caractere destinatia: string; pozitia: integer);
tergerea unui subir dintr-un procedure delete (var sursa: string;
delete
ir de caractere pozitia: integer; numar: integer);
Conversia unei valori numerice procedure str (numar:i; var
str
ntr-o secven de caractere sursa:string);
Conversia unei secvene de procedure val (sursa; var v: integer;
val
caractere ntr-un numr var cod: integer);
Conversia literelor mici n
upcase function upcase (car: char): char;
majuscule

283
Anexa 6

Funcii Predefinite pENTRU


PRELUCRAREA IRURILOR
de caractere n c/c++

Operaia Funcia Definiia


char *strcpy (char *destinaie, char
Atribuirea strcpy
*sursa);
int strcmp (const char *sir1, const
Compararea strcmp
char *sir2);
Lungimea irului strlen size_t strlen (char *sursa);
char *strcat (char *destinaie, char
Concatenarea strcat
*sursa);
Inversarea ordinii
strrev char *strrev (char *s);
caracterelor ntr-un ir
Cutarea unui subir ntr-un char *strstr (char *sir, char
strstr
ir de caractere *subsir);
Conversia unei valori
char *itoa (int valoare, char *sir,
numerice ntr-o secven de itoa
int baza);
caractere
Conversia unei secvene de
caractere ntr-o valoare atol long atol (char *sursa);
numeric
Conversia literelor mici n
strupr char *strupr (char *sursa);
majuscule
Conversia literelor mari n
strlwr char *strlwr (char *s);
litere mici

284
Anexa 7

tABELA CODURILOR ascii

Zeci- Hexaze- Caracter Zeci- Hexaze- Caracter Zeci- Hexaze- Caracter Zeci- Hexaze-Caracter
mal cimal mal cimal mal cimal mal cimal

0 0 NUL 32 20 64 40 @ 96 60 `
1 1 SOH 33 21 ! 65 41 A 97 61 a
2 2 STX 34 22 66 42 B 98 62 b
3 3 ETX 35 23 # 67 43 C 99 63 c
4 4 EOT 36 24 $ 68 44 D 100 64 d
5 5 ENQ 37 25 % 69 45 E 101 65 e
6 6 ACK 38 26 & 70 46 F 102 66 f
7 7 BEL 39 27 71 47 G 103 67 g
8 8 BS 40 28 ( 72 48 H 104 68 h
9 9 TAB 41 29 ) 73 49 I 105 69 i
10 A LF 42 2A * 74 4A J 106 6A j
11 B VT 43 2B + 75 4B K 107 6B k
12 C FF 44 2C , 76 4C L 108 6C l
13 D CR 45 2D - 77 4D M 109 6D m
14 E SO 46 2E . 78 4E N 110 6E n
15 F SI 47 2F / 79 4F O 111 6F o
16 10 DLE 48 30 0 80 50 P 112 70 p
17 11 DC1 49 31 1 81 51 Q 113 71 q
18 12 DC2 50 32 2 82 52 R 114 72 r
19 13 DC3 51 33 3 83 53 S 115 73 s
20 14 DC4 52 34 4 84 54 T 116 74 t
21 15 NAK 53 35 5 85 55 U 117 75 u
22 16 SYN 54 36 6 86 56 V 118 76 v
23 17 ETB 55 37 7 87 57 W 119 77 w
24 18 CAN 56 38 8 88 58 X 120 78 x
25 19 EM 57 39 9 89 59 Y 121 79 y
26 1A SUB 58 3A : 90 5A Z 122 7A z
27 1B ESC 59 3B ; 91 5B [ 123 7B {
28 1C FS 60 3C < 92 5C \ 124 7C |
29 1D GS 61 3D = 93 5D ] 125 7D }
30 1E RS 62 3E > 94 5E ^ 126 7E ~
31 1F US 63 3F ? 95 5F _ 127 7F

285
BIBLIOGRAFIE SELECTIV

CRISTEA V., ATANASIU I., KALISY E., IORGA V. Tehnici de programare, Ed. Teora
1999.
GREGORY J. CHAITIN Information, Randomness and Incompleteness, World Scientific,
1987.
CRISTIAN J. CLAUDE Information and Randomness, Springel Verlag, Berlin, 2002.
CRISTIAN A. GIUMALE Introducere n analiza algoritmilor, Ed. Polirom 2004.
IOSIF IGNAT, CLAUDIA-LAVINIA IGNAT Programarea calculatoarelor, descrierea algo-
ritmilor i fundamentele limbajului C/C++, Editura Albastr, Cluj-Napoca, 2002.
CORNELIA IVASC, MONA PRUN Bazele Informaticii (Grafuri i elemente de combina-
toric) manual pentru clasa a X-a, Editura Petrion, Bucureti, 1995.
KNUTH, D.E. Arta programrii calculatoarelor vol. I, Ed. Teora, 1999.
L. LIVOVSCHI, H. GEORGESCU Bazele informaticii, algoritmi U.B. 1985.
PTRCOIU O., MARIAN G., MITROI N. Elemente de grafuri i combinatoric,
Ed. All, 1994.
GHEORGHE PUN Din spectacolul matematicii, Editura Albatros, Bucureti, 1983.
DORIAN STOILESCU Culegere de C/C++; Editura Radial, Galai, 1998.
I. TOMESCU Bazele informaticii, Manual pentru licee/clase de Informatic clasa a X-a,
Editura Didactic i Pedagogic, Bucureti, 1996.
GREGORY F. WETZEL, WILLIAM G. BULGREN Pascal and Algorithms; An Introduction
to Problem Solving, Science Research Associates Inc., Chicago, 1987.

286
CUPRINS
Capitolul 1. STRUCTURI DE DATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
1. Organizarea datelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
1.1. Analiza problemei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
1.2. Soluia problemei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4
1.3. Organizarea datelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4
2. Organizarea datelor cu aceeai semnificaie n tablouri bidimensionale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
3. Implementarea tablourilor bidimensionale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
4. Tablouri bidimensionale Cazuri particulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
5. Prelucrarea tablourilor bidimensionale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19
5.1. Localizarea elementelor cu aceeai proprietate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19
5.2. Prelucrarea elementelor distribuite pe aceleai direcii (linii, coloane, diagonale) . . . . . . . . . . . . . .24
5.3. Simularea unor situaii reale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28
5.4. Prelucrarea imaginilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30
6. Organizarea datelor n structuri neomogene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35
6.1. Studiu de caz Catalogul clasei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .35
6.2. Definirea structurilor neomogene de date-articole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .36
6.3. Prelucrarea datelor organizate n structuri neomogene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38
6.4. Gruparea datelor organizate n structuri neomogene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40
7. Organizarea datelor n structuri dinamice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44
7.1. Modele de structuri dinamice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44
7.2. Clasificarea structurilor dinamice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47
7.3. Prelucrri specifice structurilor dinamice liniare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .49
7.4. Implementarea structurilor dinamice liniare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50
7.4.1. Firul de ateptare (Coada) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50
7.4.2. Stiva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55
Capitolul 2. SUBPROGRAME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63
1. Un exemplu de modularizare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63
2. Modularizarea programelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67
A. Tipuri de probleme (Facultativ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67
B. Modularizarea rezolvrii problemelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .69
C. Tehnici de modularizare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .76
D. Implementarea modularizrii. Stiva sistem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .78
3. Lucrul cu subprograme n pseudocod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .80
A. Structura subprogramelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .80
B. Definirea subprogramelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .81
C. Declararea subprogramelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .81
D. Apelarea subprogramelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82
E. Returnarea valorilor ctre programul apelant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .83
F. Transferul parametrilor la apel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84
G. Variabile locale i variabile globale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .87
4. Implementarea subprogramelor n limbajele de programare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95
A. Subprograme n limbajul Pascal: funcii i proceduri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95
B. Subprograme n limbajul C/C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .101
C. Exerciii cu subprograme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .104

287
5. iruri de caractere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .108
A. Particulariti de memorare a irurilor de caractere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .108
B. Faciliti pentru prelucrarea irurilor de caractere n limbajul Pascal . . . . . . . . . . . . . . . . .109
C. Faciliti pentru prelucrarea irurilor de caractere n limbajul C/C++ . . . . . . . . . . . . . . . . .110
D. Subprograme predefinite pentru prelucrarea irurilor de caractere . . . . . . . . . . . . . . . . . . . .112
6. Recursivitatea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .121
A. Definire. Exemplificare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .121
B. Mecanismul de implementare a recursivitii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .125
C. Tipuri de recursivitate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .126
D. Aplicaii implementate recursiv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .129

Capitolul 3. METODE DE PROGRAMARE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .145


I. Divide et impera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .145
1. Studiu de caz Campionatul de baschet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .145
2. Descrierea general a metodei Divide et Impera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .146
3. Algoritmul metodei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .147
4. Implementarea metodei Divide et Impera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .148
II. Backtracking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .172
1. Studiu de caz Planificarea examenelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .172
2. Descrierea general a metodei Backtracking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .173
3. Mecanismul metodei Backtracking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .174
4. Reprezentarea algoritmului n pseudocod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175
5. Exemplu de implementare a algoritmului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .179
6. Generarea partiiilor unei mulimi (Generarea submulimilor unei mulimi ) . . . . . . . . . . . . . . . . . . . . . . . . . .207
Capitoul 4. ELEMENTE DE TEORIA GRAFURILOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .215
1. Scurt istoric . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .215
2. Grafuri neorientate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .218
2.1. Noiuni de baz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .218
2.2. Gradul unui nod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .219
2.3. Reprezentarea n memorie a grafurilor neorientate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .221
2.4. Memorarea grafurilor folosind matricea de adiacen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .222
2.5. Memorarea grafurilor folosind listele de adiacen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .225
2.6. Memorarea grafurilor neorientate folosind lista muchiilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .226
3. Clase speciale de grafuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .228
3.1 Grafuri complete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .228
3.2. Grafuri pariale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .229
3.3. Subgrafuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .229
4. Parcurgerea grafurilor neorientate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .231
4.1. Metoda de parcurgere Breadth First (BF) parcurgerea n lime . . . . . . . . . . . . . . . . . . . . . . . . . .231
4.2. Metoda de parcurgere Depth First (DF) parcurgerea n adncime . . . . . . . . . . . . . . . . . . . . . . . . .236
5. Noiunea de conexitate n grafuri neorientate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .241
6. Grafuri orientate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .247
6.1. Memorarea grafurilor orientate prin matricea de adiacen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .251
6.2. Memorarea unui graf orientat folosind listele de adiacen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .253
6.3. Reprezentarea unui graf orientat folosind matricea vrfuri-arce . . . . . . . . . . . . . . . . . . . . . . . . . . . .254
6.4. Reprezentarea unui graf orientat ca un vector de arce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .256
7. Arbori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .261
Anexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .279
Bibliografie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286

288
CORINT
E D U C A I O N A L

CORINT
E D U C A I O N A L
CORINT
E D U C A I O N A L

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