Sunteți pe pagina 1din 14

Probleme rezolvate de programare – Subiecte propuse la ATESTAT

2004
Pentru anul 2004, am inclus în lucrarea de faţă doar problemele noi, care nu au fost propuse şi în 2003 la
examenul de atestat.
ATESTAT - 2004 - 4 - Se citesc pe rând numere naturale până la introducerea lui 55. Stabiliţi câte
cifre de zero şi câte cifre de 1 sunt necesare pentru reprezentarea în baza 2 a tuturor numerelor
anterioare.
Rezolvare:
 Din enunţ nu rezultă, în mod necesar, că numerele naturale introduse sunt consecutive. Prin
urmare, se pot introduce numere naturale la întâmplare, numărul acestor numere nefiind precizat.
Introducerea se va încheia la întâlnirea numărului 55. O variantă simplificată a problemei constă
în introducerea tuturor numerelor naturale între 1 şi 55. Vom lua în consideraţie ambele situaţii.
 Pentru transformarea numărului ZECIMAL în număr BINAR, împărţim numărul ZECIMAL la
2 şi reţinem resturile obţinute la împărţire într-un vector de resturi R. Numărul BINAR
echivalent se obţine citind vectorul R de la sfârşit către început. Pe noi ne interesează doar cifrele
numărului BINAR, deci este suficient să numărăm cifrele de ZERO şi de UNU din vectorul R
asociat numărului BINAR.
 Definim o procedură TRANSFORMA, care converteşte fiecare număr natural (zecimal)
introdus din în număr binar. Procedura va avea ca parametru de ieşire vectorul de resturi R, dar
şi numărul de cifre n ale numărului binar echivalent, adică numărul de elemente din R.
 În procedură, folosim o variabilă auxZECIMAL, ale cărei valori vor evolua între
NRZECIMAL şi 1, pe măsură ce auxZECIMAL va fi împărţită la 2. Folosind auxZECIMAL,
vom conserva (vom păstra neschimbată) valoarea lui NRZECIMAL.
 Folosim doi contori “zero” şi “unu”, care numără cifrele de 0 şi de 1 din numărul binar obţinut.
Program ATESTAT_2004_4_NUMARA_CIFRE_BINARE;
uses CRT;
Const
nmax = 100;
TYPE
vector = array [1..100] of integer;
VAR
NRZECIMAL, auxZECIMAL, zero, unu, n, i, rest: integer;
R : vector; {vector de resturi}
procedure TRANSFORMA (NRZECIMAL : integer; VAR R : vector; VAR n : integer);
begin
if NRZECIMAL = 0 then
begin
auxZECIMAL := 0;
i:=1;
R[i] := 0
end
else
begin
i := 0;
auxZECIMAL := NRZECIMAL;
while auxZECIMAL <> 1 do
begin
rest := auxZECIMAL MOD 2;
i := i + 1;
R [i] := rest;
auxZECIMAL := auxZECIMAL DIV 2;
end;
i := i + 1;
R [i] := auxZECIMAL;
end;
n := i;
end; {sfarsit procedura}
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Programul principal se va scrie astfel:

Varianta A – Dacă numerele naturale se introduc într-o ordine oarecare, până la introducerea lui
55, atunci vom folosi o structură REPEAT:
Begin { PROGRAM PRINCIPAL }
clrscr;
zero := 0; {initializare contori care numara cifrele de zero si de unu}
unu := 0;
writeln;

REPEAT
write ('Dati urmatorul numarul zecimal = ');
readln (NRZECIMAL);

TRANSFORMA (NRZECIMAL, R, n);

writeln;
write ('Numarul binar echivalent lui ', NRZECIMAL,' este ');
for i := n DOWNTO 1 do
write (R[i]);

writeln;
writeln;
for i := 1 to n do
begin
if R [i] = 0 then
zero := zero + 1
else
unu := unu + 1
end;

UNTIL (NRZECIMAL = 55);


writeln;
writeln;
writeln ('Total cifre de ZERO = ', zero);
writeln;
writeln ('Total cifre de UNU = ', unu);
readln
end.

Varianta B – Dacă numerele naturale introduse sunt cuprinse între 1 şi 55, vom folosi o structură
FOR:
begin { PROGRAM PRINCIPAL }
clrscr;
zero := 0; {initializare contori care numara cifrele de zero si de unu}
unu := 0;
writeln;

FOR NRZECIMAL := 1 to 55 do
begin
TRANSFORMA (NRZECIMAL, R, n);
writeln;
write ('Numarul binar echivalent lui ', NRZECIMAL,' este ');
for i := n DOWNTO 1 do
write (R[i]);
writeln;
writeln;

4
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
for i := 1 to n do
begin
if R [i] = 0 then
zero := zero + 1
else
unu := unu + 1
end;

end; {sfarsit FOR exterior}


writeln;
writeln;
writeln ('Total cifre de ZERO = ', zero);
writeln;
writeln ('Total cifre de UNU = ', unu);
readln
end.

ATESTAT - 2004 - 17 - Să se aranjeze n regi pe o tablă de şah de dimesiune n x n astfel încât să


nu se atace.

Rezolvare: Această problemă este asemănătoare cu “problema celor n regine”, pe care o


vom adapta la cerinţele de mai sus.
Pentru ca doi regi să nu se atace, ei trebuie să NU fie situaţi:
 pe aceeaşi linie, unul lângă altul,
 pe aceeaşi coloană, unul lângă altul sau
 pe aceeaşi diagonală, unul lângă altul.

Pe fiecare linie vom plasa câte un rege. Pentru ca poziţia regilor să fie complet determinată, este
suficient să reţinem, pentru fiecare rege, coloana în care este plasat, într-un vector soluţie f, de
dimensiune n, unde f [i] reprezintă coloana în care este plasat regele de pe linia i. Generarea matricilor
în condiţiile problemei se va face apelând la un algoritm “backtracking”.
Observaţii:
Notăm cu x, respectiv i o linie oarecare şi cu f [x], respectiv f [i] coloana pe care se găseşte
regele de pe linia x, respectiv linia i.
Condiţiile interne:
a). f [x] = 1, 2, ..., n, pentru oricare x = 1, 2, ..., n
b). Doi regi nu pot fi plasaţi pe aceeaşi coloană se va exprima analitic astfel:
f [x] ≠ f [y] pentru orice x ≠ y, cu x, y = 1, 2,...,n.
c). Celelalte condiţii interne sunt inserate şi comentate direct în program.
Definim o procedură AFIŞARE astfel:
În momentul apelării procedurii, este clar că s-a găsit o soluţie pe care o numărăm scriind:
Nrsol := Nrsol + 1
şi apoi afişăm Nrsol.
Vom parcurge toate coloanele de la 1 la n. Pentru aceasta avem nevoie de un contor poziţional
col care va lua valori de la 1 la n.
În procedură, col este o coloană curentă, iar f [lin] este tot o coloană, şi anume coloana pe
care se găseşte regele de pe linia lin.
Procedura va tipări " * " dacă pe coloana curentă col există un rege, adică atunci când
col = f [lin], şi va tipări "o" dacă această condiţie nu este satisfăcută.

5
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Program ATESTAT_2004_17_ASEZARE_REGI;
uses crt;
const
nrmaxregi = 8;
type
vectorsolutie = array [0..nrmaxregi] of 0..nrmaxregi;
var
f : vectorsolutie;
n, x, i : 0 .. nrmaxregi;
ok : boolean;
nrsol : word;
cond1, cond2, cond3, cond4, COND : boolean;
procedure AFISARE;
var
i, j : 0 ..nrmaxregi; {i = linie, j = coloana, f[i] = coloana }
begin

nrsol := nrsol + 1;
writeln;
writeln ('Solutia nr. ',nrsol);
for i := 1 to n do
begin
for j := 1 to n do
begin
if j = f [i] then
write (' * ')
else
write (' o ')
end;
writeln;
end;

writeln;
readln
end; { sfarsit procedura }

Begin { PROGRAM PRINCIPAL }


clrscr;
write ('Introduceti numarul de patratele n = ');
readln (n);

nrsol:=0;

x := 1; { virful stivei } { x = linie }


f [x] := 0;

while x > 0 do { cat timp stiva nu este vida }


begin
while f [x] < n do { cat timp exista valori disponibile }
begin
f [x] := f [x] + 1;
ok := true;

for i := 1 to x do
begin
cond1 := (f[i] = f[x]) and (ABS(x-i) = 1) ;
{Daca sunt pe aceeasi coloana, fi=fx}
{dar pe linii vecine, adica x-i=1}

{ cond1 := (i > 1) AND (f[i-1] = f[i]) ; }


{Daca sunt pe aceeasi coloana, f[i-1]=f[i]}
{dar pe linii vecine, adica pe i si i-1}

cond2 := (ABS (i-x) = ABS (f[i] - f[x] ))

6
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
and (ABS (i-x) =1 ) ;
{Daca sunt pe diagonala, i-x=fi-fx}
{la distanta de 1 casuta, i-x=1}
{ cond2 := ABS (f[i] - f[i-1]) = 1 ; }
{Daca sunt pe diagonala, }
{la distanta de 1 casuta }
{ cond3 := ABS (f[x] - f[x-1]) = 1 ; }
{sau ((ABS (f[i]-f[x]) = 1) and (x=i) ) }

COND := cond1 OR cond2 { OR cond3 } ;


if COND then
begin
ok := false;
end
end; {for}
if ok = true then { Daca valoarea este valida }
begin
if x = n then { Daca stiva este plina }
AFISARE
else
begin
x := x + 1; { PAS INAINTE }
f [x] := 0
end;
end;
end; { sfarsit WHILE interior }
x := x - 1 { PAS INAPOI }
end; { sfarsit WHILE exterior }
readln
end.

ATESTAT - 2004 - 18 - Se dă un fişier text care conţine pe prima linie numere naturale. Să se
afişeze numărul valorilor din fişier şi valoarea maximă a acestora.

Rezolvare:
 În ipoteza că fişierul text nu există deja pe disc, vom crea acest fişier cu acelaşi program care face
şi celelalte determinări cerute de enunţ. Vom introduce în fişierul text “n” numere naturale,
folosind o buclă “FOR”, astfel:
 După citirea de la tastatură a unui număr “x”, îl vom converti într-un “şir”, prin apelarea
procedurii “STR”.
 După fiecare astfel de şir, vom lăsa un singur spaţiu liber (blank). În acest fel, se va crea
o “linie” în fişierul text. Evident, “linie” este tot un şi de caractere.
 Celelalte etape sunt comentate direct în program.
Program ATESTAT_2004_18_FISIER_TEXT_CU_NUMERE_NATURALE;
const
nmax = 100;
type
vector = array [1..nmax] of integer;
var
f : text;
linie, sir : string; {linie = o linie din fisierul text}
{sir = sirul in care se transforma numarul x cu STR }
poz : integer; {pozitie in sirul de caractere "linie"}
ER : integer; {variabila EROARE = parametru al procedurii VAL}
c : char;
max, n, i, x : integer;
V : vector;

7
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Begin { PROGRAM PRINCIPAL }
assign (f, 'c:\naturale.txt');
rewrite (f);

n := 10;
for i := 1 to n do
begin
write ('Dati un nou x = ');
readln (x);
STR (x, sir); {procedura STR transforma numarul x in sir}
write (f, sir + ' '); {se lasa un spatiu dupa fiecare sir}
end;
writeln (f); {incheie linia in fisierul f }
writeln;
writeln ('Continutul fisierului f este:');

RESET (f); {pregatim fisierul”f” pentru citire}


while not EOF (f) do
begin
read (f, c); {citim fisierul “f” caracter cu caracter}
write (c); {si afisam caracterele pe un singur rand}
end;
writeln; {linie de spatiere}
{recuperarea - extragerea numerelor din fisierul text}
RESET (f); {pregatim fisierul”f” pentru citire}
READ (f, linie); {citim din “f” o “linie” = sir de caractere}
{linia contine numere urmate de cate un spatiu}
writeln ('Continut linie = ', linie); {optional, afisam linia citita}
writeln;
i := 0; {index in vectorul “V”,in care vom depune numerele citite}
{din fisier, DUPA convertirea lor din siruri in numere}
sir := '' ; {initializare sir cu sirul vid}
poz := 1; {incepand cu prima pozitie din linia citita din fisier}

while poz <= LENGTH (linie) do {cat timp linia nu a fost epuizata}
begin
IF linie [poz] <> ' ' then {daca in pozitia “poz” nu este un blank}
sir := sir + linie [poz] {reconstituim un numar din cifrele sale}
{folosind un “sir” in care depunem}
{prin concatenare cifrele numarului}
else {daca s-a ajuns la un blank, inseamna ca s-au parcurs }
{deja cifrele unui numar}
begin
i := i + 1; { numaram sirul care contine numarul}
VAL (sir, x, ER); {convertim sirul in numarul “x”}
V [i] := x; {preluam numarul “x” in vectorul “V”}
writeln ('V[',i,'] = ', V[i] ); {optional, afisam V[i] }
sir := '' ; {reinitializam “sir” cu sirul vid,}
{in eventualitatea}
{ca inca nu s-a epuizat fisierul si mai sunt }
{numere de extras din fisier}
end; {sfarsit ELSE}
poz := poz + 1 {trecem la urmatoarea pozitie din "linie"}
end; {sfarsit WHILE}
n := i; {retinem in "n" ultima valoare a contorului "i" }
{deci n = numarul total de numere extrase din "linie"}
writeln (‘Fisierul contine n = ‘, n,’ numere naturale’);
writeln;
writeln ('Vectorul V este: '); {optional, afisam vectorul}
for i := 1 to n do
begin
writeln ('V[',i,'] = ', v[i]);
end;

8
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
writeln;
{determinam numarul maxim din vector, deci din fisier}
max := V[1];
for i:= 2 to n do
begin
if max < v[i] then
max := v[i]
end;
writeln;
writeln ('Numarul maxim din fisier este MAX = ', max);
readln
end.

ATESTAT - 2004 - 19 - Să se scrie un program recursiv care calculează maximul elementelor unui
vector cu n componente.

Rezolvare:
 Definim o funcţie recursivă denumită MAXIM, cu care vom determina maximul într-un interval
din vector cuprins între două valori notate cu încep, respectiv sf. Funcţia va fi apelată iniţial
pentru încep = 1 şi sf = n (poziţiile extreme din vectorul x).
 Dacă sf – încep <> 1, se determina mijlocul intervalului sf – încep şi se apelează funcţia
MAXIM pentru jumătatea stângă, respectiv dreaptă a intervalului al cărui mijloc a fost calculat.
Se determină, astfel, două maxime, notate m1 şi m2, pentru cele două subintervale. În final, va fi
validată cea mai mare dintre valorile determinate.
Program ATESTAT_2004_19_Determinare_MAXIM_RECURSIV_DEI;
uses CRT;
type
vector = array [1..10] of integer;
VAR
x : vector;
MAX, n, i : integer;
function MAXIM ( incep, sf : integer; x : vector ) : integer;
var
m, m1, m2 : integer;
begin
IF sf - incep = 1 then
begin
if x [incep] > x [sf] then
MAXIM := x [incep]
else
MAXIM := x [sf]
end
ELSE
begin
m := (incep + sf) DIV 2;
m1 := MAXIM ( incep, m, x);
m2 := MAXIM ( m, sf, x );
if m1 > m2 then
MAXIM := m1
else
MAXIM := m2
end;
end; { sf. functie }

9
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('n = '); readln (n);
for i := 1 to n do
begin
write ('x [ ',i,' ] = ');
readln (x[i]);
end;
MAX := MAXIM ( 1, n, x);
writeln;
writeln ('MAX = ', MAX);
readln
end.

ATESTAT - 2004 - 21 - Să se afle valoarea unui polinom într-un punct.

Rezolvare:
Se definesc funcţii şi proceduri ale căror nume sugerează şi scopul.
Program ATESTAT_2004_21_Polinom_1;
uses
Crt;
const
GMaxPol = 20; {Gradul MAXim al unui POLinom}
type
polinom = record
GRAD : 0..GMaxPol;
COEF : array [ 0..GMaxPol ] of real;
end;
var
POL1, POL2, POLREZ, PREST : polinom;
NUMAR, A, X, VALOARE : real;
OK, EROARE : boolean;
OPTIUNE, CC : char;

function ValPolinom (var POL:polinom; VALX:real) : real;


var {calcularea Valoarea unui Polinom}
i : integer;
VALPOL : real;
begin
i := POL.GRAD;
VALPOL := POL.COEF [i]; {coeficientul monomului de grad maxim}
while i > 0 do
begin
i := i - 1;
VALPOL := VALPOL * VALX + POL.COEF [i];
end;{while}
ValPolinom:=VALPOL;
end;{function}

function RoundR (NUMAR:real; ZEC:integer) : real; {rotunjeste un real}


var
P10 : real;
i : integer;
begin
P10 := 1;
for i := 1 to ZEC do
P10 := P10 * 10; {end for}
RoundR := Round (NUMAR * P10) / P10;
end;{function}

10
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
procedure CitestePol (MESAJ: string; var POL: polinom);
var
i:integer;
begin
repeat
WriteLn;
WriteLn (MESAJ,' :');
Write (' - introduceti gradul: ');
ReadLn (POL.GRAD);
if POL.GRAD > GMaxPol then
begin
WriteLn('Atentie ! Gradul nu poate fi mai mare de ',GMaxPol,' !');
Sound(1200);
Delay(200);
NoSound; {Beep}
end;{if}
if POL.GRAD<0 then
begin
WriteLn('Atentie ! Gradul nu poate fi mai mic decat 0 !');
Sound(1200);
Delay(200);
NoSound; {Beep}
end;{if}
until (0<=POL.GRAD) and (POL.GRAD<=GMaxPol);
for i := POL.GRAD downto 0 do
begin
Write (' - Coeficientul lui X^', i:2,': ');
ReadLn ( POL.COEF [i] );
POL.COEF[i] := RoundR (POL.COEF [i], 5); {cel mult 5 zecimale}
end;{for}
end;{procedure}

function NrRealSir (NUMAR: real; SEMN: boolean) : string;


var L, R : integer;
S : string;
begin
Str (NUMAR:20:5,S);
L:=1;
while S [L] = ' ' do
L := L + 1; {sterge spatiile nesemnificative}
R := 20;
while S [R] = '0' do
R := R - 1; {sterge zerourile nesemnificative}
if R=15 then
R:=14; {sterge punctul de dupa numerele intregi}
S := Copy (S, L, R-L+1);
if SEMN then
begin
if NUMAR >= 0.0 then
S := '+' + S;
S := copy (S, 1, 1) + ' ' + copy (S, 2, Length (S) - 1);
end;{if}
NrRealSir:=S;
end;{function}

procedure AfiseazaPol (MESAJ:string; var POL:polinom);


var
i, L, R : integer;
S : string;
begin
WriteLn;
WriteLn (MESAJ,' (de gradul ', POL.GRAD:2,') :');

11
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
for i:=POL.GRAD downto 0 do
begin
if (i>0) and ( Abs (POL.COEF [i]) = 1.0) then
S := '' {nu afiseaza coeficientul +/- 1, dar va afisa 0}
else
S := NrRealSir ( Abs (POL.COEF [i]), False); {end if}
if POL.COEF[I]<0.0 then
S := ' - ' + S
else
if i < POL.GRAD then
S := ' + ' + S
else
S := ' ' + S; {end if}
Write (S);
if i > 9 then
Write ('x^', i:2)
else
if i > 1 then
Write('x^', i:1)
else
if i = 1 then
Write ('x')
else {i=0}
WriteLn; {end if}
end;{for}
end;{procedure}

procedure Titlu (MESAJ:string);


var i:integer;
begin
ClrScr;
WriteLn ( MESAJ,' :');
for i:=1 to Length (MESAJ) + 2 do
Write ('='); {end for}
Window (1,4,80,25);
end;{procedure}

Begin { PROGRAM PRINCIPAL }


repeat
CLRSCR; {sterge ecranul si bufferul tastaturii}

while KeyPressed do
begin
CC := ReadKey;
if Ord (CC) = 0 then
CC := ReadKey;
end;{while}

{afiseaza meniul principal}

writeln;
WriteLn (' PROGRAM TEST');
writeln;
writeln (' Alegeti una dintre optiunile de mai jos:');
writeln; writeln; writeln;
WriteLn(' 1 - Pentru a calcula valoarea unui polinom intr-un punct X dat');
WriteLn;
WriteLn(' <Esc> - Pentru Terminarea programului ');
WriteLn; writeln; WriteLn;

12
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Write (' Introduceti optiunea dvs : ');
{citeste OPTIUNEA solicitata}

repeat
until KeyPressed;

OPTIUNE := ReadKey;
if Ord (OPTIUNE)=0 then
CC := ReadKey;

{anuleaza bufferul tastaturii}

while KeyPressed do
begin
CC := ReadKey;
if Ord (CC) = 0 then
CC := ReadKey;
end;{while}

{executa operatia solicitata}

OK:=True;

CASE OPTIUNE of

'1' : begin Titlu ('1. Valoarea unui polinom pentru un X dat');


CitestePol ('Se calculeaza valoarea polinomului',POL1);
WriteLn;
Write ('pentru X = : ');
ReadLn(X);
X := RoundR (X,5); {cel mult 5 zecimale}
VALOARE := ValPolinom (POL1,X);
ClrScr;
AfiseazaPol ('Se calculeaza valoarea polinomului',POL1);
WriteLn;
WriteLn ('pentru X = ', NrRealSir (X,False),' ;');
WriteLn;
WriteLn('Se obtine valoarea ',NrRealSir(VALOARE,False),' !');
end;
else OK:=False;
end;{case}
if OK then
begin
WriteLn; WriteLn;
Write ('Apasati o tasta oarecare ... ');
repeat
until KeyPressed;
Window (1,1,80,25);
end;{if}
until Ord (OPTIUNE) = 27;
end.{program}

ATESTAT - 2004 - 22 - Să se sorteze crescător un şir de “n” numere întregi memorat într-un vector
“v”, folosind metoda sortării rapide (quick-sort).

Rezolvare:
Am notat cu “inf”, respectiv cu “sup”, o poziţie de început, respectiv de sfârşit, din vectorul de
sortat.

13
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Program ATESTAT_2004_22_QUICK_SORT;
uses CRT;
CONST
nmax = 50;
TYPE
vector = array [1..50] of real;
VAR
x : vector; {x = variabila globala}
i, n : integer;
procedure QUICK (inf, sup : integer);
VAR
i, j : integer;
aux : real;
b : boolean;
begin
if inf < sup then
begin
i := inf;
j := sup;
b := TRUE;
repeat
if x[i] > x[j] then
begin
aux := x[i];
x[i] := x[j];
x[j] := aux;
b := not b;
end;
if b = TRUE then
j := j - 1
else
i := i + 1;
until i = j;
QUICK ( inf, i - 1);
QUICK ( i + 1, sup);
end;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
repeat
write ('n = '); readln (n)
until (n >= 1) and (n <= nmax);
writeln;
write ('Introduceti elementele vectorului');
writeln;
for i := 1 to n do
begin
write ('x[',i,'] = ');
readln ( x[i] );
end;
writeln;
writeln ('Sirul initial :');
writeln;
for i:=1 to n do
write ( x[i],' ');
QUICK (1, n);
writeln;
writeln ('Sirul sortat :');
writeln;
for i:=1 to n do
write (x[i],' ');
readln;
end.

14
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
ATESTAT - 2004 - 29 - Să se realizeze un program de parcurgere a unui arbore binar.

Rezolvare:
Să presupunem că arborele binar bina are configuraţia din figura de mai jos.
Observaţii:
1
 Nodurile terminale sunt 4, 5, 6, 7 (aceste noduri nu mai
2 3 au descendenţi sau fii). Prin urmare, subarborii stâng şi
drept ai nodurilor terminale vor fi reprezentaţi prin NIL.
Convenim ca, la introducerea datelor, să introducem
4 5 6 7 valoarea 0 (zero) pentru aceşti subarbori, pentru a marca
faptul că nodurile terminale 4, 5, 6, 7 nu mai au descendenţi.
 Pentru crearea arborelui, putem alege oricare dintre
variante: PREordine, Inordine, POSTordine.
 Convenim să creăm arborele din figura de mai sus introducând nodurile în
PREordine (Rădăcină, subarbore STÂNG, subarbore DREPT). În acest caz, nodurile se vor
introduce astfel:
1, 2, 4, 0, 0, 5, 0, 0, 3, 6, 0, 0, 7, 0, 0.

La parcurgerea arborelui în PREordine, succesiunea nodurilor vizitate va fi:


1, 2, 4, 5, 3, 6, 7.

La parcurgerea arborelui în INordine, succesiunea nodurilor vizitate va fi:


4, 2, 5, 1, 6, 3, 7.

La parcurgerea arborelui în POSTordine, succesiunea nodurilor vizitate va fi:


4, 5, 2, 6, 7, 3, 1.

Program ATESTAT_2004_29_PARCURGERE_ARBORE_BINAR;
uses CRT;
TYPE
ARBORE = ^NOD;
NOD = Record
Data : integer ; {numarul nodului, care coincide, }
{pentru simplificare, cu data utila}
stg, dr : ARBORE
END;
VAR
Radacina : ARBORE;

procedure CreareArb (VAR R : ARBORE);


VAR
n : integer; {n = numarul nodului}
BEGIN
write ('Dati numarul nodului, n = ');
readln (n);

IF n = 0 then {urmeaza subarbore VID }


R := NIL
ELSE
begin
NEW ( R );
R^.Data := n;
CreareArb (R^.stg);
CreareArb (R^.dr)
end;
end; {sfarsit procedura CreareArb}

15
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
procedure PREordine (R : arbore);
begin
IF R <> NIL then
begin
write (' ', R^.Data, ' ');
PREordine (R^.stg);
PREordine (R^.dr)
end
end;

procedure INordine (R : arbore);


begin
IF R <> NIL then
begin
INordine (R^.stg);
write (' ', R^.Data, ' ');
INordine (R^.dr)
end
end;

procedure POSTordine (R : arbore);


begin
IF R <> NIL then
begin
POSTordine (R^.stg);
POSTordine (R^.dr);
write (' ', R^.Data, ' ');
end
end;

Begin { PROGRAM PRINCIPAL }


CLRSCR;

writeln ('Informatia nodurilor Arborelui parcurs in PREordine:');


CreareArb ( Radacina );

writeln;
writeln;

writeln ('Arborele parcurs in PREordine:');


PREordine (Radacina);

writeln;
writeln;

writeln ('Arborele parcurs in INordine:');


INordine (Radacina);

writeln;
writeln;

writeln ('Arborele parcurs in POSTordine:');


POSTordine (Radacina);

writeln;
readln
end.

16

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