Sunteți pe pagina 1din 28

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 rnd numere naturale pn la introducerea lui 55.
Stabilii cte cifre de zero i cte 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 ntmplare, numrul
acestor numere nefiind precizat. Introducerea se va ncheia la ntlnirea numrului
55. O variant simplificat a problemei const n introducerea tuturor numerelor
naturale ntre 1 i 55. Vom lua n consideraie ambele situaii.
Pentru transformarea numrului ZECIMAL n numr BINAR, mprim numrul
ZECIMAL la 2 i reinem resturile obinute la mprire ntr-un vector de resturi
R. Numrul BINAR echivalent se obine citind vectorul R de la sfrit ctre
nceput. Pe noi ne intereseaz doar cifrele numrului BINAR, deci este suficient s
numrm cifrele de ZERO i de UNU din vectorul R asociat numrului BINAR.
Definim o procedur TRANSFORMA, care convertete fiecare numr natural
(zecimal) introdus din n numr binar. Procedura va avea ca parametru de ieire
vectorul de resturi R, dar i numrul de cifre n ale numrului binar echivalent,
adic numrul de elemente din R.
n procedur, folosim o variabil auxZECIMAL, ale crei valori vor evolua ntre
NRZECIMAL i 1, pe msur ce auxZECIMAL va fi mprit la 2. Folosind
auxZECIMAL, vom conserva (vom pstra neschimbat) valoarea lui
NRZECIMAL.
Folosim doi contori zero i unu, care numr cifrele de 0 i de 1 din numrul
binar obinut.
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

Probleme rezolvate de programare Subiecte propuse la ATESTAT

end
else
begin
i := 0;
auxZECIMAL := NRZECIMAL;
while auxZECIMAL <> 1 do
begin
rest := auxZECIMAL
MOD
i := i + 1;
R [i] := rest;
auxZECIMAL := auxZECIMAL
end;
i := i + 1;
R [i] := auxZECIMAL;
end;
n := i;
end; {sfarsit procedura}

2;

DIV

2;

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, pn la
introducerea lui 55, atunci vom folosi o structur REPEAT:
Begin { PROGRAM PRINCIPAL }
clrscr;
zero := 0;
{initializare
cifrele de zero si de unu}
unu := 0;
writeln;

contori

care

numara

REPEAT
write ('Dati urmatorul numarul zecimal = ');
readln (NRZECIMAL);
TRANSFORMA (NRZECIMAL, R, n);
writeln;
write
('Numarul
binar
NRZECIMAL,' este
');
for i := n DOWNTO 1 do
write (R[i]);

echivalent

lui

',

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:
5

Probleme rezolvate de programare Subiecte propuse la ATESTAT

begin
{ PROGRAM PRINCIPAL }
clrscr;
zero := 0;
{initializare
cifrele de zero si de unu}
unu := 0;
writeln;

contori

care

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

numara

lui

',

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 nct s nu se atace.
Rezolvare: Aceast problem este asemntoare cu problema celor n
regine, pe care o vom adapta la cerinele de mai sus.
Pentru ca doi regi s nu se atace, ei trebuie s NU fie situai:
pe aceeai linie, unul lng altul,
pe aceeai coloan, unul lng altul sau
pe aceeai diagonal, unul lng altul.
Pe fiecare linie vom plasa cte un rege. Pentru ca poziia regilor s fie complet
determinat, este suficient s reinem, pentru fiecare rege, coloana n care este plasat,
ntr-un vector soluie f, de dimensiune n, unde f [i] reprezint coloana n care este plasat
regele de pe linia i. Generarea matricilor n condiiile problemei se va face apelnd la
un algoritm backtracking.
Observaii:
Notm cu x, respectiv i o linie oarecare i cu f [x], respectiv f [i] coloana pe
care se gsete regele de pe linia x, respectiv linia i.
Condiiile interne:
a). f [x] = 1, 2, ..., n, pentru oricare x = 1, 2, ..., n
b). Doi regi nu pot fi plasai pe aceeai coloan se va exprima analitic astfel:
f [x] f [y] pentru orice x y, cu x, y = 1, 2,...,n.
c). Celelalte condiii interne sunt inserate i comentate direct n program.
Definim o procedur AFIARE astfel:
7

Probleme rezolvate de programare Subiecte propuse la ATESTAT

n momentul apelrii procedurii, este clar c s-a gsit o soluie pe care o numrm
scriind:
Nrsol := Nrsol + 1
i apoi afim Nrsol.
Vom parcurge toate coloanele de la 1 la n. Pentru aceasta avem nevoie de un
contor poziional 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 gsete regele de pe linia lin.
Procedura va tipri " * " dac pe coloana curent col exist un rege, adic atunci
cnd
col = f [lin], i va tipri "o" dac aceast condiie nu este satisfcut.

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
readln (n);

n = ');

nrsol:=0;
x := 1;
f [x] := 0;

{ virful stivei } {
9

x = linie }

Probleme rezolvate de programare Subiecte propuse la ATESTAT

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

linii

vecine,

coloana, fi=fx}
{dar

pe

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

}
{Daca

sunt

pe

aceeasi

linii

vecine,

coloana, f[i-1]=f[i]}
{dar

pe

adica pe i si i-1}
cond2 := (ABS (i-x) = ABS (f[i] - f[x]
))
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

;
if

COND then
begin
ok := false;
end
end; {for}
10

{ OR cond3 }

Probleme rezolvate de programare Subiecte propuse la ATESTAT

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 fiier text care conine pe prima linie numere


naturale. S se afieze numrul valorilor din fiier i valoarea maxim a acestora.
Rezolvare:
n ipoteza c fiierul text nu exist deja pe disc, vom crea acest fiier cu acelai
program care face i celelalte determinri cerute de enun. Vom introduce n
fiierul text n numere naturale, folosind o bucl FOR, astfel:
Dup citirea de la tastatur a unui numr x, l vom converti ntr-un ir,
prin apelarea procedurii STR.
Dup fiecare astfel de ir, vom lsa un singur spaiu liber (blank). n acest
fel, se va crea o linie n fiierul 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 }
11

Probleme rezolvate de programare Subiecte propuse la ATESTAT

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;

12

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 fisierulf 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 fisierulf 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
fost epuizata}
13

{cat timp linia nu a

Probleme rezolvate de programare Subiecte propuse la ATESTAT

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;
14

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 funcie recursiv denumit MAXIM, cu care vom determina maximul
ntr-un interval din vector cuprins ntre dou valori notate cu ncep, respectiv sf.
Funcia va fi apelat iniial pentru ncep = 1 i sf = n (poziiile extreme din vectorul
x).
Dac sf ncep <> 1, se determina mijlocul intervalului sf ncep i se apeleaz
funcia MAXIM pentru jumtatea stng, respectiv dreapt a intervalului al crui
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
15

Probleme rezolvate de programare Subiecte propuse la ATESTAT

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 }

16

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 funcii i proceduri ale cror 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
17

Probleme rezolvate de programare Subiecte propuse la ATESTAT

begin
i := i - 1;
VALPOL := VALPOL * VALX + POL.COEF [i];
end;{while}
ValPolinom:=VALPOL;
end;{function}
function
RoundR
(NUMAR:real;
ZEC:integer)
{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}

18

real;

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}
19

Probleme rezolvate de programare Subiecte propuse la ATESTAT

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,') :');

20

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
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
21

[i]),

Probleme rezolvate de programare Subiecte propuse la ATESTAT

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;

22

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}
23

Probleme rezolvate de programare Subiecte propuse la ATESTAT

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 cresctor un ir de n numere ntregi


memorat ntr-un vector v, folosind metoda sortrii rapide (quick-sort).
Rezolvare:
Am notat cu inf, respectiv cu sup, o poziie de nceput, respectiv de sfrit, din
vectorul de sortat.

24

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
25

Probleme rezolvate de programare Subiecte propuse la ATESTAT

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.

26

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 configuraia din figura de mai jos.
Observaii:
1
Nodurile terminale sunt 4, 5, 6, 7 (aceste noduri
2
3
nu mai au descendeni sau fii). Prin urmare,
subarborii stng i drept ai nodurilor terminale vor
4
5
6
7
fi reprezentai prin NIL. Convenim ca, la
introducerea datelor, s introducem valoarea 0
(zero) pentru aceti subarbori, pentru a marca faptul
c nodurile terminale 4, 5, 6, 7 nu mai au descendeni.
Pentru crearea arborelui, putem alege oricare dintre variante: PREordine,
Inordine, POSTordine.
Convenim s crem arborele din figura de mai sus introducnd nodurile n
PREordine (Rdcin, subarbore STNG, 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,
coincide, }
{pentru simplificare, cu
utila}
stg, dr : ARBORE
END;
VAR
Radacina : ARBORE;
procedure CreareArb (VAR R : ARBORE);
VAR
27

care
data

Probleme rezolvate de programare Subiecte propuse la ATESTAT

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}

28

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
CLRSCR;

');

');

');

PRINCIPAL }

writeln ('Informatia nodurilor Arborelui parcurs in


PREordine:');
CreareArb ( Radacina );
writeln;
writeln;
writeln ('Arborele parcurs in PREordine:');
PREordine (Radacina);
writeln;
writeln;
29

Probleme rezolvate de programare Subiecte propuse la ATESTAT

writeln ('Arborele parcurs in INordine:');


INordine (Radacina);
writeln;
writeln;
writeln ('Arborele parcurs in POSTordine:');
POSTordine (Radacina);
writeln;
readln
end.

30

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