Sunteți pe pagina 1din 92

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2003 - 1 - Se citesc numere naturale pn la


introducerea a dou numere consecutive egale. Afiai toate
perechile de numere citite consecutiv, care sunt prime ntre
ele..
Rezolvare:
Dou numere naturale A i B, diferite de 0, sunt prime
ntre ele dac l au pe 1 ca singur divizor comun. Altfel
spus, CMMDC al celor dou numere este egal cu 1. Nu este
obligatoriu ca A i B s fie ele nsele prime. Exemplu: 15 i
16 NU sunt numere prime, dar sunt prime ntre
ele, pentru c CMMDC (15, 16) = 1.
Conform enunului, dac se citesc numere, nu se tie de la
nceput cte (nu se d un n = numrul de numere ce se
vor citi), deci va trebui s le numrm cu un contor i.
Numerele pe care le vom introduce vor fi preluate ntr-un
vector X.
Definim o funcie CMMDC pentru a calcula CMMDC al
dou numere consecutive (cele dou numere vor fi dou
elemente consecutive din vectorul X).
Program ATESTAT_2003_1_NUMERE_PRIME_INTRE_ELE ;
CONST
nmax = 100;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
VAR
x : vect or ;
n, i : i nt eger ;
function CMMDC ( A, B : i nt eger ) : i nt eger ;
var
aux, R : i nt eger ;
begi n
i f A < B t hen
begi n
aux : = A;
A : = B;
B : = aux
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
4
R : = A MOD B;
whi l e R <> 0 do
begi n
A : = B;
B : = R;
R : = A MOD B
end;
CMMDC : = B
end; { sf ar si t f unct i e CMMDC }
Begin { PROGRAM PRINCIPAL }
i := 1; {cont or car e
numar a numer el e i nt r oduse}
wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ;
{i nt r oducempr i mul numar }
r eadl n ( x [ i ] ) ;
REPEAT
{i nt r oducemur mat oar el e numer e}
i : = i + 1;
wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ;
r eadl n ( x [ i ] ) ;
UNTI L ( x [ i ] = x [ i - 1] ) ; {pana ce apar
doua numer e consecut i ve egal e}
n := i; {n = t ot al
numer e i nt r oduse = i }
f or i : = 1 t o n - 1 do
begi n
i f CMMDC ( x [i], x [i+1] ) = 1 t hen
wr i t el n ( x [ i ] , ' si ' , x [ i +1] , '
sunt pr i me i nt r e el e' ) ;
end;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
5
ATESTAT - 2003 - 2 - Se citesc numere naturale pn la
introducerea unui numr prim cu 12. Afiai toate numerele
care sunt prime cu suma cifrelor lor.
Rezolvare:
Dou numere sunt prime ntre ele dac CMMDC al celor dou
numere este 1 (vezi problema anterioar).
Introducem primul numr, notat cu x. Verificm dac x este
prim cu 12 i dac DA, oprim algoritmul; dac nu, verificm dac
este prim cu suma cifrelor sale.
Pentru c vom introduce mai multe numere, dar nu tim de la
nceput cte anume, introducerea urmtoarelor numere se va face
ntr-un ciclu WHILE.
Definim o funcie CMMDC pentru a calcula CMMDC al dou
numere.
Definim o funcie NUMARACIFRE, pentru a numra cifrele
unui numr natural.
Definim o procedur DETCIFRE, care determin cifrele unui
numr i le depune ntr-un vector.
Definim o funcie SUMACIFRE, care nsumeaz cifrele unui
numr.
Program
ATESTAT_2003_2_NUMERE_PRIME_CU_SUMA_CIFRELOR_LOR ;
CONST
nmax = 100;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
VAR
y : vect or ;
S, x, n, i : i nt eger ;
function CMMDC ( A, B : i nt eger ) : i nt eger ;
var
aux, R : i nt eger ;
begi n
i f A < B t hen
begi n
aux : = A;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
6
A : = B;
B : = aux
end;
R : = A MOD B;
whi l e R <> 0 do
begi n
A : = B;
B : = R;
R : = A MOD B
end;
CMMDC : = B
end; { sf ar si t f unct i e CMMDC }
function NUMARACIFRE ( z : i nt eger ) : i nt eger ;
var
nr ci f : i nt eger ;
begi n
i f z = 0 t hen
nr ci f : = 1
el se
begi n
nr ci f : = 0;
whi l e z > 0 do
begi n
z := z DIV 10;
nrcif := nrcif + 1
end;
end;
NUMARACI FRE : = nr ci f ;
end; { sf ar si t f unct i e NUMARACI FRE }
Probleme rezolvate de programare Subiecte propuse la ATESTAT
7
procedure DETCIFRE ( z : i nt eger ; VAR y :
vect or ) ;
{ det er mi na ci f r el e l ui z si
l e depune i n vect or ul y }
begi n
n : = NUMARACI FRE ( z ) ;
i : = n;
whi l e i >= 1 do
begi n
y [ i ] := z MOD 10;
z := z DIV 10;
i := i - 1
end;
end; { sf ar si t pr oc. DETCI FRE }
function SUMACIFRE ( z : i nt eger ) : i nt eger ;
var
s : i nt eger ;
begi n
DETCIFRE ( z, y );
S : = 0;
f or i : = 1 t o n do
begi n
S : = S + y [ i ]
end;
SUMACI FRE : = S;
end; { sf ar si t f unct i e SUMACI FRE }
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i x = ' ) ; {I nt r oducer ea
primului numr}
r eadl n ( x ) ;
while CMMDC ( x, 12 ) <> 1 do {testm dac x
est e pr i mcu 12}
begi n
S : = SUMACIFRE ( x) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
8
i f CMMDC ( x, S) = 1 t hen
wr i t el n ( ' x = ' , x, ' est e pr i mcu
suma ci f r el or sal e S = ' , s)
el se
wr i t el n ( ' x = ' , x, ' NU est e pr i mcu
suma ci f r el or sal e S = ' , s) ;
wr i t e ( ' Dat i x = ' ) ; {I nt r oducer ea
urmtoarelor numere}
r eadl n ( x ) ;
end;
r eadl n;
end.
ATESTAT - 2003 - 3 - Fie x un numr natural. Stabilii care
este factorul prim care, n descompunerea lui x, apare la
puterea maxim.
Rezolvare:
Notm cu d un posibil divizor al lui x. Evident, d poate
lua valori consecutive ncepnd de la 2 pn la x, dar nu
orice valoare ntre 2 i x este i divizor al lui x.
Contorul nr numr de cte ori x se mparte exact la un d
>=2.
Dup fiecare mprire exact a lui x la d, noul x devine x
DIV d. Repetm (ntr-un ciclu WHILE) aceste calcule att
timp ct x > 1.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
9
Plecm cu d de la valoarea 2 i nu de la 1, pentru a evita un
ciclu infinit n urma atribuirii x := x DIV d. Dac s-
ar iniializa d cu 1, n urma atribuirii x := x DIV d, noua
valoare a lui x ar rmne ntotdeauna = x, deci divizorul d
= 1 s-ar numra de o infinitate de ori (gsindu-l pe 1 ca
divizor de o infinitate de ori, nu s-ar mai trece niciodat la d
=2, prin atribuirea d := d + 1).
Reinem n variabila max cel mai mare numr de mpriri
ale lui x la un divizor d.
Notm cu divizor divizorul pentru care numrul de
mpriri este max.
Program ATESTAT_2003_3 ; {determin divizorul care
apare la puterea maxim }
VAR
x, d, nr , MAX, di vi zor : i nt eger ;
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i x = ' ) ;
r eadl n ( x) ;
d : = 2; {pr i mul di vi zor posi bi l }
max : = 0; {i ni t i al i zar e MAX}
nr : = 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}
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
nr : = nr + 1;
x : = x DI V d;
i f max < nr t hen
begi n
max : = nr ;
wr i t el n ( ' Di vi zor ul ' ,
d, ' apar e de ' , max, ' or i ' ) ;
di vi zor : = d;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
10
end
end
el se
begi n
d : = d + 1;
nr : = 0
end;
end;
wr i t el n;
wr i t el n ( ' Di vi zor ul ' , divizor, ' apar e l a
put er ea maxi ma = ' , max) ;
r eadl n
end.
ATESTAT - 2003 - 4 - Se citesc pe rnd n numere naturale.
Afiai-le pe cele care sunt termeni ai irului lui Fibonacci.
Rezolvare:
Presupunem c numerele x NU sunt introduse n ordine.
Folosim o bucl exterioar n care introducem cte un x.
Folosim o bucl interioar n care generm un nou termen
FIBONACCI, ct timp numrul x introdus rmne >
termenul FIBONACCI generat.
Termenii irului FIBONACCI se rein n vectorul FIBO.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
11
Program ATESTAT_2003_4_Fibonacci ;
CONST
nmax = 100;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
VAR
FI BO : vect or ;
x, n, i , j : i nt eger ;
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i nr . de numer e nat ur al e, n = ' ) ;
r eadl n ( n ) ;
f or i : = 1 t o n do {bucla exterioar}
begi n
wr i t e ( ' Dat i x = ' ) ;
r eadl n ( x) ;
FI BO [ 1] : = 1; {iniializarea
primilor termeni ai irului}
FI BO [ 2] : = 1;
j : = 3;
whi l e x > FI BO [ j ] do {bucl a
interioar}
begi n
FI BO [ j ] : = FI BO [ j - 1] +
FI BO [ j - 2] ;
j : = j + 1
end; {sf ar si t bucl a
interioar}
i f x = FI BO [ j ] t hen
wr i t el n ( ' x = ' , x, ' est e t er men
FI BO' )
el se
wr i t el n ( ' x = ' , x, ' NU est e
t er men FI BO' )
end; {sf ar si t bucl a
exterioar}
Probleme rezolvate de programare Subiecte propuse la ATESTAT
12
r eadl n
end.
ATESTAT - 2003 - 5 - Se citesc pe rnd n numere naturale.
Afiai perechile de numere citite succesiv, care sunt termeni ai
irului lui Fibonacci.
Rezolvare:
Definim funcia VERIFICA, pentru a testa dac un numr
este termen FIBONACCI.
Numerele pe care le introducem se vor reine ntr-un vector
x.
Pentru introducerea vectorului, definim procedura
CITESTEVECTOR.
Program ATESTAT_2003_5_Fibonacci ;
CONST
nmax = 100;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
VAR
x, FI BO : vect or ;
n, i , j : i nt eger ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
13
function VERIFICA ( z : i nt eger ) : BOOLEAN;
var
OK : BOOLEAN;
begi n
OK : = FALSE;
FI BO [ 1] : = 1;
FI BO [ 2] : = 1;
i f ( z = 1) t hen
OK : = TRUE;
j := 3;
whi l e z > FI BO [ j ] do
begi n
FI BO [ j ] : = FI BO [ j - 1] + FI BO
[ j - 2] ;
j : = j + 1
end;
i f z = FI BO [ j ] t hen
OK : = TRUE;
VERI FI CA : = OK;
end; { sf ar si t f unct i e VERI FI CA }
procedure CITESTEVECTOR ( VAR v : vect or ; n :
i nt eger ) ;
begi n
f or i : = 1 t o n do
begi n
wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ;
r eadl n ( v [ i ] ) ;
end;
end;
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i nr . de numer e nat ur al e, n = ' ) ;
r eadl n ( n ) ;
CITESTEVECTOR ( x, n) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
14
f or i : = 1 t o n- 1 do
begi n
i f ( VERI FI CA ( x[ i ] ) = TRUE ) AND (
VERI FI CA ( x[ i +1] ) = TRUE ) t hen
wr i t el n ( x [ i ] , ' si ' , x [ i + 1 ]
, ' sunt t er meni FI BO' )
el se
wr i t el n ( x [ i ] , ' si ' , x [ i + 1 ]
, ' NU sunt t er meni FI BO' ) ;
end;
r eadl n
end.
ATESTAT - 2003 - 6 - S se genereze toate numerele de 5
cifre care au doar cifre pare i sunt divizibile cu 13.
Rezolvare:
Notm cu a, b, c, d, e cifrele numrului x.
Verificarea se va face pentru toate numerele x cuprinse ntre
20000 i 88888.
Se definete o funcie CIFREPARE, care verific dac toate
cifrele numrului x sunt pare.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
15
Program ATESTAT_2003_6 ;
VAR
x, y, z, t , u, v, a, b, c, d, e : l ongi nt ;
function CIFREPARE( z : i nt eger ) : BOOLEAN;
begi n
e : = x MOD 10;
y : = x DI V 10;
d : = y MOD 10;
z : = y DI V 10;
c : = z MOD 10;
t : = z DI V 10;
b : = t MOD 10;
v : = t DI V 10;
a : = v MOD 10;
i f ( a MOD 2 = 0) AND ( b MOD 2 = 0) AND ( c
MOD 2 = 0)
AND ( d MOD 2 = 0) AND ( e MOD 2 = 0)
t hen
CI FREPARE : = TRUE
ELSE
CI FREPARE : = FALSE;
end; { sf ar si t f unct i e CI FREPARE }
Begin { PROGRAM PRINCIPAL }
f or x : = 20000 t o 88888 do
begi n
i f ( CI FREPARE ( x) = TRUE ) AND ( x MOD 13 =
0 ) t hen
begi n
wr i t el n ( ' x = ' , x, ' ar e t oat e ci f r el e
par e si se di vi de l a 13' ) ;
wr i t el n ( ' Apasat i ENTER' ) ;
r eadl n
end;
end;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
16
ATESTAT - 2003 - 7 - S se genereze toate numerele de 6
cifre, care au cifrele ordonate descresctor, prima i ultima
cifr fiind impare.
Rezolvare:
Notm cu a, b, c, d, e, f cifrele numrului x.
Definim funcia VERIFICA (x), care determin cifrele lui x
si apoi face verificrile impuse de problem.
Numerele testate sunt cuprinse ntre 987653 i 654321.
Program ATESTAT_2003_7 ;
VAR
x, y, z, t , u, v, w, a, b, c, d, e, f :
l ongi nt ;
function VERIFICA ( z : l ongi nt ) : BOOLEAN;
begi n
f : = x MOD 10; {det er mi nar ea ci f r el or l ui
x}
y : = x DI V 10;
e : = y MOD 10;
z : = y DI V 10;
d : = z MOD 10;
t : = z DI V 10;
c : = t MOD 10;
v : = t DI V 10;
b : = v MOD 10;
w : = v DI V 10;
a : = w MOD 10;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
17
i f ( a > b) AND ( b >c) AND ( c >d)
AND ( d >e) AND ( e >f ) t hen
begi n
i f ( a MOD 2 <> 0 ) AND ( f MOD
2 <> 0) t hen
VERI FI CA : = TRUE
el se
VERI FI CA : = FALSE
end
el se
VERI FI CA : = FALSE;
end; { sf ar si t f unct i e VERI FI CA }
Begin { PROGRAM PRINCIPAL }
f or x : = 987653 downt o 654321 do
begi n
i f VERI FI CA ( x) = TRUE t hen
begi n
wr i t el n ( ' x = ' , x ) ;
wr i t el n ( ' Apasat i ENTER' ) ;
r eadl n
end;
end;
r eadl n
end.
ATESTAT - 2003 - 8 - S se determine toate cuvintele de 5
litere ce conin mcar dou vocale i au a 2-a liter m.
Rezolvare:
Generm cuvintele folosind un ir de caractere cuvant de
lungime =5.
Pe poziia 2 din cuvant va fi ntotdeauna litera m, deci
cuvant [2] := 'm'.
Pe celelalte 4 poziii (1, 3, 4, 5) din cuvant vom plasa
consoane i vocale. Pentru aceasta, folosim 4 bucle FOR
Probleme rezolvate de programare Subiecte propuse la ATESTAT
18
n care contorii de tip CHAR vor fi chiar elementele irului
cuvant de pe poziiile 1, 3, 4, 5 (cuvant [1], cuvant [3],
cuvant [4], cuvant [5]), care vor lua valori de tip CHAR de
la a la z.
Pentru fiecare poziie din irul cuvant testm dac pe
poziia respectiv se afl o vocal i dac DA, numrm
acea vocal, folosind contorul nrvocale.
Dup generarea unei combinaii de vocale i consoane care
compun un cuvnt (la sfritul buclei FOR de la interior),
testm dac nrvocale >= 2 i dac DA, numrm cuvntul
care satisface condiiile problemei (majorm contorul i) i
afim cuvntul.
La nceputul buclei FOR situate cel mai interior, trebuie
s iniializm, de fiecare dat, contorul care numr
vocalele, scriind nrvocale := 0;
Program ATESTAT_2003_8 ;
uses cr t ;
var
cuvant : st r i ng;
i , nr vocal e : i nt eger ;
Begin { PROGRAM PRINCIPAL }
i := 0; {i = cont or car e numr cuvintele
pe car e l e vomgener a}
cuvant [2] := 'm';
Probleme rezolvate de programare Subiecte propuse la ATESTAT
19
f or cuvant [ 1] : = ' a' t o ' z' do
begi n
f or cuvant [ 3] : = ' a' t o ' z' do
begi n
f or cuvant [ 4] : = ' a' t o ' z' do
begi n
f or cuvant [ 5] : = ' a' t o ' z' do
begi n
nrvocale := 0; {contor ce
numr vocalele di n cuvant}
i f cuvant [ 1] I N
[ ' a' , ' e' , ' o' , ' i ' , ' u' ] t hen
nr vocal e : = nr vocal e +
1;
i f cuvant [ 3] I N
[ ' a' , ' e' , ' o' , ' i ' , ' u' ] t hen
nr vocal e : = nr vocal e +
1;
i f cuvant [ 4] I N
[ ' a' , ' e' , ' o' , ' i ' , ' u' ] t hen
nr vocal e : = nr vocal e +
1;
i f cuvant [ 5] I N
[ ' a' , ' e' , ' o' , ' i ' , ' u' ] t hen
nr vocal e : = nr vocal e +
1;
i f nr vocal e >= 2 t hen
begi n
i := i + 1;
wr i t el n ( ' i = ' ,
i ) ;
wr i t el n
( ' cuvant ul = ' , cuvant [ 1] , cuvant [ 2] ,
cuvant [ 3] , cuvant [ 4] , cuvant [ 5] ) ;
end;
r eadl n
end
end;
end;
end;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
20
ATESTAT - 2003 - 9 - S se afieze toate matricile ptratice n
x n care conin pe fiecare linie i coloan un singur 1, n rest 0.
Rezolvare:
Aceast problem este asemntoare cu problema
celor n regine, pe care o vom adapta la cerinele de mai sus.
Asociem unei regine o cifr de 1. Problema reginelor cere s se
plaseze n regine pe o tabl de ah de dimensiune n x n, astfel
nct oricare dou regine s nu se atace. Pentru ca dou regine s
nu se atace, ele trebuie s nu fie situate pe aceeai linie, pe
aceeai coloan sau pe aceeai diagonal. La noi, rolul reginelor
va fi jucat de elementele egale cu 1 din matricea ptratic n x n. n
cazul problemei noastre, vom renuna la cerina ca elementele
matricii egale cu 1 s nu fie plasate pe aceeai diagonal. Pe
fiecare linie trebuie s fie plasat cte o regin. Deci, pentru ca
poziia reginelor s fie complet determinat, este suficient s
reinem, pentru fiecare regin, coloana n care este plasat, ntr-un
vector soluie f, de dimensiune n, unde f [i] reprezint coloana n
care este plasat regina de pe linia i. Generarea matricilor n
condiiile problemei se face apelnd la un algoritm
backtracking.
Observaii:
Notm cu x, respectiv i o linie oarecare i cu f [x],
respectiv f [i], coloana pe care se gsete regina de pe linia x,
respectiv linia i.
Condiiile interne:
a). f [x] =1, 2, ..., n, pentru oricare x =1, 2, ..., n
b). Dou regine nu pot fi plasate pe aceeai coloan se va exprima
analitic astfel:
f [x] f [y] pentru orice x y, cu x, y = 1, 2,...,n.
Definim o procedur AFIARE astfel:
Probleme rezolvate de programare Subiecte propuse la ATESTAT
21
n momentul apelrii procedurii, este evident c s-a gsit o
soluie pe care o numrm scriind:
Nrsol := Nrsol + 1
i apoi afim Nrsol.
Vom parcurge toate coloanele de la 1 la n. Pentru aceasta
avem nevoie de un contor poziional col care va lua valori de la 1
la n.
n procedur, col este o coloan curent, iar f [lin] este
tot o coloan, i anume coloana pe care se gsete regina de pe
linia lin.
Procedura va tipri " * " dac pe coloana curent col exist
o regin, adic atunci cnd col = f [lin], i va tipri "o" dac
aceast condiie nu este satisfcut.
Program ATESTAT_2003_9 ;
uses cr t ;
const
nrmaxregine = 8; {8 sau alt valoare}
t ype
vect or sol ut i e = ar r ay [ 0. . nr maxr egi ne] of
0. . nr maxr egi ne;
var
f : vect or sol ut i e;
n, x, i : 0 . . nr maxr egi ne;
ok : bool ean;
nr sol : wor d;
procedure AFISARE;
var
i , j : 0 . . nr maxr egi ne;
begi n
nr sol : = nr sol + 1;
wr i t el n;
wr i t el n ( ' Sol ut i a nr . ' , nr sol ) ;
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
begi n
i f j = f [ i ] t hen
Probleme rezolvate de programare Subiecte propuse la ATESTAT
22
wr i t e ( ' 1 ' )
el se
wr i t e ( ' o ' )
end;
wr i t el n;
end;
wr i t el n;
r eadl n
end; { sf ar si t pr ocedur a }
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e ( ' I nt r oducet i numar ul de pat r at el e n =
' ) ;
r eadl n ( n) ;
nr sol : =0;
x : = 1; { vi r f ul st i vei }
f [ x] : = 0;
whi l e x > 0 do { ci t t i mp st i va nu est e vi da
}
begi n
whi l e f [ x] < n do { ci t t i mp exi st a
val or i di sponi bi l e }
begi n
f [ x] : = f [ x] + 1;
ok : = t r ue;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
23
f or i : = 1 t o x - 1 do
begi n
i f ( f [ i ] = f [ x] ) t hen
begi n
ok : = f al se;
end
end;
i f ok = t r ue t hen { val oar ea est e
val i da }
begi n
i f x = n t hen { st i va est e
pl i na }
AFISARE
el se
begi n
x := x + 1;
{PAS INAINTE}
f [ x] : = 0
end;
end;
end; { sf ar si t WHI LE i nt er i or }
x := x 1
{PAS INAPOI}
end; { sf ar si t WHI LE ext er i or }
r eadl n
end.
ATESTAT - 2003 - 10 - S se genereze toate permutrile
mulimii {1, 2,... n} cu condiia ca orice dou numere alturate
ale unei permutrii s fie prime ntre ele.
Rezolvare:
Definim o funcie CMMDC pentru a calcula CMMDC al
dou numere.
Funcia CMMDC va fi apelat n procedura PERMUT,
pentru a se testa dac dou numere alturate ale unei
permutri sunt prime ntre ele. Cu excepia acestei verificri
Probleme rezolvate de programare Subiecte propuse la ATESTAT
24
impuse de enunul problemei de fa, procedura PERMUT
are acelai coninut ca i cel de la generarea permutrilor de
ordinul n.
Program ATESTAT_2003_10_PERMUTARI ;
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 ;
OK : bool ean;
function CMMDC ( A, B : i nt eger ) : i nt eger ;
var
aux, R : i nt eger ;
begi n
i f A < B t hen
begi n
aux : = A;
A : = B;
B : = aux
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
25
R : = A MOD B;
whi l e R <> 0 do
begi n
A : = B;
B : = R;
R : = A MOD B
end;
CMMDC : = B
end; { sf ar si t f unct i e CMMDC }
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
begi n
wr i t e ( f [ i ] : 3 )
end;
wr i t el n
end;
procedure PERMUTA ( m: i nt eger ) ;
LABEL
Probleme rezolvate de programare Subiecte propuse la ATESTAT
26
20;
var
k : i nt eger ;
CONTI N : bool ean;
Begi n {nceput procedur PERMUTA}
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 , 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
OK : = TRUE;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
27
f or i : = 1 t o n - 1 do
begi n
i f CMMDC ( f[i], f[i-
1] ) <> 1 t hen
OK : = FALSE
end;
i f OK = TRUE t hen
SCRIE;
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; {sfrit WHILE exterior}
end; {sfrit procedur PERMUTA}
Begin { PROGRAM PRINCIPAL }
cl r scr ;
sol : = 0;
wr i t e( ' Dat i n = ' ) ;
r eadl n ( 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.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
28
ATESTAT - 2003 - 11 - S se genereze toate variantele de
punctaje ce aparin {1, 2,... 10} obinute la n examene, astfel
nct punctajul obinut s fie minim.
Rezolvare:
Generarea combinaiilor de note se face dup algoritmul
BACKTRACKING.
Folosim un vector max n care memorm nota maxim
obinut la fiecare din cele n examene. Evident, vectorul max
va avea n elemente.
n algoritmul de generare a produsului cartezian din lucrarea
amintit, am notat cu f [x] o valoare numeric dintr-o poziie
x. Adaptm aceste notaii la problema noastr: n loc de x
notm cu poz poziia n care se gsete o not n combinaia
de note care va fi generat i cu nota [poz], nota de pe
poziia poz. Poziia poz va lua valori de la 1 la n (n =total
examene). Evident, nota va fi un vector cu max [i]
elemente, unde i este numrul de ordine al unui examen.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
29
Program ATESTAT_2003_11_Produs_cartezian_EXAMENE;
uses CRT;
t ype
vect or = ar r ay [ 1. . 20] of i nt eger ; {20 = nr .
de examene}
var
i , poz, n : i nt eger ;
max, not a : vect or ;
S, mi n : i nt eger ;
procedure SCRIE;
begi n
wr i t e ( ' { ' ) ;
f or i : = 1 t o n - 1 do
begi n
wr i t e ( not a[ i ] , ' , ' ) ;
end;
wr i t e ( not a[ n] , ' ' ) ;
wr i t e ( ' } ' ) ;
wr i t el n;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t e ( ' I nt r oducet i numar ul de EXAMENE, n = ' ) ;
r eadl n ( n) ;
wr i t el n;
wr i t el n ( Pent r u f i ecar e examen, pr eci zat i car e
est e not a MAXI MA ) ;
wr i t el n ( ' Scr i et i 10 pt . not e de l a 1 l a 10 :
' ) ;
wr i t el n;
f or i : = 1 t o n do
begi n
wr i t e ( ' Pent r u examenul ' , i , ' Car e
est e not a MAXI MA ? ' ) ;
r eadl n ( max [ i ] ) ;
end;
wr i t el n;
Wr i t el n ( ' Punct aj ul mi ni m= suma not el or l a
f i ecar e examen' ) ;
wr i t e ( ' Pr eci zat i punct aj ul MI NI M pe car e vr et i
sa- l obt i net i , Mi n = ' ) ;
r eadl n ( mi n) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
30
poz : = 1; {nceput algoritm
BACKTRACKING}
not a [ poz] : = 0;
whi l e poz > 0 do
begi n
i f nota [poz] < max [poz] t hen
begi n
not a [ poz] : = not a [ poz] + 1;
i f poz = n t hen
begi n
S : = 0;
f or i : = 1 t o n do
S := S + nota [i] ;
i f S = min t hen
SCRIE;
end
el se
begi n
poz := poz + 1; {PAS
NAI NTE}
not a [ poz] : = 0
end
end
el se
poz := poz 1 {PAS
NAPOI }
end;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
31
ATESTAT - 2003 - 12 - Afiai numere prime mai mici dect
un numr n citit de la tastatur, care rmn prime i dup ce
au fost inversate.
Rezolvare:
Definim o funcie PRIM, cu rezultat de tip BOOLEAN, care
testeaz dac un numr este prim.
Definim o funcie INVERS care inverseaz elementele unui
ir.
n programul principal, nainte de a inversa un numr x, l
transformm mai nti ntr-un ir cu funcia STR.
Dup inversare, transformm irul obinut ntr-un numr cu
funcia VAL.
Testm dac numrul obinut prin inversare este i el prim.
Program ATESTAT_2003_12 ;
uses cr t ;
var
i nver sul , si r : st r i ng;
a, b, i , x, n, i nvx : i nt eger ;
function PRIM ( x : i nt eger ) : bool ean;
var
nr di v, di vi z : i nt eger ;
begi n
nr di v : = 0;
di vi z : = 1;
whi l e di vi z <= x do
begi n
i f x MOD di vi z = 0 t hen
nr di v : = nr di v + 1;
di vi z : = di vi z + 1
end;
i f nrdiv = 2 t hen
PRI M : = TRUE
el se
PRI M : = FALSE;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
32
function INVERS ( s : st r i ng) : st r i ng;
var
i nv : st r i ng;
begi n
i nv : = ' ' ;
f or i : = LENGTH ( s) DOWNTO 1 do
begi n
i nv : = i nv + s [ i ]
end;
I NVERS : = i nv ;
end;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e( ' Dat i n = ' ) ;
r eadl n ( n) ;
wr i t el n;
f or x : = 1 t o n do
begi n
STR ( x, si r ) ;
i nver sul : = INVERS ( si r ) ;
VAL ( i nver sul , a, b) ;
i nvx : = a;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
33
i f PRI M ( x) = TRUE t hen
begi n
i f PRIM ( i nvx) = TRUE t hen
begi n
wr i t el n ( ' x = ' , x, '
= pr i m' ) ;
wr i t el n ( ' i nvx = ' ,
i nvx, ' = pr i m' ) ;
end;
end;
end;
r eadl n
end.
ATESTAT - 2003 - 13 - Se citete un vector cu n componente
numere ntregi. S se determine CMMDC al valorilor din
vector.
Rezolvare:
Definim funcia CMMDC cu care calculm CMMDC al
dou numere.
Calculm CMMDC al primelor dou numere din vector (x1
si x2) i l notm cu C[1].
ncepnd de la i = 2 pn la n, facem atribuirile:
x [i] := C [i-1];
C [i] := CMMDC ( x [i], x [i+1] )
Altfel spus, calculm CMMDC dintre CMMDC-ul anterior i
urmtorul element al vectorului.
Program ATESTAT_2003_13 ;
uses cr t ;
const
nmax = 100;
t ype
vect or = ar r ay [ 1. . nmax] of i nt eger ;
var
x, C : vect or ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
34
sol , n, i : i nt eger ;
function CMMDC ( A, B : i nt eger ) : i nt eger ;
var
aux, R : i nt eger ;
begi n
i f A < B t hen
begi n
aux : = A;
A : = B;
B : = aux
end;
R : = A MOD B;
whi l e R <> 0 do
begi n
A : = B;
B : = R;
R : = A MOD B
end;
CMMDC : = B
end; { sf ar si t f unct i e CMMDC }
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e( ' Dat i n = ' ) ;
r eadl n ( n) ;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
35
wr i t el n ( ' Dat i vect or ul ' ) ;
wr i t el n;
f or i : = 1 t o n do
begi n
wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ;
r eadl n ( x [ i ] ) ;
end;
C [1] := CMMDC ( x[1], x [2] );
f or i : = 2 to n-1 do
begi n
x [i] := C [i-1];
C [i] := CMMDC ( x [i], x [i+1] )
end;
wr i t el n ( ' CMMDC = ' , C [n-1] ) ;
r eadl n
end.
ATESTAT - 2003 - 14 - Se citesc 2 numere naturale A < B. S
se tipreasc toate numerele PALINDROAME dintre A i B.
Un numr este PALINDROM dac, citit direct i invers,
rezultatul este acelai (dac este egal cu inversul su). Exemplu:
323 este PALINDROM.
Rezolvare:
Definim o funcie NRCIFRE pentru a numra cifrele unui
numr natural.
Definim o funcie PALINDROM n care:
- determinm numrul de cifre pentru un numr
natural;
- extragem din numrul natural cifrele i le depunem
ntr-un vector y;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
36
- verificm dac vectorul y este simetric
(PALINDROM).
n programul principal, apelm funcia PALINDROM
pentru toate numerele naturale dintre A i B i le afim
doar pe acelea care sunt palindroame.
Program ATESTAT_2003_14 ;
uses cr t ;
VAR
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 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;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
37
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;
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;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e ( ' Dat i A = ' ) ; r eadl n ( A) ;
wr i t el n;
wr i t e ( ' Dat i B = ' ) ; r eadl n ( B) ;
wr i t el n;
cl r scr ;
f or x : = A t o B do
begi n
i f PALINDROM ( x) = TRUE t hen
wr i t el n ( ' x = ' , x, ' est e
PALI NDROM' ) ;
{ el se
wr i t el n ( ' x = ' , x, ' NU est e
pal i ndr om' ) ; }
{r eadl n; }
end;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
38
ATESTAT - 2003 - 15 - Se citete un vector cu n componente
ntregi. Care este cea mai mare sum care se poate forma cu ele?
Exemplu: n =4, iar numerele citite sunt 1, 3, 2, -7. Se va
tipri 5.
Rezolvare:
Numerele ntregi introduse vor fi reinute ntr-un vector x.
Numerele ntregi introduse pot fi pozitive, negative sau nule.
Evident, suma cea mai mare ce se poate obine din ntregul
ir de numere va rezulta prin nsumarea doar a numerelor
pozitive.
Notm cu Spoz suma numerelor strict pozitive. ntr-o bucl
FOR, vom aduga la aceast sum cte un termen, doar dac
acest termen este strict >0.
Program ATESTAT_2003_15 ;
uses cr t ;
VAR
Spoz, n, i : i nt eger ;
x : ar r ay [ 1. . 100] of i nt eger ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
39
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e ( ' Dat i n = ' ) ;
r eadl n ( n) ;
wr i t el n;
wr i t el n ( ' Dat i vect or ul ' ) ;
f or i : = 1 t o n do
begi n
wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ;
r eadl n ( x [ i ] ) ;
end;
wr i t el n;
Spoz : = 0;
f or i : = 1 t o n do
begi n
i f x [i] > 0 t hen
Spoz := Spoz + x [i];
end;
wr i t el n ( ' Spoz = ' , Spoz) ;
r eadl n
end.
ATESTAT - 2003 - 16 Interschimbai coloanele unei matrici
cu m linii i n coloane astfel nct, n linia k, elementele s fie
ordonate cresctor.
Rezolvare:
Ordonm linia k. n cursul procesului de ordonare, o parte
din elementele liniei k se interschimb ntre ele.
n paralel cu ordonarea, interschimbm i coloanele
corespunztoare elementelor de pe linia k supuse
interschimbrilor.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
40
Program ATESTAT_2003_16 ;
uses cr t ;
VAR
OK, m, n, i , j , k : i nt eger ;
A : ar r ay [ 1. . 100, 1. . 100] of i nt eger ;
aux : i nt eger ;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e( ' Dat i m= ' ) ;
r eadl n ( m) ;
wr i t el n;
wr i t e ( ' Dat i n = ' ) ;
r eadl n ( n) ;
wr i t el n;
wr i t e ( ' Dat i l i ni a k = ' ) ;
r eadl n ( k) ;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
41
wr i t el n ( ' Dat i mat r i cea' ) ;
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 ] ) ;
end;
end;
REPEAT {Ordonm linia k, pr i n
met oda BUBBLE- SORT}
OK : = 0;
j : = 1;
REPEAT
i f A [ k, j ] > A [ k, j +1] t hen
begi n
f or i : = 1 t o mdo
begi n
aux : = A [ i , j ] ;
A [ i , j ] : = A
[ i , j +1] ;
A [ i , j +1] : =
aux;
OK : = 1;
end;
end;
j : = j + 1;
UNTI L ( j > n - 1) ;
UNTI L ( OK = 0) ;
wr i t el n;
wr i t el n ( ' Mat r i cea or donat a est e' ) ;
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 , '
] = ' , A [ i , j ] , ' ' ) ;
end;
wr i t el n;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
42
r eadl n
end.
ATESTAT - 2003 - 17 - Se citete un text i o succesiune de
caractere. De cte ori ntlnim aceast succesiune n cadrul
textului ?
Rezolvare:
Apelm funcia POS (subir, ir) i determinm poziia
unde apare subir n ir.
Dac poziia determinat este <> 0, atunci majorm contorul
nrapariii, care numr apariiile subirului n ir.
De asemenea, dac poziia determinat este <> 0, tergem
din irul dat caracterele, de la poziia 1, pe o lungime =
poziia + LENGTH (subir) 1, unde poziia este valoarea
determinat cu funcia POS.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
43
Program ATESTAT_2003_17 ;
uses cr t ;
var
si r , subsi r : st r i ng;
pozi t i a, nr apar i t i i : i nt eger ;
OK : bool ean;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e( ' Dat i si r ul = ' ) ;
r eadl n ( si r ) ;
wr i t el n;
wr i t el n ( ' Dat i subsi r ul = ' ) ;
r eadl n ( subsi r ) ;
wr i t el n;
nraparitii := 0;
OK := TRUE; { pr esupun ca subsi r ul exi st a }
whi l e ( si r <> ' ' ) AND ( OK = TRUE ) do
begi n
pozi t i a : = POS ( subsi r , si r ) ;
i f pozi t i a <> 0 t hen
begi n
nr apar i t i i : = nr apar i t i i +
1 ;
DELETE ( si r , 1, pozi t i a +
LENGTH ( subsi r ) - 1 )
end
el se
OK : = FALSE
end;
wr i t el n ( ' nr apar i t i i = ' , nr apar i t i i ) ;
r eadl n
end.
ATESTAT - 2003 - 18 - Problema celor 8 regine. S se afieze
toate posibilitile de a se aeza, pe o tabl de ah, 8 regine fr
s se atace ntre ele.
Rezolvare:
Probleme rezolvate de programare Subiecte propuse la ATESTAT
44
Problema reginelor cere s se plaseze n regine pe o tabl de ah
de dimensiune n x n astfel nct oricare dou regine s nu se
atace. Pentru ca dou regine s nu se atace, ele trebuie s nu fie
situate pe aceeai linie, pe aceeai coloan sau pe aceeai
diagonal. Pe fiecare linie trebuie s fie plasat cte o regin.
Deci, pentru ca poziia reginelor s fie complet determinat, este
suficient s reinem, pentru fiecare regin, coloana n care este
plasat, ntr-un vector soluie f, de dimensiune n, unde f [i]
reprezint coloana n care este plasat regina de pe linia i.
Generarea matricilor care afieaz poziiile reginelor, n
condiiile problemei, se va face apelnd la un algoritm
backtracking.
Observaii:
Notm cu x, respectiv i o linie oarecare i cu f [x],
respectiv f [i] coloana pe care se gsete regina de pe linia x,
respectiv linia i.
Condiiile interne:
a). f [x] =1, 2, ..., n, pentru oricare x =1, 2, ..., n
b). Condiia dou regine nu pot fi plasate pe aceeai coloan
se va exprima analitic astfel:
f [x] f [y] pentru orice x y, cu x, y = 1, 2,...,n.
c). Dou regine nu pot fi plasate pe aceeai diagonal. Dac regina
de pe linia i, coloana f [i] este pe aceeai diagonal cu regina de pe
linia x, coloana f [x], atunci triunghiul dreptunghic care se
formeaz are unghiurile de 45 grade, este deci isoscel (catetele sale
vor fi egale), ceea ce se poate scrie astfel:
| i - x | = | f [ i ] - f [ x ] |
Cum acest lucru nu este permis de problem, condiia dou
regine nu pot fi plasate pe aceeai diagonal se va exprima
astfel:
| f [i] - f [x] | <> | i - x | pentru orice i, x =1, 2, ..., n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
45
Definim o procedur AFIARE astfel nct:
n momentul apelrii procedurii, evident s-a gsit o soluie pe
care o numrm scriind:
Nrsol := Nrsol +1
i apoi afim Nrsol.
Vom parcurge toate coloanele de la 1 la n. Pentru aceasta avem
nevoie de un contor poziional col care va lua valori de la 1 la
n.
n procedur, col este o coloan curent, iar f [lin] este tot o
coloan, i anume coloana pe care se gsete regina de pe linia
lin.
Procedura va tipri " * " dac pe coloana curent col exist o
regin, adic atunci cnd
col = f [lin], i va tipri "o" dac aceast condiie nu este
satisfcut.
Program ATESTAT_2003_18_REGINE ;
uses cr t ;
const
nr maxr egi ne = 8;
t ype
vect or sol ut i e = ar r ay [ 0. . nr maxr egi ne] of
0. . nr maxr egi ne;
var
f : vect or sol ut i e;
n, x, i : 0 . . nr maxr egi ne;
ok : bool ean;
nr sol : wor d;
procedure AFISARE;
var
i , j : 0 . . nr maxr egi ne;
begi n
nr sol : = nr sol + 1;
wr i t el n;
wr i t el n ( ' Sol ut i a nr . ' , nr sol ) ;
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
Probleme rezolvate de programare Subiecte propuse la ATESTAT
46
begi n
i f j = f [ i ] t hen
wr i t e ( ' * ' )
el se
wr i t e ( ' o ' )
end;
wr i t el n;
end;
wr i t el n;
r eadl n
end; { sf ar si t pr ocedur a }
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e ( ' I nt r oducet i numar ul de pat r at el e n =
' ) ;
r eadl n ( n) ;
nrsol: =0;
x : = 1; { vi r f ul st i vei }
f [ x] : = 0;
while x > 0 do { ct timp stiva nu este vid
nceput al gor i t m}
begi n
{ backtracking }
while f [x] < n do { ct timp exist
val or i di sponi bi l e }
begi n
f [ x] : = f [ x] + 1;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
47
ok : = t r ue;
f or i : = 1 t o x - 1 do
begi n
i f ( f [ i ] = f [ x] ) OR ( ABS
( i - x) = ABS ( f [ i ] - f [ x] ) ) t hen
begi n
ok : = f al se;
end
end;
i f ok = t r ue t hen { val oar ea est e
valid }
begi n
i f x = n t hen { st i va est e
plin }
AFI SARE
el se
begi n
x := x + 1;
{PAS NAINTE}
f [ x] : = 0
end;
end;
end; { sf ar si t WHI LE i nt er i or }
x := x 1
{PAS NAPOI}
end; { sf ar si t WHI LE ext er i or }
r eadl n
end.
ATESTAT - 2003 - 19 - Se dau dou numere naturale n i k. S
se genereze toate combinrile de n elemente luate cte k.
Rezolvare: Aplicm algoritmul BACKTRACKING pentru
generarea combinrilor.
Program ATESTAT_2003_19_COMBINARI_BACKTRACKING_1 ;
uses CRT;
CONST
Probleme rezolvate de programare Subiecte propuse la ATESTAT
48
Kmax = 20; { nr . max a l ui k }
Nmax = 50; { nr . max a l ui n }
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;
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 ;
REPEAT
wr i t e ( ' k = ' ) ;
r eadl n ( k) ;
UNTI L ( k >= 1 ) AND ( k <= Kmax) ;
REPEAT
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 ' )
UNTI L ( n >= k) AND ( n >= 1 ) AND ( n<= Nmax
) ;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
49
poz : = 1; {poz = vrful stivei }
f [ poz] : = 0 ;
whi l e poz > 0 do { ct t i mp st i va nu est e
vid }
begi n
whi l e f [poz] < n - k + poz do { a
doua condiie intern }
begi n
f [ poz] : = f [ poz] + 1;
if poz = k then { dac
stiva este plin }
begi n
f or i : = 1 t o
k do
begi n
wr i t e (
' f [ ' , i , ' ] = ' , f [ i ] , ' ' ) ;
end;
wr i t el n;
wr i t el n
end
el se
begi n
poz := poz +
1 ; { I NSERARE i n STI VA }
f [ poz] : = f
[ poz - 1]
end;
end; { sf ar si t WHI LE i nt er i or }
poz := poz - 1; { EXTRAGERE di n
STI VA = PAS I NAPOI }
end; { sf ar si t WHI LE ext er i or }
r eadl n
end.
ATESTAT - 2003 - 20 - S se genereze toate irurile de
lungime n formate numai din literele A i M, iruri care
s nu aib dou litere A alturate. Numrul n (0 <n <13)
Probleme rezolvate de programare Subiecte propuse la ATESTAT
50
se citete de la tastatur. Fiecare ir va fi scris pe cte un rnd al
ecranului fr spaiu ntre litere.
Rezolvare:
Problema const n generarea produsului cartezian al mulimilor
de caractere. Generarea combinaiilor de litere se face dup
algoritmul BACKTRACKING.
Algoritmul de generare a produsului cartezian va genera
valori numerice cuprinse ntre 1 i elementul maxim al unei
mulimi implicate n acest produs. Cum pe noi ne intereseaz
combinaiile de litere a i m, vom asocia unui numr din
cte o mulime o liter, astfel:
dac f [i] = 1, atunci sir [i] = a
dac f [i] = 2, atunci sir [i] = m.
Nu ne intereseaz dect aceste valori ale lui f [i].
Procedura SCRIE se va apela n mod opional, pentru a
observa modul de generare a produsului cartezian n varianta
sa numeric.
Procedura SCRIETEXT va afia doar combinaiile de litere
a i m.
Funcia boolean VECINI testeaz dac avem litera a pe
dou poziii vecine.
Funcia boolean EXIST verific dac n ir exist i cifra
1. n acest fel se vor elimina combinaiile care nu-l conin pe
1 (adic acele combinaii de litere care nu conin litera a i
care, deci, nu ne intereseaz).
Vectorul nrelem reine numrul de elemente al fiecrei
mulimi din produsul cartezian.
Poz = poziia unui element ntr-o mulime a produsului
cartezian.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
51
Program ATESTAT_2003_20_Produs_cartezian_AMA ;
uses CRT;
t ype
vect or = ar r ay [ 1. . 20] of i nt eger ;
var
i , poz, n : i nt eger ;
nr el em, f : vect or ;
si r : st r i ng;
procedure SCRIE; {procedura opional}
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;
procedure SCRIETEXT;
begi n
f or i : = 1 t o n do
begi n
i f f [ i ] = 1 t hen
si r [ i ] : = ' a' ;
i f f [ i ] = 2 t hen
si r [ i ] : = ' m' ;
wr i t e ( si r [ i ] , ' ' ) ;
end;
wr i t el n;
end;
function VECINI: bool ean;
var
OK : bool ean;
begi n
OK : = FALSE;
f or i : = 1 t o n - 1 do
begi n
i f ( f [ i ] = 1 ) AND ( f [ i + 1] =
1) t hen
OK : = TRUE
end;
VECI NI : = OK
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
52
function EXISTA : bool ean; { ver i f i ca daca i n si r
exi st a si ci f r a 1 }
var
OK : bool ean;
begi n
OK : = FALSE;
f or i : = 1 t o n do
begi n
i f f [ i ] = 1 t hen
OK : = TRUE
end;
EXI STA : = OK;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t e ( ' St abi l i t i numar ul de mul t i mi , n = ' ) ;
r eadl n ( n) ;
f or i : = 1 t o n do
begi n
wr i t e ( ' Cat e el ement e ar e mul t i mea
' , i , ' : ' ) ;
r eadl n ( nr el em[ i ] ) ;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
53
poz : = 1;
f [ poz] : = 0;
whi l e poz > 0 do
begi n
i f f [ poz] < nr el em[ poz] t hen
begi n
f [ poz] : = f [ poz] + 1;
i f poz = n t hen
begi n
i f ( NOT VECINI) AND
( EXISTA) t hen
begi n
{SCRI E; } {apel
opt i onal al acest ei
pr ocedur i }
SCRIETEXT;
End;
end
el se
begi n
poz : = poz + 1; {PAS
INAINTE}
f [ poz] : = 0
end
end
el se
poz : = poz 1 {PAS INAPOI}
end;
r eadl n
end.
ATESTAT - 2003 - 21 - Generarea permutrilor de n
elemente, n >0.
Rezolvare:
Aplicnd algoritmul BACKTRACKING, vom genera
permutrile de ordinul n n variant iterativ.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
54
Program ATESTAT_2003_21_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 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;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
55
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 ] : 3 )
end;
wr i t el n
end;
procedure PERMUTA ( m: i nt eger ) ;
LABEL
20;
var
poz : i nt eger ;
CONTI N : bool ean;
begi n
poz : = 1;
f [ poz] : = 0;
while poz > 0 do
begi n
CONTI N : = FALSE;
while f [ poz] < mdo
begi n
f [ poz] : = f [ poz] + 1;
VERIFICA ( poz, f , CONTI N) ;
i f CONTI N = TRUE t hen
GOTO 20
end; {sf ar si t WHI LE
i nt er i or }
20: i f ( CONTI N = TRUE ) AND ( poz = n) t hen
SCRIE;
i f ( CONTI N = TRUE ) and ( poz < n) t hen
begi n
poz : = poz + 1; {PAS INAINTE}
f [ poz] : = 0
end;
i f CONTI N = FALSE t hen
poz : = poz 1 {PAS INAPOI}
Probleme rezolvate de programare Subiecte propuse la ATESTAT
56
end; {sf ar si t WHI LE ext er i or }
end; {sf ar si t pr ocedur a PERMUTA}
Begin { PROGRAM PRINCIPAL }
cl r scr ;
sol : = 0;
wr i t e( ' Dat i n = ' ) ;
r eadl n ( 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.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
57
ATESTAT - 2003 - 22 - S se afieze termenii irului lui
Fibonacci, pentru un n dat.
Rezolvare:
Termenii irului vor fi reinui ntr-un tablou FIBO. Generarea
termenilor se va face n variant iterativ.
Program ATESTAT_2003_22 ;
CONST
nmax = 100;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
VAR
FI BO : vect or ;
n, i : i nt eger ;
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i numr aul de t er meni , n = ' ) ;
r eadl n ( n) ;
FI BO [ 1] : = 1;
FI BO [ 2] : = 1;
f or i : = 3 t o n do
begi n
FI BO [ i ] : = FI BO [ i - 1] + FI BO[ i -
2] ;
end;
f or i : = 1 t o n do
begi n
wr i t el n ( FI BO [ i ] , ' = ' , FI BO [
i ] )
end;
r eadl n
end.
ATESTAT - 2003 - 23 - Fie A un ir cu n elemente ntregi, n
> 0. S se ordoneze cresctor folosind metoda bulelor.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
58
Rezolvare:
Definim procedura ORDONEAZA, bazat pe algoritmul de
sortare BUBBLE-SORT.
Definim procedura TIPARESTE, care afieaz vectorul
sortat.
Program ATESTAT_2003_23_BUBBLE_SORT ;
uses CRT;
const
nmax = 30;
t ype
vect or = ar r ay [ 1. . nmax] of i nt eger ;
var
a : vect or ;
i , n : i nt eger ;
procedure ORDONEAZA ( var x: vect or ; m: i nt eger ) ;
var
k, j , aux: i nt eger ;
begi n
r epeat
k: = 0;
j : = 1;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
59
r epeat
i f x[ j ] < x [ j +1] t hen
begi n
aux : = x[ j ] ;
x[ j ] : = x[ j +1] ;
x[ j +1] : = aux;
k : = 1
end;
j : = j + 1
unt i l ( j > m- 1)
unt i l ( k = 0) ;
end;
procedure TIPARESTE ( x: vect or ; m: i nt eger ) ;
begi n
f or i : = 1 t o mdo
begi n
wr i t el n ( ' x [ i ] = ' , x [ i ] )
end
end;
Begin { PROGRAM PRINCIPAL }
clrscr;
wr i t e ( ' I nt r oducet i n = ' ) ;
r eadl n ( n) ;
wr i t el n;
f or i : = 1 t o n do
begi n
wr i t e ( ' a [ i ] = ' ) ;
r eadl n ( a [ i ] )
end;
wr i t el n;
r eadl n;
clrscr;
wr i t el n;
ORDONEAZA ( a, n) ;
TIPARESTE ( a, n) ;
wr i t el n;
r eadl n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
60
end.
ATESTAT - 2003 - 24 - Fie A i B doi vectori cu cte m,
respectiv n elemente numere ntregi (m > 0, n > 0), ordonai
cresctor. S se interclaseze, n vectorul C, vectorii A i B.
Rezolvare:
Program ATESTAT_2003_24_INTERCLASARE ;
uses CRT;
CONST
nmax = 50;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
vect or t ot = ar r ay [ 1. . 2*nmax] of i nt eger ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
61
var
m, n, i , j , k : i nt eger ;
A, B : vect or ;
C : vect or t ot ;
Begin { PROGRAM PRINCIPAL }
cl r scr ;
wr i t e ( ' Dat i numar ul de el ement e al e
vect or ul ui a, m= ' ) ;
r eadl n ( m) ;
wr i t e ( ' Dat i numar ul de el ement e al e
vect or ul ui b, n = ' ) ;
r eadl n ( n) ;
wr i t el n;
wr i t el n ( ' Dat i pr i mul vect or SORTAT : ' ) ;
wr i t el n;
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 al doi l ea vect or SORTAT' ) ;
wr i t el n;
f or j : = 1 t o n do
begi n
wr i t e ( ' B [ ' , j , ' ] = ' ) ;
r eadl n ( B [ j ] ) ;
end;
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;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
62
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;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
63
wr i t el n;
wr i t el n ( ' Vect or ul r ezul t at i n ur ma
i nt er cl asar i i est e: ' ) ;
wr i t el n;
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.
ATESTAT - 2003 - 25 - Fie X un vector ordonat cu n
elemente numere ntregi, n > 0 i elem o valoare ntreag,
citit de la tastatur. S se decid dac elem se gsete n
vectorul X, folosind metoda Divide et Impera.
Rezolvare:
Program ATESTAT_2003_25_Cautare_Binara_Recursiva ;
uses CRT;
t ype
vect or = ar r ay [ 1. . 20] of i nt eger ;
VAR
x : vect or ;
el em, n, i : i nt eger ;
GASI T : bool ean; {GASI T = TRUE daca el ement ul a
f ost gasi t si FALSE daca nu}
procedure CAUTA ( i ncep, sf : i nt eger ; VAR GASI T :
bool ean ) ;
var
m: i nt eger ;
begi n
I F i ncep <= sf t hen
begi n
m: = ( i ncep + sf ) DI V 2;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
64
i f el em= x [ m] t hen
GASI T : = t r ue
el se
i f el em< x [ m] t hen
CAUTA ( i ncep, m- 1, GASI T)
el se
CAUTA ( m+1, sf , GASI T)
end
ELSE
GASI T : = f al se
end; {sf ar si t pr ocedur a}
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t e ( ' n = ' ) ;
r eadl n ( n) ;
f or i : = 1 t o n do
begi n
wr i t e ( ' x [ ' , i , ' ] = ' ) ;
r eadl n ( x[ i ] ) ;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
65
wr i t el n;
wr i t e ( ' Dat i el ement ul caut at , el em= ' ) ;
r eadl n ( el em) ;
CAUTA ( 1, n, GASI T) ;
i f GASI T = t r ue t hen
wr i t el n ( el em, ' exi st a' )
el se
wr i t el n ( el em, ' nu exi st a' ) ;
r eadl n
end.
ATESTAT - 2003 - 26 - Fie n numere ntregi a1, a2, ... an, cu n
> 0. S se determine CMMDC al celor n numere, prin metoda
DEI.
Rezolvare:
Prin metoda DEI (Divide-Et-Impera) se determin CMMDC
pentru prima jumtate a vectorului, apoi pentru cea de-a doua
jumtate, dup care vom reuni rezultatele.
Program ATESTAT_2003_26_CMMDC_DEI ;
CONST
nmax = 100;
TYPE
vect or = ar r ay [ 1. . nmax] of i nt eger ;
VAR
x : vect or ;
C, n, i : i nt eger ;
function CMMDC ( A, B : i nt eger ) : i nt eger ;
var
aux, R : i nt eger ;
begi n
i f A < B t hen
begi n
aux : = A;
A : = B;
B : = aux
Probleme rezolvate de programare Subiecte propuse la ATESTAT
66
end;
R : = A MOD B;
whi l e R <> 0 do
begi n
A : = B;
B : = R;
R : = A MOD B
end;
CMMDC : = B
end; { sf ar si t f unct i e CMMDC }
function DIVCOM ( i ncep, sf : i nt eger ) : i nt eger ;
{ det er mi na CMMDC pr i n DEI }
VAR
mi j , C1, C2 : i nt eger ;
begi n
i f i ncep = sf t hen
DI VCOM : = x [ i ncep]
el se
begi n
i f sf - i ncep = 1 t hen
DI VCOM : = CMMDC ( x [ i ncep] , x
[ sf ] )
Probleme rezolvate de programare Subiecte propuse la ATESTAT
67
el se
begi n
mi j : = ( i ncep + sf ) DI V
2;
C1 : = DI VCOM ( i ncep,
mi j ) ;
C2 : = DI VCOM ( mi j + 1,
sf ) ;
DI VCOM : = CMMDC ( C1, C2)
end
end
end; { sf ar si t f unct i e DI VCOM }
Begin { PROGRAM PRINCIPAL }
wr i t e ( ' Dat i nr . de el ement e al e vect or ul ui , n =
' ) ;
r eadl n ( n) ;
f or i : = 1 t o n do
begi n
wr i t e ( ' Dat i x [ ' , i , ' ] = ' ) ;
r eadl n ( x [ i ] )
end;
C : = DI VCOM ( 1, n) ;
wr i t el n ( ' C = ' , C) ;
r eadl n
end.
ATESTAT - 2003 - 27 - Fie A un ir cu n numere ntregi, n >
0. S se ordoneze cresctor folosind metoda sortrii prin
numrare.
Rezolvare:
Descrierea metodei:
Iat o situaie concret: la ora de educaie fizic elevii trebuie s
se aeze n ordinea cresctoare a nlimii. Fiecare elev va
numra ci colegi sunt mai mici ca nlime dect el. Astfel,
dac un elev E va ti c are 15 colegi mai mici dect el, atunci
elevul E se va aeza pe poziia 16.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
68
Metoda de sortare prin numrare const n urmtoarele:
Fie A un vector cu n elemente. Se va crea un vector NR
astfel nct :
NR [i] ="numrul de valori din A mai mici dect A[i]".
Folosim un vector auxiliar C, n care vom prelua
elementele sortate ale vectorului A. Fiecare element A[i] va fi
trecut n C n poziia NR [i] + 1. Pentru exemplul de mai sus,
pentru elevul E, NR [i] = 15, iar poziia pe care trebuie s-o
ocupe E n vectorul sortat va fi 16, deci NR [i] + 1.
Program ATESTAT_2003_27_SORTARE_PRIN_NUMARARE ;
uses CRT;
const
nmax = 100;
t ype
vect or = ar r ay [ 1. . 10] of i nt eger ;
var
A: vect or ;
i , n: i nt eger ;
procedure CITIRE ( var A: vect or ; n: i nt eger ) ;
var
i : i nt eger ;
begi n
f or i : =1 t o n do
begi n
wr i t e ( ' Dat i A [ ' , i , ' ] =
' ) ;
r eadl n ( A [ i ] ) ;
end;
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
69
pr ocedur e AFISARE ( v: vect or ; m: i nt eger ) ;
begi n
f or i : = 1 t o mdo
begi n
wr i t el n ( ' A [ ' , i , ' ] = ' , v
[ i ] )
end
end;
procedure ORDONARE ( var A: vect or ; n: i nt eger ) ;
var
NR, C: vect or ;
j , i : i nt eger ;
begi n
{Pentru fiecare element A[i] se numr n A
ct e el ement e sunt mai mi ci dect A [ i ] ;
numrul obinut n urma numrrii se trece n
NR [ i ] }
f or i : = 1 t o n do
NR [i] := 0;
f or i : = 2 to n do
begi n
f or j : = 1 to i - 1 do
begi n
i f A [ i ] > A [ j ] t hen
NR [i] := NR [i] + 1
ELSE
NR [j] := NR [j] + 1;
End; { sfrit for interior}
end; {sfrit for exterior}
{Vom cr ea vect or ul t empor ar C, n care se rein
elementele n ordine cresctoare, i apoi l vom
copi a n A. Dac A [i] ar e NR[i] el ement e mai mi ci
dect el , at unci , n vect or ul or donat , A [i] va fi
n poziia NR [i] + 1}.
f or i : = 1 t o n do
C [ NR [i] + 1 ] := A [i];
{copi em n A el ement el e l ui C}
f or i : =1 t o n do
Probleme rezolvate de programare Subiecte propuse la ATESTAT
70
A [i] := C [i];
end; {sf ar si t pr ocedur a ORDONARE}
Begin { PROGRAM PRINCIPAL }
clrscr;
wr i t e ( ' Dat i numar ul de el ement e al e
vect or ul ui , n = ' ) ;
r eadl n ( n) ;
CITIRE (A, n);
ORDONARE (A, n);
AFISARE (A, n);
end.
ATESTAT - 2003 - 28 - S se citeasc din fiierul VEC.TXT,
vectorul V de ntregi i s se calculeze apoi media aritmetic
a elementelor pozitive.
Rezolvare:
Atenie ! Fiierul VEC.TXT trebuie s existe pe discul C: i s
conin valori. Dac nu exist, l vom crea, ca mai jos, dup
care l vom accesa, citind din el ntregi, n condiiile problemei.
Program ATESTAT_2003_28 ;
VAR
f : f i l e of i nt eger ;
Spoz, poz, x, v, n, i : i nt eger ;
Med : r eal ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
71
Begin { PROGRAM PRINCIPAL }
ASSI GN ( f , ' C: \ VEC. TXT' ) ;
r ewr i t e ( f ) ;
{ CREAREA lui VEC.TXT }
wr i t e ( ' Dat i numar ul de i nt r egi di n f i si er , n
= ' ) ;
r eadl n ( n) ;
wr i t el n ( ' I nt r oducet i el ement el e f i si er ul ui
( pozi t i ve si negat i ve) ' ) ;
f or i : = 1 t o n do
begi n
wr i t e ( ' Dat i un i nt r egul al ' , i , '
l ea x = ' ) ;
r eadl n ( x) ;
wr i t e ( f , x) ;
end;
RESET ( f ) ; {pr egat i r e f i si er pent r u ci t i r e}
Spoz : = 0; { i ni t i al i zar e suma pozi t i ve }
poz : = 0;
whi l e not EOF ( f ) do
begi n
READ ( f , v) ; { ci t esc o component a
di n f }
i f v > 0 t hen
begi n
poz : = poz + 1;
Spoz : = Spoz + v;
end;
end;
i f poz > 0 t hen
begi n
Med : = Spoz / poz;
wr i t el n ( ' Medi a pozi t i vel or = ' , Med) ;
end
el se
wr i t el n ( ' Nu exi st a numer e pozi t i ve' ) ;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
72
ATESTAT - 2003 - 29 - S se calculeze maximul elementelor
matricii A (m, n) i s se adauge la sfritul fiierului text
MAT.TXT.
Rezolvare: Vom folosi un algoritm cunoscut pentru
determinarea maximului dintr-un ir de numere.
Program ATESTAT_2003_29 ;
CONST
nmax = 30;
TYPE
mat r i ce = ar r ay [ 1. . nmax, 1. . nmax] of r eal ;
VAR
A : mat r i ce;
f : f i l e of r eal ;
m, n, i , j : i nt eger ;
x, Max : r eal ;
Begin { PROGRAM PRINCIPAL }
ASSI GN ( f , ' C: \ MAT. TXT' ) ;
r ewr i t e ( f ) ;
r epeat
wr i t e ( ' Dat i m= ' ) ;
r eadl n ( m)
unt i l ( m>= 1) AND ( m<= nmax) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
73
r epeat
wr i t e ( ' Dat i n = ' ) ;
r eadl n ( n)
unt i l ( n >= 1) AND ( n <= nmax) ;
wr i t el n ( ' Dat i mat r i cea' ) ;
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 ] ) ;
end;
end;
max : = A [ 1, 1] ;
f or i : = 1 t o mdo
begi n
f or j : = 1 t o n do
begi n
i f max < A [ i , j ] t hen
Max : = A [ i , j ]
end;
end;
wr i t el n ( ' Max = ' , Max) ;
RESET ( f ) ;
whi l e not EOF ( f ) do
begi n
r ead ( f , x)
end;
wr i t e ( f , max) ;
RESET ( f ) ;
READ ( f , x) ;
Max : = x;
wr i t el n ( ' Max ci t i t di n f i si er est e = ' , max) ;
r eadl n
end.
ATESTAT - 2003 - 30 - S se scrie la sfritul fiierului text
DIV.TXT toi divizorii naturali ai numrului ntreg x.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
74
Rezolvare: Folosim algoritmul de verificare a primalitii unui
numr ntreg.
Program ATESTAT_2003_30 ;
VAR
f : f i l e of i nt eger ;
x, d, di vi z : i nt eger ;
Begin { PROGRAM PRINCIPAL }
ASSI GN ( f , ' C: \ DI V. TXT' ) ;
r ewr i t e ( f ) ;
wr i t e ( ' Dat i x = ' ) ;
r eadl n ( x) ;
x : = ABS ( x) ; {daca x est e negat i v i l f acem>
0 }
di vi z : = 1;
whi l e di vi z <= x do
begi n
i f x MOD di vi z = 0 t hen
wr i t e ( f , di vi z ) ;
di vi z : = di vi z + 1
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
75
RESET ( f ) ;
wr i t el n ( ' Ci t i mf i si er ul ' ) ;
whi l e not EOF ( f ) do
begi n
r ead ( f , d) ;
wr i t el n ( ' Di vi zor = ' , d)
end;
r eadl n
end.
ATESTAT - 2003 - 31 - S se determine toate modalitile de
plat a unei sume S (S >= 0 i S <= 1.000.000) cu
bancnote de valoare dat: b1 =1000, b2 =5000, b3 =10.000,
b4 =100.000.
Rezolvare:
Varianta 1
Program
ATESTAT_2003_31_Bancnote_1_Platile_unei_sume_BackTr
acking ;
uses CRT;
VAR
s : ar r ay [ 0. . 20] of i nt eger ;
f , b : ar r ay [ 1. . 20] of i nt eger ;
{f [ poz] = numar ul de
bancnot e de t i pul b [ poz] }
nr sol , Suma, m, poz, i , j : i nt eger ; {m =
numarul de tipuri de bancnote }
{poz = pozi t i a unei
bancnot e i n suma}
Begin { PROGRAM PRINCIPAL }
cl r scr ;
nr sol : = 0;
wr i t e ( ' Dat i o suma < 1. 000. 000, Suma = ' ) ;
r eadl n ( Suma) ;
wr i t e ( ' Ci t e t i pur i de bancnot e f ol osi t i , ( l a
noi m= 4) m= ' ) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
76
r eadl n ( m) ;
f or i : = 1 t o mdo
begi n
wr i t e ( ' Dat i val oar ea bancnot ei de
t i pul ' , i , ' b [ ' , i , ' ] =' ) ;
r eadl n ( b[ i ] )
end;
s[ 0] : = 0;
f [ 1] : = 0;
poz : = 1;
while poz > 0 do
begi n
while ( poz <= m) AND ( f [ poz] * b[ poz]
< Suma - s[ poz- 1] ) do
begi n
f [ poz] : = f [ poz] + 1;
s[ poz] : = s[ poz- 1] + f [ poz] *
b[ poz] ;
I F s[ poz] = Suma t hen
begi n
i f poz > 1 t hen
begi n
nr sol : =
nr sol + 1;
wr i t el n
( ' Sol ut i a nr . ' , nr sol ) ;
wr i t e (
Suma, ' = ' , f [ 1] , ' *
' , b[ 1] ) ;
f or j : = 2 t o
poz do
begi n
wr i t e ( ' + ' , f [ j ] , ' * ' , b[ j ] )
end;
end
end
Probleme rezolvate de programare Subiecte propuse la ATESTAT
77
ELSE
begi n
poz := poz + 1;
{PAS INAINTE}
f [ poz] : = 0; {f
[ poz] : = f [ poz- 1] - 1; }
end { f [ poz] >= f
[ poz- 1] }
end; {sf ar si t WHI LE i nt er i or }
poz := poz-1; {PAS INAPOI}
end; { sf ar si t WHI LE ext er i or }
r eadl n
end.
Varianta 2
Program
ATESTAT_2003_31_Bancnote_2_Platile_unei_sume_BackTr
acking;
t ype
st i va = ar r ay[ 1. . 100] of l ongi nt ;
var
st , a, b: st i va;
n, k, s, i : Longi nt ;
as, ev: bool ean;
Procedure Init ( k: i nt eger ; var st : st i va) ;
begi n
st [ k] : = - 1
End;
Procedure Succesor ( var as: bool ean; var st : st i va;
k: i nt eger ) ;
var
s1, i : l ongi nt ;
begi n
i f ( st [ k] < b[ k] ) and ( k <= n) t hen
begi n
s1 : = 0;
f or i : =1 t o k do
s1 : = s1 + st [ i ] * a[ i ] ;
as : = ( s1 < s)
Probleme rezolvate de programare Subiecte propuse la ATESTAT
78
end
el se
as : = f al se;
i f as t hen
st [ k] : = st [ k] + 1
End;
Procedure Valid ( var ev: bool ean; st : st i va; k:
i nt eger ) ;
var i : i nt eger ;
begi n
ev : = t r ue
End;
Function Solutie( k: i nt eger ) : bool ean;
var i , s1: l ongi nt ;
begi n
s1 : = 0;
f or i : = 1 t o k do
s1 : = s1 + st [ i ] *a[ i ] ;
sol ut i e : = ( s=s1)
End;
Procedure Scrie;
var i : i nt eger ;
begi n
wr i t el n ( s, ' l ei se pl at esc cu: ' ) ;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
79
f or i : = 1 t o k do
begi n
i f st [ i ] >0 t hen
wr i t el n ( st [ i ] : 2, '
de ' , a[ i ] , ' l ei ' ) ;
end;
wr i t el n ( ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - ' ) ;
r eadl n
End;
Begin { PROGRAM PRINCIPAL }
n : = 4;
a[ 1] : = 1000;
a[ 2] : = 5000;
a[ 3] : = 10000;
a[ 4] : = 100000;
wr i t e ( ' Suma = ' ) ; r eadl n ( s) ;
f or i : = 1 t o n do
begi n
b[ i ] : = s di v a[ i ]
end;
k : = 1;
Init (k, st);
whi l e ( k > 0) do
begi n
r epeat
succesor (as, st, k);
i f as t hen
valid (ev, st, k);
unt i l ( not as) or ( as and ev) ;
i f as t hen
i f solutie (k) t hen
SCRIE
el se
begi n
k : = k+1;
init (k, st);
end
el se
k : = k- 1
Probleme rezolvate de programare Subiecte propuse la ATESTAT
80
end;
r eadl n
END.
ATESTAT - 2003 - 32 - S se parcurg, prin sritura calului, o
tabl de ah, netrecnd de dou ori prin aceleai poziii sau
omind o anumit poziie.
Rezolvare:
Program ATESTAT_2003_32_SARITURA_CALULUI ;
uses CRT;
CONST
mmax = 8; { nr . de l i ni i }
nmax = 8; { nr . de col oane }
TYPE
mat r i ce = ARRAY [ 1. . mmax, 1. . nmax] of i nt eger ;
{ mat r i cea TABLEI DE SAH }
Probleme rezolvate de programare Subiecte propuse la ATESTAT
81
VAR
SOL : mat r i ce; { SOL = mat r i cea sol ut i i l or }
{ SOL [ i , j ] = 0 daca nu s- a
t r ecut pr i n pozi t i a ( i , j ) }
{ <> 0 daca s- a
t r ecut pr i n pozi t i a ( i , j ) }
m, n, nr sol , i , j : i nt eger ; { ( i , j )
= pozi t i a pe t abl a de sah }
procedure SCRIE;
begi n
wr i t el n;
wr i t el n ( ' Apasat i o t ast a ' ) ;
wr i t el n;
r eadl n;
nr sol : = nr sol + 1;
wr i t el n ( ' Sol ut i a ' , nr sol , ' : ' ) ;
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 ( ' ' , SOL
[ i , j ] : 3, ' ' ) ;
end;
wr i t el n;
wr i t el n;
end;
r eadl n;
CLRSCR
end; { sf ar si t pr ocedur a SCRI E }
procedure TRASEU ( i , j , pas : i nt eger ) ;
begi n
I F ( i I N [ 1. . m] )
AND ( j I N [ 1. . n] ) t hen
begi n
Probleme rezolvate de programare Subiecte propuse la ATESTAT
82
i f SOL [ i , j ] = 0 t hen
begi n
SOL [ i , j ] : = pas ;
i f pas = m* n t hen
SCRIE
el se
begi n
TRASEU (i-2,
j+1, pas + 1 );
TRASEU (i-1,
j+2, pas + 1 );
TRASEU (i+1,
j+2, pas + 1 );
TRASEU (i+2,
j+1, pas + 1 );
TRASEU (i+2, j-
1, pas + 1 );
TRASEU (i+1, j-
2, pas + 1 );
TRASEU (i-1, j-
2, pas + 1 );
TRASEU (i-2, j-
1, pas + 1 );
end;
SOL [ i , j ] : = 0;
end;
end;
end; { sf ar si t pr ocedur a }
Probleme rezolvate de programare Subiecte propuse la ATESTAT
83
Begin { PROGRAM PRINCIPAL }
CLRSCR;
wr i t e ( ' Dat i numar ul de l i ni i ( cel put i n 5) ,
m= ' ) ;
r eadl n ( m) ;
wr i t e ( ' Dat i numar ul de col oane ( egal cu
numar ul de l i ni i ) , n = ' ) ;
r eadl n ( n) ;
f or i : = 1 t o mdo
begi n
f or j : = 1 t o n do
begi n
SOL [ i , j ] : = 0
end;
end;
nr sol : = 0;
CLRSCR;
TRASEU (1, 1, 1);
i f nr sol = 0 t hen
wr i t el n ( ' Nu exi st a sol ut i e' ) ;
wr i t el n;
r eadl n
END.
ATESTAT - 2003 - 33 - S se parcurg n lime un graf
neorientat.
Rezolvare:
Varianta 1: Algoritmul este descris n lucrarea Ctlin Tnase
Note de curs, Ediia II, 2008.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
84
Program
ATESTAT_2003_33_Parcurgere_graf_in_latime_BF_Breadt
h_First ;
uses CRT;
VAR
VI ZI TAT : ar r ay [ 1. . 20] of 0. . 1;
{el ement el e vect or ul ui VI ZI TAT sunt : }
{ = 1, daca un var f a f ost
vi zi t at }
{ = 0, i n caz cont r ar }
A : ar r ay [ 1. . 20, 1. . 20] of i nt eger ; { A =
mat r i cea de adi acent a}
n : i nt eger ; { n = nr . de nodur i }
m: i nt eger ; { m= nr . de muchi i }
i , j : i nt eger ; { i , j = i ndecsi }
v : i nt eger ; { v = var f cur ent }
x, y : i nt eger ; { x, y = ext r emi t at i al e unei
muchi i }
pr i m, ul t i m: i nt eger ;
{ poi nt er i cat r e "pr i mul " / "ul t i mul "
el em. al cozi i }
C : ar r ay [ 1. . 20] of i nt eger ;
{ C = coada i n car e depunemvar f ur i l e
nevi zi t at e, veci ne al e unui var f }
begi n
CLRSCR;
wr i t el n;
wr i t e ( ' Dat i numar ul de var f ur i , n = ' ) ;
r eadl n ( n) ;
wr i t el n;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
85
wr i t e ( ' Dat i numar ul de muchi i , m= ' ) ;
r eadl n ( m) ;
wr i t el n;
f or i : = 1 t o n do
begi n
f or j : = 1 t o n do
begi n
A [ i , j ] : = 0 {i ni t i al i zar e el ement e
mat r i ce de adi acent a cu 0}
end;
end;
wr i t el n;
wr i t el n ( ' Dat i ext r emi t at i l e muchi i l or ' ) ;
wr i t el n;
f or i : = 1 t o mdo
begi n
wr i t el n ( ' Pent r u muchi a ' , i , ' , dat i
ext r emi t at i l e' ) ;
wr i t e ( ' Pr i ma ext r emi t at e, x = ' ) ;
r eadl n ( x) ;
wr i t e ( ' A doua ext r emi t at e, y = ' ) ;
r eadl n ( y) ;
wr i t el n;
A [ x, y] : = 1;
A [ y, x] : = 1;
end;
wr i t el n;
wr i t e ( ' Dat i var f ul de pl ecar e, i = ' ) ;
r eadl n ( i ) ;
wr i t el n;
C [ 1] : = i ; {pr i mul el ement di n coada est e
var f ul de pl ecar e}
f or j : = 1 t o n do
begi n
VI ZI TAT [ j ] : = 0;
end;
pr i m: = 1; {poi nt ar e cat r e pr i mul el ement al
cozi i }
Probleme rezolvate de programare Subiecte propuse la ATESTAT
86
ul t i m: = 1; {poi nt ar e cat r e ul t i mul el ement al
cozi i }
VI ZI TAT [ i ] : = 1;
whi l e pr i m<= ul t i mdo
begi n
v : = C [ pr i m] ;
f or j : = 1 t o n do
begi n
i f ( A [ v, j ] = 1) AND ( VI ZI TAT [ j ] =
0) t hen
begi n
ul t i m: = ul t i m+ 1;
{se depune un var f i n coada i n
pozi t i a "ul t i m"}
C [ ul t i m] : = j ;
VI ZI TAT [ j ] : = 1;
end; {end I F }
end; {end FOR }
pr i m: = pr i m + 1;
end; {end WHI LE}
Probleme rezolvate de programare Subiecte propuse la ATESTAT
87
wr i t el n ( ' Li st a nodur i l or , i n par cur ger e BF,
pl ecand di n nodul ' , i , ' , est e : ' ) ;
f or j : = 2 t o ul t i mdo
begi n
wr i t e ( C [ j ] , ' ' ) ;
end;
r eadl n
end.
Varianta 2:
Program
ATESTAT_2003_33_Parcurgere_graf_in_latime_cu_proced
ura_recursiva ;
t ype mat = ar r ay [ 1. . 20, 1. . 20] of i nt eger ;
vect = ar r ay [ 1. . 20] of i nt eger ;
var v : mat ;
t , coada : vect ;
n, k, j , i , p : i nt eger ;
procedure PBF ( i : i nt eger ) ; { Par cur ger e Breadth
First }
{pr ocedur a r ecur si va}
var j : i nt eger ;
begi n
f or j : =1 t o n do
i f ( v [ coada [ i ] , j ] = 1 ) and ( t [ j ]
= 0) t hen
begi n
k : = k+1;
coada [ k] : = j ;
t [ j ] : = 1 ;
end;
i f i <n t hen
PBF ( i +1) ;
end;
Begin { PROGRAM PRINCIPAL }
wr i t e( ' n = ' ) ;
r eadl n( n) ;
f or i : = 1 t o n do
Probleme rezolvate de programare Subiecte propuse la ATESTAT
88
begi n
t [ i ] : = 0;
f or j : = i +1 t o n do
begi n
wr i t e ( ' Legat ur a
i nt r e ' , i , ' si ' , j , ' = ' ) ;
r eadl n ( v[ i , j ] ) ;
v[ j , i ] : = v[ i , j ] ;
end;
end;
wr i t e ( ' Dat i Nodul de plecare, p = ' ) ;
r eadl n ( p) ;
coada [ 1] : = p;
t [ p] : = 1;
k : = 1;
PBF (p);
f or i : =1 t o n do
wr i t e ( coada[ i ] , ' - >' ) ;
wr i t el n;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
89
ATESTAT - 2003 - 34 - S se determine un ciclu ntr-un graf
astfel nct s se treac prin toate punctele grafului, iar costul
drumului s fie minim.
Rezolvare: Se folosete algoritmul cunoscut de determinare a
unui ciclu ntr-un graf.
Program ATESTAT_2003_34_Graf_cost_minim ;
var
A: ar r ay [ 1. . 20, 1. . 20] of i nt eger ; {mat r i cea
de adi acent a}
s: ar r ay [ 1. . 20] of i nt eger ;
n, i , j , v, v1, v2, mi n, cost : i nt eger ;
Begin { PROGRAM PRINCIPAL }
Wr i t e ( ' Dat i numar ul de nodur i , n = ' ) ;
Readl n ( n) ;
wr i t el n ( Dat i mat r i cea de adi acent a A ) ;
f or i : = 1 t o n - 1 do
f or j : = i + 1 t o n do
begi n
wr i t e ( ' Dat i A [ ' , i , ' , ' , j , ' ]
= ' ) ;
r eadl n ( A [ i , j ] ) ;
A [ j , i ] : = A [ i , j ]
end;
f or i : =1 t o n do
begi n
S [ i ] : = 0; {mat r i cea de adi acent a
est e pat r at i ca, avand t oat e}
A [ i , i ] : = 0 {el ement el e di agonal ei
pr i nci pal e egal e cu zer o }
end;
wr i t e ( ' Dat i Nodul de pornire, v = ' ) ;
r eadl n ( v) ;
S [ v] : = 1;
v2 : = v;
cost : = 0;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
90
wr i t el n ( v) ;
f or i : = 1 t o n- 1 do
begi n
mi n : = 30000;
f or j : = 1 t o n do
i f ( A [ v2, j ] <> 0) and ( S [ j ] = 0)
and ( mi n > A [ v2, j ] ) t hen
begi n
mi n : = A [ i , j ] ;
v1 : = j
end;
v2 : = v1;
S [ v2] : = 1;
cost : = cost + mi n;
wr i t e ( v1, ' - > ' ) ;
end;
cost : = cost + A [ v2, v] ;
wr i t el n ( v) ;
wr i t el n ( ' Cost t ot al = ' , cost ) ;
r eadl n
end.
Probleme rezolvate de programare Subiecte propuse la ATESTAT
91
ATESTAT - 2003 - 35 - S se afieze toate posibilitile de
aranjare pe o caset a n melodii, codificate cu numere de la 1
la n, astfel nct melodia X s urmeze dup melodia Y (x i y
sunt dou valori citite). Se consider n < 10.
Rezolvare:
Program ATESTAT_2003_35_Caseta_cu_melodii ;
uses cr t ;
const nmax = 100;
t ype vect or = ar r ay [ 1. . nmax] of i nt eger ;
var f : vect or ;
SOLUTI I : TEXT; {f i si er t ext de pe di sc i n
car e vomr et i ne sol ut i i l e}
sol , n, i , x, y : 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
begi n wr i t e ( f [ i ] : 3 ) ; wr i t e
( SOLUTI I , f [ i ] : 3 ) ; end;
wr i t el n ( SOLUTI I ) ; wr i t el n {Li ni e de
spat i er e}
end;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
92
function POZMELODIE ( x, y : i nt eger ) : BOOLEAN;
Var OK : bool ean;
begi n
OK : = FALSE;
f or i : = 1 t o n - 1 do
begi n
i f ( f [ i ] = y) AND ( f [ i + 1 ] =
x ) t hen
OK : = TRUE;
end;
POZMELODI E : = OK
end;
procedure PERMUTA ( m: i nt eger ) ;
LABEL 20;
var k : i nt eger ;
CONTI N : bool ean;
Probleme rezolvate de programare Subiecte propuse la ATESTAT
93
begi n
k : = 1;
f [ k] : = 0;
while k > 0 do
begi n
CONTI N : = FALSE;
while f [ k] < mdo
begi n
f [ k] : = f [ k] + 1;
VERIFICA (k, f, CONTIN);
i f CONTI N = TRUE t hen
GOTO 20
end; {sf ar si t WHI LE i nt er i or }
20: i f ( CONTI N = TRUE ) AND ( k = n) t hen
begi n
i f POZMELODIE (x, y) = TRUE
t hen
SCRIE;
end;
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
k : = k - 1
{PAS INAPOI}
end; {sf ar si t WHI LE
ext er i or }
end; {sf ar si t pr ocedur a
PERMUTA}
Begin { PROGRAM PRINCIPAL }
cl r scr ;
assi gn ( SOLUTI I ,
' C: \ SOLUTI I . t xt ' ) ;
{Sol ut i i l e se vor
scr i e si i n f i si er ul
C: \ SOLUTI I . TXT}
r ewr i t e ( SOLUTI I ) ;
1 2 4 3 5
1 2 5 4 3
1 4 3 2 5
1 4 3 5 2
1 5 2 4 3
1 5 4 3 2
2 1 4 3 5
2 1 5 4 3
2 4 3 1 5
2 4 3 5 1
2 5 1 4 3
2 5 4 3 1
4 3 1 2 5
4 3 1 5 2
4 3 2 1 5
4 3 2 5 1
4 3 5 1 2
4 3 5 2 1
5 1 2 4 3
5 1 4 3 2
5 2 1 4 3
5 2 4 3 1
5 4 3 2 1
Probleme rezolvate de programare Subiecte propuse la ATESTAT
94
sol : = 0;
wr i t e( ' Dat i nr . de mel odi i ( < 10 ) n = ' ) ;
r eadl n ( n) ;
wr i t e ( ' Dat i mel odi a nr . x = ' ) ;
r eadl n ( x) ;
wr i t e ( ' Dat i mel odi a nr . y = ' ) ;
r eadl n ( y) ;
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.
De exemplu, pentru n =5
X =3
Y =4
se vor afia pe ecran
(respectiv se vor scrie n fiierul C:\SOLUTII.TXT)
soluiile:

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