You are on page 1of 129

Probleme rezolvate de programare Subiecte propuse la ATESTAT

2005
BACKTRACKING
ATESTAT - 2005 - 1 - Se citesc de la tastatur dou numere naturale n i k (0 < k < n < 12). S se
afieze toate irurile formate din k litere distincte, litere alese dintre primele n ale alfabetului
englez. Exemplu: pentru k = 2 i n = 4, se afieaz, nu neaprat n aceast ordine, irurile: AB, BA,
AC, CA, AD, DA, BC, CB, BD, DB, CD, DC.
Rezolvare:
Aplicm algoritmul BACKTRACKING pentru generarea aranjamentelor.
program ATESTAT_2005_1_ARANJAMENTE_1;
uses CRT;
CONST
Kmax = 20; { nr . max al el ement el or di n A }
Nmax = 50; { nr . max al el ement el or di n B sau nr . val or i l or f unct i ei }
TYPE
f unct i e = ar r ay [ 1. . Kmax ] of 0. . Nmax;
VAR
k, poz, i : 1 . . Kmax; { se consi der a k <= n }
n : 0 . . Nmax;
f : f unct i e; {sau f : ar r ay [ 1. . Kmax] of [ 1. . Nmax] ; }
I MAG : set of 1 . . Nmax; { I MAG = mul t i mea i magi ni l or el ement el or di n A }
{ adi ca f [ poz] }
Begin { PROGRAM PRINCIPAL }
cl r scr ;
r epeat
wr i t e ( ' k = ' ) ;
r eadl n ( k) ;
unt i l ( k >= 1 ) AND ( k <= Kmax ) ;
r epeat
wr i t e ( ' I nt r oducet i un n >= ' , k, ' n = ' ) ;
r eadl n ( n) ;
i f n < k t hen
wr i t el n ( ' Pent r u acest n = ' , n, ' Nu exi st a sol ut i i ' )
unt i l ( n >= k ) AND ( n >= 1 ) AND ( n <= Nmax ) ;
wr i t el n;
wr i t el n ( ' Apasat i ENTER pent r u ur mat oar ea sol ut i e' ) ;
wr i t el n;
r eadl n;
poz : = 1; { poz = pozi t i a vi r f ul ui st i vei }
f [ poz] : = 0 ; { i ni t i al i zar e el ement }
I MAG : = [ ] ; { i ni t i al i zar e mul t i me i magi ni cu mul t i mea vi da }
while poz > 0 do { cat t i mp st i va nu est e vi da }
begi n
while f [poz] < n do { cat t i mp nu s- au epui zat t oat e }
{ el ement el e di n B }
begi n
f [ poz] : = f [ poz] + 1; {INSERARE}
i f not ( f [ poz] I N I MAG ) t hen
begi n
i f poz = k t hen { daca stiva este plina }
begi n
f or i : = 1 t o k do
Probleme rezolvate de programare Subiecte propuse la ATESTAT
4
begi n {t i par i r e SOLUTI E}
wr i t e ( CHR (64 + f[i] ) , ' ' ) ;
end;
r eadl n;
end
el se
begi n
I MAG : = I MAG + [ f [ poz] ] ;
poz := poz + 1 ; {pas INAINTE}
f [ poz] : = 0 {r ei ni t i al i zar e el ement }
end;
end; { sf . I F NOT }
end; { sf . WHI LE i nt er i or }
poz := poz - 1; {pas INAPOI}
I MAG : = I MAG - [ f [ poz] ] ;
end; { sf . WHI LE ext er i or }
r eadl n
END.
ATESTAT - 2005 - 2 - Civa copii cu vrste ntre 2 si 7 ani trebuie s fie vizitai de Mo Crciun.
Scriei un program care determin toate modurile diferite n care pot ei s fie aezai n lista lui Mo
Crciun, astfel nct s fie vizitai toi copiii i vizitele s se fac n ordinea cresctoare a vrstei lor.
Se citesc de la tastatur: n = numrul de copii (0 < n < 10), apoi numele i vrsta fiecruia dintre cei n
copii. Se scriu, pe linii diferite, liste cu numele copiilor, n ordinea n care vor fi vizitai de Mo Crciun.
O list este format din toate cele n nume ale copiilor, ntr-o anumit ordine, oricare dou nume
succesive fiind desprite prin spaii.
Exemplu:
Pentru datele de intrare: n =4, Dan 6, Cristina 4, Corina 2, Iulia 4
se scriu urmtoarele soluii:
Corina Iulia Cristina Dan
Corina Cristina Iulia Dan
Rezolvare:
Definim o procedur ORDONEAZ, pentru ordonarea numelor copiilor.
program ATESTAT_2005_2_MOS_CRACIUN_SI_COPIII;
uses cr t ;
const
nmax = 100;
t ype
vect or = ar r ay [ 1. . nmax] of i nt eger ;
vect or _nume = ar r ay [ 1. . nmax] of st r i ng;
vect or _vi r st a = ar r ay [ 1. . nmax] of i nt eger ;
var
f : vect or ;
sol , n, i : i nt eger ;
i ncep, sf : i nt eger ;
NUME : vect or _nume;
VI RSTA : vect or _vi r st a;
EGAL : bool ean;
t : i nt eger ;
k : i nt eger ; {cont or car e numar a el ement el e veci ne egal e i n vect or ul VI RSTA }
pozi t i e : i nt eger ; {pozi t i a i ncepi nd de l a car e apar el ement e egal e}
{i n vect or ul VI RSTA}
Probleme rezolvate de programare Subiecte propuse la ATESTAT
5
procedure ORDONEAZA ( VAR v1: vect or _vi r st a; VAR v2 : vect or _nume; q: i nt eger ) ;
var
k1, j , aux: i nt eger ;
si r aux : st r i ng;
begi n
r epeat
k1: = 0;
j : = 1;
r epeat
i f v1[ j ] > v1 [ j +1] t hen
begi n
aux : = v1 [ j ] ;
v1 [ j ] : = v1 [ j +1] ;
v1 [ j +1] : = aux;
siraux : = v2 [ j ] ;
v2 [ j ] : = v2 [ j +1] ;
v2 [ j +1] : = siraux;
k1 : = 1
end;
j : = j + 1
unt i l ( j > q- 1)
unt i l ( k1 = 0) ;
end;
pr ocedur e VERIFICA ( pozi t i a : i nt eger ; f : vect or ; VAR CONTI N : bool ean ) ;
LABEL
10;
VAR
j : i nt eger ;
begi n
CONTI N : = TRUE;
f or j : = 1 t o pozi t i a - 1 do
begi n
i f f [ j ] = f [ pozi t i a] t hen
begi n
CONTI N : = FALSE;
GOTO 10
end;
end;
10:
end;
pr ocedur e SCRIE ;
var
j : i nt eger ;
begi n
sol : = sol + 1;
wr i t e ( ' Sol ut i a nr . ' , sol , ' ' ) ;
f or t : = 1 t o i ncep - 1 do
begi n
wr i t e ( NUME [ t ] , ' ' ) ;
end;
f or j : = 1 t o sf - i ncep + 1 do
begi n
wr i t e ( NUME [ f [ j ] + i ncep - 1 ] , ' ' )
end;
f or t : = sf + 1 t o n do
begi n
wr i t e ( NUME [ t ] , ' ' ) ;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
6
wr i t el n;
r eadl n;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
7
pr ocedur e PERMUTA ( i ncep, sf : i nt eger ) ;
LABEL
20;
var
m: i nt eger ;
poz : i nt eger ;
CONTI N : bool ean;
begi n
m: = sf - i ncep + 1;
poz : = 1;
f [ poz] : = 0;
whi l e poz > 0 do
begi n
CONTI N : = FALSE;
whi l e f [ poz] < mdo
begi n
f [ poz] : = f [ poz] + 1;
VERIFICA (poz, f, CONTIN);
i f CONTI N = TRUE t hen
GOTO 20
end;
20: i f ( CONTI N = TRUE ) AND ( poz = m) t hen
SCRI E;
i f ( CONTI N = TRUE ) and ( poz < m) t hen
begi n
poz : = poz + 1;
f [ poz] : = 0;
end;
i f CONTI N = FALSE t hen
poz : = poz - 1
end; {sf . WHI LE ext er i or }
end;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
sol : = 0;
wr i t e ( ' Dat i numar ul de copi i , n = ' ) ;
r eadl n ( n) ;
wr i t el n;
wr i t el n;
f or i : = 1 t o n do
begi n
wr i t e ( ' Dat i NUMELE copi l ul ui ' , i , ' nume = ' ) ;
r eadl n ( nume [ i ] ) ;
wr i t e ( ' Dat i VI RSTA copi l ul ui ' , i , ' vi r st a = ' ) ;
r eadl n ( vi r st a [ i ] ) ;
wr i t el n;
wr i t el n ( ' *****************************************' ) ;
wr i t el n
end;
ORDONEAZA (virsta, nume, n);
wr i t el n;
wr i t el n ( ' Apasat i ENTER pent r u ur mat oar ea sol ut i e' ) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
8
r eadl n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
9
i : = 1;
whi l e i < n do
begi n
EGAL : = FALSE;
k : = 0;
whi l e ( VI RSTA [ i ] = VI RSTA [ i +1] ) AND ( i < n ) do
begi n
EGAL : = TRUE;
k : = k + 1;
i : = i + 1
end;
i f EGAL = TRUE t hen
begi n
k : = k + 1;
pozitie := i - k + 1;
i ncep : = pozi t i e;
sf := pozitie + k - 1;
PERMUTA (incep, sf);
end;
i : = i + 1
end;
wr i t el n;
i f sol = 0 t hen
wr i t el n ( ' Nu exi st a sol ut i e' ) ;
r eadl n
END.
ATESTAT - 2005 - 3 - Se citesc de la tastatur numerele naturale n i k (0 < n <= 10000 i 0 <
k <= 10) reprezentate n baza 10. S se afieze n ordine cresctoare toate numerele naturale de k cifre
cu proprietatea c sunt formate numai cu cifre ale numrului n.
Exemplu: pentru n = 216 i k = 2, se vor afia numerele:
11, 12, 16, 21, 22, 26, 61, 62, 66.
Rezolvare:
Completm acest algoritm cu cerinele enunului de mai sus.
Mulimile care se nmulesc cartezian vor avea "nrcif" elemente.
Numrul de mulimi care se vor nmuli cartezian = k. Altfel spus, numerele generate vor avea cte k
cifre.
Exemplu, pentru n = 216 (nrcif = 3) i k = 2, vom obine:
(1,2,6) x (1,2,6) =(1,1), (1,2), (1,6), (2,1), (2,2), (2,6), (6,1), (6,2), (6,6)
program ATESTAT_2005_3_Produs_cartezian;
uses CRT;
t ype
vect or = ar r ay [ 1. . 20] of i nt eger ;
var
k, nr ci f , i , x, n : i nt eger ;
w, m, f : vect or ;
si r : st r i ng;
a, er : i nt eger ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
10
pr ocedur e SCRIE;
begi n
f or i : = 1 t o k - 1 do
begi n
wr i t e ( w [ f [ i ] ] ) ;
end;
wr i t e ( w [ f [ k] ] ) ;
wr i t el n;
end;
f unct i on NRCIFRE ( x : i nt eger ) : i nt eger ;
begi n
i f x = 0 t hen
nr ci f : = 1
el se
begi n
nr ci f : = 0;
whi l e x <> 0 do
begi n
nr ci f : = nr ci f + 1;
x : = x DI V 10
end;
end;
NRCI FRE : = nr ci f
end;
pr ocedur e ORDONEAZA ( var v: vect or ; q: i nt eger ) ;
var
k, j , aux: i nt eger ;
begi n
r epeat
k: = 0;
j : = 1;
r epeat
i f v[ j ] > v [ j +1] t hen
begi n
aux : = v[ j ] ;
v[ j ] : = v[ j +1] ;
v[ j +1] : = aux;
k : = 1
end;
j : = j + 1
unt i l ( j > q- 1)
unt i l ( k = 0) ;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t e ( ' Dat i numar ul n ( de ex. n = 215) , n = ' ) ;
r eadl n ( n) ;
nrcif := NRCIFRE (n);
STR (n, sir);
f or i : = 1 t o nr ci f do
begi n
VAL (sir [i], a, er);
w [ i ] : = a;
end;
ORDONEAZA (w, nrcif);
wr i t el n ( ' Pr eci zat i ci t e ci f r e vor avea numer el e gener at e, de ex. k = 2' ) ;
wr i t e ( ' Dat i k = ' ) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
11
r eadl n ( k) ;
wr i t el n ( ' Apasat i ENTER pent r u af i sar ea ur mat oar ei sol ut i i ' ) ;
r eadl n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
12
x : = 1;
f [ x] : = 0;
whi l e x > 0 do
begi n
i f f [ x] < nr ci f t hen
begi n
f [ x] : = f [ x] + 1;
i f x = k t hen
begi n
SCRI E;
r eadl n;
end
el se
begi n
x := x + 1; {PAS INAINTE}
f [ x] : = 0
end
end
el se
x := x 1 {PAS INAPOI}
end;
r eadl n
END.
ATESTAT - 2005 - 4 - S se genereze toate irurile de n (n < 6, numr natural dat de la tastatur) note
muzicale din mulimea {do, re, mi, fa, sol, la, si}. Orice not poate s nu apar sau se poate repeta n
cadrul unui ir. Fiecare ir va fi afiat pe cte o linie, n cadrul liniei, notele fiind separate prin cte un
spaiu.
Exemplu: pentru n = 5, unul dintre irurile generate este:
mi do do si mi
Rezolvare:
program ATESTAT_2005_4_Produs_cartezian;
uses CRT;
t ype
vect or = ar r ay [ 1. . 20] of i nt eger ;
var
p, i , x, n : i nt eger ;
f : vect or ;
not a : ar r ay [ 1. . 7] of st r i ng;
pr ocedur e SCRIE;
begi n
wr i t e ( ' { ' ) ;
f or i : = 1 t o n - 1 do
begi n
wr i t e ( not a [ f [ i ] ] , ' , ' ) ;
end;
wr i t e ( not a [ f [ n] ] , ' ' ) ;
wr i t e ( ' } ' ) ;
wr i t el n;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
13
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t el n ( ' Pr eci zat i ci t e not e t r ebui e sa cont i na si r ul , de exempl u n = 6' ) ;
wr i t e ( ' Dat i n = ' ) ;
r eadl n ( n) ;
p : = 7; {numar ul t ot al de not e: do, r e, . . . si }
wr i t el n;
wr i t el n ( ' Apasat i ENTER dupa f i ecar e sol ut i e' ) ;
r eadl n;
not a [ 1] : = ' do' ;
not a [ 2] : = ' r e' ;
not a [ 3] : = ' mi ' ;
not a [ 4] : = ' f a' ;
not a [ 5] : = ' sol ' ;
not a [ 6] : = ' l a' ;
not a [ 7] : = ' si ' ;
x : = 1;
f [ x] : = 0;
whi l e x > 0 do
begi n
i f f [ x] < p t hen
begi n
f [ x] : = f [ x] + 1;
i f x = n t hen
begi n
SCRIE;
r eadl n;
end
el se
begi n
x := x + 1; {PAS INAINTE}
f [ x] : = 0
end
end
el se
x := x 1 {PAS INAPOI}
end;
r eadl n
END.
ATESTAT - 2005 - 5 - S se genereze toate cuvintele de lungime n (n <10) ale alfabeltului Morse
(formate doar din caracterele '-' i '.'), care nu ncep i nu se termin cu caracterul '-'. Fiecare cuvnt va fi
afiat pe cte o linie.
Rezolvare:
Vom genera produsul cartezian M x M x M ...x M, de n ori, n care mulimea M este format doar
din caracterele . i -.
Asociem: cifrei 1, caracterul "-" cu codul ASCII 45
i cifrei 2, caracterul "." cu codul ASCII 46.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
14
program ATESTAT_2005_5_Codul_Morse_produs_cartezian;
uses CRT;
t ype
vect or = ar r ay [ 1. . 20] of i nt eger ;
var
p, i , x, n : i nt eger ;
m, f : vect or ;
procedure SCRIE;
begi n
f or i : = 1 t o n do
wr i t e ( CHR (44 + f[i] ) , ' ' ) ;
wr i t el n;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t el n ( ' Pr eci zat i de ci t e or i t r ebui e i nmul t i t a mul t i mea M cu ea i nsasi ' ) ;
wr i t e ( ' Dat i n = ' ) ; r eadl n ( n) ;
wr i t el n ( ' Mul t i mea M ar e doar p = 2 el ement e: . si - ' ) ;
p : = 2;
wr i t el n; wr i t el n ( ' Apasat i ENTER dupa f i ecar e sol ut i e' ) ; r eadl n;
x : = 1;
f [ x] : = 0;
whi l e x > 0 do
begi n
i f f [ x] < p t hen
begi n
f [ x] : = f [ x] + 1;
i f x = n t hen
begi n
i f NOT ( f [ 1] = 1 ) AND NOT ( f [ n] = 1 ) t hen
begi n
SCRIE;
r eadl n;
end;
end
el se
begi n
x := x + 1; {PAS INAINTE}
f [ x] : = 0
end
end
el se
x := x 1 {PAS INAPOI}
end;
r eadl n
END.
ATESTAT - 2005 - 6 - Se citete un cuvnt format din maxim 20 de litere distincte. S se afieze
toate anagramele cuvntului respectiv. Un cuvnt A este anagrama unui cuvnt C dac A este
format din aceleai litere ca i cuvntul C, dar aezate n alt ordine.
Exemplu: Pentru cuvntul "car", trebuie afiate, nu neaprat n aceast ordine, anagramele:
car ->cra, acr, arc, rca, rac.
Rezolvare:
Probleme rezolvate de programare Subiecte propuse la ATESTAT
15
Probleme rezolvate de programare Subiecte propuse la ATESTAT
16
program ATESTAT_2005_6_PERMUTARI_ITERATIV;
uses cr t ;
const
nmax = 100;
t ype
vect or = ar r ay [ 1. . nmax] of i nt eger ;
var
f : vect or ;
si r : st r i ng;
l ungi me_si r : i nt eger ;
sol , n, i : i nt eger ;
procedure VERIFICA ( k : i nt eger ; f : vect or ; VAR CONTI N : bool ean ) ;
LABEL
10;
begi n
CONTI N : = TRUE;
f or i : = 1 t o k - 1 do
begi n
i f f [ i ] = f [ k] t hen
begi n
CONTI N : = FALSE;
GOTO 10
end;
end;
10: end;
procedure SCRIE ;
begi n
sol : = sol + 1;
wr i t e ( ' Sol ut i a nr . ' , sol , ' ' ) ;
f or i : = 1 t o n do
wr i t e ( si r [ f [ i ] ] )
r eadl n; wr i t el n {opt i onal e}
end;
procedure PERMUTA ( m : integer );
LABEL
20;
var
k : i nt eger ;
CONTI N : bool ean;
begi n
k : = 1;
f [ k] : = 0;
whi l e k > 0 do
begi n
CONTI N : = FALSE;
whi l e f [ k] < mdo
begi n
f [ k] : = f [ k] + 1;
VERIFICA (k, f, CONTIN);
i f CONTI N = TRUE t hen
GOTO 20
end;
20: i f ( CONTI N = TRUE ) AND ( k = n) t hen
SCRIE;
i f ( CONTI N = TRUE ) and ( k < n) t hen
begi n
k : = k + 1; {PAS INAINTE}
f [ k] : = 0
end;
i f CONTI N = FALSE t hen
Probleme rezolvate de programare Subiecte propuse la ATESTAT
17
k : = k 1 {PAS INAPOI}
end; {sf . WHI LE ext er i or }
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
18
Begin { PROGRAM PRINCIPAL }
cl r scr ;
sol : = 0;
wr i t el n;
wr i t e ( ' Dat i si r ul car e se va per mut a, si r = ' ) ;
r eadl n ( si r ) ;
wr i t el n;
wr i t el n;
wr i t el n;
wr i t el n ( ' Apasat i ENTER dupa f i ecar e sol ut i e af i sat a' ) ;
wr i t el n;
l ungi me_si r : = LENGTH ( si r ) ;
n : = l ungi me_si r ;
wr i t el n;
wr i t el n;
PERMUTA (n);
i f sol = 0 t hen
wr i t el n ( ' Nu exi st a sol ut i e' ) ;
r eadl n
END.
ATESTAT - 2005 - 7 - Se citete din fiierul standard de intrare un numr natural n aparinnd N* i o
mulime M cu p elemente numere ntregi. S se determine i s se scrie elementele produsului
cartezian M x M x...x M (de n ori).
Rezolvare:
program ATESTAT_2005_7_produs_cartezian;
uses CRT;
t ype
vect or = ar r ay [ 1. . 20] of i nt eger ;
var
p, i , x, n : i nt eger ;
m, f : vect or ;
procedure SCRIE;
begi n
wr i t e ( ' { ' ) ;
f or i : = 1 t o n - 1 do
begi n
wr i t e ( f [ i ] , ' , ' ) ;
end;
wr i t e ( f [ n] , ' ' ) ;
wr i t e ( ' ' ) ;
wr i t el n;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
19
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t el n ( ' Pr eci zat i de ci t e or i t r ebui e i nmul t i t a mul t i mea M cu ea i nsasi ' ) ;
wr i t e ( ' Dat i n = ' ) ; r eadl n ( n) ;
wr i t e ( ' Dat i numar ul de el ement e al e mul t i mi i M, p = ' ) ; r eadl n ( p) ;
wr i t el n;
wr i t el n ( ' Apasat i ENTER dupa f i ecar e sol ut i e' ) ;
r eadl n;
x : = 1;
f [ x] : = 0;
whi l e x > 0 do
begi n
i f f [ x] < p t hen
begi n
f [ x] : = f [ x] + 1;
i f x = n t hen
begi n
SCRI E;
r eadl n;
end
el se
begi n
x := x + 1; {PAS INAINTE}
f [ x] : = 0
end
end
el se
x := x 1 {PAS INAPOI}
end;
r eadl n
END.
ATESTAT - 2005 - 8 - Un copil dorete s introduc n bile numerotate de la 1 la n n n cutii, cte o bil
n fiecare cutie. S se afieze toate posibilitile pe care le are copilul de a pune cele n bile n cele n
cutii.
Rezolvare:
program ATESTAT_2005_8_PERMUTARI_ITERATIV;
uses cr t ;
const nmax = 100;
t ype
vect or = ar r ay [ 1. . nmax] of i nt eger ;
var
f : vect or ;
sol , n, i : i nt eger ;
procedure SCRIE ;
begi n
sol : = sol + 1;
wr i t e ( ' Sol ut i a nr . ' , sol , ' ' ) ;
f or i : = 1 t o n do
begi n
wr i t e ( f [ i ] : 5 )
end;
r eadl n; wr i t el n
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
20
procedure VERIFICA ( k : i nt eger ; f : vect or ; VAR CONTI N : bool ean ) ;
LABEL 10;
begi n
CONTI N : = TRUE;
f or i : = 1 t o k - 1 do
begi n
i f f [ i ] = f [ k] t hen
begi n
CONTI N : = FALSE;
GOTO 10
end;
end;
10: end;
procedure PERMUTA ( m: i nt eger ) ;
LABEL 20;
var
k : i nt eger ;
CONTI N : bool ean;
begi n
k : = 1;
f [ k] : = 0;
whi l e k > 0 do
begi n
CONTI N : = FALSE;
whi l e f [ k] < mdo
begi n
f [ k] : = f [ k] + 1;
VERI FI CA ( k, f , CONTI N) ;
i f CONTI N = TRUE t hen
GOTO 20
end;
20: i f ( CONTI N = TRUE ) AND ( k = n) t hen
begi n
SCRI E;
r eadl n;
end;
i f ( CONTI N = TRUE ) and ( k < n) t hen
begi n
k : = k + 1;
f [ k] : = 0
end;
i f CONTI N = FALSE t hen
k : = k - 1
end; {sf . WHI LE ext er i or }
end;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
sol : = 0;
wr i t e( ' Dat i n = ' ) ; r eadl n ( n) ;
wr i t el n;
wr i t el n ( ' Apasat i ENTER dupa f i ecar e sol ut i e' ) ;
wr i t el n;
PERMUTA (n);
i f sol = 0 t hen
wr i t el n ( ' Nu exi st a sol ut i e' ) ;
r eadl n
END.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
21
ATESTAT - 2005 - 9 - S se genereze toate PALINDROAMELE care au n cifre, iar cifrele au valori
ntre 0 i p. Se citesc de la tastatur n i p (0 < n < 10, 0 < p < 5). Reamintim c un numr este
PALINDROM dac numrul coincide cu imaginea lui n oglind. Altfel spus, un numr este
PALINDROM dac citit direct i invers rezultatul este acelai.
Exemplu: 121 este PALINDROM.
Barem:
- declararea variabilelor: 0.5 puncte
- citirea datelor de intrare: 1 punct
- un algoritm de generare principial corect: 3 puncte
- verificarea condiiilor de continuare : 2 puncte
- afiarea soluiilor: 2 puncte
- corectitudinea sintactic a programului : 0.5 puncte
- din oficiu 1 punct.
Rezolvare:
program ATESTAT_2005_9_ PALINDROAME;
uses CRT;
t ype
vect or = ar r ay [ 1. . 20] of i nt eger ;
var
m, f : vect or ;
p, poz, A, B, x, n, nr ci f , i : i nt eger ;
OK : bool ean;
y : ar r ay [ 1. . 100] of i nt eger ;
function PUTERE ( z: i nt eger ; t : i nt eger ) : i nt eger ;
var
p1, j : i nt eger ;
begi n
p1 : = 1;
f or j : = 1 t o t do
p1 : = p1 * z;
PUTERE : = p1
end;
function NRCIFRE ( x : i nt eger ) : i nt eger ;
begi n
i f x = 0 t hen
nr ci f : = 1
el se
begi n
nr ci f : = 0;
whi l e x <> 0 do
begi n
nr ci f : = nr ci f + 1;
x : = x DI V 10
end;
end;
NRCI FRE : = nr ci f
end;
function PALINDROM ( x : i nt eger ) : bool ean;
begi n
n : = NRCI FRE ( x) ;
f or i : = n DOWNTO 1 do
begi n
y [ i ] : = x MOD 10;
x : = x DI V 10;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
22
OK := TRUE;
f or i : = 1 t o n DI V 2 do
begi n
i f y [ i ] <> y [ n- i +1] t hen
OK := FALSE
end;
PALI NDROM : = OK
end; { sf ar si t f unct i e PALI NDROM }
procedure SCRIE;
begi n
wr i t e ( ' { ' ) ;
f or i : = 1 t o n - 1 do
begi n
wr i t e ( f [ i ] , ' , ' ) ;
end;
wr i t e ( f [ n] , ' ' ) ;
wr i t e ( ' ' ) ;
wr i t el n; wr i t el n;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t el n ( ' Pr eci zat i numar ul de ci f r e al vi i t or ul ui numar ' ) ;
wr i t e ( ' Dat i n = ' ) ; r eadl n ( n) ;
{n = nr de mul t i mi al e pr odusul ui car t ezi an }
wr i t el n;
r epeat
wr i t el n ( ' Pr eci zat i car e est e cea mai mar e ci f r a di n vi i t or ul numar ' ) ;
wr i t e ( ' Dat i p = ' ) ; r eadl n ( p) ;
unt i l ( p > 0) AND ( p<=5) ;
wr i t el n;
{est e acel asi l ucr u cu a cer e numar ul de el ement e di n f i ecar e mul t i me }
{i mpl i cat a i n cal cul ul pr odusul ui car t ezi an }
poz : = 1;
f [ poz] : = 0;
whi l e poz > 0 do
begi n
i f f [ poz] < p t hen
begi n
f [ poz] : = f [ poz] + 1;
i f poz = n t hen
begi n
x : = 0;
f or i : = n downt o 1 do
begi n
x : = x + PUTERE ( 10, n- i ) * f [ i ] ;
end;
i f PALI NDROM ( x) = TRUE t hen
begi n
wr i t el n ( ' x = ' , x, ' est e PALI NDROM' ) ;
SCRI E;
end;
end
el se
begi n
poz := poz + 1; {PAS INAINTE}
f [ poz] : = 0
end
end
el se
poz := poz 1 {PAS INAPOI}
Probleme rezolvate de programare Subiecte propuse la ATESTAT
23
end;
r eadl n
END.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
24
ALOCARE DINAMICA
ATESTAT - 2005 - 10 - S se realizeze operaiile de creare i vizualizare a unei stive implementate
dinamic, precum i eliminarea unui element din stiv.
Barem:
- declararea corect a variabilelor: 1 punct
- crearea: 4 puncte
- vizualizarea: 2 puncte
- eliminarea unui element: 2 puncte
- din oficiu: 1 punct
Rezolvare:
program ATESTAT_2005_10_STIVA;
l abel
10, 500;
t ype
STIVA = ^Nod;
Nod = r ecor d
chei e : i nt eger ;
dat a : i nt eger ;
ur m: STIVA
end;
var
p, q, r , baza : STIVA;
n, x, i , j : i nt eger ;
dat a : i nt eger ;
c : char ;
procedure CITDATA; { i nt r oducer e dat e ut i l e }
begi n
wr i t e ( ' i nt r oducet i dat el e nodul ui : ' ) ;
r eadl n ( dat a) ;
end;
procedure TRAVLISTA ; { t r aver sar e i n or di nea i nt r oducer i i }
begi n
p: =baza;
whi l e p<>ni l do
begi n
wr i t el n( ' chei a= ' , p^. chei e, ' dat a= ' , p^. dat a) ;
p: =p^. ur m;
wr i t el n
end;
end;
procedure INSEREAZAPRIMUL ; {i nt r oduce pr i mul el ement - l a i ncep. Li st ei }
begi n
baza: =ni l ;
new( p) ;
wr i t e( ' dat i chei a nodul ui 1 : ' ) ;
r eadl n( p^. chei e) ;
p^. ur m: =baza;
baza: =p;
CI TDATA;
p^. dat a: =dat a
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
25
procedure INSEREAZAREST ; { i nt r oduce cel el al t e el em. - l a sf i r s. l i st ei }
begi n
new ( q) ;
q^. ur m: =ni l ;
p^. ur m: =q;
i f j <=n t hen
begi n
wr i t e( ' dat i chei a nodul ui ' , j , ' : ' ) ;
r eadl n( q^. chei e) ;
CI TDATA;
q^. dat a: =dat a;
p: =q
end
el se
begi n
q^. chei e: =N+1;
{ q^. dat a: =' ACEST NOD NU SE VA STERGE SI NU SE ADAUGA NI MI C DUPA EL' ; }
p: =q
end
end;
procedure CAUTA ; { caut a un nod dupa chei e }
var
b: bool ean;
begi n
b: =f al se;
wr i t e( ' DATI CHEI A X = ' ) ;
r eadl n( x) ;
wr i t el n;
p: =baza;
whi l e ( p<>ni l ) and not b do
begi n
i f p^. chei e=x t hen
b: =t r ue
el se
p: =p^. ur m
end;
i f not b t hen
wr i t el n( ' NODUL ( CHEI A ) NU EXI STA ' )
el se
begi n
wr i t el n( ' PRI MUL NOD CARE ARE CHEI A ' , X, ' ESTE ' ) ;
wr i t el n( p^. chei e, ' ' , p^. dat a) ;
wr i t el n
end
end;
procedure STERGE ; { st er ge un nod i ndi cat pr i nt r - o chei e }
begi n
q: =p^. ur m;
p^: =q^
end;
Begin { PROGRAM PRINCIPAL }
wr i t e( ' dat i nr . de nodur i N = ' ) ;
r eadl n( n) ;
wr i t el n;
i f n=0 t hen
begi n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
26
wr i t el n( ' LI STA VI DA' ) ;
got o 500
end
Probleme rezolvate de programare Subiecte propuse la ATESTAT
27
el se
begi n
wr i t el n( ' I NTRODUCETI DATELE NODULUI 1 ' ) ;
INSEREAZAPRIMUL;
wr i t el n
end;
i f n > 1 t hen
begi n
f or j : =2 t o n do
begi n
INSEREAZAREST;
wr i t el n
end
end;
j : =j +1;
INSEREAZAREST;
wr i t el n;
wr i t el n( ' LI STA ESTE : ' ) ;
TRAVLISTA;
wr i t el n;
10: wr i t e( ' DORI TI SA CAUTATI UN NOD ? APASATI D SAU N ' ) ;
r eadl n( c) ;
i f ( c=' d' ) or ( c=' D' ) t hen
begi n
CAUTA
end;
wr i t el n;
wr i t e( ' DORI TI SA STERGETI UN NOD ? APASATI D SAU N ' ) ;
r eadl n( c) ;
wr i t el n;
i f ( c=' d' ) or ( c=' D' ) t hen
begi n
CAUTA;
wr i t el n( ' CONTI NUT NOD CU CHEI A ' , X, ' I NAI NTE DE STERGERE ESTE ' ) ;
wr i t el n( p^. chei e, ' ' , p^. dat a) ;
wr i t el n;
STERGE;
wr i t el n;
wr i t el n( ' CONTI NUTUL NODULUI DUPA STERGERE ESTE : ' ) ;
wr i t el n( p^. chei e, ' ' , p^. dat a) ;
wr i t el n;
wr i t el n( ' LI STA DUPA STERGEREA NODULUI CU CHEI A ' , X, ' ESTE : ' ) ;
TRAVLISTA;
wr i t el n
end;
wr i t e( ' DORI TI SA RELUATI PROGRAMUL ? APASATI D SAU N ' ) ;
r eadl n( c) ;
wr i t el n;
i f ( c=' d' ) or ( c=' D' ) t hen got o 10;
500: r eadl n
END.
ATESTAT - 2005 - 11 - S se realizeze operaiile de creare i vizualizare a unei cozi implementate
dinamic, precum i eliminarea unui element din coad.
Barem:
- declararea corect a variabilelor: 1 punct
- crearea: 4 puncte
- vizualizarea: 2 puncte
Probleme rezolvate de programare Subiecte propuse la ATESTAT
28
- eliminarea unui element: 2 puncte
- din oficiu: 1 punct
Probleme rezolvate de programare Subiecte propuse la ATESTAT
29
Rezolvare:
program ATESTAT_2005_11_COADA;
l abel
10, 500;
t ype
COADA=^nod;
nod=r ecor d
chei e : i nt eger ;
dat a : i nt eger ;
ur m: COADA
end;
var
q, r , baza, p : COADA;
n, x, i , j : i nt eger ;
dat a : i nt eger ;
c : char ;
procedure CITDATA; { i nt r oducer e dat e ut i l e }
begi n
wr i t e ( ' i nt r oducet i dat el e nodul ui : ' ) ;
r eadl n ( dat a) ;
end;
procedure TRAVLISTA ; { t r aver sar e i n or di nea i nt r oducer i i }
begi n
p: =baza;
whi l e p<>ni l do
begi n
wr i t el n( ' chei a= ' , p^. chei e, ' dat a= ' , p^. dat a) ;
p: =p^. ur m;
wr i t el n
end;
end; {sf ar si t pr ocedur a TRAVLI STA}
procedure INSEREAZAPRIMUL ; {i nt r oduce pr i mul el ement - l a i ncep. l i st ei }
begi n
baza: =ni l ;
new( p) ;
wr i t e( ' dat i chei a nodul ui 1 : ' ) ;
r eadl n( p^. chei e) ;
p^. ur m: =baza;
baza: =p;
CI TDATA;
p^. dat a: =dat a
end;
procedure INSEREAZAREST ; { i nt r oduce cel el al t e el em. - l a sf i r s. l i st ei }
begi n
new ( q) ;
q^. ur m: =ni l ;
p^. ur m: =q;
i f j <=n t hen
begi n
wr i t e( ' dat i chei a nodul ui ' , j , ' : ' ) ;
r eadl n( q^. chei e) ;
CI TDATA;
q^. dat a: =dat a;
p: =q
Probleme rezolvate de programare Subiecte propuse la ATESTAT
30
end
Probleme rezolvate de programare Subiecte propuse la ATESTAT
31
el se
begi n
q^. chei e: =N+1;
{ q^. dat a: =' ACEST NOD NU SE VA STERGE SI NU SE ADAUGA NI MI C DUPA EL' ; }
p: =q
end
end;
procedure CAUTA ; { caut a un nod dupa chei e }
var
b: bool ean;
begi n
b: =f al se;
wr i t e( ' DATI CHEI A X = ' ) ;
r eadl n( x) ;
wr i t el n;
p: =baza;
whi l e ( p<>ni l ) and not b do
begi n
i f p^. chei e=x t hen
b: =t r ue
el se
p: =p^. ur m
end;
i f not b t hen
wr i t el n( ' NODUL ( CHEI A ) NU EXI STA ' )
el se
begi n
wr i t el n( ' PRI MUL NOD CARE ARE CHEI A ' , X, ' ESTE ' ) ;
wr i t el n( p^. chei e, ' ' , p^. dat a) ;
wr i t el n
end
end;
procedure STERGE ; { st er ge un nod i ndi cat pr i nt r - o chei e }
begi n
q: =p^. ur m;
p^: =q^
end;
Begin { PROGRAM PRINCIPAL }
wr i t e( ' Dat i numar ul de nodur i N = ' ) ; r eadl n( n) ;
wr i t el n;
i f n=0 t hen
begi n
wr i t el n( ' LI STA VI DA' ) ;
got o 500
end
el se
begi n
wr i t el n( ' I NTRODUCETI DATELE NODULUI 1 ' ) ;
INSEREAZAPRIMUL;
wr i t el n
end;
i f n > 1 t hen
begi n
f or j : =2 t o n do
begi n
INSEREAZAREST;
wr i t el n
end
end;
j : =j +1;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
32
wr i t el n( ' I NTRODUCETI NODUL F A N I O N ' ) ;
INSEREAZAREST;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
33
wr i t el n( ' LI STA ESTE : ' ) ;
TRAVLISTA;
wr i t el n;
10: wr i t e( ' DORI TI SA CAUTATI UN NOD ? APASATI D SAU N ' ) ;
r eadl n( c) ;
i f ( c=' d' ) or ( c=' D' ) t hen
CAUTA
wr i t el n;
wr i t e( ' DORI TI SA STERGETI UN NOD ? APASATI D SAU N ' ) ;
r eadl n( c) ;
wr i t el n;
i f ( c=' d' ) or ( c=' D' ) t hen
begi n
CAUTA;
wr i t el n( ' CONTI NUT NOD CU CHEI A ' , X, ' I NAI NTE DE STERGERE ESTE ' ) ;
wr i t el n( p^. chei e, ' ' , p^. dat a) ;
wr i t el n;
STERGE;
wr i t el n;
wr i t el n( ' CONTI NUTUL NODULUI DUPA STERGERE ESTE : ' ) ;
wr i t el n( p^. chei e, ' ' , p^. dat a) ;
wr i t el n;
wr i t el n( ' LI STA DUPA STERGEREA NODULUI CU CHEI A ' , X, ' ESTE : ' ) ;
TRAVLISTA;
wr i t el n
end;
wr i t e( ' DORI TI SA RELUATI PROGRAMUL ? APASATI D SAU N ' ) ;
r eadl n( c) ;
wr i t el n;
i f ( c=' d' ) or ( c=' D' ) t hen got o 10;
500: r eadl n
END.
ATESTAT - 2005 - 12 - S se creeze o list liniar dublu nlnuit avnd ca elemente cuvinte citite
din fiierul standard de intrare, pn la ntlnirea caracterului * . S se afieze cuvintele n ordine
invers citirii i apoi n ordinea n care s-au citit.
Barem:
- declararea corect a variabilelor: 1 punct
- crearea: 4 puncte
- vizualizarea: 4 puncte
- din oficiu: 1 punct
Rezolvare:
program ATESTAT_2005_12_LISTA_DUBLU_INLANTUITA;
uses CRT;
l abel
10, 500;
t ype
LISTA = ^nod;
nod = r ecor d
chei e : i nt eger ;
dat a : st r i ng;
ur m, pr eced : LISTA
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
34
var
q, r , baza, p: LISTA;
n, x, i , j : i nt eger ;
dat a: st r i ng;
c: char ;
procedure CITDATA; { i nt r oducer e dat e ut i l e }
begi n
wr i t e ( ' I nt r oducet i dat el e nodul ui : ' ) ;
r eadl n ( dat a) ;
end;
procedure TRAVLISTA_INCEP_SFARSIT ; { t r aver sar e l i st a i nceput - > sf i r si t }
begi n
p: =baza;
wr i t el n ( ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' ) ;
wr i t el n ( ' Tr aver sar e i n sens di r ect ' ) ;
wr i t el n ( ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' ) ;
whi l e ( p<>ni l ) AND ( p^. dat a <> ' *' ) do
begi n
wr i t el n ( ' NODUL cu chei a= ' , p^. chei e, ' dat a= ' , p^. dat a) ;
p:=p^.urm;
end;
wr i t el n( ' Ul t i mul NOD ( FANI ON) : chei a= ' , p^. chei e, ' dat a= ' , p^. dat a) ;
end;
procedure TRAVLIST_SFARSIT_INCEP; { t r aver sar e l i st a sf i r si t - > i nceput }
begi n
p: =baza;
q: =p;
p: =p^. ur m;
p^. pr eced : = q;
whi l e ( p<>ni l ) AND ( p^. dat a <> ' *' ) do
begi n
q : = p;
p: =p^. ur m;
p^. pr eced : = q;
end;
wr i t el n ( ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' ) ;
wr i t el n ( ' Tr aver sar e i n sens i nver s' ) ;
wr i t el n ( ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' ) ;
whi l e p <> baza do
begi n
wr i t el n ( ' NOD CURENT chei a= ' , p^. chei e, ' dat a= ' , p^. dat a) ;
p: =p^. pr eced;
end;
wr i t el n( ' NOD CURENT chei a= ' , p^. chei e, ' dat a= ' , p^. dat a) ;
end; {sf ar si t pr ocedur a TRAVLIST_SFARSIT_INCEP }
procedure INSEREAZAPRIMUL ; {i nt r oduce pr i mul el ement - l a i ncep. l i st ei }
begi n
baza: =ni l ;
new( p) ;
wr i t e( ' dat i chei a nodul ui 1 : ' ) ;
r eadl n( p^. chei e) ;
p^. ur m: =baza;
baza: =p;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
35
CI TDATA;
p^. dat a: =dat a
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
36
procedure INSEREAZAREST ; { i nt r oduce cel el al t e el em. }
{ pr i n t ehni ca "l a sf ar si t ul l i st ei " }
begi n
new ( q) ;
q^. ur m: =ni l ;
p^. ur m: =q;
i f j <=n t hen
begi n
wr i t e( ' dat i chei a nodul ui ' , j , ' : ' ) ;
r eadl n( q^. chei e) ;
CITDATA;
q^. dat a: =dat a;
p: =q
end
el se
begi n
q^. chei e: =N+1;
q^. dat a: =' *' ;
{ NOD FANI ON - ACEST NOD NU SE VA STERGE }
{ SI NU SE ADAUGA NI MI C DUPA EL }
p : = q
end
end;
procedure CAUTA ; { caut a un nod dupa chei e }
var
b: bool ean;
begi n
b: =f al se;
wr i t e( ' DATI CHEI A X = ' ) ;
r eadl n( x) ;
wr i t el n;
p: =baza;
whi l e ( p<>ni l ) and not b do
begi n
i f p^. chei e=x t hen
b: =t r ue
el se
p: =p^. ur m
end;
i f not b t hen
wr i t el n( ' NODUL ( CHEI A ) NU EXI STA ' )
el se
begi n
wr i t el n( ' PRI MUL NOD CARE ARE CHEI A ' , X, ' ESTE ' ) ;
wr i t el n( p^. chei e, ' ' , p^. dat a) ;
wr i t el n
end
end;
procedure STERGE ; { st er ge un nod i ndi cat pr i nt r - o chei e }
begi n
q: =p^. ur m;
p^: =q^
end;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e( ' Dat i nr . de nodur i N = ' ) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
37
r eadl n( n) ;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
38
i f n=0 t hen
begi n
wr i t el n( ' LI STA VI DA' ) ;
got o 500
end
el se
begi n
wr i t el n( ' I NTRODUCETI DATELE NODULUI 1 ' ) ;
INSEREAZAPRIMUL;
wr i t el n
end;
i f n > 1 t hen
begi n
f or j : =2 t o n do
begi n
INSEREAZAREST;
wr i t el n
end
end;
j : =j +1;
INSEREAZAREST;
wr i t el n;
wr i t el n( ' LI STA par cur sa de l a I NCEPUT l a SFI RSI T est e : ' ) ;
TRAVLISTA_INCEP_SFIRSIT;
wr i t el n;
wr i t el n ( ' *********************************************' ) ;
wr i t el n;
wr i t el n( ' LI STA par cur sa de l a SFI RSI T l a I NCEPUT est e : ' ) ;
TRAVLIST_SFIRSIT_INCEP;
wr i t el n;
500: r eadl n
END.
ATESTAT - 2005 - 13 - Se citete de la tastatur un ir de numere ntregi, care se ncheie cu citirea
valorii 0. S se creeze o list liniar simplu nlnuit astfel nct, la parcurgerea listei, elementele s
apar n ordinea n care au fost citite.
a). S se afieze coninutul listei;
b). S se verifice dac elementele listei sunt ordonate cresctor.
Barem:
- declaraii corecte: 1 punct
- crearea listei: 3 puncte
- vizualizarea coninutului: 2 puncte
- algoritm de verificare a ordonrii cresctoare: 3 puncte
Probleme rezolvate de programare Subiecte propuse la ATESTAT
39
- din oficiu: 1 punct
Probleme rezolvate de programare Subiecte propuse la ATESTAT
40
Rezolvare:
program ATESTAT_2005_13_LISTA_LINIARA_SIMPLU_INLANTUITA_INTREGI;
uses CRT;
l abel
10, 500;
const
nmax = 50;
t ype
LISTA = ^Nod;
Nod = r ecor d
chei e : i nt eger ;
dat a : i nt eger ;
ur m: LISTA
end;
vect or = ar r ay [ 1. . nmax] of i nt eger ;
var
q, r , baza, p : LISTA;
n, x, i , j : i nt eger ;
dat a : i nt eger ;
c : char ;
v : vect or ;
function VERIFICA ( v : vect or ; q: i nt eger ) : bool ean;
var
j : i nt eger ;
begi n
VERI FI CA : = TRUE;
j : = 1;
r epeat
i f v[ j ] > v [ j +1] t hen
VERI FI CA : = FALSE;
j : = j + 1
unt i l ( j > q- 1)
end;
procedure TRAVLISTA ; { t r aver sar e i n or di nea i nt r oducer i i }
begi n
p: =baza;
whi l e p<>ni l do
begi n
wr i t el n ( ' dat a= ' , p^. dat a) ;
p: =p^. ur m;
end;
end;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t el n ( ' Dat i el ement el e l i st ei ' ) ;
wr i t el n ( ' **********************' ) ;
i : = 0; {cont or car e numar a numer el e i nt r oduse }
wr i t e ( ' Dat i pr i mul el ement , x = ' ) ;
r eadl n ( x) ;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
41
I f x = 0 t hen
begi n
wr i t el n ( ' LI STA VI DA' ) ;
got o 500
end
el se
begi n { I NSERARE PRI MUL NOD }
i : = i + 1;
baza: =ni l ;
new ( p) ;
p^. ur m: =baza;
baza: =p;
p^. dat a : = x;
v [ i ] : = x;
end;
wr i t el n;
wr i t el n ( ' Dat i ur mat oar el e el ement e' ) ;
r epeat
wr i t e ( ' Dat i el ement ul ' , i + 1, ' x = ' ) ;
r eadl n ( x) ;
i f x <> 0 t hen { I NSERARE URMATOARELE NODURI }
begi n
i : = i + 1;
v [ i ] : = x;
new ( q) ;
q^. ur m: = ni l ;
p^. ur m: = q;
q^. dat a : = x;
p : = q
end;
unt i l x = 0;
n : = i ;
wr i t el n;
wr i t el n ( ' Li st a ar e ' , n, ' el ement e' ) ;
wr i t el n;
wr i t el n( ' LI STA ESTE : ' ) ;
TRAVLI STA;
wr i t el n;
i f VERI FI CA ( v, n) = TRUE t hen
wr i t el n ( ' Li st a est e ORDONATA' )
el se
wr i t el n ( ' Li st a NU est e ORDONATA' ) ;
500: r eadl n
END.
ATESTAT - 2005 - 14 - S se creeze o list liniar simplu nlnuit format din numere ntregi
introduse de la tastatur. S se afieze coninutul listei, dup care s se realizeze transferul primului
element la sfritul listei.
Exemplu: Dac lista conine iniial elementele 2, 51, 4, 7, 14, 25, 69 (n aceast ordine), dup
transfer coninutul va fi: 51, 4, 7, 14, 25, 69, 2 (n aceast ordine).
Barem:
- declaraii corecte: 1 punct
- crearea listei: 3 puncte
- vizualizarea coninutului: 2 puncte
Probleme rezolvate de programare Subiecte propuse la ATESTAT
42
- realizarea transferului cerut: 3 puncte
- din oficiu: 1 punct
Probleme rezolvate de programare Subiecte propuse la ATESTAT
43
Rezolvare:
program ATESTAT_2005_14_LISTA_SIMPLU_INLANTUITA;
uses CRT;
l abel
10, 500;
t ype
LISTA = ^NOD;
NOD = r ecor d
chei e : i nt eger ;
dat a : i nt eger ;
ur m: LISTA
end;
var
q, r , baza, p: LISTA;
n, x, i , j : i nt eger ;
dat a: i nt eger ;
pr i mul , ul t i mul : i nt eger ;
c: char ;
procedure CITDATA; { i nt r oducer e dat e ut i l e }
begi n
wr i t e( ' i nt r oducet i dat el e nodul ui : ' ) ;
r eadl n( dat a) ;
end;
procedure TRAVLISTA_INCEP_SFIRSIT ; { t r aver sar e l i st a i nceput - > sf i r si t }
begi n
p: =baza;
wr i t el n ( ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' ) ;
pr i mul : = p^. dat a;
wr i t el n ( ' Pr i mul = ' , pr i mul ) ;
wr i t el n;
whi l e p <> ni l do
begi n
wr i t el n ( ' NODUL cu chei a= ' , p^. chei e, ' dat a= ' , p^. dat a) ;
ultimul := p^.data;
p:=p^.urm;
end;
wr i t el n;
wr i t el n ( ' Ul t i mul = ' , ul t i mul ) ;
wr i t el n;
end;
procedure INSEREAZAPRIMUL ; {i nt r oduce pr i mul el ement - l a i ncep. l i st ei }
begi n
baza: =ni l ;
new( p) ;
wr i t e( ' dat i chei a nodul ui 1 : ' ) ;
r eadl n( p^. chei e) ;
p^. ur m: =baza;
baza: =p;
CI TDATA;
p^. dat a: =dat a
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
44
procedure TRANSFERA ; { i nser eaza un nod NOU dupa un nod cu chei a caut at a }
var
aux : i nt eger ;
begi n
aux : = pr i mul ;
pr i mul : = ul t i mul ;
ul t i mul : = aux;
end;
procedure INSEREAZAREST ; { i nt r oduce cel el al t e el em. }
{ pr i n t ehni ca "l a sf i r s. l i st ei " }
begi n
new ( q) ;
q^. ur m: =ni l ;
p^. ur m: =q;
i f j <=n t hen
begi n
wr i t e( ' dat i chei a nodul ui ' , j , ' : ' ) ;
r eadl n( q^. chei e) ;
CI TDATA;
q^. dat a: =dat a;
p: =q
end
el se
begi n
q^. chei e: =N+1;
q^. dat a: = 0;
{ NOD FANI ON - ACEST NOD NU SE VA STERGE }
{ SI NU SE ADAUGA NI MI C DUPA EL }
p: =q
end
end;
procedure CAUTA ; { caut a un nod dupa chei e }
var
b: bool ean;
begi n
b: =f al se;
wr i t e( ' DATI CHEI A X = ' ) ;
r eadl n( x) ;
wr i t el n;
p: =baza;
whi l e ( p<>ni l ) and not b do
begi n
i f p^. chei e=x t hen
b: =t r ue
el se
p: =p^. ur m
end;
i f not b t hen
wr i t el n( ' NODUL ( CHEI A ) NU EXI STA ' )
el se
begi n
wr i t el n( ' PRI MUL NOD CARE ARE CHEI A ' , X, ' ESTE ' ) ;
wr i t el n( p^. chei e, ' ' , p^. dat a) ;
wr i t el n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
45
end
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
46
procedure STERGE ; { st er ge un nod i ndi cat pr i nt r - o chei e }
begi n
q: =p^. ur m;
p^: =q^
end;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e( ' dat i nr . de nodur i N = ' ) ;
r eadl n( n) ;
wr i t el n;
i f n=0 t hen
begi n
wr i t el n( ' LI STA VI DA' ) ;
got o 500
end
el se
begi n
wr i t el n ( ' I NTRODUCETI DATELE NODULUI 1 ' ) ;
INSEREAZAPRIMUL;
wr i t el n
end;
i f n > 1 t hen
begi n
f or j : =2 t o n do
begi n
INSEREAZAREST;
wr i t el n
end
end;
wr i t el n;
wr i t el n ( ' Pr i ma t r aver sar e a l i st ei ' ) ;
TRAVLISTA_INCEP_SFIRSIT;
wr i t el n;
wr i t el n ( ' *********************************************' ) ;
wr i t el n;
r eadl n;
TRANSFERA;
wr i t el n;
wr i t el n ( ' Dupa TRANSFER, avem: ' ) ;
wr i t el n;
wr i t el n ( ' Pr i mul = ' , pr i mul ) ;
wr i t el n ( ' Ul t i mul = ' , ul t i mul ) ;
p : = baza;
p^. dat a : = pr i mul ;
j : = 1;
whi l e ( p <> ni l ) AND ( j <> n) do
begi n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
47
p: =p^. ur m;
j : = j + 1;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
48
p^. dat a : = ul t i mul ;
wr i t el n;
wr i t el n ( ' A doua t r aver sar e a l i st ei : ' ) ;
TRAVLISTA_INCEP_SFIRSIT ;
500: r eadl n
END.
ATESTAT - 2005 - 15 - S se descrie operaia de adugare a unui nou element la o list liniar
simplu nlnuit, implementat dinamic, ce conine caractere n noduri.
Barem:
- declaraii corecte: 1 punct
- crearea listei: 3 puncte
- vizualizarea coninutului: 2 puncte
- adugarea unui element: 3 puncte
- din oficiu: 1 punct
Rezolvare:
program ATESTAT_2005_15_LISTA_LINIARA_SIMPLU_INLANTUITA;
l abel
10, 500;
t ype
LISTA = ^NOD;
NOD = r ecor d
chei e: i nt eger ;
dat a: CHAR;
ur m: LISTA
end;
var
p, q, r , baza : LISTA;
n, x, i , j : i nt eger ;
dat a: CHAR;
c: char ;
procedure CITDATA; { i nt r oducer e dat e ut i l e }
begi n
wr i t e ( ' i nt r oducet i dat el e nodul ui : ' ) ;
r eadl n ( dat a) ;
end;
procedure TRAVLISTA ; { t r aver sar e i n or di nea i nt r oducer i i }
begi n
p: =baza;
whi l e p<>ni l do
begi n
wr i t el n( ' chei a= ' , p^. chei e, ' dat a= ' , p^. dat a) ;
p: =p^. ur m;
wr i t el n
end;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
49
procedure INSEREAZAPRIMUL ; {i nt r oduce pr i mul el ement - l a i ncep. l i st ei }
begi n
baza: =ni l ;
new( p) ;
wr i t e( ' dat i chei a nodul ui 1 : ' ) ;
r eadl n( p^. chei e) ;
p^. ur m: =baza;
baza: =p;
CI TDATA;
p^. dat a: =dat a
end;
procedure INSEREAZAREST ; { i nt r oduce cel el al t e el em. - l a sf i r s. l i st ei }
begi n
new ( q) ;
q^. ur m: =ni l ;
p^. ur m: =q;
i f j <=n t hen
begi n
wr i t e( ' dat i chei a nodul ui ' , j , ' : ' ) ;
r eadl n( q^. chei e) ;
CI TDATA;
q^. dat a: =dat a;
p: =q
end
el se
begi n
q^. chei e: =N+1;
{ q^. dat a: =' ACEST NOD NU SE VA STERGE SI NU SE ADAUGA NI MI C DUPA EL' ; }
p: =q
end
end;
procedure CAUTA ; { caut a un nod dupa chei e }
var
b: bool ean;
begi n
b: =f al se;
wr i t e( ' DATI CHEI A X = ' ) ;
r eadl n( x) ;
wr i t el n;
p: =baza;
whi l e ( p<>ni l ) and not b do
begi n
i f p^. chei e=x t hen
b: =t r ue
el se
p: =p^. ur m
end;
i f not b t hen
wr i t el n( ' NODUL ( CHEI A ) NU EXI STA ' )
el se
begi n
wr i t el n( ' PRI MUL NOD CARE ARE CHEI A ' , X, ' ESTE ' ) ;
wr i t el n( p^. chei e, ' ' , p^. dat a) ;
wr i t el n
end
end;
procedure STERGE ; { st er ge un nod i ndi cat pr i nt r - o chei e }
begi n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
50
q: =p^. ur m;
p^: =q^
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
51
Begin { PROGRAM PRINCIPAL }
wr i t e( ' dat i nr . de nodur i N = ' ) ;
r eadl n( n) ;
wr i t el n;
i f n=0 t hen
begi n
wr i t el n( ' LI STA VI DA' ) ;
got o 500
end
el se
begi n
wr i t el n( ' I NTRODUCETI DATELE NODULUI 1 ' ) ;
INSEREAZAPRIMUL;
wr i t el n
end;
i f n > 1 t hen
begi n
f or j : =2 t o n do
begi n
INSEREAZAREST;
wr i t el n
end
end;
j : =j +1;
wr i t el n( ' I NTRODUCETI NODUL F A N I O N ' ) ;
INSEREAZAREST;
wr i t el n;
wr i t el n( ' LI STA ESTE : ' ) ;
TRAVLISTA;
wr i t el n;
10: wr i t e( ' DORI TI SA CAUTATI UN NOD ? APASATI D SAU N ' ) ;
r eadl n( c) ;
i f ( c=' d' ) or ( c=' D' ) t hen
begi n
CAUTA
end;
wr i t el n;
wr i t e( ' DORI TI SA STERGETI UN NOD ? APASATI D SAU N ' ) ;
r eadl n( c) ;
wr i t el n;
i f ( c=' d' ) or ( c=' D' ) t hen
begi n
CAUTA;
wr i t el n( ' CONTI NUT NOD CU CHEI A ' , X, ' I NAI NTE DE STERGERE ESTE ' ) ;
wr i t el n( p^. chei e, ' ' , p^. dat a) ;
wr i t el n;
STERGE;
wr i t el n;
wr i t el n( ' CONTI NUTUL NODULUI DUPA STERGERE ESTE : ' ) ;
wr i t el n( p^. chei e, ' ' , p^. dat a) ;
wr i t el n;
wr i t el n( ' LI STA DUPA STERGEREA NODULUI CU CHEI A ' , X, ' ESTE : ' ) ;
TRAVLISTA;
wr i t el n
end; { sf ar si t I F }
wr i t e( ' DORI TI SA RELUATI PROGRAMUL ? APASATI D SAU N ' ) ;
r eadl n( c) ;
wr i t el n;
i f ( c=' d' ) or ( c=' D' ) t hen got o 10;
500: r eadl n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
52
END.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
53
ATESTAT - 2005 - 16 - S se realizeze operaiile de creare i vizualizare a unei liste circulare.
Barem:
- declaraii corecte: 1 punct
- crearea listei: 4 puncte
- vizualizarea coninutului: 4 puncte
- din oficiu: 1 punct
Rezolvare:
program ATESTAT_2005_16_LISTA_CIRCULARA;
l abel
10, 500;
t ype
LISTA = ^NOD;
NOD = r ecor d
chei e : i nt eger ;
dat a : i nt eger ;
ur m: LISTA
end;
var
q, r , baza, p : LISTA;
n, x, i , j : i nt eger ;
dat a : i nt eger ;
c : char ;
procedure CITDATA; { i nt r oducer e dat e ut i l e }
begi n
wr i t e ( ' i nt r oducet i dat el e nodul ui : ' ) ;
r eadl n ( dat a) ;
end;
procedure TRAVLISTA ; { t r aver sar e l i st a i n or di nea i nt r oducer i i }
begi n
p: =baza;
whi l e p^. chei e < n do
begi n
wr i t el n( ' chei a= ' , p^. chei e, ' dat a= ' , p^. dat a) ;
p: =p^. ur m;
wr i t el n
end;
{af i sar e ul t i mnod
wr i t el n( ' chei a= ' , p^. chei e, ' dat a= ' , p^. dat a) ;
end;
procedure INSEREAZAPRIMUL ; {i nt r oduce pr i mul el ement - l a i ncep. l i st ei }
begi n
baza: =ni l ;
new( p) ;
wr i t e( ' dat i chei a nodul ui 1 : ' ) ;
r eadl n( p^. chei e) ;
p^. ur m: =baza;
baza: =p;
CITDATA;
p^. dat a: =dat a
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
54
procedure INSEREAZAREST ; { i nt r oduce cel el al t e el em. - l a sf i r s. l i st ei }
begi n
new ( q) ;
q^. ur m: =ni l ;
p^. ur m: =q;
i f j <= n t hen
begi n
wr i t e ( ' dat i chei a nodul ui ' , j , ' : ' ) ;
r eadl n ( q^. chei e) ;
CI TDATA;
q^. dat a : = dat a;
p : = q
end
end;
procedure CAUTA ; { caut a un nod dupa chei e }
var
b: bool ean;
begi n
b: =f al se;
wr i t e( ' DATI CHEI A X = ' ) ;
r eadl n( x) ;
wr i t el n;
p: =baza;
whi l e ( p<>ni l ) and not b do
begi n
i f p^. chei e=x t hen
b: =t r ue
el se
p: =p^. ur m
end;
i f not b t hen
wr i t el n( ' NODUL ( CHEI A ) NU EXI STA ' )
el se
begi n
wr i t el n( ' PRI MUL NOD CARE ARE CHEI A ' , X, ' ESTE ' ) ;
wr i t el n( p^. chei e, ' ' , p^. dat a) ;
wr i t el n
end
end;
procedure STERGE ; { st er ge un nod i ndi cat pr i nt r - o chei e }
begi n
q: =p^. ur m;
p^: =q^
end;
Begin { PROGRAM PRINCIPAL }
wr i t e( ' dat i nr . de nodur i N = ' ) ;
r eadl n( n) ;
wr i t el n;
i f n=0 t hen
begi n
wr i t el n( ' LI STA VI DA' ) ;
got o 500
end
el se
begi n
wr i t el n( ' I NTRODUCETI DATELE NODULUI 1 ' ) ;
INSEREAZAPRIMUL;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
55
wr i t el n
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
56
i f n > 1 t hen
begi n
f or j : =2 t o n do
begi n
INSEREAZAREST;
wr i t el n
end
end;
q^. ur m: = baza;
{ j : =j +1; }
wr i t el n ( ' I NTRODUCETI NODUL F A N I O N ' ) ;
INSEREAZAREST;
wr i t el n;
wr i t el n ( ' LI STA ESTE : ' ) ;
TRAVLISTA;
wr i t el n;
500: r eadl n
END.
ATESTAT - 2005 - 17 - S se realizeze operaia de eliminare a unui element dintr-o list simplu
nlnuit, implementat dinamic, ce conine numere ntregi citite de la tastatur. S se afieze lista
nainte i dup tergerea elementului.
Barem:
- declaraii i citire: 1 punct
- crearea listei : 3 puncte
- tergerea unui element: 3 puncte
- afiarea listei: 2 punct
- din oficiu: 1 punct
Rezolvare:
program ATESTAT_2005_17_LISTA SIMPLU INLANTUITA;
l abel
10, 500;
t ype
LISTA = ^NOD;
NOD = r ecor d
chei e : i nt eger ;
dat a : i nt eger ;
ur m: LISTA
end;
var
q, r , baza, p : LISTA;
n, x, i , j : i nt eger ;
dat a : i nt eger ;
c : char ;
procedure CITDATA; { i nt r oducer e dat e ut i l e }
begi n
wr i t e ( ' i nt r oducet i dat el e nodul ui : ' ) ; r eadl n ( data) ;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
57
procedure TRAVLISTA ; { t r aver sar e i n or di nea i nt r oducer i i }
begi n
p: =baza;
whi l e p<>ni l do
begi n
wr i t el n( ' chei a= ' , p^. chei e, ' dat a= ' , p^. dat a) ;
p: =p^. ur m;
wr i t el n
end;
end;
procedure INSEREAZAPRIMUL ; {i nt r oduce pr i mul el ement - l a i ncep. l i st ei }
begi n
baza: =ni l ;
new( p) ;
wr i t e( ' dat i chei a nodul ui 1 : ' ) ; r eadl n( p^.cheie) ;
p^. ur m: =baza;
baza: =p;
CITDATA;
p^. dat a: =dat a
end;
procedure INSEREAZAREST ; { i nt r oduce cel el al t e el em. - l a sf i r s. l i st ei }
begi n
new ( q) ;
q^. ur m: =ni l ;
p^. ur m: =q;
i f j <=n t hen
begi n
wr i t e( ' dat i chei a nodul ui ' , j , ' : ' ) ; r eadl n( q^.cheie) ;
CITDATA;
q^. dat a: =dat a;
p: =q
end
el se
begi n
q^. chei e: =N+1;
{ q^. dat a: =' ACEST NOD NU SE VA STERGE SI NU SE ADAUGA NI MI C DUPA EL' ; }
p: =q
end
end;
procedure CAUTA ; { caut a un nod dupa chei e }
var
b: bool ean;
begi n
b: =f al se;
wr i t e( ' DATI CHEI A X = ' ) ; r eadl n( x) ;
wr i t el n;
p: =baza;
whi l e ( p<>ni l ) and not b do
begi n
i f p^. chei e=x t hen
b: =t r ue
el se
p: =p^. ur m
end;
i f not b t hen
wr i t el n( ' NODUL ( CHEI A ) NU EXI STA ' )
el se
begi n
wr i t el n( ' PRI MUL NOD CARE ARE CHEI A ' , X, ' ESTE ' ) ;
wr i t el n( p^. chei e, ' ' , p^. dat a) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
58
wr i t el n
end
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
59
procedure STERGE ; { st er ge un nod i ndi cat pr i nt r - o chei e }
begi n
q: =p^. ur m;
p^: =q^
end;
Begin { PROGRAM PRINCIPAL }
wr i t e( ' dat i nr . de nodur i N = ' ) ; r eadl n( n) ;
wr i t el n;
i f n=0 t hen
begi n
wr i t el n( ' LI STA VI DA' ) ;
got o 500
end
el se
begi n
wr i t el n( ' I NTRODUCETI DATELE NODULUI 1 ' ) ;
INSEREAZAPRIMUL;
wr i t el n
end;
i f n > 1 t hen
begi n
f or j : =2 t o n do
begi n
INSEREAZAREST;
wr i t el n
end
end;
j : =j +1;
wr i t el n( ' I NTRODUCETI NODUL F A N I O N ' ) ;
INSEREAZAREST;
wr i t el n;
wr i t el n( ' LI STA ESTE : ' ) ;
TRAVLISTA;
wr i t el n;
10: wr i t e( ' DORI TI SA CAUTATI UN NOD ? APASATI D SAU N ' ) ;
r eadl n( c) ;
i f ( c=' d' ) or ( c=' D' ) t hen
begi n
CAUTA
end;
wr i t el n;
wr i t e( ' DORI TI SA STERGETI UN NOD ? APASATI D SAU N ' ) ;
r eadl n( c) ;
wr i t el n;
i f ( c=' d' ) or ( c=' D' ) t hen
begi n
CAUTA;
wr i t el n( ' CONTI NUT NOD CU CHEI A ' , X, ' I NAI NTE DE STERGERE ESTE ' ) ;
wr i t el n( p^. chei e, ' ' , p^. dat a) ;
STERGE;
wr i t el n;
wr i t el n( ' CONTI NUTUL NODULUI DUPA STERGERE ESTE : ' ) ;
wr i t el n( p^. chei e, ' ' , p^. dat a) ;
wr i t el n( ' LI STA DUPA STERGEREA NODULUI CU CHEI A ' , X, ' ESTE : ' ) ;
TRAVLISTA;
end;
wr i t e( ' DORI TI SA RELUATI PROGRAMUL ? APASATI D SAU N ' ) ;
r eadl n ( c) ;
wr i t el n;
i f ( c=' d' ) or ( c=' D' ) t hen got o 10;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
60
500: r eadl n
END.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
61
GRAFURI
ATESTAT - 2005 - 18 - Se d un graf neorientat G la care:
- n = numrul de vrfuri (n, numr natural pozitiv);
- pentru fiecare vrf se cunosc vrfurile adiacente cu el;
S se scrie un program prin care s se afieze:
a). gradul fiecrui vrf (nod);
b). lista tuturor vrfurilor de grad maxim;
c). numrul de vrfuri izolate;
d). numrul de muchii din graf.
Barem:
- declaraii i introducere corect a grafului: 1 punct
- realizarea punctului a): 2 puncte
- realizarea punctului b): 2 puncte
- realizarea punctului c): 2 puncte
- realizarea punctului d): 2 puncte
- din oficiu: 1 punct
Rezolvare:
Considerm urmtorul graf neorientat:
Graful are 5 noduri (vrfuri),
notate cu 1, 2, 3, 4, 5 i
4 muchii, notate cu
[2,3], [2,4], [3,4] i [4,5].
n general, la un graf neorientat cu n vrfuri, matricea de adiacen A este o matrice
ptratic de ordinul n, simetric, cu elementele:
Este uor de observat c elementele de pe diagonala principal sunt nule (A [i, i] = 0), deoarece [i, i]
NU este muchie n graf..
Matricea de adiacen asociat grafului de mai sus este:
n program, matricea de adiacen se va construi astfel:
I - Se face iniializarea tuturor elementelor matricii cu zero (n acest fel, anulm att elementele
diagonalei principale, ct i elementele matricii care nu se asociaz muchiilor). Vom scrie:
For i :=1 to n do
For j :=1 to n do
A [i, j] := 0;
II A Dac se cunoate numrul muchiilor. Notm cu [x, y] o muchie din graf, unde x i y sunt
extremitile muchiei (dou noduri ale grafului). n matricea de adiacen, elementul A [x, y] = 1. Cum
matricea de adiacen este i simetric, rezult cu i A [y, x] = 1. Notnd cu m numrul de muchii
1, dac [i, j] este muchie n graf ; nodurile i i j sunt extremitile muchiei
0, n caz contrar
A [i, j] =
1
2
3 4
5
1 2 3 4 5
1 0 0 0 0 0
2 0 0 1 1 0
3 0 1 0 1 0
4 0 1 1 0 1
5 0 0 0 1 0
A (5, 5) =
Probleme rezolvate de programare Subiecte propuse la ATESTAT
62
din graf, vom folosi o structur FOR n care, pentru fiecare muchie i, vom introduce extremitile x
i y. Evident, aceste extremiti sunt vrfuri n graf. Vom scrie:
Probleme rezolvate de programare Subiecte propuse la ATESTAT
63
For i :=1 to mdo
Begin
Writeln (Dai extremitile muchiei i:)
Write (Dai vrful x = ); readln (x);
Write (Dai vrful y = ); readln (y);
A [x, y] := 1;
A [y, x] := 1;{matrice simetric}
End;
II B Dac NU se cunoate numrul muchiilor (este cazul problemei noastre), dar, pentru fiecare
vrf, se cunosc vrfurile adiacente cu el (se cunosc vecinii fiecrui vrf). Notm cu x, respectiv cu y
dou vrfuri din graf. Evident, att x ct i y iau valori ntre 1 i n (n = numrul total de vrfuri din graf).
Pentru fiecare nod x, trebuie s precizm numrul vecinilor si, precum i care sunt acetia. n
programvomscrie:
For x :=1 to n do
begin
write (Ci vecini are x, nrvecini =);
readln (nr);
For i :=1 to nrvecini do
begin
write (Dai urmtorul vecin, y = );
readln (y);
A [x, y] := 1;
A [y, x] := 1
end;
end;
a Gradul unui vrf v, se noteaz cu d(x) i este dat de numrul muchiilor incidente cu v. n
programvomfolosi un vector notat cu d, cu 5 elemente (5 = numrul de noduri), fiecare element
reprezentnd gradul unui nod (vrf). Pentru cazul particular al grafului de mai sus, avem:
d (1) =0 d (2) =2 d (3) =2 d (4) =3 d (5) =1
Se observ c gradul unui nod icoincide cu numrul de cifre de 1 de pe linia i din matricea
de adiacen. Prin urmare, pentru a determina gradul unui nod, numrm cifrele de 1 de pe fiecare linie a
matricii de adiacen i reinem aceste numere n elementele vectorului d.
b Determinm gradul maxim (elementul maxim din vectorul d) i afim doar numerele nodurilor al
cror grad = gradul maxim.
c Un vrf izolat are gradul zero. n matricea de adiacen, unui nod izolat i corespunde o linie,
respectiv o coloan cu toate elementele egale cu zero. Pentru a determina numrul de vrfuri izolate,
numrm liniile din matricea de adiacen care au toate elementele nule.
d Fiecare muchie [x, y] contribuie cu o unitate (1) la gradul nodului x i cu o unitate (1) la gradul
nodului y, deci cu dou uniti (2) la suma gradelor tuturor nodurilor. Cum n graf sunt m muchii, rezult
c suma gradelor tuturor nodurilor = 2m. De aici rezult m.
program ATESTAT_2005_18_GRAF_NEORIENTAT;
uses CRT;
CONST
nmax = 100;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
64
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
mat r i ce = ar r ay [ 1. . nmax, 1. . nmax] of i nt eger ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
65
VAR
n : i nt eger ; {n = numar ul nodur i l or }
i , j : i nt eger ;
x, y : i nt eger ; {nodur i i n gr af , ext r emi t i al e unei muchi i }
A : mat r i ce; {matricea de adiacenta}
d : vect or ; {vect or ul car e cont i ne "gradele" f i ecar ui nod di n gr af }
nr veci ni : i nt eger ; {numar ul de veci ni ai unui nod}
nr ci f r e1 : i nt eger ; {numar ul de ci f r e egal e cu 1 di n mat r i cea de adi acent a}
gr admax : i nt eger ; {gr adul maxi mal unui nod}
nr ci f r ezer o : i nt eger ; {numar ul ci f r el or egal e cu zer o di n mat r i cea de adi acent a}
nr nodur i gr adzer o : i nt eger ; {numar ul nodur i l or cu gr adul zer o}
sumagr ade : i nt eger ; {suma gr adel or t ut ur or nodur i l or }
m: i nt eger ; {numar ul de muchi i di n gr af }
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t e ( ' Dat i numar ul de nodur i , n = ' ) ;
r eadl n ( n) ;
{Initializarea tuturor elementelor matricii de adiacenta cu zero}
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
begi n
A [ i , j ] : = 0
end;
end;
wr i t el n;
{Completare matrice de adiacenta}
For x : = 1 t o n do
begi n
wr i t e ( ' Cat i veci ni ar e nodul ' , x, ' ? Dat i nr veci ni = ' ) ;
r eadl n ( nr veci ni ) ;
For i : = 1 t o nr veci ni do
begi n
wr i t e ( ' Pent r u nodul ' , x, ' , dat i ur mat or ul veci n, y = ' ) ;
r eadl n ( y) ;
A [ x, y] : = 1;
A [ y, x] : = 1
end;
wr i t el n;
end;
wr i t el n;
{a - Determinare grade varfuri}
f or i : = 1 t o n do {i = i ndex l i ni e i n mat r i cea de adi acent a}
begi n
nr ci f r e1 : = 0;
f or j : = 1 t o n do {j = i ndex col oana i n mat r i cea de adi acent a}
begi n
i f A [ i , j ] = 1 t hen
nr ci f r e1 : = nr ci f r e1 + 1;
end;
d [ i ] : = nr ci f r e1;
wr i t el n ( ' gr adul nodul ui ' , i , ' = ' , d [ i ] ) ;
end;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
66
{b - Determinam gradul maxim si afisam nodurile cu gradul maxim}
gr admax : = d [ 1] ;
f or i : = 2 t o n do
begi n
i f gr admax < d [ i ] t hen
gr admax : = d [ i ]
end;
wr i t el n ( ' Gr adul maxi m= ' , gr admax) ;
wr i t el n;
f or i : = 1 t o n do
begi n
i f d [ i ] = gr admax t hen
wr i t el n ( ' Nodul ' , i , ' ar e gr adul maxi m= ' , gr admax) ;
end;
wr i t el n;
{c Determinare noduri cu grad zero}
nr nodur i gr adzer o : = 0;
f or i : = 1 t o n do
begi n
nr ci f r ezer o : = 0;
f or j : = 1 t o n do
begi n
i f A [ i , j ] = 0 t hen
nr ci f r ezer o : = nr ci f r ezer o + 1;
end;
i f nr ci f r ezer o = n t hen
nr nodur i gr adzer o : = nr nodur i gr adzer o + 1;
end;
wr i t el n ( ' Gr af ul ar e ' , nr nodur i gr adzer o, ' nodur i cu gr adul zer o' ) ;
wr i t el n;
{d Determinare numar muchii = m}
sumagr ade : = 0;
f or i : = 1 t o n do
begi n
sumagr ade : = sumagr ade + d [ i ]
end;
m: = sumagr ade DI V 2;
wr i t el n ( ' Gr af ul ar e ' , m, ' muchi i ' ) ;
r eadl n
end.
ATESTAT - 2005 - 19 - Se d un graf neorientat G cu n vrfuri i m muchii (n i m sunt numere
naturale introduse de la tastatur). S se scrie un program care s verifice dac graful este complet.
Barem:
- declaraii corecte de variabile: 1 punct
- reprezentarea corect a grafului prin matricea de adiacen: 3 puncte
- realizarea algoritmului de prelucrare: 3 puncte
- afiarea rezultatului : 2 puncte
- din oficiu: 1 punct
Rezolvare:
Probleme rezolvate de programare Subiecte propuse la ATESTAT
67
Un graf este complet dac oricare dou noduri sunt adiacente (sunt legate ntre ele printr-o
muchie). Altfel spus, n matricea de adiacen, notat cu A, doar elementele de pe diagonala principal
sunt nule, celelalte elemente sunt egale cu 1, adic matricea are n
2
n = n (n 1) elemente egale cu 1.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
68
Altfel spus, fiecare nod are gradul n 1. Cum graful conine n noduri, rezult c suma gradelor
tuturor nodurilor este =n (n 1) = 2m.
Prin urmare, problema s-ar putea rezolva foarte simplu verificnd dac n (n 1) = 2m, avnd n
vedere c n i m sunt cunoscute (sunt date de intrare).
Presupunnd c nu dorim s verificm doar relaia de mai sus, vom face verificri asupra matricii
de adiacen A:
a - fie vom numra elementele egale cu 1 din matrice i vom verifica dac numrul total de elemente
egale cu 1 este egal cu n (n 1),
b - fie vom verifica dac, n matricea de adiacen, numai elementele diagonalei principale sunt nule.
Notm cu [x, y] o muchie din graf, unde x i y sunt extremitile muchiei (dou noduri ale
grafului). n matricea de adiacen, elementul A [x, y] = 1. Cum matricea de adiacen este i simetric,
rezult cu i A [y, x] = 1. Deoarece se cunoate numrul muchiilor (m), vom folosi o structur FOR
n care, pentru fiecare muchie i, vom introduce extremitile x i y. Evident, aceste extremiti
sunt vrfuri n graf. Vomscrie:
For i :=1 to mdo
Begin
Writeln (Dai extremitile muchiei i:)
Write (Dai vrful x = ); readln (x);
Write (Dai vrful y = ); readln (y);
A [x, y] := 1;
A [y, x] := 1;{matrice simetric}
End;
program ATESTAT_2005_19_GRAF_NEORIENTAT;
uses CRT;
CONST
nmax = 100;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
mat r i ce = ar r ay [ 1. . nmax, 1. . nmax] of i nt eger ;
VAR
n : i nt eger ; {n = numar ul nodur i l or }
m : i nt eger ; {numar ul de muchi i di n gr af }
x, y : i nt eger ; {nodur i i n gr af , ext r emi t i al e unei muchi i }
A : mat r i ce; {matricea de adiacenta}
nrcifre1 : i nt eger ; {numar ul de ci f r e egal e cu 1 di n mat r i cea de adi acent a}
nrcifrezero : i nt eger ; {numar ul ci f r el or egal e cu zer o di n mat r i cea de
adi acent a}
i , j : i nt eger ;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t e ( ' Dat i numar ul de nodur i , n = ' ) ;
r eadl n ( n) ;
{Initializarea tuturor elementelor matricii de adiacenta cu zero}
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
begi n
A [ i , j ] : = 0
end;
end;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
69
Probleme rezolvate de programare Subiecte propuse la ATESTAT
70
{Completare matrice de adiacenta}
For i : = 1 t o mdo
Begi n
Writeln (Dai extremitile muchiei i: )
Write (Dai vrful x = ); readln (x) ;
Write (Dai vrful y = ); readln (y) ;
A [x, y] := 1;
A [y, x] := 1; {matricea este simetric}
End;
wr i t el n;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{Varianta a - Numrarea cifrelor de 1 din matricea de adiacen}
nr ci f r e1 : = 0;
f or i : = 1 t o n do {i = i ndex l i ni e i n mat r i cea de adi acent a}
begi n
f or j : = 1 t o n do {j = i ndex col oana i n mat r i cea de adi acent a}
begi n
i f A [ i , j ] = 1 t hen
nr ci f r e1 : = nr ci f r e1 + 1;
end;
end;
wr i t el n;
i f nrcifre1 = n (n 1) t hen
wr i t el n ( Gr af ul est e compl et )
el se
wr i t el n ( Gr af ul est e i ncompl et ) ;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{Varianta b - Numrarea cifrelor de zero din matricea de adiacen}
nr ci f r ezer o : = 0;
f or i : = 1 t o n do {i = i ndex l i ni e i n mat r i cea de adi acent a}
begi n
f or j : = 1 t o n do {j = i ndex col oana i n mat r i cea de adi acent a}
begi n
i f A [ i , j ] = 0 t hen
nr ci f r ezer o : = nr ci f r ezer o + 1;
end;
end;
wr i t el n;
i f nrcifrezero = n t hen
wr i t el n ( Gr af ul est e compl et )
el se
wr i t el n ( Gr af ul est e i ncompl et ) ;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
r eadl n
end.
ATESTAT - 2005 - 20 - Fie G un graf neorientat dat prin numrul de vrfuri i numrul de muchii (n,
respectiv m, numere naturale introduse de la tastatur). S se scrie un program care s verifice dac
graful conine un ciclu de lungime 4.
Barem:
- declaraii corecte de variabile: 1 punct
- reprezentarea corect a grafului prin matricea de adiacen: 3 puncte
Probleme rezolvate de programare Subiecte propuse la ATESTAT
71
- realizarea algoritmului de prelucrare: 3 puncte
- afiarea rezultatului : 2 puncte
- din oficiu: 1 punct
Probleme rezolvate de programare Subiecte propuse la ATESTAT
72
Rezolvare:
Un ciclu elementar are proprietatea c oricare dou vrfuri ale sale, cu excepia primului i
ultimului, sunt diferite dou cte dou. Lungimea unui ciclu =numrul de muchii ce apar n ciclu.
Considernd graful din figura de mai jos, se poate observa uor ciclul 1 2 3 4 1 care are
lungimea 4. Matricea de adiacen a grafului este urmtoarea:
Trebuie doar s se verifice dac exist cicluri de lungime 4 (NU se cere generarea acestora).
Pentru ciclul de lungime 4 identificat n graf (1 2 3 4 1), n matricea de adiacen, liniile
corespunztoare nodurilor 1 i 3 conin amndou cifra 1 pe poziiile k = 2 i k = 4.
De asemenea, liniile corespunztoare nodurilor 2 i 4 conin amndou cifra 1 pe poziiile
k = 1 i k = 3.
Va trebui s verificm dac, pentru fiecare pereche de noduri distincte, liniile (din matricea de
adiacen) corespunztoare acestor noduri conin cifra 1 pe cel puin 2 poziii (coloane) identice.
Notm cu i, respectiv j dou linii distincte din matricea de adiacen, linii corespunztoare a
dou noduri i i j. Evident, i =1 .. n-1, iar j =i +1 .. n.
Notm cu k indexul de coloan (din matricea de adiacen) pentru care se face testarea perechii
A [i, k] i A [j, k]. Iniializm un contor nrcifre care numr cifrele de 1, n condiia
( A [i, k] = 1 ) AND ( A [j, k] = 1 ).
program ATESTAT_2005_20_GRAF_CU_UN_CICLU_DE_LUNGIME_PATRU ;
uses CRT;
LABEL
sf ar si t ;
CONST
nmax = 100;
TYPE
mat r i ce = ar r ay [ 1. . nmax, 1. . nmax] of i nt eger ;
VAR
n : i nt eger ; {n = numar ul nodur i l or }
m : i nt eger ; {numar ul de muchi i di n gr af }
x, y : i nt eger ; {nodur i i n gr af , ext r emi t i al e unei muchi i }
A : mat r i ce; {matricea de adiacenta}
i , j , k : i nt eger ;
nr ci f r e : i nt eger ; {numar a ci f r el e de 1, i n condi t i i l e pr obl emei }
GASI T : bool ean; {GASI T = TRUE daca s- a gasi t un ci cl u de l ungi me 4}
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t e ( ' Dat i numar ul de noduri, n = ' ) ;
r eadl n ( n) ;
wr i t e ( ' Dat i numar ul de muchii, m= ' ) ;
r eadl n ( m) ;
{Initializarea tuturor elementelor matricii de adiacenta cu zero}
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
begi n
A [ i , j ] : = 0
1
2
5 4
3
k
Nod 1 2 3 4 5
i = 1 0 1 0 1 0
2 1 0 1 0 1
j = 3 0 1 0 1 0
4 1 0 1 0 0
5 0 1 0 0 0
Probleme rezolvate de programare Subiecte propuse la ATESTAT
73
end;
end;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
74
{Completare matrice de adiacenta}
For i : = 1 t o mdo
Begi n
Writeln (Dai extremitile muchiei i: )
Write (Dai vrful x = ); readln (x) ;
Write (Dai vrful y = ); readln (y) ;
A [x, y] := 1;
A [y, x] := 1; {matricea este simetric}
End;
wr i t el n;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
GASI T : = FALSE; {pr esupunemca nu exi st a un ci cl u de l ungi me 4}
f or i := 1 to n 1 do {i = i ndex el ement e de pe una di n liniile t est at e}
begi n
f or j := i + 1 to n do {j = i ndex el ement e de pe al t a linie t est at a}
begi n
nrcifre := 0; {i ni t i al i zar e cont or pt . f i ecar e per eche t est at a}
f or k := 1 to n do {k = i ndex de coloana}
begi n
i f ( A [i, k] = 1 ) AND ( A [j, k] = 1 ) t hen
nrcifre := nrcifre + 1;
i f nr ci f r e >= 2 t hen
begi n
GASIT := TRUE;
GOTO sfarsit
end;
end;
end;
end;
sfarsit: i f GASI T = TRUE t hen
wr i t el n ( Gr af ul cont i ne ci cl ur i de l ungi me 4 )
el se
wr i t el n ( Gr af ul NU cont i ne ci cl ur i de l ungi me 4 ) ;
r eadl n
END.
ATESTAT - 2005 - 21 - Pentru un graf orientat G cu n vrfuri i m arce (n i m numere naturale citite
la intrare) s se scrie un program care s determine matricea drumurilor. Matricea se va afia pe ecran
linie cu linie.
Barem:
- declaraii corecte de variabile: 1 punct
- reprezentarea corect a grafului prin matricea de adiacen: 3 puncte
- determinarea matricii drumurilor prin algoritmul lui Roy-Warshall: 3 puncte
- afiarea matricii drumurilor: 2 puncte
- din oficiu: 1 punct
Rezolvare:
Reamintim cteva noiuni din teoria grafurilor orientate.
Un lan ( L ) ntr-un graf orientat = un ir de arce L = [a
1
, a
2
, a
k
,
, a
p
], cu proprietatea c oricare arc a
k
are un nod comun cu a
k-1
i
cellalt nod comun cu a
k+1
, pentru orice k din mulimea { 2, p-1}.
NU ARE IMPORTAN ORIENTAREA ARCELOR.
Exemplu: Pentru graful din figura alturat, lanuri cu extremitile n
nodurile 1 i 4 sunt:
1 2
4 3
a
1
a
2
a
4
a
3
a
5
Probleme rezolvate de programare Subiecte propuse la ATESTAT
75
L1 = (a1, a2, a3), L2 = (a1, a4, a5, a3), L3 = (a5, a3) se observ c nu are importan orientarea
arcelor.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
76
Un lan ntr-un graf orientat se numete drum (notat D) dac toate arcele sale au ACEEAI
ORIENTARE, dat de sensul deplasrii de la x
0
(extremitatea iniial a lui a
1
) la xp (extremitatea final
a lui a
p
). Vrfurile x
0
i x
p
=extremitile lanului. De observat c, n cazul drumului, ARE
IMPORTAN ORIENTAREA ARCELOR
Altfel spus, un drum ntr-un graf orientat este un ir de vrfuri. Un drumse poate scrie fie ca o
succesiune de arce, fie ca o succesiune de vrfuri. Pentru graful alturat, avem drumurile:
D1 =(1, 2, 3), D2 =(1, 2, 1, 3).
Matricea drumurilor unui graf G este o matrice B definit astfel:
Pentru graful anterior, avem:
Algoritmul Roy-Warshall determin matricea drumurilor plecnd de la matricea de
adiacen astfel:
Un element A [i, j] = 0 din matricea de adiacen devine 1 n matricea drumurilor dac
exist un vrf k astfel nct
A [i, k] = 1 i A [k, j] = 1,
adic atunci cnd exist drum de la xi la xk i drum de la xk la xj. Aceast condiie se poate exprima i
astfel:
A [i, j] = MIN ( A[i, k], A [k, j] )
sau
A [i, j] = A[i, k] * A [k, j].
Transformarea propriu-zis pe care o presupune algoritmul Roy-Warshall poate fi exprimat
astfel:
for k := 1 to n do
begin
for i := 1 to n do
begin
if i <> k then
begin
for j := 1 to n do
begin
if j <> k then
begin
IF A [i, j] =0 then
A [i, j] := A [i, k] * A [k, j]
end
end
end
end
1, dac exist drum n G
B [i, j] = de la nodul xi la nodul xj
0, n caz contrar.
Matricea de ADIACEN:
Nod 1 2 3 4
1 0 1 1 0
A = 2 1 0 1 0
3 0 0 0 0
4 0 0 1 0

Matricea DRUMURILOR:
Nod 1 2 3 4
1 1 1 1 0
B = 2 1 1 1 0
3 0 0 0 0
4 0 0 1 0

Probleme rezolvate de programare Subiecte propuse la ATESTAT
77
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
78
program ATESTAT_2005_21_MATRICEA_DRUMURILOR_ALGORITMUL_ROY_WARSHALL;
uses CRT;
CONST
nmax = 100;
TYPE
mat r i ce = ar r ay [ 1. . nmax, 1. . nmax] of i nt eger ;
VAR
n, m : i nt eger ; {n = numar ul nodur i l or ; m= numar ul de muchi i di n gr af }
x, y : i nt eger ; {ext r emi t at i al e unei muchi i }
A : mat r i ce; {matricea de adiacenta}
B : mat r i ce; {matricea drumurilor}
i , j , k : i nt eger ;
function MIN ( al f a, bet a : i nt eger ) : i nt eger ;
begi n
i f al f a <= bet a t hen
MI N : = al f a
el se
MI N : = bet a
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t e ( ' Dat i numar ul de noduri, n = ' ) ;
r eadl n ( n) ;
wr i t e ( ' Dat i numar ul de muchii, m= ' ) ;
r eadl n ( m) ;
{Initializarea tuturor elementelor matricii de adiacenta cu zero}
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
begi n
A [ i , j ] : = 0
end;
end;
wr i t el n;
{Completare matrice de adiacenta}
For i : = 1 t o mdo
Begi n
Writeln (Dai extremitile muchiei i: ) ;
Write (Dai vrful x = ); readln (x) ;
Write (Dai vrful y = ); readln (y) ;
A [x, y] := 1; {matricea NU este simetric}
End;
wr i t el n;
wr i t el n ( ' Mat r i cea de ADI ACENTA est e: ' ) ;
f or i : = 1 t o n do
begi n
wr i t el n;
f or j : = 1 t o n do
begi n
wr i t e ( A [ i , j ] : 3 ) ; {se l asa 3 pozi t i i pent r u f i ecar e }
{el ement al mat r i ci i }
end;
end;
wr i t el n;
{ Deoar ece se pl eaca de l a mat r i cea de ADI ACENTA A, si pent r u a nu af ect a }
{aceast a mat r i ce, Initializam matrice DRUMURI B, cu mat r i cea de ADIACENTA - A}
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
begi n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
79
B [ i , j ] : = A [ i , j ] ;
end;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
80
{Transformarea propriu-zisa - Algoritmul Roy-Warshall}
{VARIANTA 1}
f or k : = 1 t o n do
begi n
f or i : = 1 t o n do
begi n
i f i <> k t hen
begi n
f or j : = 1 t o n do
begi n
i f j <> k t hen
begi n
I F B [ i , j ] = 0 t hen
B [i, j] := MIN (B [i, k], B [k, j])
end
end
end
end
end;
wr i t el n ( 'Varianta 1 - Matricea drumurilor este: ' ) ;
f or i : = 1 t o n do
begi n
wr i t el n;
f or j : = 1 t o n do
begi n
wr i t e ( B [ i , j ] : 3 ) ; {se l asa 3 pozi t i i pent r u f i ecar e }
{el ement al mat r i ci i }
end;
end;
{Transformarea propriu-zisa - Algoritmul Roy-Warshall}
{VARIANTA 2}
f or k : = 1 t o n do
begi n
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
begi n
I F B [ i , j ] = 0 t hen
B [i, j] := B [i, k] * B [k, j]
end
end
end;
wr i t el n;
wr i t el n ( 'Varianta 2 - Matricea drumurilor este: ' ) ;
f or i : = 1 t o n do
begi n
wr i t el n;
f or j : = 1 t o n do
begi n
wr i t e ( B [ i , j ] : 3 ) ; {se l asa 3 pozi t i i pent r u f i ecar e }
{el ement al mat r i ci i }
end;
end;
r eadl n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
81
END.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
82
ATESTAT - 2005 - 22 - Pentru un graf orientat G cu n vrfuri i m arce (n i m sunt numere naturale
citite la intrare), s se scrie un program care s construiasc i s afieze listele de adiacen ale
succesorilor vrfurilor grafului sub form de liste liniare simplu nlnuite.
Barem:
- declaraii corecte de variabile: 2 puncte
- generarea listelor de adiacen: 4 puncte
- afiarea listelor: 3 puncte
- din oficiu: 1 punct
Rezolvare:
Pentru reprezentarea grafurilor orientate se pot folosi
a matricea de adiacen
b listele de adiacen.
La reprezentarea prin liste de adiacen, pentru orice vrf x se construiete o list L ( x ) a succesorilor
vrfului x. Liste de adiacen pot fi reprezentate folosind tablouri sau structuri dinamice de date.
Exemplu: pentru graful alturat, listele de adiacen L vor fi:
La reprezentarea listelor de adiacen folosind structuri dinamice de date (liste liniare
nlnuite), vomconsidera un vector L (LISTA) cu n componente de tip pointer (referin, adres).
O component L [ i ] va pointa la nceputul listei de adiacen a nodului i.
Un arc (x, y) al grafului este reprezentat prin extremitile x i y,
Fiecare element al listei va avea dou componente:
- NodSuccesor =y = extremitatea final a nodului curent
- URM = informaia de legtur ctre urmtorul element al listei de adiacen.
Vom face urmtoarele declaraii:
TYPE
LISTA = ^ element;
element = RECORD
NodSuccesor : 1 . . n;
URM : LISTA
END;
VAR
L : array [ 1 . . n ] of LISTA ;
P : LISTA ; {variabil pointer de lucru }
n, m, i : integer ;
Iniializm toate componentele listei L cu pointerul NIL, scriind:
for i := 1 to n do
L [i] := NIL;
Prezena n graf a unui arc (x, y) presupune crearea unei locaii de memorie cu NEW (P), urmat de
calificarea celor dou cmpuri (NodSuccesor i URM) ale noii locaii. Vom scrie:
P^. NodSuccesor := y ;
P^.URM := L [ x ] ;
1
2
4
3
5
1
2
3
4
5
2
3
4
1
5
5
NIL
NIL
NIL
NIL
NIL
Nod Succesori
1 : 2
2 : 3
3 : 4, 5
4 : 1, 5
5 :
Probleme rezolvate de programare Subiecte propuse la ATESTAT
83
L [ x ] := P ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
84
program ATESTAT_2005_22_LISTE_DE_ADIACENTA ;
uses CRT;
CONST
nmax = 100;
TYPE
LI STA = ^ELEMENT;
ELEMENT = RECORD
NodSuccesor : i nt eger ;
URM : LI STA {poi nt er de l egat ur a spr e ur mat or ul nod di n l i st a}
END;
VAR
L : ar r ay [ 1. . nmax] of LI STA;
m, n, i : i nt eger ; { n = nr . de NODURI ; m= nr . de ARCE }
P : LI STA ; { P = poi nt er de l ucr u}
x, y : i nt eger ; { x, y = ext r emi t at i l e unui ar c }
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t e ( ' Dat i numar ul de nodur i , n = ' ) ;
r eadl n ( n) ;
wr i t el n;
wr i t e ( ' Dat i numar ul de muchi i , m= ' ) ;
r eadl n ( m) ;
wr i t el n;
{ Initializam toate componentele listelor de ADIACENTA cu pointerul NIL }
f or i : = 1 t o n do
begi n
L [i] := NIL;
end;
wr i t el n;
{Completarea LISTELOR de adiacenta}
For i := 1 to m do
Begi n
Wr i t el n ( ' Dat i extremitatile muchiei i: ' ) ;
Wr i t e ( ' Dat i var f ul x = ' ) ;
r eadl n ( x) ;
Wr i t e ( ' Dat i var f ul y = ' ) ;
r eadl n ( y) ;
NEW (P);
P^.NodSuccesor := y ;
P^.URM := L [x];
L [x] := P;
End;
wr i t el n;
{Afisarea listelor de adiacenta pentru cele n noduri}
f or i : = 1 t o n do
begi n
wr i t e ( ' Nodul ' , i , ' ar e ur mat or i i succesori : ' ) ;
P := L [i]; {P indic initial spre inceputul listei nodului i }
whi l e P <> NIL do
begi n
wr i t e ( p^.NodSuccesor, ' - > ' ) ;
P := P^.URM
end;
wr i t e ( ' NI L' ) ;
wr i t el n;
wr i t el n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
85
end;
r eadl n
END.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
86
ATESTAT - 2005 - 23 - Dat un graf orientat G cu n vrfuri i m arce, s se scrie un program prin care:
a) s se calculeze gradul interior, respectiv exterior al fiecrui vrf
b) s se verifice dac graful are vrfuri izolate
Datele de intrare se preiau din fiierul text INPUT.TXT sub forma urmtoare :
pe prima linie: n - reprezentnd numrul de vrfuri ale grafului ;
pe linia a doua : m - reprezentnd numrul de arce ale grafului ;
pe urmtoarele m linii, cte o pereche de numere, separate printr-un spaiu, ce reprezint
extremitatea iniial, respectiv final a arcului.
Rezultatele se vor afia pe ecran.
Barem:
- declaraii corecte de variabile: 1 punct
- citirea corect a datelor din fiier: 1 punct
- reprezentarea corect a grafului prin matricea de adiacen: 2 puncte
- realizarea punctului a): 2 puncte
- realizarea punctului b): 2 puncte
- afiarea rezultatelor: 1 punct
- din oficiu: 1 punct
Rezolvare:
Vomreprezenta graful prin listele de adiacen (vezi problema anterioar ATESTAT_2005_22).
Folosim2 vectori GradExt, respectiv GradInt, fiecare cu cte n componente, n care vommemora
gradul exterior i interior al fiecrui vrf. Dac pentru un vrf suma celor dou grade este zero, acel
vrf este izolat.
Exemplu: pentru graful alturat, fiierul
GRAF.TXT, de pe discul C:, va avea
coninutul:
6 {numrul de noduri}
8 {numrul de arce}
1 2
1 3
2 3
2 4
3 4
3 5
4 1
4 5
De asemenea, se observ c vrful 6 este izolat.
program ATESTAT_2005_23_GRADE_INT_SI_EXT_CU_LISTE_DE_ADIACENTA ;
uses CRT;
CONST
nmax = 100;
TYPE
LISTA = ^ELEMENT;
ELEMENT = RECORD
NodSuccesor : i nt eger ;
URM : LI STA {poi nt er de l egat ur a spr e ur mat or ul nod di n l i st a}
END;
VAR
L : array [1..nmax] of LISTA;
m, n, i : i nt eger ; { n = nr . de NODURI ; m= nr . de ARCE }
P : LI STA ; { P = poi nt er de l ucr u}
1
2
4
3
5
6
NOD GradExt GradInt Suma grade
1 2 1 3
2 2 1 3
3 2 2 4
4 2 2 4
5 0 2 2
6 0 0 0
Probleme rezolvate de programare Subiecte propuse la ATESTAT
87
x, y : i nt eger ; { x, y = ext r emi t at i l e unui ar c }
Gr adI nt , Gr adExt : ar r ay [ 1. . nmax] of i nt eger ;
S : i nt eger ; { S = suma gr adel e i nt er i or si ext er i or pt . un var f }
f : TEXT; {f i si er i n car e memor ami nf or mat i i l e despr e GRAF }
l i ni e : STRI NG ; { "l i ni e" = o l i ni e di n f i si er ul t ext GRAF. TXT }
ER : i nt eger ; { var i abi l a er oar e di n apel ul pr ocedur i i VAL }
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t el n;
ASSI GN ( f , ' C: \ GRAF. TXT' ) ;
RESET ( f ) ;
{ Citim din fisier prima componenta = numarul de noduri }
readln (f, n);
wr i t el n ( ' Numar ul de nodur i , n = ' , n) ;
wr i t el n;
{ Initializam toate componentele listelor de ADIACENTA cu pointerul NIL }
f or i : = 1 t o n do
begi n
L [ i ] : = NI L;
end;
{ Citim din fisier a doua componenta = numarul de arce }
readln (f, m);
wr i t el n ( ' Numar ul de muchi i , m= ' , m) ;
wr i t el n;
{ Citim din fisier urmatoarele "m" linii ce contin extremitatile arcelor. }
{ Cu aceste extremitati construim LISTELE de ADIACENTA }
For i : = 1 t o mdo
Begi n
readln (f, linie);
VAL ( linie [1], x , ER ); {transformam sirul linie [1] in numarul x }
Wr i t el n ( ' Ext r emi t at ea i ni t i al a a muchi ei ' , i , ' est e x = ' , x) ;
VAL ( linie [3], y , ER ); {transformam sirul linie [3] in numarul y }
Wr i t el n ( ' Ext r emi t at ea f i nal a a muchi ei ' , i , ' est e y = ' , y) ;
{ Construirea LISTELOR DE ADIACENTA }
NEW( P) ;
P^. NodSuccesor : = y ;
P^. URM : = L [ x] ;
L [ x] : = P;
End;
wr i t el n;
{Afisarea listelor de adiacenta pentru cele n noduri - OPTIONAL}
f or i : = 1 t o n do
begi n
wr i t e ( ' Nodul ' , i , ' ar e ur mat or i i succesor i : ' ) ;
P : = L [ i ] ;
whi l e P <> NI L do
begi n
wr i t e ( p^. NodSuccesor , ' - > ' ) ;
P : = P^. URM
end;
wr i t e ( ' NI L' ) ;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
88
wr i t el n
end;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
89
{ Initializare elemente vectori GradExt si GradInt }
f or i : = 1 t o n do
begi n
Gr adExt [ i ] : = 0;
Gr adI nt [ i ] : = 0;
end;
{ Determinam gradele exterior si interior pt. fiecare nod }
f or i : = 1 t o n do
begi n
P : = L [ i ] ;
whi l e P <> NI L do
begi n
INC ( Gr adExt [ i ] ) ;
INC ( Gr adI nt [ P^. NodSuccesor ] ) ;
P : = P^. URM
end;
wr i t el n
end;
wr i t el n;
wr i t el n ( 'Gradele nodurilor sunt urmatoarele: ' ) ;
wr i t el n;
f or i : = 1 t o n do
begi n
wr i t el n ( ' Gr adExt ( ' , i , ' ) = ' , GradExt [i] ) ;
wr i t el n ( ' Gr adI nt ( ' , i , ' ) = ' , GradInt [i] ) ;
S : = Gr adExt [ i ] + Gr adI nt [ i ] ;
wr i t el n;
wr i t el n ( 'Suma gradelor = ' , S ) ;
wr i t el n ;
wr i t el n;
i f GradExt [ i ] + GradInt [ i ] = 0 t hen
wr i t el n ( ' Nodul ' , i , ' est e IZOLAT') ;
end;
r eadl n
END.
ATESTAT - 2005 - 24 - Se d un graf orientat G cu n vrfuri i m arce, reprezentat n memorie prin
matricea de adiacen. S se scrie un program care, pornind de la matricea drumurilor corespunztoare
grafului, s verifice dac:
a). graful are vrfuri izolate;
b). graful conine circuite (n i m sunt numere naturale citite la intrare).
Barem:
- declaraii corecte de variabile: 1 punct
- reprezentarea corect a grafului prin matricea de adiacen: 2 puncte
- determinarea matricii drumurilor prin algoritmul lui Roy-Warshall: 2 puncte
- realizarea punctului a): 2 puncte
- realizarea punctului b): 2 puncte
- din oficiu: 1 punct
Probleme rezolvate de programare Subiecte propuse la ATESTAT
90
Rezolvare:
Considerm graful din figura alturat.
Notm cu GradExt, respectiv GradInt, gradul
exterior i interior al fiecrui vrf.
Dac pentru un vrf suma celor dou grade
este zero, acel vrf este izolat.
De asemenea, un vrf este izolat dac i
numai dac linia i i coloana i din
matricea de ADIACEN au toate
elementele NULE.
Un drum ntr-un graf orientat este un ir de
vrfuri. Un drum se poate scrie fie ca o
succesiune de arce, fie ca o succesiune de
vrfuri.
Dac toate arcele unui drum sunt distincte, iar primul i ultimul nod coincid, drumul se numete
circuit.
Dac toate vrfurile unui circuit, cu excepia primului i ultimului, sunt distincte, circuitul este
elementar.
Pentru graful alturat, avem circuitele:
C1 =(1, 2, 3, 4, 1, 3, 4, 1), C2 =(1, 3, 4, 1, 2, 3, 4, 1)
precum i circuitele elementare:
C3 =(1, 2, 4, 1), C4 =(1, 3, 4, 1), C5 =(1, 2, 3, 4, 1)
Pentru graful de mai sus, avem:
Pentru a verifica dac graful conine noduri izolate, declarm doi vectori zeropelin si zeropecol in care
memorm numarul de zero-uri de pe fiecare linie, respectiv fiecare coloan. Apoi, pentru fiecare linie
din matricea de ADIACEN, verificam dac este ndeplinit condiia
( zeropelin [ i ] = n) AND (zeropecol [ i ] = n)
adic, simultan pe linia i i coloana i avemnumai zero-uri (n zero-uri).
Se observ c, n matricea de ADIACEN linia 6 i coloana 6 au toate elementele nule. Rezult c
nodul 6 este nod izolat.
Pentru a verifica dac graful are circuite, se verific dac matricea drumurilor conine elemente egale
cu 1 pe diagonala principal. Din faptul c matricea drumurilor are numai elemente de 1 pe diagonala
principal deducem doar c fiecare vrf aparine unui circuit; NU rezult c exist un circuit care trece
prin toate nodurile grafului.
program ATESTAT_2005_24_CIRCUITE_MATRICEA_DRUMURILOR_ALGORITMUL_ROY_WARSHALL;
uses CRT;
CONST
nmax = 100;
1
2
4
3
5
6
NOD GradExt GradInt Suma grade
1 2 1 3
2 2 1 3
3 2 2 4
4 2 2 4
5 0 2 2
6 0 0 0
Matricea de ADIACEN:
Nod 1 2 3 4 5 6
1 0 1 1 0 0 0
A = 2 0 0 1 1 0 0
3 0 0 0 1 1 0
4 1 0 0 0 1 0
5 0 0 0 0 0 0
6 0 0 0 0 0 0
Matricea DRUMURILOR:
Nod 1 2 3 4 5 6
1 1 1 1 1 1 0
B = 2 1 1 1 1 1 0
3 1 1 1 1 1 0
4 1 1 1 1 1 0
5 0 0 0 0 0 0
6 0 0 0 0 0 0
Probleme rezolvate de programare Subiecte propuse la ATESTAT
91
TYPE
mat r i ce = ar r ay [ 1. . nmax, 1. . nmax] of i nt eger ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
92
VAR
n : i nt eger ; {n = numar ul nodur i l or }
m: i nt eger ; {numar ul de muchi i di n gr af }
x, y : i nt eger ; { ext r emi t at i al e unei muchi i }
A : mat r i ce; {mat r i cea de adi acent a}
B : mat r i ce; {mat r i cea dr umur i l or }
i , j , k : i nt eger ;
zer opel i n : ar r ay [ 1. . nmax] of i nt eger ;
{vect or i n car e memor amnumar ul zer o- ur i l e gasi t e pe o l i ni e }
zer opecol : ar r ay [ 1. . nmax] of i nt eger ;
{vect or i n car e memor amnumar ul zer o- ur i l e gasi t e pe o col oana }
GASI T : bool ean ; {t est eaza daca exi st a ci r cui t e i n gr af }
function MIN ( al f a, bet a : i nt eger ) : i nt eger ;
begi n
i f al f a <= bet a t hen
MI N : = al f a
el se
MI N : = bet a
end;
Begin { PROGRAM PRINCIPAL }
{ CLRSCR; }
wr i t e ( ' Dat i numar ul de nodur i , n = ' ) ;
r eadl n ( n) ;
wr i t e ( ' Dat i numar ul de muchi i , m= ' ) ;
r eadl n ( m) ;
{Initializarea tuturor elementelor matricii de adiacenta cu zero}
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
begi n
A [ i , j ] : = 0
end;
end;
wr i t el n;
{Completare matrice de adiacenta}
For i : = 1 t o mdo
Begi n
Wr i t el n ( ' Dat i ext r emi t at i l e muchi ei ' , i , ' : ' ) ;
Wr i t e ( ' Dat i var f ul x = ' ) ;
r eadl n ( x) ;
Wr i t e ( ' Dat i var f ul y = ' ) ;
r eadl n ( y) ;
A [ x, y] : = 1; {matricea NU este simetrica}
End;
wr i t el n;
wr i t el n ( 'Matricea de ADIACENTA este: ' ) ;
f or i : = 1 t o n do
begi n
wr i t el n;
f or j : = 1 t o n do
begi n
wr i t e ( A [ i , j ] : 3 ) ; {se l asa 3 pozi t i i pent r u f i ecar e }
{el ement al mat r i ci i }
end;
end;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
93
Probleme rezolvate de programare Subiecte propuse la ATESTAT
94
{ Deoarece se pleaca de la matricea de ADIACENTA, se va face }
{ Initializarea matricii DRUMURILOR B cu matricea de ADIACENTA A }
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
begi n
B [ i , j ] : = A [ i , j ] ;
end;
end;
{Transformarea propriu-zisa - Algoritmul Roy-Warshall}
f or k : = 1 t o n do
begi n
f or i : = 1 t o n do
begi n
i f i <> k t hen
begi n
f or j : = 1 t o n do
begi n
i f j <> k t hen
begi n
I F B [ i , j ] = 0 t hen
B [ i , j ] : = MI N ( B [ i , k] , B [ k, j ] )
end
end
end
end
end;
wr i t el n ( 'Matricea drumurilor este: ' ) ;
f or i : = 1 t o n do
begi n
wr i t el n;
f or j : = 1 t o n do
begi n
wr i t e ( B [ i , j ] : 3 ) ; {se l asa 3 pozi t i i pent r u f i ecar e }
{el ement al mat r i ci i }
end;
end;
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ Verificam, in matricea de ADIACENTA, daca exista varfuri IZOLATE }
f or i : = 1 t o n do
begi n
zer opel i n [ i ] : = 0;
f or j : = 1 t o n do
begi n
i f A [ i , j ] = 0 t hen
zer opel i n [ i ] : = zer opel i n [ i ] + 1;
end
end;
f or j : = 1 t o n do
begi n
zer opecol [ j ] : = 0;
f or i : = 1 t o n do
begi n
i f A [ i , j ] = 0 t hen
zer opecol [ j ] : = zer opecol [ j ] + 1;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
95
end
end;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
96
f or i : = 1 t o n do
begi n
wr i t el n ( ' zer opel i n [ ' , i , ' ] = ' , zer opel i n [ i ] ) ;
wr i t el n ( ' zer opecol [ ' , i , ' ] = ' , zer opecol [ i ] ) ;
wr i t el n
end;
f or i : = 1 t o n do
begi n
i f ( zeropelin [ i ] = n) AND (zeropecol [ i ] = n) t hen
wr i t el n ( ' Var f ul ' , i, ' est e izolat') ;
wr i t el n
end;
{ Verificam, in matricea de DRUMURILOR, daca exista 1 pe diagonala principala }
GASI T : = FALSE; {pr esupunemca nu exi st a ci r cui t e i n gr af }
f or i : = 1 t o n do
begi n
i f B [ i , i ] = 1 t hen
GASI T : = TRUE
end;
i f GASI T = TRUE t hen
wr i t el n ( ' Gr af ul cont i ne ci r cui t e' )
el se
wr i t el n ( ' Gr af ul NU cont i ne ci r cui t e' ) ;
r eadl n
END.
FUNCII I PROCEDURI RECURSIVE
ATESTAT - 2005 - 25 - S se scrie un program care citete de la tastatur un numr natural n i
apeleaz o funcie recursiv, care ntoarce valoarea produsului:
p (n) = 1 * 3 * 5 ** (2n+1).
Exemple: pentru n =0, seva afia p (0) = 1, adic 2 * 0 + 1
pentru n = 3, se va afia p (3) = 105, adic 1 * 3 * 5 * 7
Barem:
- corectitudinea definiiei recursive: 3 puncte
- declaraie corect de funcie: 2 puncte
- condiia de ieire din funcie: 2 puncte
- corectitudine sintactic: 1 punct
- din oficiu: 1 punct
Rezolvare: Algoritmul recursiv pentru calcularea produsului din enun este asemntor cu cel pentru
calcularea lui x
n
n variant recursiv.
program ATESTAT_2005_25_PRODUS_RECURSIV;
var
i , n, p : i nt eger ;
function PRODUS ( m: i nt eger ) : i nt eger ;
begi n
i f m= 0 t hen
PRODUS : = 1
el se
Probleme rezolvate de programare Subiecte propuse la ATESTAT
97
PRODUS : = (2*m + 1) * PRODUS (m - 1)
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
98
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i n = ' ) ;
r eadl n ( n) ;
p : = PRODUS (n);
wr i t el n ( ' p ( ' , n, ' ) = ' , p) ;
r eadl n
END.
ATESTAT - 2005 - 26 - S se scrie un program prin care se citete de la tastatur numrul natural n.
Programul trebuie s apeleze o funcie recursiv, care s ntoarc valoarea sumei S (n), unde S
(n) = 2 + 5 + 8 + ... + (2 + 3*n).
Valoarea pentru numrul n este citit n programul principal. Valoarea calculat de funcie va fi afiat
pe ecran tot n programul principal.
Exemplu: pentru n = 3, se va afia valoarea 26 ( S (3) = 2 + 5 + 8 + 11 ).
Barem:
- corectitudinea definiiei recursive: 3 puncte
- declaraie corect de funcie: 2 puncte
- condiia de ieire din funcie: 2 puncte
- corectitudine sintactic: 1 punct
- din oficiu: 1 punct
Rezolvare: Algoritmul recursiv pentru calcularea sumei din enun este asemntor cu cel pentru
calcularea, n variant recursiv, a sumei S = 1 + 2 + 3 + + n.
program ATESTAT_2005_26_SUMA_RECURSIVA;
var
i , n, s : i nt eger ;
function SUMA ( m: i nt eger ) : i nt eger ;
begi n
i f m= 0 t hen
SUMA : = 2
el se
SUMA : = ( 2 + 3 * m) + SUMA (m-1 )
end;
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i n = ' ) ;
r eadl n ( n) ;
s : = SUMA (n);
wr i t el n ( ' S ( ' , n, ' ) = ' , s) ;
s: =2;
f or i : = 1 t o n do
begi n
wr i t el n ( ' SUMA ( ' , i , ' ) = ' , SUMA (i) ) ;
s : = s + SUMA (i);
end;
r eadl n
END.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
99
ATESTAT - 2005 - 27 - Se d un numr natural n introdus de la tastatur. Scriei un program care
calculeaz suma cifrelor acestui numr. Programul trebuie s apeleze o funcie recursiv care s
ntoarc valoarea sumei.
Barem:
- corectitudinea definiiei recursive: 3 puncte
- declaraie corect de funcie: 2 puncte
- condiia de ieire din funcie: 2 puncte
- corectitudine sintactic: 1 punct
- din oficiu: 1 punct
Rezolvare: Pentru numrul x, trebuie s determinm, mai nti, numrul de cifre i apoi vom calcula
suma cifrelor. Vom defini dou funcii NRCIFRE i SUMACIFRE, n acest scop
program ATESTAT_2005_27_SUMA_CIFRE_NUMAR_X;
{Fol osi nd o f unct i e r ecur si va, sa se cal cul eze suma ci f r el or unui nr . nat ur al x}
const
nmax = 100;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
var
s, x, x1, n, i : i nt eger ;
y : vect or ;
k : BOOLEAN;
function NRCIFRE ( y : i nt eger ) : i nt eger ;
var
m: i nt eger ;
begi n
i f y = 0 t hen
m: = 1
el se
begi n
m: = 0;
whi l e y <> 0 do
begi n
y : = y DI V 10;
m: = m+ 1
end
end;
NRCI FRE : = m
end;
function SUMACIFRE ( nr : i nt eger ) : i nt eger ;
var
s1, i : i nt eger ;
begi n
s1 : = 0;
f or i : = 1 t o NRCIFRE (nr) do
begi n
S1 : = s1 + y [ i ] ;
end;
SUMACI FRE : = s1
end;
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' I nt r oducet i un numar nat ur al x = ' ) ;
r eadl n ( x) ;
n : = NRCIFRE (x);
Probleme rezolvate de programare Subiecte propuse la ATESTAT
100
wr i t el n ( ' Numar ul ' , x, ' ar e ' , n, ' ci f r e' ) ;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
101
x1 : = x; {conser vamval oar ea numar ul ui i ni t i al x, f ol osi nd auxi l i ar ul x1}
f or i : = 1 t o n do
begi n
y [ i ] : = x1 MOD 10;
wr i t el n ( ' y [ ' , i , ' ] = ' , y [ i ] ) ;
x1 : = x1 DI V 10;
end;
s : = SUMACIFRE (x);
wr i t el n ( ' Suma ci f r el or numar ul ui ' , x, ' = ' , s) ;
r eadl n
END.
ATESTAT - 2005 - 28 - Se d un numr natural n n baza 10 i un numr natural b (2 <= b <= 9). S se
scrie un program care s converteasc numrul n n baza b, utiliznd n acest scop un subprogram
recursiv.
Barem:
- apel corect de subprogram: 2 puncte
- declaraie corect de subprogram: 3 puncte
- algoritm pentru conversia n baza b (algoritm corect): 3 puncte
- corectitudine sintactic: 1 punct
- din oficiu: 1 punct
Rezolvare: Folosimun vector R n care se rein resturile mpririi numrului zecimal nr10 la b (de
exemplu, b = 2).
program ATESTAT_2005_28_TRANSFORMARE_BAZA_10_IN_BAZA_2_VARIANTA_ITERATIVA_1;
uses CRT;
t ype
vect or = ar r ay [ 1. . 100] of i nt eger ;
VAR
ZECI MAL, BI NAR, nr10 : i nt eger ; {numar ul zecimal}
nr 2i nver sat , nr2 : i nt eger ; {numar bi nar inversat r espect i v nr bi nar f i nal }
R : vect or ;
n, i , j , k, r est : i nt eger ;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e ( ' Dat i numar ul zeci mal = ' ) ;
r eadl n ( nr 10) ;
i f nr10 = 0 t hen
begi n
ZECI MAL : = 0;
i : =1;
R[ i ] : = 0
end
el se
begi n
i : = 0;
ZECI MAL : = nr 10;
whi l e nr 10 <> 1 do
begi n
r est : = nr 10 MOD 2;
i : = i + 1;
R [ i ] : = r est ;
nr 10 : = nr 10 DI V 2;
end;
i : = i + 1;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
102
r [ i ] : = nr 10;
end;
n := i;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
103
wr i t el n;
wr i t e ( ' Numar ul bi nar echi val ent l ui ' , ZECI MAL, ' est e ' ) ;
f or i : = n downt o 1 do
begi n
wr i t e ( R[ i ] ) ;
end;
r eadl n
END.
program ATESTAT_2005_28_TRANSFORMARE_BAZA_10_IN_BAZA_B_VARIANTA_ITERATIVA_2;
uses CRT;
t ype
vect or = ar r ay [ 1. . 100] of i nt eger ;
VAR
ZECI MAL, BI NAR, nr 10 : i nt eger ; {numar ul zeci mal }
nr 2i nver sat , nr 2 : i nt eger ; {numar bi nar i nver sat r espect i v nr bi nar f i nal }
R : vect or ;
baza, n, i , j , k, r est : i nt eger ;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e ( ' Dat i numar ul zeci mal nr 10 = ' ) ;
r eadl n ( nr 10) ;
wr i t e ( ' Dat i noua baza = ' ) ;
r eadl n ( baza) ;
i : = 0;
ZECI MAL : = nr 10;
whi l e nr 10 <> 0 do
begi n
r est : = nr 10 MOD baza;
i : = i + 1;
R [ i ] : = r est ;
nr 10 : = nr 10 DI V baza;
end;
n := i;
wr i t e ( ' Numar ul i n baza ' , baza, ' echi val ent est e ' ) ;
f or i : = n downt o 1 do
begi n
wr i t e ( R[ i ] ) ;
end;
r eadl n
END.
program ATESTAT_2005_28_TRANSFORMARE_BAZA_10_IN_BAZA_2_VARIANTA_RECURSIVA;
var
n: i nt eger ;
b: byt e;
pr ocedur e conversie ( x: i nt eger ; b: byt e) ;
var r : byt e;
begi n
i f x>0 t hen
begi n
r : =x mod b;
conversie (x div b, b);
wr i t e( r ) ;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
104
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
105
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i n = ' ) ;
r eadl n ( n) ;
wr i t e ( ' Dat i noua baza de numer at i e, b = ' ) ;
r eadl n ( b) ;
wr i t el n ( ' Repr ezent ar ea numar ul ui ' , n, ' i n baza ' , b, ' est e: ' ) ;
conversie (n,b);
r eadl n;
end.
ATESTAT - 2005 - 29 - Se citesc n cuvinte terminate fiecare cu cte un spaiu. Cuvintele se citesc de la
tastatur din n linii. S se scrie un program care s afieze fiecare cuvnt aa cum s-a citit i apoi cu
literele inversate. S se rezolve problema recursiv.
Barem:
- apel corect de subprogram: 2 puncte
- declaraie corect de subprogram: 3 puncte
- algoritm corect de inversare recursiv: 3 puncte
- corectitudine sintactic: 1 punct
din oficiu: 1 punct
Rezolvare: Definim o funcie recursiv pentru inversarea unui ir.
program ATESTAT_2005_29_INVERSAREA_ELEMENTELOR_UNUI_SIR;
{ I nver sar e cuvi nt e - cu f unct i e r ecur si va }
uses CRT;
const
nmax = 100;
t ype
vect or = ar r ay [ 1. . nmax] of st r i ng;
VAR
si r , i nv : st r i ng;
n, i : i nt eger ;
si r ur i : vect or ;
function INVERS ( s : st r i ng ) : st r i ng;
begi n
i f s = ' ' t hen
I NVERS : = ' '
el se
I NVERS : = s [ LENGTH ( s) ] + I NVERS ( COPY ( s, 1, LENGTH ( s) - 1 ) ) ;
end; { sf ar si t f unct i e }
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i numar ul de cuvi nt e, n = ' ) ;
r eadl n ( n) ;
f or i : = 1 t o n do
begi n
wr i t e ( ' I nt r oducet i cuvi nt ul ' , i , ' ' ) ;
r eadl n ( si r ) ;
si r ur i [ i ] : = si r ;
end;
wr i t el n;
wr i t el n ( ' ********************************' ) ;
f or i : = 1 t o n do
begi n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
106
wr i t el n ( si r ur i [ i ] : 20, ' ' , I NVERS ( si r ur i [ i ] ) ) ;
end;
r eadl n
END.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
107
ATESTAT - 2005 - 30 - Se d un ir de caractere citit de la tastatur, ir ce se termin cu caracterul
punct. Scriei un program care afieaz irul citit n ordine invers. S se rezolve problema recursiv.
Barem:
- apel corect de subprogram: 2 puncte
- declaraie corect de subprogram: 3 puncte
- algoritm corect deinversare recursiv: 3 puncte
- corectitudine sintactic: 1 punct
- din oficiu: 1 punct
Rezolvare: Definim o funcie recursiv pentru inversarea unui ir.
program ATESTAT_2005_30_INVERSAREA_UNUI_SIR;
{ I nver sar e si r - cu f unct i e r ecur si va }
uses CRT;
const
nmax = 100;
VAR
si r 2, si r , i nv : st r i ng;
n, L, i : i nt eger ;
function INVERS ( s : st r i ng ) : st r i ng;
begi n
i f s = ' ' t hen
I NVERS : = ' '
el se
I NVERS : = s [ LENGTH ( s) ] + I NVERS ( Copy ( s, 1, LENGTH ( s) - 1 ) ) ;
end; { sf i r si t f unct i e
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e ( ' Dat i si r ul ( max 8 car act er e) , si r = ' ) ;
r eadl n ( si r ) ;
L := LENGTH (sir);
si r : = COPY ( si r , 1, L - 1) ;
wr i t el n ( ' Noul si r = ' , si r ) ;
wr i t el n;
wr i t el n ( ' ********************************' ) ;
si r 2 : = INVERS (sir);
wr i t el n ( ' si r 2 = ' , si r 2 ) ;
r eadl n
END.
ALGORITMI FUNDAMENTALI
CARE LUCREAZ CU TABLOURI
(varianta iterativ)
ATESTAT - 2005 - 31 - S se citeasc din fiierul standard de intrare un numr natural x. S se creeze
un fiier text, numit FACTORI.TXT cu structura :
- pe prima linie se va scrie valoarea lui x;
- pe urmtoarele linii se vor scrie factorii primi i puterile lor, n descompunerea lui x n factori
primi (cte un factor pe o linie).
S se citeasc fiierul creat i s se afieze pe ecran descompunerea numrului x.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
108
Barem:
- declaraii i citire corect: 1 punct
- algoritmul de descompunere n factori primi: 3 puncte
- crearea fiierului FACTORI.TXT: 2 puncte
- listarea coninutului fiierului: 3 puncte
- din oficiu: 1 punct
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.
Dup citirea de la tastatur a numrului x, l vom converti ntr-un ir de caractere, notat sirx,
prin apelarea procedurii STR. Introducem n fiierul text irul sirx asociat numrului x.
n fiierul text se vor introduce att factorii primi n care se descompune x, ct i puterile lor, astfel:
Transformm factorii n sir1, iar puterilen sir2
Dup fiecare astfel de numr transformat n ir, fie vom lsa cte un singur spaiu liber (blank),
fie vom aduga un comentariu (un ir de caractere). n acest fel, se va crea, prin CONCATENARE, cte
o linie n fiierul text. Evident, linie este tot un ir de caractere.
Celelalte etape sunt comentate direct n program.
program ATESTAT_2005_31_FACTORI_PRIMI_SI_PUTERILE_LOR;
{ Fi e x un numar nat ur al . Af i sat i f act or i i pr i mi ai l ui x si put er i l e l or }
CONST
nmax = 1000;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
VAR
f : TEXT;
l i ni e : st r i ng;
si r x, si r 1, si r 2 : st r i ng;
put er e : vect or ; {r et i nemi n vect or ul "put er e" put er ea unui f act or pr i m}
di vi zor : vect or ; {"di vi zor " = vect or i n car e se r et i n f act or i i pr i mi }
x, d : i nt eger ;
di vmax : i nt eger ; {di vi zor ul sau f act or ul pr i mmaxi m}
{d = un di vi zor oar ecar e, cur ent }
Begin { PROGRAM PRINCIPAL }
ASSI GN ( f , ' C: \ FACTORI . TXT' ) ;
REWRI TE ( f ) ;
wr i t e ( ' Dat i x = ' ) ;
r eadl n ( x) ;
STR (x, sirx);
wr i t el n ( f , si r 1) ; {scr i u pe pr i ma l i ni e a l ui "f " val oar ea l ui x}
RESET ( f ) ;
whi l e not EOF ( f ) do
begi n
r eadl n ( f , l i ni e) ;
wr i t el n ( l i ni e) ;
end;
d : = 2; {pr i mul di vi zor = pr i mul f act or }
di vi zor [ d] : = d; {i ni t i al i zar e el ement di n vect or ul di vi zor }
put er e [ d] : = 0; {i ni t i al i zar e numar de i mpar t i r i al e l ui x l a d}
Probleme rezolvate de programare Subiecte propuse la ATESTAT
109
whi l e x > 1 do
begi n
I f x MOD d = 0 t hen {daca x se i mpar t e l a d}
begi n
put er e [ d] : = put er e [ d] + 1;
x : = x DI V d;
end
el se
begi n
d : = d + 1;
di vi zor [ d] : = d;
put er e [ d] : = 0
end;
end;
wr i t el n;
di vmax : = d;
f or d : = 2 t o di vmax do
begi n
i f put er e [ d] <> 0 t hen
begi n
wr i t el n ( ' Di vi zor ul ' , di vi zor [ d] ,
' apar e l a put er ea a ' , put er e [ d] , ' - a' ) ;
STR (divizor [d], sir1); {t r ansf or mdivizor [d] i n sir1}
STR (putere [d], sir2); {t r ansf or mputere [d] i n sir2}
l i ni e : = ' Di vi zor ul ' + si r 1 + ' apar e l a put er ea a ' + si r 2 + ' - a' ;
APPEND ( f ) ; {APPEND, deoar ece amscr i s dej a si r x i n f }
wr i t el n ( f , l i ni e) ;
end
end;
wr i t el n;
wr i t el n ( ' Cont i nut ul f i si er ul ui est e: ' ) ;
RESET ( f ) ;
whi l e NOT EOF ( f ) do
begi n
r eadl n ( f , l i ni e) ;
wr i t el n ( l i ni e)
end;
r eadl n
end.
ATESTAT - 2005 - 32 - Se d un tablou bidimensional cu m linii i n coloane, ce conine numere
ntregi. S se determine linia ce conine cel mai mare element n valoare absolut din matrice.
Datele de intrare se vor prelua dintr-un fiier text MATRICE.TXT cu structura :
- prima linie conine m i n (dou numere ntregi pozitive, separate printr-un spaiu)
- urmtoarele m linii conin fiecare n numere ntregi separate printr-un spaiu.
Rezultatele se vor afia pe ecran.
Barem:
- crearea fiierului de intrare : 1 punct
- citire din fiier : 3 puncte
- algoritmul pentru determinarea elementului maxim: 4 puncte
- afiare rezultate: 1 punct
Probleme rezolvate de programare Subiecte propuse la ATESTAT
110
din oficiu: 1 punct
Probleme rezolvate de programare Subiecte propuse la ATESTAT
111
Rezolvare: Folosim funcia STR pentru conversia unui numr ntr-un ir, la introducerea elementelor
matricii n fiier.
program ATESTAT_2005_32_ELEMENT_MAX_IN_MATRICE;
uses CRT;
LABEL
100;
CONST
nmax = 100;
TYPE
mat r i ce = ar r ay [ 1. . nmax, 1. . nmax] of i nt eger ;
VAR
m, n, i , j , MAX : i nt eger ;
f : TEXT;
A : mat r i ce;
si r , si r 1, si r 2, l i ni e : STRI NG;
begi n
CLRSCR;
ASSI GN ( f , ' C: \ MATRI CE. t xt ' ) ;
r ewr i t e ( f ) ; {gener amf i si er ul t ext }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ scr i empe pr i ma l i ni e di n f i si er ul TEXT cel e doua val or i "m" si "n" }
l i ni e : = ' ' ; { i ni t i al i zar e var i abi l a "l i ni e" cu si r ul vi d }
{ "l i ni e" = un STRI NG car e se va i nt r oduce i n f i si er ul t ext }
{ Pr i ma "l i ni e" va cont i ne "m" si "n" separ at e de spat i i }
{ Ur mat oar el e "m" l i ni i vor cont i ne cat e "n" el ement e separ at e de
spat i i }
wr i t el n ;
wr i t e ( ' Dat i numar ul de l i ni i , m= ' ) ;
r eadl n ( m) ;
STR (m, sir1); {t r ansf or ma "m" i n "si r 1", pent r u a- l memor a i n f i si er }
linie := linie + sir1 + ' '; {const r ui m"l i ni e" pr i n concat enar e, }
{scr i i nd un "spat i u" dupa f i ecar e si r }
wr i t el n;
wr i t e ( ' Dat i numar ul de col oane, n = ' ) ;
r eadl n ( n) ;
STR (n, sir2); {t r ansf or ma "n" i n "si r 2", pent r u a- l memor a i n f i si er }
linie := linie + sir2 ; {const r ui m"l i ni e" pr i n concat enar e cu vechea val oar e}
{ a si r ul ui "l i ni e" }
writeln (f, linie); { scr i emsi r ul "l i ni e" i n f i si er ul TEXT }
wr i t el n;
{ Introducerea matricii }
wr i t el n ;
wr i t el n ( ' Dat i mat r i cea' ) ;
wr i t el n;
f or i : = 1 t o mdo
begi n
f or j : = 1 t o n do
begi n
wr i t e ( ' Dat i A [ ' , i , ' , ' , j , ' ] = ' ) ;
r eadl n ( A [ i , j ] ) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
112
end;
end;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
113
{ Scrierea matricii in fisierul TEXT }
f or i : = 1 t o mdo
begi n
l i ni e : = ' ' ; { i ni t i al i zar e si r "l i ni e" cu si r ul vi d }
{ pt . f i ecar e l i ni e a mat r i ci i }
f or j : = 1 t o n - 1 do
begi n
STR ( A [i, j] , sir ); {t r ansf or ma A [ i , j ] i nt r - un si r }
linie := linie + sir + ' ' ; { const r ui r ea l i ni ei cur ent e }
{ di n f i si er ul t ext }
end;
writeln (f, linie); { scr i emsi r ul "l i ni e" i n f i si er ul TEXT }
end;
wr i t el n ;
wr i t el n ( ' Cont i nut ul f i si er ul ui TEXT est e : ' ) ;
wr i t el n;
RESET ( f ) ;
WHI LE NOT EOF ( f ) do
begi n
r eadl n ( f , l i ni e) ;
wr i t el n ( l i ni e)
end;
wr i t el n;
RESET ( f ) ;
{ Se ci t esc di n f i si er dimensiunile matricii }
Read (f, m);
Readln (f, n);
{ Se ci t esc di n f i si er elementele matricii }
f or i : = 1 t o mdo
begi n
f or j : =1 t o n do
begi n
Read (f, A [i, j]);
end;
Readl n ( f ) ; { avansul l a l i ni a ur mat oar e i n f i si er }
end;
Cl ose ( f ) ;
{ Determinare element MAXIM }
MAX : = ABS ( A [ 1, 1] ) ;
f or i : = 1 t o mdo
begi n
f or j : = 1 t o n do
begi n
i f ABS ( A [ i , j ] ) >= MAX t hen
begi n
MAX : = ABS ( A [ i , j ] ) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
114
end;
end;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
115
wr i t el n;
wr i t el n ( ' El ement ul maxi m, i n modul , est e : ' , MAX ) ;
wr i t el n;
wr i t el n ( ' Li ni a / l i ni i l e pe car e se af l a el ement ul caut at : ' ) ;
wr i t el n;
f or i : = 1 t o mdo
begi n
f or j : = 1 t o n do
begi n
i f ABS ( A [ i , j ] ) = MAX t hen
begi n
wr i t el n ( ' El ement ul caut at se af l a pe Li ni a = ' , i ) ;
GOTO 100; { daca MAX a f ost gasi t i nt r - o l i ni e, }
{ t r eceml a ur mat oar ea l i ni e }
end;
end;
100 :
end;
r eadl n;
end.
ATESTAT - 2005 - 33 - Se consider o matrice cu m linii i n coloane. S se scrie un program care s
ordoneze cresctor n funcie de suma liniilor matricii, prin una din metodele nvate. Se va meniona
metoda folosit printr-un comentariu n program. Datele de intrare se vor citi dintr-un fiier text
INPUT.TXT, iar matricea ordonat se va afia pe ecran linie cu linie.
Barem:
- crearea fiierului de intrare: 1 punct
- citire din fiier: 3 puncte
- algoritm de sortare cresctoare a liniilor: 4 puncte
- afiare matrice: 1 punct
- din oficiu: 1 punct
Rezolvare: Pentru ordonare, vom defini dou proceduri: BUBBLE care apeleaz la algoritmul bubble
sort, i ORDONEAZ, bazat pe sortarea prin selecie.
program ATESTAT_2005_33_ORDONARI;
uses CRT;
const
nmax = 30;
t ype
vect or = ar r ay [ 1. . nmax] of i nt eger ;
mat r i ce = ar r ay [ 1. . nmax, 1. . nmax] of i nt eger ;
var
f : f i l e of i nt eger ;
A : mat r i ce;
l i ni a : vect or ;
n, j , i , m: i nt eger ;
t , suma, i ndex : i nt eger ;
procedure BUBBLE ( var v : vect or ; nr : i nt eger ) ;
var
k1, j : i nt eger ;
aux : i nt eger ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
116
begi n
r epeat
k1: = 0;
j : = 1;
r epeat
i f v[ j ] > v [ j +1] t hen
begi n
aux : = v [ j ] ;
v [ j ] : = v [ j +1] ;
v [ j +1] : = aux;
k1 : = 1
end;
j : = j + 1
unt i l ( j > nr - 1)
unt i l ( k1 = 0) ;
end;
procedure ORDONEAZA ( var v : vect or ; nr : i nt eger ) ; {al t al gor i t mde sor t ar e}
var
aux : i nt eger ;
begi n
f or t : = 1 t o nr - 1 do
begi n
f or j : = t + 1 t o nr do
begi n
i f v [ t ] < v [ j ] t hen
begi n
aux : = v [ t ] ;
v [ t ] : = v [ j ] ;
v [ j ] : = aux
end;
end;
end;
end;
procedure TIPARESTE ( x: vect or ; nr : i nt eger ) ;
begi n
f or t : = 1 t o nr do
wr i t e ( x [ t ] , ' , ' )
end;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
ASSI GN ( f , ' c: \ i nt r egi . t xt ' ) ;
r ewr i t e ( f ) ;
r epeat
wr i t e ( ' Dat i numar ul de l i ni i , m= ' ) ;
r eadl n ( m) ;
unt i l ( m>= 1) and ( m<= nmax) ;
r epeat
wr i t e ( ' Dat i numar ul de col oane, n = ' ) ;
r eadl n ( n) ;
unt i l ( n >= 1) and ( n <= nmax) ;
wr i t el n;
wr i t el n ( ' Dat i mat r i cea A' ) ;
f or i : = 1 t o mdo
begi n
f or j : = 1 t o n do
begi n
wr i t e ( ' a [ ' , i , ' , ' , j , ' ] = ' ) ;
r eadl n ( a [ i , j ] )
Probleme rezolvate de programare Subiecte propuse la ATESTAT
117
end;
end;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
118
f or i : = 1 t o mdo
begi n
f or j : = 1 t o n do
begi n
l i ni a [ j ] : = a [ i , j ] ;
end;
wr i t el n;
TIPARESTE (linia, n);
r eadl n;
end;
suma : = m+ n;
i ndex : = suma mod 2;
case i ndex of
0 : begi n
f or i : = 1 t o mdo
begi n
f or j : = 1 t o n do
begi n
l i ni a [ j ] : = a[ i , j ] ;
end;
wr i t e ( ' l i ni a ' , i , ' est e ' ) ;
TIPARESTE (linia, n);
wr i t el n;
r eadl n;
BUBBLE (linia, n); {un prim algoritm de sortare}
wr i t el n;
TIPARESTE (linia, n);
wr i t el n;
r eadl n;
end;
end;
1 : begi n
f or i : = 1 t o mdo
begi n
f or j : = 1 t o n do
begi n
l i ni a [ j ] : = a[ i , j ] ;
end;
wr i t e ( ' l i ni a ' , i , ' est e ' ) ;
TIPARESTE (linia, n);
r eadl n;
ORDONEAZA (linia, n); {al doilea algoritm de sortare}
wr i t el n;
TIPARESTE (linia, n);
r eadl n;
end;
end;
end; {end CASE}
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
119
r eadl n
END.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
120
ATESTAT - 2005 - 34 - Scriei un program care s realizeze REUNIUNEA a dou mulimi A i B
introduse prin doi vectori ce au m, respectiv n elemente numere ntregi, distincte. Datele de intrare se
vor citi de la tastatur. Rezultatele se vor afia pe ecran.
Barem:
- declaraii de variabile: 1 punct
- citire corect a datelor: 2 puncte
- algoritm de prelucrare corect descris: 5 puncte
- afiarea reuniunii: 1 punct
- din oficiu: 1 punct
Rezolvare: Construim dou mulimi Ma i Mb care conin, fiecare, elementele vectorilor A, respectiv
B, i apoi reunim cele dou mulimi.
program ATESTAT_2005_34_REUNIUNE_MULTIMI;
const
nmax = 100;
t ype
vect or = ar r ay [ 1. . nmax] of i nt eger ;
var
a, b : vect or ;
R, Ma, Mb : set of byt e;
el em, m, n, i , j : i nt eger ;
Begin { PROGRAM PRINCIPAL }
r epeat
wr i t e ( ' Dat i nr . de el ement e al e mul t i mi i A, m= ' ) ;
r eadl n ( m)
unt i l ( m>= 1 ) AND ( m<= nmax) ;
r epeat
wr i t e ( ' Dat i nr . de el ement e al e mul t i mi i B, n = ' ) ;
r eadl n ( n)
unt i l ( n >= 1 ) AND ( n <= nmax) ;
wr i t el n;
wr i t el n ( ' Dat i el ement el e mul t i mi i A' ) ;
f or i : = 1 t o mdo
begi n
wr i t e ( ' A [ ' , i , ' ] = ' ) ;
r eadl n ( A [ i ] ) ;
end;
wr i t el n;
wr i t el n ( ' Dat i el ement el e mul t i mi i B' ) ;
f or i : = 1 t o n do
begi n
wr i t e ( ' B [ ' , i , ' ] = ' ) ;
r eadl n ( B [ i ] ) ;
end;
Ma : = [ ] ;
f or i : = 1 t o mdo
begi n
Ma : = Ma + [ A[ i ] ] ; {const r ui esc Ma pr i n r euni une
end;
Mb : = [ ] ;
f or i : = 1 t o n do
begi n
Mb : = Mb + [ B[ i ] ] ; {const r ui esc Ma pr i n r euni une
Probleme rezolvate de programare Subiecte propuse la ATESTAT
121
end;
R := Ma + Mb;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
122
wr i t el n ( ' El ement el e mul t i mi i REUNI UNE sunt : ' ) ;
f or el em: = 0 t o 255 do
begi n
i f el emI N R t hen
wr i t e ( el em, ' , ' ) ;
end;
r eadl n
END.
ATESTAT - 2005 - 35 - Scriei un program care s realizeze INTERSECIA a dou mulimi A i B
introduse prin doi vectori ce au m, respectiv n elemente numere ntregi, distincte.
Datele de intrare se vor citi de la tastatur. Rezultatele se vor afia pe ecran.
Barem:
- declaraii de variabile: 1 punct
- citire corect a datelor: 2 puncte
- algoritm de prelucrare corect descris: 5 puncte
- afiarea interseciei: 1 punct
- din oficiu: 1 punct
Rezolvare: Construim dou mulimi Ma i Mb care conin, fiecare, elementele vectorilor A, respectiv
B, i apoi intersectm cele dou mulimi.
program ATESTAT_2005_35_INTERSECTIE;
const
nmax = 100;
t ype
vect or = ar r ay [ 1. . nmax] of i nt eger ;
var
a, b : vect or ;
I NTERS, Ma, Mb : set of byt e;
el em, m, n, i , j : i nt eger ;
Begin { PROGRAM PRINCIPAL }
r epeat
wr i t e ( ' Dat i nr . de el ement e al e mul t i mi i A, m= ' ) ;
r eadl n ( m)
unt i l ( m>= 1 ) AND ( m<= nmax) ;
r epeat
wr i t e ( ' Dat i nr . de el ement e al e mul t i mi i B, n = ' ) ;
r eadl n ( n)
unt i l ( n >= 1 ) AND ( n <= nmax) ;
wr i t el n;
wr i t el n ( ' Dat i el ement el e mul t i mi i A' ) ;
f or i : = 1 t o mdo
begi n
wr i t e ( ' A [ ' , i , ' ] = ' ) ;
r eadl n ( A [ i ] ) ;
end;
wr i t el n;
wr i t el n ( ' Dat i el ement el e mul t i mi i B' ) ;
f or i : = 1 t o n do
begi n
wr i t e ( ' B [ ' , i , ' ] = ' ) ;
r eadl n ( B [ i ] ) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
123
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
124
Ma : = [ ] ;
f or i : = 1 t o mdo
begi n
Ma : = Ma + [ A[ i ] ] ; {const r ui esc Ma pr i n r euni une }
end;
Mb : = [ ] ;
f or i : = 1 t o n do
begi n
Mb : = Mb + [ B[ i ] ] ; {const r ui esc Ma pr i n r euni une }
end;
INTERS := Ma * Mb;
wr i t el n;
wr i t el n ( ' El ement el e mul t i mi i I NTERS sunt : ' ) ;
f or el em: = 0 t o 255 do
begi n
i f el emI N I NTERS t hen
wr i t e ( el em, ' , ' ) ;
end;
r eadl n
END.
ATESTAT - 2005 - 36 - Scriei un program care s realizeze DIFERENA a dou mulimi A i B
introduse prin doi vectori ce au m, respectiv n elemente numere ntregi, distincte.
Datele de intrare se vor citi de la tastatur. Rezultatele se vor afia pe ecran.
Barem:
- declaraii de variabile: 1 punct
- citire corect a datelor: 2 puncte
- algoritm de prelucrare corect descris: 5 puncte
- afiarea diferenei: 1 punct
- din oficiu: 1 punct
Rezolvare: Construim dou mulimi Ma i Mb care conin, fiecare, elementele vectorilor A, respectiv
B, i apoi facem diferena celor dou mulimi.
program ATESTAT_2005_36_INTERSECTIE;
const
nmax = 100;
t ype
vect or = ar r ay [ 1. . nmax] of i nt eger ;
var
a, b : vect or ;
DI FER, Ma, Mb : set of byt e;
el em, m, n, i , j : i nt eger ;
Begin { PROGRAM PRINCIPAL }
r epeat
wr i t e ( ' Dat i nr . de el ement e al e mul t i mi i A, m= ' ) ;
r eadl n ( m)
unt i l ( m>= 1 ) AND ( m<= nmax) ;
r epeat
wr i t e ( ' Dat i nr . de el ement e al e mul t i mi i B, n = ' ) ;
r eadl n ( n)
unt i l ( n >= 1 ) AND ( n <= nmax) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
125
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
126
wr i t el n ( ' Dat i el ement el e mul t i mi i A' ) ;
f or i : = 1 t o mdo
begi n
wr i t e ( ' A [ ' , i , ' ] = ' ) ;
r eadl n ( A [ i ] ) ;
end;
wr i t el n;
wr i t el n ( ' Dat i el ement el e mul t i mi i B' ) ;
f or i : = 1 t o n do
begi n
wr i t e ( ' B [ ' , i , ' ] = ' ) ;
r eadl n ( B [ i ] ) ;
end;
Ma : = [ ] ;
f or i : = 1 t o mdo
begi n
Ma : = Ma + [ A[ i ] ] ; {const r ui esc Ma pr i n r euni une }
end;
Mb : = [ ] ;
f or i : = 1 t o n do
begi n
Mb : = Mb + [ B[ i ] ] ; {const r ui esc Ma pr i n r euni une }
end;
DIFER := Ma - Mb;
wr i t el n;
wr i t el n ( ' El ement el e mul t i mi i DI FER sunt : ' ) ;
f or el em: = 0 t o 255 do
begi n
i f el emI N DI FER t hen
wr i t e ( el em, ' , ' ) ;
end;
r eadl n
END.
ATESTAT - 2005 - 37 - Scriei un program care s afieze elementele care sunt numere prime, dintr-o
matrice ptratic cu n x n elemente ntregi pozitive. Dac n matrice nu sunt astfel de elemente s se
menioneze acest lucru printr-un mesaj adecvat afiat pe ecran.
Barem:
- declaraii de variabile: 1 punct
- citire corect a datelor: 2 puncte
- algoritm de determinare numr prim: 5 puncte
- afiare numere prime, respectiv mesaj: 1 punct
- din oficiu: 1 punct
Rezolvare: Verificm primalitatea unui numr ntreg, definind o funcie PRIM.
program ATESTAT_2005_37_NUMERE_PRIME_IN_MATRICE_PATRATICA;
const
nmax = 100;
t ype
mat r i ce = ar r ay [ 1. . nmax, 1. . nmax] of i nt eger ;
var
Probleme rezolvate de programare Subiecte propuse la ATESTAT
127
A : mat r i ce;
PRI ME, m, n, i , j : i nt eger ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
128
function PRIM ( x : i nt eger ) : bool ean;
var
nr di v, di vi zor : i nt eger ;
begi n
nr di v : = 0;
f or di vi zor : = 1 t o x do
begi n
i f x mod di vi zor = 0 t hen
nr di v : = nr di v + 1
end;
i f nr di v <= 2 t hen
PRI M : = TRUE
el se
PRI M : = FALSE
end;
Begin { PROGRAM PRINCIPAL }
r epeat
wr i t e ( ' Dat i nr . de l i ni i = nr . de col oane, n = ' ) ;
r eadl n ( n)
unt i l ( n >= 1 ) AND ( n <= nmax) ;
wr i t el n ( ' Dat i el ement el e mat r i ci i A' ) ;
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
begi n
wr i t e ( ' A [ ' , i , ' , ' , j , ' ] = ' ) ;
r eadl n ( A [ i , j ] ) ;
end;
end;
PRI ME : = 0; {cont or car e numar a numer el e pr i me gasi t e }
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
begi n
i f PRI M ( A[ i , j ] ) = TRUE t hen
begi n
PRI ME : = PRI ME + 1;
wr i t el n ( A[ i , j ] , ' est e numar pr i m' ) ;
end;
end;
end;
wr i t el n;
wr i t el n ( ' Mat r i cea ar e ' , PRI ME, ' numer e pr i me' ) ;
i f PRI ME = 0 t hen
wr i t el n ( ' Mat r i cea nu ar e numer e pr i me' ) ;
r eadl n
END.
ATESTAT - 2005 - 38 - S se scrie un program care s realizeze INTERCLASAREA a doi vectori A
i B ordonai cresctor. Vectorii au m, respectiv n componente numere reale. La citire, s se verifice
dac vectorii sunt ordonai cresctor. Dac unul din ei nu satisface aceast condiie, s se fac
ordonarea prin una din metodele nvate.
Barem:
- declaraii de variabile: 1 punct
- citire corect a datelor, cu ordonare, cnd este cazul: 3 puncte
- algoritm de interclasare: 4 puncte
Probleme rezolvate de programare Subiecte propuse la ATESTAT
129
- afiare vector interclasat: 1 punct
- din oficiu: 1 punct
Probleme rezolvate de programare Subiecte propuse la ATESTAT
130
Rezolvare: Ordonm vectorii prin metoda bubble sort, dup care interclasm vectorii.
program ATESTAT_2005_38_INTERCLASARE;
uses CRT;
const
Nmax = 30;
t ype
vect or = ar r ay [ 1 . . Nmax] of i nt eger ;
var
A, B : vect or ;
C : ar r ay [ 1 . . 2 * Nmax] of REAL;
i , j , m, n, k : i nt eger ;
procedure ORDONEAZA ( VAR v : vect or ; q: i nt eger ) ;
var
k1, t : i nt eger ;
aux : i nt eger ;
begi n
r epeat
k1: = 0;
t : = 1;
r epeat
i f v [ t ] > v [ t +1] t hen
begi n
aux : = v [ t ] ;
v [ t ] : = v [ t +1] ;
v [ t +1] : = aux;
k1 : = 1
end;
t : = t + 1
unt i l ( t > q- 1)
unt i l ( k1 = 0) ;
end;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
REPEAT
wr i t e ( ' Dat i nr . de el ement e pent r u vect or ul A, m= ' ) ;
r eadl n ( m) ;
UNTI L ( m>=1) AND ( m<= Nmax) ;
wr i t el n;
REPEAT
wr i t e ( ' Dat i nr . de el ement e pent r u vect or ul B, n = ' ) ;
r eadl n ( n) ;
UNTI L ( n >=1) AND ( n <= Nmax) ;
wr i t el n;
wr i t el n ( 'Dati elementele vectorului A' ) ;
f or i : = 1 t o mdo
begi n
wr i t e ( ' A [ i ] = ' ) ;
r eadl n ( A [ i ] )
end;
wr i t el n;
ORDONEAZA (A, m);
wr i t el n ( 'Dati elementele vectorului B' ) ;
f or j : = 1 t o n do
begi n
wr i t e ( ' B [ j ] = ' ) ;
r eadl n ( B [ j ] )
end;
ORDONEAZA (B, n);
Probleme rezolvate de programare Subiecte propuse la ATESTAT
131
{ Algoritmul de INTERCLASARE }
k : = 0;
i : = 1;
j : = 1;
WHI LE ( i <= m) AND ( j <= n) do
begi n
i f A [ i ] < B [ j ] t hen
begi n
k : = k + 1;
C [ k] : = A [ i ] ;
i : = i + 1
end
el se
begi n
k : = k + 1;
C [ k] : = B [ j ] ;
j : = j + 1
end;
end;
WHI LE i <= mDO
begi n
k : = k + 1;
C [ k] : = A [ i ] ;
i : = i + 1
end;
WHI LE j <= n DO
begi n
k : = k + 1;
C [ k] : = B [ j ] ;
j : = j + 1
end;
wr i t el n;
wr i t el n ( ' Vect or ul r ezul t ant C est e: ' ) ;
f or k : = 1 t o m+ n do
begi n
wr i t el n ( ' C [ k] = ' , C [ k] )
end;
r eadl n
END.

You might also like