Sunteți pe pagina 1din 51

Probleme rezolvate de programare – Subiecte propuse la ATESTAT

2006
ATESTAT - 2006 - 1 - Se citeşte de la tastatură un număr natural n (1 < n < 100) şi un şir X de n
valori întregi. Să se înlocuiască fiecare element din şir cu media aritmetică a celorlalte n – 1
elemente.

Rezolvare:
 Calculăm suma “S” a tuturor elementelor vectorului X.
 Pentru fiecare poziţie “i” din vector, calculăm media aritmetică a elementelor S – x[i].
Program ATESTAT_2006_1_MEDIE_ARITMETICA ;
const
nmax = 100;
type
vector = array [1..nmax] of integer;
vectorreal = array [1..nmax] of real;
var
n, i, k : integer;
s: integer;
x : vector;
y : vectorreal;
media : real;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n <= nmax);
writeln ('Dati cele n elemente intregi');
writeln;
for i := 1 to n do
begin
write ('Dati X [', i, '] = ');
readln (x[i])
end;
s:= 0;
for i := 1 to n do
begin
s:= s + x[i]
end;
for i := 1 to n do
begin
media := (s - x[i] ) / (n-1);
y[i] := media ;
writeln ('y[i] = ', y[i] )
end;
readln
end.

ATESTAT - 2006 - 2 – Se citeşte de la tastatură un număr natural n (1 < n < 100) şi un şir X de n
valori întregi. Să se construiască un vector Y care să conţină numai elementele pare din vectorul X.

Rezolvare: Notăm cu pare o variabilă cu dublu rol: de contor al numerelor pare găsite în vectorul
X, precum şi de index al elementelor vectorului Y.
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Program ATESTAT_2006_2_ELEMENTE_PARE ;
const
nmax = 100;
type
vector = array [1..nmax] of integer;
var
x, y : vector;
n, i, k, pare : integer;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n <= nmax);
writeln;
writeln ('Dati vectorul X');
writeln;
for i:= 1 to n do
begin
write ('Dati X[', i, '] = ');
readln (x[i])
end;
pare := 0; {initializare contor si index}
for i := 1 to n do
begin
if x [i] MOD 2 = 0 then
begin
pare := pare + 1;
y [pare] := x[i];
writeln ('y [', pare, '] = ', y [pare]);
end;
end;
readln
end.

ATESTAT - 2006 - 3 – Se citeşte de la tastatură un număr natural n (1 < n < 100) şi un şir X de n
valori întregi. Verificaţi dacă o valoare “a”, citită de la tastatură se găseşte în vector şi dacă da,
afişaţi poziţiile pe care apare şi numărul de apariţii.

Rezolvare: Aplicăm un algoritm de căutare secvenţială a unui element într-un vector.


Program ATESTAT_2006_3_CAUTARE ;
const
nmax = 100;
type
vector = array [1..nmax] of integer;
var
x : vector;
n, i, pozitia : integer;
elem : integer;
gasit : BOOLEAN;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n <= nmax);
writeln;
writeln ('Dati vectorul X');
writeln;

4
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
for i:= 1 to n do
begin
write ('Dati X[', i, '] = ');
readln (x[i])
end;
gasit := false;
writeln ;
writeln ('Dati elementul cautat, elem = ');
readln (elem);
writeln;
for i:= 1 to n do
begin
if x [i] = elem then
begin
gasit := true;
pozitia := i;
writeln (elem, ' apare in pozitia ', pozitia);
end
end;
if gasit = true then
writeln (elem, ' apartine vectorului')
else
writeln (elem, ' nu apartine vectorului');
readln
end.

ATESTAT - 2006 - 4 – Se citeşte de la tastatură un număr natural n (1 < n < 100) şi un şir X de n
valori întregi. Să se numere elementele din vectorul X care se găsesc în intervalul [a, b], cu a şi b
numere întregi citite de la tastatură, şi să se construiască un alt vector cu cele care nu aparţin
intervalului.

Rezolvare: Vom folosi 2 contori:


k = contor care numără elementele din intervalul [a, b] ;
j = contor care numără elementele ce nu aparţin [a, b] .
Program ATESTAT_2006_4_NUMARARE_ELEMENTE_DIN_INTERVALUL_A_B ;
const
nmax = 100;
type
vector = array [1..nmax] of integer;
var
x, y : vector;
a, b, n, i, k, j : integer;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n <= nmax);
writeln;
writeln ('Dati vectorul X');
writeln;
for i:= 1 to n do
begin
write ('Dati X[', i, '] = ');
readln (x[i])
end;
writeln;
write ('Dati a = '); readln (a);
write ('Dati b = '); readln (b);

5
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
writeln;
k := 0; {contor care număra elementele din intervalul [a, b] }
j := 0; {contor care număra elementele ce nu apartin [a, b] }
for i := 1 to n do
begin
if (x [i] >= a) and (x[i] <= b) then
begin
k:= k + 1;
end
else
begin
if (x[i] <a) AND (x[i] > b) then
begin
j := j + 1;
y [j] := x [i];
writeln (' y[', j,'] = ', y [j]);
end;
end;
end;
writeln;
writeln ('In intervalul [', a,', ', b,'] exista ', k, ' elemente');
readln
end.

ATESTAT - 2006 - 5 – Se citeşte de la tastatură un număr natural n (1 < n < 100) şi un şir X de n
valori întregi. Să se ordoneze crescător până la o poziţie “k” citită de la tastatură şi descrescător de
la poziţia “k” la “n”.

Rezolvare: Definim două proceduri: ORDONEAZACRESCATOR, pentru ordonarea până la


poziţia “k” şi ORDONEAZADESCRESCATOR., pentru ordonarea de la poziţia “k” la “n”.
Ambele proceduri se bazează pe algoritmul “bubble sort”.
Program ATESTAT_2006_5_ORDONARI ;
const
nmax = 100;
type
vector = array [1..nmax] of integer;
var
x, y, z : vector;
a, b, n, i, k, aux : integer;
procedure ORDONEAZACRESCATOR (VAR v : vector; m : integer);
var
j, aux, test : integer;
begin
repeat
test := 0;
j := 1;
repeat
if v [j] > v [j + 1] then
begin
aux := v[j];
v [j] := v [j + 1];
v [j + 1] := aux;
test := 1;
end;
j := j + 1
until j > m - 1
until test = 0
end;

6
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
procedure ORDONEAZADESCRESCATOR (VAR v : vector; m : integer);
var
j, aux, test : integer;
begin
repeat
test := 0;
j := 1;
repeat
if v [j] < v [j + 1] then
begin
aux := v[j];
v [j] := v [j + 1];
v [j + 1] := aux;
test := 1;
end;
j := j + 1
until j > m - 1
until test = 0
end;

Begin { PROGRAM PRINCIPAL }


repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n <= nmax);
writeln;
writeln ('Dati vectorul X');
writeln;
for i:= 1 to n do
begin
write ('Dati X[', i, '] = ');
readln (x[i])
end;
writeln;
write ('Dati pozitia k = ');
readln (k);
for i:= 1 to k do
begin
y [i] := x [i];
end;
for i:= k + 1 to n do
begin
z [i-k] := x [i]
end;

ORDONEAZACRESCATOR (y, k);


ORDONEAZADESCRESCATOR (z, n-k);

for i:= 1 to k do
begin
writeln ('y [',i,'] = ', y[i]);
end;

writeln;
for i:= k + 1 to n do
begin
writeln ('z [',i-k,'] = ', z[i-k]);
end;
readln
end.

7
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
ATESTAT - 2006 - 6 – Se citeşte de la tastatură un număr natural n (1 < n < 100) şi un şir X de n
valori întregi. Să se afişeze subşirul de valori crescătoare (aşezate pe poziţii consecutive) de
lungime maximă.

Rezolvare:
 Reţinem cele n valori întregi în vectorul X.
 Construim un alt vector “subsir” cu elemente din X în ordine crescătoare.
 Construim încă un vector “LUNGIME” în care scriem, pe fiecare poziţie, lungimile subşirurilor
crescătoare găsite.
Program ATESTAT_2006_6_SUBSIR_DE_VALORI_CRESCATOARE_DE_LUNGIME_MAXIMA ;
const
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
var
max, poz, t, n, i, lung, j : integer;
subsir, lungime, x, y : vector;
k : BOOLEAN;

Begin { PROGRAM PRINCIPAL }


write ('Dati n = '); readln (n);
writeln;
writeln ('Dati vectorul X');
for i:= 1 to n do
begin
write ('X[',i,'] = '); readln (x [i] )
end;
writeln;
lung := 0; {contor pentru numărul de subsiruri crescatoare}
t:= 1; {t = pozitia in subsirul construit cu elemente in ordine
crescatoare}
subsir [t] := x [1]; {initializarea unui prim subsir, presupunand ca vom
gasi un astfel de subsir chiar din pozitia 1}
max := 1; {initializare lungime maxima presupusa}
for i:= 1 to n-1 do
begin
if x [i] < x [i + 1] then
begin
t := t + 1;
subsir [t] := x [i + 1]; {depun in subsir urmatorul element}
end
else
begin
lung := lung + 1;
lungime [lung] := t; {t = nr. de elemente din subsir}
{ writeln ('lungime subsir = ', lungime [lung]); }
if max < lungime [lung] then
begin
max := lungime [lung];
writeln;
poz := i - max + 1; {pt. ca i = 1..n-1}
end;
for j := 1 to t do
write (subsir [j],' '); {tiparesc subsir curent}
writeln;
t := 1; {reinitializ. pozitie nou subsir}
subsir [t] := x [i + 1];
end; {sf. IF}
end; {sf. for}
writeln;

8
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
writeln ('Ultimul subsir este:');
lung := lung + 1;
lungime [lung] := t; {t = nr. de elemente din subsir}

for j := 1 to t do
write (subsir [j],' ');
writeln;
if max < lungime [lung] then
begin
max := lungime [lung];
writeln;
writeln;
poz := i + 1 - max + 1; {pt. ca i = 1..n-1}

if max < lungime [lung] then


begin
max := lungime [lung];
writeln;
poz := i - max;
writeln;
end;
writeln;
end;
writeln;
writeln ('Subsirul este:');
writeln;
for i:= 1 to n do
begin
write (X[i],' ');
end;
writeln;
writeln;
writeln ('S-au gasit subsiruri de lungimile');
writeln;

for j:= 1 to lung do


begin
writeln ('Subsirul ', j,' are lungimea ', lungime [j]);
end;
writeln;
writeln ('Subsirul de lungime maxima are ', max, ' elemente:');
writeln ('si incepe in pozitia ', poz);
writeln;
for j := poz to (poz + max-1) do
begin
write (x[j],' ');
end;
readln
end.

ATESTAT - 2006 - 7 – Se citeşte de la tastatură un număr natural n (1 < n < 100) şi un şir X de n
valori întregi. Să se afişeze toate perechile de elemente ale şirului (nu neapărat consecutive ca
poziţie) cu proprietatea că ambele elemente ale perechii au aceeaşi sumă a cifrelor.

Rezolvare: Definim două funcţii:


 NRCIFRE – pentru a număra cifrele unui element ;
 SUMACIFRE – pentru a face suma cifrelor unui element.
 Scriem cifrele unui element într-un vector auxiliar “y”.

9
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Program ATESTAT_2006_7_SUMA_CIFRE ;
const
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
var
S1, x1, n, i, j : integer;
x, suma, y : vector;
k : BOOLEAN;
function NRCIFRE (numar : integer) : integer;
var
m : integer;
begin
if numar = 0 then
m := 1
else
begin
m := 0;
while numar <> 0 do
begin
numar := numar DIV 10;
m := m + 1
end
end;
NRCIFRE := m
end;
function SUMACIFRE (numar : integer) : integer;
var
t, s : integer;
y : vector;
begin
s := 0;
for t := 1 to NRCIFRE (numar) do
begin
y [ t ] := numar MOD 10;
writeln ('y [', t, '] = ', y [t]);

numar := numar DIV 10;


end;
for t := 1 to NRCIFRE (numar) do
begin
s := s + y [t]
end;
SUMACIFRE := s;
end;
Begin { PROGRAM PRINCIPAL }
write ('Dati n = ');
readln (n);
writeln;
writeln ('Dati vectorul X');
for i:= 1 to n do
begin
write ('X[',i,'] = ');
readln (x [i] )
end;
writeln;
for i := 1 to n do
begin
suma [i] := SUMACIFRE (x [i] )
end;
writeln;
writeln ('Perechile de numere cu sumele cifrelor egale sunt:');
writeln;

10
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
for i:= 1 to n - 1 do
begin
for j := i + 1 to n do
begin
if suma [i] = suma [j] then
begin
writeln ('x[',i,'] = ', x[i],' x[',j,'] = ', x[j] );
end
end
end;
readln
end.

ATESTAT - 2006 - 8 – Se citeşte un număr întreg strict pozitiv cu cel mult nouă cifre. Să se
afişeze cifra cea mai mare şi de câte ori apare în număr.

Rezolvare: Definim funcţia NRCIFRE, pentru a număra cifrele numărului. Reţinem într-un vector
“y” cifrele numărului.
Program ATESTAT_2006_8_CIFRA_MAXIMA;
const
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
var
cifmax, cif, max, c, x, x1, n, i : integer;
y : vector;
k : BOOLEAN;
cifra : array [0..9] of integer;
{vectorul "cifra" contorizeaza aparitiile cifrelor in numarul x}

function NRCIFRE ( numar : integer) : integer;


var
m : integer;
begin
if numar = 0 then
m := 1
else
begin
m := 0;
while numar <> 0 do
begin
numar := numar DIV 10;
m := m + 1
end
end;
NRCIFRE := m
end;

Begin { PROGRAM PRINCIPAL }


write ('Introduceti un numar natural x = ');
readln (x);
n := NRCIFRE (x);
writeln ('Numarul ',x,' are ',n,' cifre');

writeln;
x1 := x; {conservam valoarea lui x, folosind un auxiliar x1}
writeln ('Cifrele numarului ', x,' sunt:');

11
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
for i := n downto 1 do
begin
y [ i ] := x1 MOD 10;
writeln ('y [',i,'] = ', y [i]);
x1 := x1 DIV 10;
end;

for c:= 0 to 9 do
cifra [c] := 0; {initializam cu "zero" toti contorii cifrelor}
for c:= 0 to 9 do
begin
for i:= 1 to NRCIFRE (x) do
begin
if c = y [i] then
cifra [c] := cifra [c] + 1 {majoram contor cifra}
end
end;
writeln;
writeln ('Frecventa de aparitie a cifrelor este:');

for c:= 0 to 9 do
begin
writeln ('Cifra ', c,' apare de ', cifra [c], ' ori');
end;

cifmax := 0; {initializare variabila "cifmax" }

for i := 1 to NRCIFRE (x) do


begin
if cifmax < y [i] then
cifmax := y [i]
end;
writeln;
writeln ('Cifra maxima ', cifmax,' apare de ', cifra [cifmax], ' ori');
readln
end.

ATESTAT - 2006 - 9 – Se citeşte un număr întreg strict pozitiv cu cel mult nouă cifre. Să se
afişeze cifrele distincte precum şi de câte ori apar în număr.

Rezolvare: Folosim un vector “CIFRA” în care memorăm, pe fiecare poziţie, frecvenţele de


apariţie ale cifrelor de la 0 la 9. Reţinem într-un vector “y” cifrele numărului “x”.
Program ATESTAT_2006_9_NUMARARE_CIFRE_DISTINCTE ;
const
nmax = 100;
TYPE
vector = array [1..nmax] of integer;

var
c, x, x1, n, i : integer;
y : vector;
k : BOOLEAN;
cifra : array [0..9] of integer;
{vectorul "cifra" contorizeaza aparitiile cifrelor in numarul x}

12
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
function NRCIFRE ( numar : integer) : integer;
var
m : integer;
begin
if numar = 0 then
m := 1
else
begin
m := 0;
while numar <> 0 do
begin
numar := numar DIV 10;
m := m + 1
end
end;
NRCIFRE := m
end;

Begin { PROGRAM PRINCIPAL }


write ('Introduceti un numar natural x = ');
readln (x);
n := NRCIFRE (x);
writeln ('Numarul ',x,' are ',n,' cifre');
writeln;
x1 := x; {conservam valoarea lui x, folosind un auxiliar x1}
writeln ('Cifrele numarului ', x,' sunt:');
for i := n downto 1 do
begin
y [ i ] := x1 MOD 10;
writeln ('y [',i,'] = ', y [i]);
x1 := x1 DIV 10;
end;

for c:= 0 to 9 do
cifra [c] := 0; {initializam cu "zero" toti contorii cifrelor}

for c:= 0 to 9 do
begin
for i:= 1 to NRCIFRE (x) do
begin
if c = y [i] then
cifra [c] := cifra [c] + 1 {majoram contor cifra}
end
end;
writeln;
writeln ('Frecventa de aparitie a cifrelor este:');
for c:= 0 to 9 do
begin
writeln ('Cifra ', c,' apare de ', cifra [c], ' ori');
end;
readln
end.

ATESTAT - 2006 - 10 – Se citeşte un număr întreg strict pozitiv cu cel mult nouă cifre. Să se
verifice dacă cifrele lui sunt în ordine strict crescătoare.

Rezolvare: Definim funcţia NRCIFRE, pentru a număra cifrele numărului. Reţinem într-un vector
“y” cifrele numărului.

13
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Program ATESTAT_2006_10_CIFRE_IN_ORDINE_CRESCATOARE ;
const
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
var
x, x1, n, i : integer;
y : vector;
k : BOOLEAN;

function NRCIFRE ( numar : integer) : integer;


var
m : integer;
begin
if numar = 0 then
m := 1
else
begin
m := 0;
while numar <> 0 do
begin
numar := numar DIV 10;
m := m + 1
end
end;
NRCIFRE := m
end;
Begin { PROGRAM PRINCIPAL }
write ('Introduceti un numar natural x = ');
readln (x);
n := NRCIFRE (x);
writeln ('Numarul ',x,' are ',n,' cifre');
writeln;
x1 := x; {conservam valoarea lui x, folosind un auxiliar x1}
for i := n downto 1 do
begin
y [ i ] := x1 MOD 10;
writeln ('y [',i,'] = ', y [i]);
x1 := x1 DIV 10;
end;

K := TRUE;
for i := 3 to n do
begin
if NOT ((y[i] > y [i - 1] ) AND (y[i] > y [i - 1])) then
k := FALSE
end;
if K then
writeln (x ,' are cifrele in ordine crescatoare')
else
writeln (x ,' are NU cifrele in ordine crescatoare');
readln
end.

ATESTAT - 2006 - 11 – Se citesc trei numere întregi strict pozitive. Să se afişeze în ordine
crescătoare. Să se verifice dacă ele formează sau nu o progresie geometrică.

Rezolvare: În general, un şir de numere se află într-o progresie geometrică dacă şi Xn + 1 / Xn =


raţia şi Xn / Xn–1 = raţia ... şi X2 / X1 = raţia.

14
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Program ATESTAT_2006_11_PROGRESIE_GEOMETRICA ;
const
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
var
ratia, n, i, j, k: integer ;
x : vector;
OK : boolean;
procedure ORDONEAZA (VAR v : vector; m : integer);
var
j, aux, test : integer;
begin
repeat
test := 0;
j := 1;
repeat
if v [j] > v [j + 1] then
begin
aux := v[j];
v [j] := v [j + 1];
v [j + 1] := aux;
test := 1;
end;
j := j + 1
until j > m - 1
until test = 0
end;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = '); readln (n)
until (n >= 1) and (n <= nmax);
writeln;
writeln ('Dati vectorul X');
writeln;
for i := 1 to n do
begin
write ('Dati X [', i, '] = '); readln (X [i])
end;
writeln;
ORDONEAZA (X, n);
writeln;
writeln ('Vectorul X dupa ordonare este');
for i := 1 to n do
begin
writeln ('X [',i,'] = ', X[i] );
end;
writeln;

ratia := x [2] DIV x [1];

OK := TRUE ; {presupun ca formeaza progresie aritmetica}


for i:= 2 to n do
begin
if x [i] / x [i-1] <> ratia then
OK := FALSE
end;
if OK = TRUE then
writeln ('Elementele formeaza o progresie geometrica')
else
writeln ('Elementele NU formeaza o progresie geometrica');
readln
end.

15
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
ATESTAT - 2006 - 12 – Se citesc două numere întregi strict pozitive. Să se calculeze şi să se
afişeze c.m.m.d.c. al celor două numere.

Rezolvare: Aplicăm algoritmul lui Euclid.


Program ATESTAT_2006_12_CMMDC ;
VAR
A, B, aux, R, cmmdc : integer;
Begin { PROGRAM PRINCIPAL }
write ('Dati A = ');
readln (A);
write ('Dati B = ');
readln (B);
if A< b then
begin
aux := a;
a:= B;
b := aux;
end;
R := A MOD B;
While R <> 0 do
begin
A := B;
B := R;
R := A MOD B
end;
cmmdc := b;
writeln ('CMMDC = ', CMMDC);
readln
end.

ATESTAT - 2006 - 13 – Se citesc două numere întregi strict pozitive cu cel mult nouă cifre. Să se
afişeze c.m.m.d.c. al lor, apoi să se verifice rezultatul.

Rezolvare: Aplicăm algoritmul lui Euclid.


Program ATESTAT_2006_13_CMMDC;
VAR
A, B, aux, R, cmmdc : LONGINT;
Begin { PROGRAM PRINCIPAL }
write ('Dati A = ');
readln (A);
write ('Dati B = ');
readln (B);
if A< b then
begin
aux := a;
a:= B;
b := aux;
end;
R := A MOD B;
While R <> 0 do
begin
A := B;
B := R;
R := A MOD B
end;
cmmdc := b;

16
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
writeln ('CMMDC = ', CMMDC);
writeln;
if (A MOD cmmdc = 0) AND (B MOD cmmdc = 0) then
writeln ('Rezultat CORECT')
else
writeln ('Rezultat incorect');
readln
end.

ATESTAT - 2006 - 14 – Două numere întregi strict pozitive sunt prietene dacă suma divizorilor
proprii ai unuia este mai mică cu o unitate decât celălalt număr şi invers. Date două numere, să se
verifice dacă sunt prietene.

Rezolvare: Reţinem în SA, respectiv în SB, sumele divizorilor celor două numere.
Program ATESTAT_2006_14_NUMERE_PRIETENE ;
const
nmax = 30;
type
vector = array [1..nmax] of integer;
var
divA, divB : vector;
SA, SB, A, B, divizor, nrdiv: integer;
Begin { PROGRAM PRINCIPAL }
write ('Dati A = '); readln (A);
write ('Dati B = '); readln (B);
SA := 0;
SB := 0;
for divizor := 1 to A do
begin
if A MOD divizor = 0 then
SA := SA + divizor;
end;
for divizor := 1 to B do
begin
if B MOD divizor = 0 then
SB := SB + divizor;
end;
if (SA = B-1) AND (SB = A - 1) then
writeln (A, ' si ', B, ' sunt prietene')
else
writeln (A, ' si ', B, ' NU sunt prietene');
readln
end.

ATESTAT - 2006 - 15 – Fie A (m, n) o matrice cu m linii şi n coloane. Să se genereze şi să se


afişeze matricea B (n, m) cu n linii şi m coloane, ale cărei elemente sunt definite astfel:
B[i, j] = A[j, i], cu i = 1 . . n, j = 1 . . m.

Rezolvare: Se construiete matricea B, în condiţiile din enunţ.


Program ATESTAT_2006_15_MATRICI ;
const
nmax = 30;
type
matrice = array [1..nmax, 1..nmax] of integer;

17
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
var
A, B : matrice;
m,n,i,j : integer;

Begin { PROGRAM PRINCIPAL }


repeat
write ('Dati m = ');
readln (m);
until (m >= 1) and (m <= nmax);
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n <= nmax);
writeln;
writeln ('Dati matricea A');
for i := 1 to m do
begin
for j := 1 to n do
begin
write ('Dati A [', i,',',j,'] = ');
readln (A [i,j])
end
end;
for i:= 1 to n do
begin
for j := 1 to m do
begin
B [i, j] := A [j, i]
end
end;
writeln;

writeln ('Matricea A este:');


for i:= 1 to m do
begin
for j := 1 to n do
begin
write (A [i, j], ' ')
end;
writeln
end;
writeln;
writeln ('Matricea B este:');
for i:= 1 to n do
begin
for j := 1 to m do
write (B [i, j], ' ');
writeln
end;
readln
end.

ATESTAT - 2006 - 16 – Fie A (m, n) o matrice cu m linii şi n coloane, cu elemente numere reale şi
două linii distincte L1 şi L2 cu indicii din intervalul [1 . . m]. Să se schimbe elementele liniei L1 cu
elementele liniei L2 şi să se afişeze matricea rezultată.

Rezolvare: Folosim o matrice auxiliară “MATAUX” şi aplicăm algoritmul folosit schimbarea între
ele a două valori reale.

18
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Program ATESTAT_2006_16_INTERSCHIMBARE_LINII_MATRICE ;
const
nmax = 30;
type
vector = array [1..nmax] of integer;
matrice = array [1..nmax, 1..nmax] of integer;
var
A, B, MATAUX : matrice;
m,n,i,j, L1, L2 : integer;
v1, v2, aux : vector;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati m = '); readln (m);
until (m >= 1) and (m <= nmax);
repeat
write ('Dati n = '); readln (n);
until (n >= 1) and (n <= nmax);

writeln;
writeln ('Dati matricea A');
writeln;
for i := 1 to m do
begin
for j := 1 to n do
begin
write ('Dati A[', i,',',j,'] = ');
readln (A[i,j])
end
end;
writeln;
writeln;
for i := 1 to m do
begin
for j := 1 to n do
MATAUX [i, j] := A [i, j] ;
end;
writeln;
writeln ('Dati linia L1 =');
readln (L1);
writeln ('Dati linia L2 = ');
readln (L2);
for j := 1 to n do
begin
aux [j] := MATAUX [L1, j];
MATAUX [L1, j] := MATAUX [L2, j];
MATAUX [L2, j] := aux [j]
end;
writeln;
for i := 1 to m do
begin
for j := 1 to n do
B [i, j] := MATAUX [i, j];
end;
writeln;
writeln ('Matricea A este:');
for i := 1 to m do
begin
for j := 1 to n do
begin
write (A[i,j],' ');
end;
WRITELN
end;

19
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
writeln;
writeln;
writeln ('Matricea B este:');
for i := 1 to m do
begin
for j := 1 to n do
begin
write (B[i,j],' ');
end;
WRITELN
end;
readln
end.

ATESTAT - 2006 - 17 – Se dă o matrice pătratică A de ordinul n. Să se ordoneze crescător


elementele de pe diagonala principală.
Indicaţie: două elemente consecutive de pe diagonala principală sunt:
A [i, i] şi A [i + 1, i + 1].

Rezolvare: Definim procedura ORDONEAZA, bazată pe algoritmul “bubble sort”. Folosim un


vector auxiliar în care preluăm elementele de pe diagonala principală.
Program ATESTAT_2006_17_ORDONARE_ELEMENTE_DIAGONALA_PRINCIPALA ;
const
nmax = 100;
type
vector = array [1..nmax] of integer;
matrice = array [1..nmax, 1..nmax] of integer;
var
x : vector;
m, n, i, j : integer;
A : matrice;
procedure ORDONEAZA (VAR v : vector; m : integer);
var
j, aux, test : integer;
begin
repeat
test := 0;
j := 1;
repeat
if v [j] > v [j + 1] then
begin
aux := v[j];
v [j] := v [j + 1];
v [j + 1] := aux;
test := 1;
end;
j := j + 1
until j > m - 1
until test = 0
end;
Begin { PROGRAM PRINCIPAL }
writeln ('Matricea A este patratica, deci m = n');
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n <= nmax);

20
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
writeln;
writeln ('Dati matricea A');
writeln;
for i := 1 to n do
begin
for j:= 1 to n do
begin
write ('Dati A[', i,',',j, '] = ');
readln (A [i,j])
end
end;
writeln;
for i:= 1 to n do
begin
X[i] := A [i,i] {preluam elementele diagonalei principale in X }
end;
writeln;
ORDONEAZA (X, n);
for i:= 1 to n do
begin
A[i,i] := X [i]
end;
writeln;
writeln ('Matricea A dupa ordonarea diagonalei principale este');

for i := 1 to n do
begin
for j:= 1 to n do
begin
write (A[i,j], ' ');
end;
writeln
end;
readln
end.

ATESTAT - 2006 - 18 – Fie A (m, n) o matrice cu m linii şi n coloane cu elemente întregi şi un


număr întreg nenul “ad” <> 0. Să se calculeze şi să se afişeze:
a). numărul “d” de elemente ale matricii date divizibile cu “ad”.
b). suma “S” a elementelor strict negative de pe fiecare coloană.
Exemplu: Pentru m = 3, n = 4, ad = 2
şi matricea:
–1 2 –3 4
5 –6 7 –8
9 – 10 11 –12
==================
se obţin: d = 6
S= –1 – 16 – 3 – 20

Rezolvare: Testul de divizibilitate se face verificând condiţia: A [i, j] MOD ad = 0.


Program ATESTAT_2006_18_DETERMINARI_IN_MATRICE ;
const
nmax = 30;
type
matrice = array [1..nmax, 1..nmax] of integer;
vector = array [1..nmax] of integer;

21
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
var
A, B : matrice;
ad, d, m,n,i,j : integer;
s : vector; {vector suma}
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati m = ');
readln (m);
until (m >= 1) and (m <= nmax);
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n <= nmax);
writeln;
writeln ('Dati matricea A');
for i := 1 to m do
begin
for j := 1 to n do
begin
write ('Dati A [', i,',',j,'] = ');
readln (A [i,j])
end
end;
writeln;
write ('Dati ad = ');
readln (ad);
d:=0;
for i := 1 to m do
begin
for j := 1 to n do
begin
if A [i,j] MOD ad = 0 then
d := d + 1
end
end;
writeln ('Matricea are ', d,' elemente divizibile cu ', ad);
writeln;
writeln;
for j := 1 to n do
begin
s [j] := 0;
for i := 1 to m do
begin
if A [i,j] < 0 then
s [j] := s [j] + A [i,j]
end;
writeln ('S [', j,' = ', s [j] )
end;
readln
end.

ATESTAT - 2006 - 19 – Fie A o matrice pătratică de ordinul n, cu elemente numere întregi. Să se


afişeze pe ecran rama exterioară a matricii.
Exemplu: Pentru n = 3
şi matricea: –1 2 –3
5 –6 7
9 – 10 11
se va afişa succesiunea de elemente: –1 2 –3 7 11 –10 9 5.

22
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Rezolvare: Afişăm elementele de pe prima linie, ultima coloană, ultima linie (de la sfârşit către
început) şi, în sfârşit, prima coloană (de asemenea, de la sfârşit către început).
Program ATESTAT_2006_19_RAMA_EXTERIOARA_A_MATRICII ;
const
nmax = 100;
type
vector = array [1..nmax] of integer;
matrice = array [1..nmax, 1..nmax] of integer;
var
n, i, j : integer;
A : matrice;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = '); readln (n)
until (n >= 1) and (n <= nmax);
writeln ('Dati matricea A');
writeln;
for i := 1 to n do
begin
for j:= 1 to n do
begin
write ('Dati A[', i,',',j, '] = ');
readln (A [i,j])
end
end;
writeln;
for j := 1 to n do
write ( A[1,j],' '); {elementele de pe prima linie}
for i:= 2 to n do
write ( A [i, n], ' '); {elementele de pe ultima coloana}
for j:= n-1 downto 1 do
write ( A[n, j], ' '); {elementele de pe ultima linie}
for i := n-1 downto 2 do
write ( A[i, 1], ' '); {elementele de pe prima coloana}
readln
end.

ATESTAT - 2006 - 20 – Fie A o matrice pătratică de ordinul n, cu elemente numere întregi. Să se


genereze şi să se afişeze vectorul format din numerele prime de deasupra diagonalei principale.
Exemplu: Pentru n = 5
şi matricea:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7 ====> (2 3 5 19 7)
14 23 22 21 8
13 12 11 10 9
Rezolvare: Construim un vector X cu elementele de deasupra diagonalei principale.
Program ATESTAT_2006_20_NUMERE_PRIME_DE_DEASUPRA_DIAGONALEI_PRINCIPALE ;
const
nmax = 100;
type
vector = array [1..nmax] of integer;
matrice = array [1..nmax, 1..nmax] of integer;

23
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
var
prim, x : vector;
t, p, k, m, n, i, j, nrdiv, divizor: integer;
A : matrice;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = '); readln (n)
until (n >= 1) and (n <= nmax);
writeln ('Dati matricea A');
for i := 1 to n do
begin
for j:= 1 to n do
begin
write ('Dati A[', i,',',j, '] = ');
readln (A [i,j])
end
end;
writeln;
k := 0; {index vector construit cu elemente de deasupra diag. principale}
for i := 1 to n do
begin
for j := 1 to n do
begin
if j > i then
begin
k := k + 1;
x [k] := A [i,j]
end;
end
end;
p := 0; {contor care numara primele gasite in vector}
for t := 1 to k do
begin
nrdiv := 0;
for divizor := 1 to x [t] do
begin
if x [t] MOD divizor = 0 then
nrdiv := nrdiv + 1
end;
if nrdiv <= 2 then
begin
p := p + 1;
prim [p] := x [t]
end;
end;
for i := 1 to p do
begin
writeln ('Prim [', i, '] = ', prim [i] );
end;
readln
end.

ATESTAT - 2006 - 21 – Fie A o matrice pătratică de ordinul n, cu elemente numere întregi. Să se


genereze şi să se afişeze vectorul format din numerele palindroame de sub diagonala secundară.

Rezolvare: Construim un vector cu elementele de sub diagonala secundară.


În vector avem elemente începând cu linia i = 2. Pe această linie avem doar ultimul element (j = n)

24
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Observăm că: pe linia i = 2, indexul de coloană “j” ia o singură valoare j = n, deci jmin = n
pe linia i = 3, indexul de coloană “j” ia valori de la jmin = n-1 la n;
pe linia i = 4, indexul de coloană “j” ia valori de la jmin = n-2 la n;
pe o linie oarecare “i”, indexul de coloană “j” ia valori de la jmin = n – (i – 2) la n.
În concluzie, jmin = n + 2 – i, pentru orice linie “i” între 2 şi n.
Deci, cel mai mic index de coloană, pe o linie “i” de sub diagonala secundară, este jmin = n + 2 - i.
Altfel spus, pe o linie “i” vom avea doar elementele cu indexul de coloană “j’de la n + 2 - i la n.
Program ATESTAT_2006_21_PALINDROAME_DE_SUB_DIAGONALA_SECUNDARA ;
uses CRT;
const
nmax = 100;
TYPE
matrice = array [1..nmax, 1..nmax] of integer;
vector = array [1..nmax] of integer;
var
p, numar, m, n, i, j, t, q : integer;
A : matrice;
x, v : vector;
k : BOOLEAN;
function NRCIFRE (numar : integer) : integer;
var
nr : integer; {retine nr. cifre}
begin
if numar = 0 then
nr := 1
else
begin
nr := 0;
while numar <> 0 do
begin
numar := numar DIV 10;
nr := nr + 1
end
end;
NRCIFRE := nr
end;
function SIMETRIC (numar : integer): boolean;
var
z1, nr : integer;
cif : vector;
begin
nr := NRCIFRE (numar);
z1 := numar;
writeln;
for i := 1 to NRCIFRE (numar) do
begin
cif [ i ] := z1 MOD 10;
{ writeln ('cif [',i,'] = ', cif [i]); }
z1 := z1 DIV 10;
end;

K := TRUE; {presupun "numar" = SIMETRIC}

for i := 1 to nr DIV 2 do
begin
if cif [i] <> cif [nr - i + 1] then
k := FALSE
end;
SIMETRIC := k
end; {sfarsit functie SIMETRIC}

25
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Begin { PROGRAM PRINCIPAL }
clrscr;
repeat
write ('Dati n = '); readln (n)
until (n >= 1) AND (n <= nmax);

writeln ('Dati matricea A');


for i := 1 to n do
begin
for j := 1 to n do
begin
write ('Dati A [',i,',',j,'] = ');
readln (A [i,j])
end
end;
writeln;
writeln ('Matricea A este:');
for i := 1 to n do
begin
for j := 1 to n do
begin
write (a[i,j],' ')
end;
writeln;
end;
writeln;
{construire vector V cu elemente de SUB diagonala secundara}
writeln ('Elementele de SUB diagonala SECUNDARA sunt:');
writeln;
t := 0; {index in vectorul V}
for i:= 2 to n do {pe linia i = 1 nu exista elemente SUB diag sec}
begin
for j := n + 2 - i to n do
begin
t := t + 1;
V [t] := a [i,j];
write ( V [t], ' ' );
end;
end;
writeln ('Numarul Total de elemente SUB diagonala SECUNDARA, t = ', t);
q := 0; {contor pt. elemente simetrice}
writeln;
writeln ('Elemente SIMETRICE SUB diagonala SECUNDARA:');
for p := 1 to t do
{caut in vectorul cu elemente de SUB diag sec}
begin
if SIMETRIC ( v [p] ) = TRUE then
begin
writeln ('V [', p,'] = ', V [p] );
q := q + 1; {am gasit un numar SIMETRIC, il numaram}
x [q] := v [p]; {retin elementul gasit in vectorul X}
{ writeln ( x [q] ); }
end;
end;
writeln ('TOTAL elemente SIMETRICE SUB diagonala SECUNDARA = ', q);
readln
end.

26
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
ATESTAT - 2006 - 22 – Se dau matricile A şi B de tip (m, n) cu elemente numere reale. Să se
genereze şi să se afişeze matricile C şi D de tip (m, n), astfel încât C = A + B, D = A – B, ale căror
elemente sunt definite astfel:
C [i, j] = A [i, j] + B [i, j]
D [i, j] = A [i, j] – B [i, j] pentru orice i = 1 . . m şi j = 1 . . n.
Rezolvare: Matricile C şi D se construiesc foarte simplu în două bucle FOR
Program ATESTAT_2006_22_MATRICI_SUMA_SI_DIFERENTA ;
const
nmax = 30;
type
matrice = array [1..nmax, 1..nmax] of integer;
var
C, D, A, B : matrice;
m, n, i, j : integer;

Begin { PROGRAM PRINCIPAL }


repeat
write ('Dati m = ');
readln (m);
until (m >= 1) and (m <= nmax);

repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n <= nmax);

writeln;
writeln ('Dati matricea A');
for i := 1 to m do
begin
for j := 1 to n do
begin
write ('Dati A [', i,',',j,'] = ');
readln (A [i,j])
end
end;
writeln;

writeln ('Dati matricea B');


for i := 1 to m do
begin
for j := 1 to n do
begin
write ('Dati B [', i,',',j,'] = ');
readln (B [i,j])
end
end;
writeln;

for i := 1 to m do
begin
for j := 1 to n do
begin
C [i, j] := A [i,j] + B [i,j];
end
end;
writeln;

27
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
for i := 1 to m do
begin
for j := 1 to n do
begin
D [i, j] := A [i,j] - B [i,j];
end
end;
writeln;

writeln ('Matricea C este');


for i := 1 to m do
begin
for j := 1 to n do
begin
write ( C [i,j], ' ');
end;
writeln
end;
writeln;

writeln ('Matricea D este');


for i := 1 to m do
begin
for j := 1 to n do
begin
write ( D [i,j], ' ');
end;
writeln;
end;
writeln;
readln
end.

ATESTAT - 2006 - 23 – Pentru un şir de n numere naturale, să se calculeze recursiv cel mai
mare divizor comun al lor.

Rezolvare: Prezentăm două variante:

VARIANTA 1

Definim o funcţie recursivă CMMDC (A, B), în care:


- Dacă B = 0, CMMDC = A (B = 0 este şi condiţia de oprire a funcţiei recursive CMMDC);
- Dacă B <> 0, funcţia CMMDC se va apela cu parametrii B, respectiv R = A MOD B.
Desigur, această funcţie se poate aplica doar celor două numere A şi B. De aceea, vom folosi un
vector auxiliar Caux, în care vom reţine CMMDC temporari. De exemplu:
- După introducerea lui x [ 1 ] , Caux [ 1 ] = x [ 1 ];
- După introducerea lui x [ 2 ], Caux [ 2 ] = CMMDC ( x [ 2 ], Caux [ 1 ] );
- ……………..
- După introducerea lui x [ i ], Caux [ i ] = CMMDC ( x [ i ], Caux [ i - 1 ] );
- ……………..
- După introducerea lui x [ n ], Caux [ n ] = CMMDC ( x [ n ], Caux [ n - 1 ] ).
În final CMMDC = Caux [ n ].

28
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Program ATESTAT_2006_23_CMMDC_RECURSIV_ VARIANTA_1 ;
uses CRT;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
x, Caux : vector; {Caux = vector auxiliar in care se retin CMMDC temporari}
C, n, i : integer;

function CMMDC (A, B : integer) : integer;


var
aux, R : integer;
begin
if A < B then
begin
aux := A;
A := B;
B := aux
end;
IF B = 0 then
CMMDC := A
Else
Begin
R := A MOD B;
CMMDC := CMMDC (B, R) sau CMMDC := CMMDC (B, A MOD B)
End;
End; {sfârsit functie CMMDC}

Begin { PROGRAM PRINCIPAL }


CLRSCR;
write ('Dati nr. de elemente ale vectorului, n = ');
readln (n);
writeln;
write ('Dati primul element, x [ 1 ] = ');
readln (x [ 1] );
Caux [ 1 ] := x [ 1 ];
C := Caux [ 1 ];
writeln ('Pana in acest moment, CMMDC = ', C);
writeln;
for i:= 2 to n do
begin
write ('Dati x [ ', i,' ] = ');
readln (x [i]);
Caux [ i ] := CMMDC ( x [i], Caux [i - 1] );
C := Caux [i];
writeln ('Pana in acest moment, CMMDC = ', C);
writeln;
end;
writeln ('C = ', C);
readln
end.

VARIANTA 2

Pentru un şir de n numere, se poate defini o funcţie recursivă, notată DIVCOM, care calculează
CMMDC prin metoda DEI. Se calculează CMMDC al primei jumătăţi a şirului de numere şi se
reţine rezultatul în variabila C1; apoi se calculează CMMDC al celei de-a doua jumătăţi şi se reţine
rezultatul în variabila C2. În final, se determină CMMDC al C1 şi C2.

29
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Program ATESTAT_2006_23_CMMDC_RECURSIV_VARIANTA_2_DEI ;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
x : vector;
C, n, i : integer;

function DIVCOM (incep, sf : integer): integer;


{ determina CMMDC prin DEI }
VAR
mij, C1, C2 : integer;
begin
if incep = sf then
DIVCOM := x [incep]
else
begin
if sf - incep = 1 then
DIVCOM := CMMDC ( x [incep], x [sf] )
else
begin
mij := (incep + sf) DIV 2;
C1 := DIVCOM (incep, mij);
C2 := DIVCOM (mij + 1, sf);
DIVCOM := CMMDC (C1, C2)
end
end
end; { sf. fct. DIVCOM }

Begin { PROGRAM PRINCIPAL }


write ('Dati nr. de elemente ale vectorului, n = ');
readln (n);

for i:= 1 to n do
begin
write ('Dati x [ ', i,' ] = ');
readln (x [i])
end;
C := DIVCOM (1, n);
writeln ('C = ', C);
readln
end.

ATESTAT - 2006 - 24 – Se citesc pe rând n numere naturale. Folosind o funcţie recursivă,


verificaţi care sunt termeni ai şirului lui Fibonacci şi afişaţi aceşti termeni câte unul pe un rând.

Rezolvare: Definim o funcţie recursivă FIBO, care calculează termenii şirului lui Fibonacci.
Definim încă o funcţie numită VERIFICA, pentru a testa dacă un număr este sau nu termen al
şirului lui Fibonacci.
Program ATESTAT_2006_24_FIBONACCI_RECURSIV ;
VAR
n, i : integer;
x : integer;

30
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
function FIBO (m : integer) : integer;
begin
if (m = 1) or (m=2) then
FIBO := 1
else
FIBO := FIBO (m-1) + FIBO (m-2)
end;
function VERIFICA (y : integer) : boolean;
label
10;
var
j : integer;
k : boolean;
begin
k := FALSE; {presupun ca y nu este element al sirului Fibo}
j := 1;
while FIBO (j) <= y do
begin
if FIBO (j) = y then
begin
k := TRUE;
GOTO 10;
end;
j := j + 1;
end;
10: VERIFICA := k
end;
Begin { PROGRAM PRINCIPAL }
write ('Dati n = ');
readln (n);
writeln ;
writeln ('Dati numerele ');
for i := 1 to n do
begin
write ('x = ');
readln (x);
if VERIFICA (x) = TRUE then
writeln (x,' apartine sirului lui Fibonacci');
end;
readln
end.

ATESTAT - 2006 - 25 – Scrieţi o funcţie recursivă care întoarce oglinditul unui număr natural.
Exemplu, pentru n = 123 se afişează 321

Rezolvare: Notăm cu INVERS funcţia recursivă cerută, în care facem apel la funcţii specifice
datelor de tip STRING: LENGTH şi COPY.
Program ATESTAT_2006_25_INVERSAREA_ELEMENTELOR_UNUI_SIR_CU_FUNCTIE_RECURSIVA ;
uses CRT;
VAR
sir, inv : string;
function INVERS ( s : string ) : string;
begin
if s = '' then
INVERS := ''
else
INVERS := s [ LENGTH (s) ] + INVERS ( COPY (s, 1, LENGTH (s) - 1 ));
end; { sfarsit functie }

31
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Begin { PROGRAM PRINCIPAL }
write ('Introduceti sirul : ');
readln (sir);
writeln;
inv := INVERS ( sir );
writeln ('Sirul invers este : ', inv );
readln
end.

ATESTAT - 2006 - 26 – Să se determine şi să se afişeze reprezentarea unui număr natural dat


într-o bază b, b < 10, folosind o funcţie recursivă (să se transforme un număr natural din baza 10
într-o altă bază de numeraţie “b”, b < 10, folosind o funcţie recursivă).

Rezolvare: A se vedea şi alte variante de rezolvare prezentate la pag. 140 (ATESTAT - 2005 – 28)
Program ATESTAT_2006_26_TRANSFORMARE_BAZA_10_IN_BAZA_b_VARIANTA_RECURSIVA;
var
n: integer;
b: byte;
procedure TRANSFORMA (x: integer; b:byte);
var r: byte;
begin
if x > 0 then
begin
r := x MOD b;
TRANSFORMA (x DIV b, b);
write (r);
end;
end;
Begin { PROGRAM PRINCIPAL }
write ('Dati n = ');
readln (n);
write ('Dati noua baza de numeratie, b = ');
readln (b);
writeln ('Reprezentarea numarului ',n,' in baza ',b,' este:');
TRANSFORMA (n, b);
readln;
end.

ATESTAT - 2006 - 27 – Să se descompună recursiv un număr n  N, transmis ca parametru,


într-o sumă de puteri ale lui 2, puterile fiind în ordine strict descrescătoare.
Exemplu: 14 = 8 + 4 + 2 = 23 + 22 + 21.

Rezolvare: Definim funcţiile PUTERE (pentru ridicare la putere), TRANSFORMA (pentru a


converti un număr zecimal în număr binar) şi NRCIF (pentru numărarea cifrelor unui număr).
Program ATESTAT_2006_27_DESCOMPUNERE_IN_SUMA_DE_PUTERI_ALE_LUI_2;
uses CRT;
const
nmax = 30;
type
vector = array [1..nmax] of integer; {vector cifre numar}
var
c : vector; {vector cifre numar sau vector coeficienti ai
puterilor lui 2}

32
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
zecim, n: integer;
b: byte;
x1, x : integer;
i, nrcifre : integer;
ZECIMAL, BINAR, nr10 : integer; {numarul zecimal}
nr2inversat, nr2 : integer; {numar binar inversat respectiv nr. binar
final}
R : vector; {vector de resturi}
j, k, rest : integer;
function PUTERE (z : integer; m : integer): integer;
var
p, j : integer;
begin
p := 1;
for j := 1 to m do
p := p * z;
PUTERE := p
end;
procedure TRANSFORMA (x:integer; b:byte);
var
r:byte; {r = REST}
begin
i := 0;
if x > 0 then
begin
i := i + 1;
r := x mod b; {b = baza de numeratie}
TRANSFORMA (x DIV b, b);
write (r);
end;
end;
function NRCIF (y : integer) : integer;
var
nr : integer;
begin
if y = 0 then
nrcif := 0
else
NRCIF := 1 + NRCIF (y DIV 10)
end;
Begin { PROGRAM PRINCIPAL }
clrscr;
write ('Dati numarul zecimal = '); readln (nr10);
zecimal := nr10; {conservam valoarea initiala a numarului zecimal}
n := nr10;
write ('Dati baza de numeratie, b = '); readln (b);
writeln ('Reprezentarea numarului ',n,' in baza ',b,' este:');
writeln;
TRANSFORMA (n, b);
writeln;
nrcifre := NRCIF (n);
writeln ('Numarul ', n,' are ', nrcifre,' cifre');
if nr10 = 0 then
begin
ZECIMAL := 0;
i :=1;
R [i] := 0
end
else
begin
i := 0;
ZECIMAL := nr10;

33
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
while nr10 <> 1 do
begin
rest := nr10 MOD 2;
i := i + 1;
R [i] := rest;
nr10 := nr10 DIV 2;
end;
i := i + 1;
r [i] := nr10;
end;
n := i;
writeln; writeln;
write ('Numarul binar echivalent lui ', ZECIMAL,' este ');
for i := n downto 1 do
begin
write ( R[i] );
end;
writeln; writeln;
writeln ('Numarul zecimal ', ZECIMAL,' se poate scrie ca suma puterilor lui
2 astfel:');
writeln;
for i := n downto 2 do
begin
write (r[i] * putere (2, i-1), ' + ');
end;
write (r[i] * putere (2, 0));
readln;
end.

ATESTAT - 2006 - 28 – Scrieţi o funcţie (iterativă sau recursivă) care afişează valoarea unui
polinom în punctul “a”. Coeficienţii polinomului sunt daţi într-un vector.
Astfel, pentru v = (1, 2, 3), avem polinomului P = x2 + 2x + 3.

Rezolvare:
Plecăm de la observaţia că vectorul conţine coeficienţii polinomului în ordine descrescătoare a
puterilor lui x, inclusiv puterea zero. Definim funcţii şi proceduri ale căror roluri rezultă din nume.

Program ATESTAT_2006_28_CALCUL_VALOARE_POLINOM_INTR-UN_PUNCT;
uses Crt;
const
GMaxPol = 20; {Gradul MAXim al unui POLinom}
TYPE
polinom = record
GRAD : 0..GMaxPol;
COEF : array [ 0..GMaxPol ] of real;
end;
VAR
POL1, POL2, POLREZ, PREST : polinom;
NUMAR, A, X, VALOARE : real;
OK, EROARE : boolean;
OPTIUNE, CC : char;
function ValPolinom (var POL : polinom; VALX : real) : real;
var {calcularea Valoarea unui Polinom}
i : integer;
VALPOL : real;
begin
i := POL.GRAD;
VALPOL := POL.COEF [i]; {coeficientul monomului de grad maxim}

34
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
while i > 0 do
begin
i := i - 1;
VALPOL := VALPOL * VALX + POL.COEF [i];
end;{while}
ValPolinom := VALPOL;
end;{function}

function RoundR (NUMAR:real; ZEC:integer) : real;


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

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


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

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


var L, R : integer;
S : string;
begin
Str (NUMAR:20:5,S);
L:=1;
while S [L] = ' ' do
L := L + 1; {sterge spatiile nesemnificative}
R := 20;
while S [R] = '0' do
R := R - 1; {sterge zerourile nesemnificative}
if R = 15 then
R := 14; {sterge punctul situat dupa numerele intregi}
S := Copy (S, L, R-L + 1);

35
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
if SEMN then
begin
if NUMAR >= 0.0 then
S := ' + ' + S;
S := copy (S, 1, 1) + ' ' + copy (S, 2, Length (S) - 1);
end;{if}
NrRealSir:=S;
end;{function}

procedure Titlu (MESAJ: string);


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

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


var i, L, R : integer;
S : string;
begin
WriteLn;
WriteLn (MESAJ,' (de gradul ', POL.GRAD:2,') :');
for i := POL.GRAD downto 0 do
begin
if (i>0) and ( Abs (POL.COEF [i]) = 1.0) then
S := '' {nu afiseaza coeficientul + /- 1, dar va afisa 0}
else
S := NrRealSir ( Abs (POL.COEF [i]), False); {end if}
if POL.COEF[I]<0.0 then
S := ' - ' + S
else
if i < POL.GRAD then
S := ' + ' + S
else
S := ' ' + S; {end if}
Write (S);
if i > 9 then
Write ('x^', i:2)
else
if i > 1 then
Write('x^', i:1)
else
if i = 1 then
Write ('x')
else {i=0}
WriteLn; {end if}
end;{for}
end;{procedure}

Begin { PROGRAM PRINCIPAL }


repeat
CLRSCR; {sterge ecranul si bufferul tastaturii}

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

36
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
writeln;
writeln (' Alegeti una dintre optiunile de mai jos:');
writeln;
WriteLn(' 1 - Pentru a calcula valoarea unui polinom intr-un punct X dat');
WriteLn;
WriteLn(' <Esc> - Pentru Terminarea programului ');
writeln;
Write (' Introduceti optiunea dvs : ');
{citeste OPTIUNEA solicitata}

repeat
until KeyPressed;

OPTIUNE := ReadKey;
if Ord (OPTIUNE)=0 then
CC := ReadKey;
{anuleaza bufferul tastaturii}

while KeyPressed do
begin
CC := ReadKey;
if Ord (CC) = 0 then
CC := ReadKey;
end;{while}
{executa operatia solicitata}
OK:=True;

CASE OPTIUNE of
'1' : begin Titlu ('1. Valoarea unui polinom pentru un X dat');
CitestePol ('Se calculeaza valoarea polinomului',POL1);
WriteLn;
Write ('pentru X = : ');
ReadLn(X);
X := RoundR (X,5); {cel mult 5 zecimale}
VALOARE := ValPolinom (POL1,X);
ClrScr;
AfiseazaPol ('Se calculeaza valoarea polinomului',POL1);
WriteLn;
WriteLn ('pentru X = ', NrRealSir (X,False),' ;');
WriteLn;
WriteLn('Se obtine valoarea ',NrRealSir(VALOARE,False),' !');
end;
else OK:=False;
end;{case}

if OK then
begin
WriteLn;
WriteLn;
Write ('Apasati o tasta oarecare ... ');
repeat
until KeyPressed;
Window (1,1,80,25);
end;{if}

until Ord (OPTIUNE) = 27; {Pana se apasa ESC}


end. {sfarsit program}

37
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
ATESTAT - 2006 - 29 – Se citeşte o valoare n. Să se scrie un subprogram recursiv care să
calculeze valoarea expresiei: E = 2 * 4 * 6 * 8* …* (2 * n)

Rezolvare: Definim funcţia EXPRESIE al cărei algoritm recursiv se aseamănă cu algoritmul de


calculare a lui xn.
Program ATESTAT_2006_29_CALCUL_RECURSIV_EXPRESIE ;
var
E, n : integer;

function EXPRESIE (m : integer) : integer;


begin
IF m = 0 then
EXPRESIE := 1
else
EXPRESIE := 2 * m * EXPRESIE (m - 1)
end;
Begin { PROGRAM PRINCIPAL }
write ('Dati n = ');
readln (n);

E := EXPRESIE (n);
writeln ('E = ', E);
readln
end.

ATESTAT - 2006 - 30 – Se citeşte un număr întreg şi pozitiv. Să se scrie un subprogram recursiv


care să determine suma cifrelor impare ale numărului.

Rezolvare: Definim funcţiile NRCIF (pentru numărarea cifrelor unui întreg) şi SUMAIMPARE
(pentru determinarea sumei cifrelor impare ale unui număr).
Program ATESTAT_2006_30_SUMA_CIFRE_IMPARE ;
const
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
var
S1, x, x1, n, i : integer;
y : vector;
k : BOOLEAN;
function NRCIFRE (z : integer) : integer;
var
m : integer;
begin
if z = 0 then
m := 1
else
begin
m := 0;
while z <> 0 do
begin
z := z DIV 10;
m := m + 1
end
end;
NRCIFRE := m
end;

38
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
function SUMAIMPARE (z : integer) : integer;
var
s, j : integer;
y : vector;
begin
s := 0;
for i := 1 to n do
begin
y [ i ] := x1 MOD 10;
writeln ('y [',i,'] = ', y [i]);
x1 := x1 DIV 10;
end;
for j := 1 to NRCIFRE (z) do
begin
if y [j] MOD 2 <> 0 then
s := s + y [j]
end;
SUMAIMPARE := s;
end;

Begin { PROGRAM PRINCIPAL }


write ('Introduceti un numar natural x = ');
readln (x);
n := NRCIFRE (x);
writeln ('Numarul ',x,' are ',n,' cifre');
writeln;
x1 := x;
s1 := SUMAIMPARE (x);
writeln ('Suma cifrelor impare = ', S1);
readln
end.

ATESTAT - 2006 - 31 – Se citeşte o valoare naturală n. Să se scrie câte un subprogram recursiv


care să calculeze valoarea expresiilor :

E1 = 1 * 4 * 7 * … (3n – 2)
E2 = 2 – 4 + 6 + … + (–1)n + 1 (2 n)

Rezolvare: Funcţiile PUTERE, EXPRESIE1 şi EXPRESIE2 au algoritmi asemănători.


Program ATESTAT_2006_31_CALCUL_RECURSIV_EXPRESII ;
var
E1, E2, n : integer;

function PUTERE (x : integer; m : integer) : integer;


var
p, i : integer;
begin
p := 1;
for i := 1 to m do
begin
p := p * x
end;
PUTERE := p
end;

39
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
function EXPRESIE1 (m : integer) : integer;
begin
if m = 0 then
EXPRESIE1 := 1
else
EXPRESIE1 := (3*m -2) * EXPRESIE1 (m-1)
end;
function EXPRESIE2 (m : integer) : integer;
begin
if m = 0 then
EXPRESIE2 := 0
else
EXPRESIE2 := PUTERE (-1, m + 1) * (2 * m) + EXPRESIE2 (m-1)
end;
Begin { PROGRAM PRINCIPAL }
write ('Datin n = ');
readln (n);
E1 := EXPRESIE1 (n);
E2 := EXPRESIE2 (n);
writeln ('E1 = ', E1);
writeln;
writeln ('E2 = ', E2);
readln
end.

ATESTAT - 2006 - 32 – Se citesc două numere naturale diferite “a” şi” b”. Cerinţe:
Definiţi o funcţie recursivă care calculează valoarea ab.
Definiţi o funcţie recursivă care calculează suma valorilor din intervalul [a, b].

Rezolvare: Funcţiile recursive PUTERE şi SUMA se bazează pe algoritmi cunoscuţi.


Program ATESTAT_2006_32_FUNCTII_RECURSIVE ;
var
a, b, p, s : integer;
function PUTERE (y: integer; m : integer) : integer;
begin
if m = 0 then
PUTERE := 1
else
PUTERE := y * PUTERE (y, m-1)
end;
function SUMA (a1, b1 : integer) : integer;
var
s1, i : integer;
begin
s1 := 0;
for i := a1 to b1 do
s1 := s1 + i;
SUMA := s1
end;
Begin { PROGRAM PRINCIPAL }
write ('Dati a = '); readln (a);
write ('Dati b = '); readln (b);
p := PUTERE (a, b);
writeln ('P = ', P);
s := SUMA (a, b);
writeln ('S = ', s);
readln
end.

40
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
ATESTAT - 2006 - 33 – Se citeşte de la tastatură un vector cu n elemente numere întregi.
Cerinţe:
Scrieţi o funcţie recursivă care calculează produsul elementelor impare din vector.
Scrieţi o funcţie recursivă sau iterativă care determină dacă elementele situate simetric faţă de
mijlocul vectorului sunt egale.

Rezolvare: Funcţia PRODUS este recursivă; funcţia VERIFICĂ este iterativă.


Program ATESTAT_2006_33_FUNCTII_RECURSIVE ;
const
nmax = 30;
type
vector = array [1..nmax] of integer;
var
x, y : vector;
mij, P, n, i, j, impare : integer;
b : boolean;
function PRODUS (m : integer): integer;
begin
if m = 0 then
PRODUS := 1
else
PRODUS := y [m] * PRODUS (m-1)
end;
function VERIFICA (v : vector) : boolean;
begin
b := TRUE;
for i := 1 to n DIV 2 do
begin
if v [i] <> v [n - i + 1] then
b := FALSE
end;
VERIFICA := b;
end;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = '); readln (n)
until (n >= 1) and (n <= nmax);
writeln ('Dati vectorul de intregi');
for i := 1 to n do
begin
write ('Dati X [ ', i,' ] = '); readln (x[i])
end;
impare := 0; {contor pentru numere impare}
for i:= 1 to n do
begin
if x [i] MOD 2 <> 0 then
begin
impare := impare + 1;
y [impare] := x [i]; {construiesc vectorul de impare}
end;
end;
p := PRODUS (impare);
writeln ('P = ', P);
writeln;
if VERIFICA (x) then
writeln ('Vectorul este SIMETRIC')
else
writeln ('Vectorul este NESIMETRIC');
readln
end.

41
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
ATESTAT - 2006 - 34 – Se citeşte de la tastatură un vector cu n elemente numere întregi.
Cerinţe:
Scrieţi o funcţie recursivă care calculează suma elementelor vectorului.
Scrieţi o funcţie recursivă sau iterativă care verifică dacă există cel puţin o valoare pozitivă în
vector.

Rezolvare: Funcţia SUMA este recursivă; funcţia VERIFICĂ este iterativă.


Program ATESTAT_2006_34_FUNCTII_RECURSIVE ;
const
nmax = 30;
type
vector = array [1..nmax] of integer;
var
x, y : vector;
mij, s, n, i, j, k : integer;
b : boolean;

function SUMA (m : integer): integer;


begin
if m = 0 then
SUMA := 0
else
SUMA := x [m] + SUMA (m-1)
end;
function VERIFICA (v : vector) : boolean;
begin
b := FALSE;
for i := 1 to n do
begin
if v [i] > 0 then
b := TRUE
end;
VERIFICA := b;
end;

Begin { PROGRAM PRINCIPAL }


repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n <= nmax);
writeln;
writeln ('Dati vectorul de intregi');
for i := 1 to n do
begin
write ('Dati X [ ', i,' ] = ');
readln (x[i])
end;
writeln;
s := SUMA (n);
writeln ('S = ', S);
writeln;

if VERIFICA (x) then


writeln ('Vectorul are cel putin un element pozitiv')
else
writeln ('Vectorul nu are elemnte pozitive');
readln
end.

42
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
ATESTAT - 2006 - 35 – Fie X un şir de n numere întregi şi k  N, 1 < k < n. Să se scrie o funcţie
care să afişeze şirul astfel încât primele k numere să fie în ordine crescătoare şi restul în ordine
descrescătoare.

Rezolvare: Reţinem numerele introduse în vectorul “x”. Procedurile ORDONEAZACRESCATOR


şi ORDONEAZADESCRESCATOR vor sorta k, respectiv n - k elemente ale vectorului “x”.
Program ATESTAT_2006_35_ORDONARI_ELEMENTE_VECTOR ;
const
nmax = 100;
type
vector = array [1..nmax] of integer;
var
x, y, z : vector;
n, i, k, aux : integer;
a, b : integer;
procedure ORDONEAZACRESCATOR (VAR v : vector; m : integer);
var
j, aux, test : integer;
begin
repeat
test := 0;
j := 1;
repeat
if v [j] > v [j + 1] then
begin
aux := v[j];
v [j] := v [j + 1];
v [j + 1] := aux;
test := 1;
end;
j := j + 1
until j > m - 1
until test = 0
end;
procedure ORDONEAZADESCRESCATOR (VAR v : vector; m : integer);
var
j, aux, test : integer;
begin
repeat
test := 0;
j := 1;
repeat
if v [j] < v [j + 1] then
begin
aux := v[j];
v [j] := v [j + 1];
v [j + 1] := aux;
test := 1;
end;
j := j + 1
until j > m - 1
until test = 0
end;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = '); readln (n)
until (n >= 1) and (n <= nmax);
writeln;
writeln ('Dati vectorul X');
writeln;

43
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
for i:= 1 to n do
begin
write ('Dati X[', i, '] = ');
readln (x[i])
end;
writeln;
write ('Dati pozitia k = ');
readln (k);
for i:= 1 to k do
y [i] := x [i];
for i:= k + 1 to n do
z [i-k] := x [i]
ORDONEAZACRESCATOR (y, k);
ORDONEAZADESCRESCATOR (z, n-k);
for i:= 1 to k do
writeln ('y [',i,'] = ', y[i]);
writeln;
for i:= k + 1 to n do
writeln ('z [',i-k,'] = ', z[i-k]);
readln
end.

ATESTAT - 2006 - 36 – Fie X un şir de n numere întregi. Să se scrie o funcţie care să afişeze şirul
astfel încât numerele să se găsească în ordinea crescătoare a sumei cifrelor (primul număr este cel
care are suma cifrelor cea mai mică).

Rezolvare:
Varianta 1: Definim funcţia NRCIFRE care determină numărul cifrelor unui întreg. După
introducerea şirului de numere, preluate într-un vector X, vom determina, pentru fiecare număr,
numărul de cifre şi vom face suma cifrelor fiecărui număr. Toate cele n sume vor fi reţinute într-un
vector S al sumelor cifrelor numerelor introduse. Ordonăm vectorul S (al sumelor) şi, în funcţie de
ordinea elementelor din S, ordonăm şi vectorul X.
Program ATESTAT_2006_36_ORDONARI_SUMA_CIFRE_VARIANTA_1 ;
const
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
var
aux, x1, n, nr, i, test, j, s1 : integer;
x, v, S : vector;
k : BOOLEAN;
function NRCIFRE (y : integer) : integer;
var
m : integer;
begin
if y = 0 then
m := 1
else
begin
m := 0;
while y <> 0 do
begin
y := y DIV 10;
m := m + 1
end
end;
NRCIFRE := m
end;

44
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n <= nmax);
writeln;
writeln ('Dati vectorul');
for i:= 1 to n do
begin
write ('Dati X [', i, '] = ');
readln (x [i])
end;
for i := 1 to n do
begin
nr := NRCIFRE (x [i] );
x1 := x [i];
S1 := 0;
for j := 1 to nr do
begin
v [ j ] := x1 MOD 10;
s1 := S1 + v [j];
x1 := x1 DIV 10;
end;
s [i] := s1;
end;
repeat
test := 0;
i := 1;
repeat
if S [i] > S [i + 1] then
begin
aux := x [i];
x [i] := x [i + 1];
x [i + 1] := aux;
aux := s [i];
S [i] := S [i + 1];
S [i + 1] := aux;
test := 1
end;
i := i + 1;
until (i > n-1)
until (test = 0);
writeln ('Vectorul X ordonat dupa suma cifrelor');
for i:= 1 to n do
writeln ('X [', i,'] = ', X [i] );
readln
end.

Varianta 2: Observând că la ieşire trebuie să avem un vector ordonat (X) în condiţiile problemei,
vom defini o procedură AFISEAZA, care va avea ca parametru vectorul X. În afară de această
procedură se mai definesc şi procedurile CONSTRUIESTEVECTORSUMECIFRE,
CITESTEVECTOR, ORDONEAZA,.

Program ATESTAT_2006_36_ORDONARI_SUMA_CIFRE_VARIANTA_2;
const
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
var
n : integer;
x, S : vector;

45
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
function NRCIFRE (y : integer) : integer;
var
m : integer;
begin
if y = 0 then
m := 1
else
begin
m := 0;
while y <> 0 do
begin
y := y DIV 10;
m := m + 1
end
end;
NRCIFRE := m
end;

procedure CITESTEVECTOR (VAR V : vector; n : integer);


VAR
i : integer;
begin
for i := 1 to n do
begin
write ('Dati X [', i, '] = ');
readln ( V [i])
end;
end;

procedure CONSTRUIESTEVECTORSUMECIFRE (VAR S : vector; n : integer);


VAR
i, j : integer; {indici}
nr : integer;
x1 : integer;
S1 : integer;
V : vector;
begin
for i := 1 to n do
begin
nr := NRCIFRE (x [i] );
x1 := x [i];
S1 := 0;
for j := 1 to nr do
begin
v [ j ] := x1 MOD 10;
s1 := S1 + v [j];
x1 := x1 DIV 10;
end;
s [i] := s1;
end;
end;

procedure AFISEAZA (VAR V : vector; n : integer);


var
i : integer;
begin
writeln ('Vectorul X ordonat dupa suma cifrelor');
for i := 1 to n do
writeln (' X [', i,'] = ', V [i] );
end;

46
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
procedure ORDONEAZAVECTORSUME ( VAR S : vector; n : integer);
var
test : integer ;
i : integer;
aux : integer;
begin
repeat
test := 0;
i := 1;
repeat
if S [i] > S [i+1] then
begin
aux := x [i];
x [i] := x [i+1];
x [i+1] := aux;
aux := s [i];
S [i] := S [i+1];
S [i+1] := aux;
test := 1
end;
i := i + 1;
until (i > n-1)
until (test = 0);
end;
begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n<= nmax);
writeln;
writeln ('Dati vectorul');
CITESTEVECTOR (X, n);
CONSTRUIESTEVECTORSUMECIFRE ( S, n );
ORDONEAZAVECTORSUME ( S, n);
writeln;
AFISEAZA ( X, n );
readln
end.

ATESTAT - 2006 - 37 – Fie X un şir de n numere întregi. Să se scrie o funcţie care să afişeze şirul
obţinut din şirul dat înlocuind fiecare număr cu oglinditul său.

Rezolvare: Observând că la ieşire trebuie să avem un vector în condiţiile problemei, vom defini o
procedură AFISEAZA, care va avea ca parametru acest vector. Se mai defineşte, de asemenea,
funcţia INVERS, care inversează un număr.
Program ATESTAT_2006_37_NUMERE_INVERSATE ;
uses CRT;
const
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
var
n, i : integer;
numar, eroare : integer;
x, xinv : vector;
sir, inv : string;

47
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
function INVERS ( s : string ) : string;
begin
if s = '' then
INVERS := ''
else
INVERS := s [ LENGTH (s) ] + INVERS ( Copy (s, 1, LENGTH (s) - 1 ));
end; { sfarsit functie }

procedure AFISEAZA (VAR V : vector; n : integer);


var
i : integer;
begin
for i := 1 to n do
writeln (' Xinv [', i,'] = ', V [i] );
end;

Begin { PROGRAM PRINCIPAL }


repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n <= nmax);
writeln;
writeln ('Dati vectorul');
for i:= 1 to n do
begin
write ('Dati X [', i, '] = ');
readln (x [i]);
STR (x[i], sir); { transforma numarul x[i] intr-un sir}
inv := INVERS (sir);
VAL (inv, numar, eroare); { transforma sirul inv intr-un numar }
xinv [i] := numar;
end;
writeln;
writeln ('Vectorul rezultat este:');
AFISEAZA (xinv, n);
readln
end.

ATESTAT - 2006 - 38 – Fie X un şir de n numere întregi. Să se scrie o funcţie care să afişeze şirul
obţinut din şirul dat înlocuind fiecare număr cu suma divizorilor săi.

Rezolvare: Pentru că la ieşire trebuie să avem un vector în condiţiile problemei, vom defini o
procedură AFISEAZA, care va avea ca parametru acest vector. Mai definim, de asemenea, funcţia
SUMADIVIZORI, care determină suma divizorilor unui întreg.
Program ATESTAT_2006_38_SUMA_DIVIZORI ;
uses CRT;
const
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
var
n, i: integer;
x, Sum : vector;

48
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
procedure AFISEAZA (VAR V : vector; n : integer);
var
i : integer;
begin
for i := 1 to n do
writeln (' SUM [', i,'] = ', V [i] );
end;
function SUMADIVIZORI (numar : integer) : integer;
var
S, nrdiv, divizor : integer;
begin
nrdiv := 0;
divizor := 1;
S := 0;
for divizor := 1 to numar do
begin
if numar MOD divizor = 0 then
s := s + divizor
end;
SUMADIVIZORI := S
end;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n <= nmax);
writeln;
writeln ('Dati vectorul');
for i:= 1 to n do
begin
write ('Dati X [', i, '] = ');
readln (x [i]);
SUM [i] := SUMADIVIZORI ( x[i] );
end;
writeln;
writeln ('Vectorul rezultat este:');
AFISEAZA (SUM, n);
readln
end.

ATESTAT - 2006 - 39 – Fie A o matrice pătratică cu n x n numere întregi. Să se scrie o funcţie


care să determine liniile pentru care suma elementelor este un număr prim, afişând şi valoarea
sumei respective.

Rezolvare: Definim funcţia VERIFICANUMAR, care face verificările cerute de problemă pentru
fiecare element al matricei. Funcţia are la bază algoritmul de testare a primalităţii unui întreg.
Program ATESTAT_2006_39_SUMA_ELEMENTE_LINIE_MATRICE ;
const
nmax = 30;
type
matrice = array [1..nmax, 1..nmax] of integer;
vector = array [1..nmax] of integer;
var
A : matrice;
n, i, j : integer;
s : vector; {vector suma}

49
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
function VERIFICANUMAR (numar : integer) : boolean;
var
nrdiv, divizor : integer;
begin
nrdiv := 0;
divizor := 1;
for divizor := 1 to numar do
begin
if numar mod divizor = 0 then
nrdiv := nrdiv + 1
end;
if nrdiv <= 2 then
VERIFICANUMAR := TRUE
else
VERIFICANUMAR := FALSE
end; {sfarsit functie}
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n <= nmax);
writeln ('Dati matricea A');
for i := 1 to n do
begin
for j := 1 to n do
begin
write ('Dati A [', i,',',j,'] = ');
readln (A [i,j])
end
end;
writeln ('Matricea A este');
for i := 1 to n do
begin
for j := 1 to n do
begin
write (A [ i,j] ,' ');
end;
writeln;
end;
writeln;
for i := 1 to n do
begin
s [i] := 0;
for j := 1 to n do
begin
s [i] := s [i] + A [i,j]
end;
if VERIFICANUMAR ( s [i] ) = true then
writeln ('Suma elem. liniei ', i,' este nr. prim ', S [i] )
end;
readln
end.

ATESTAT - 2006 - 40 – Fie A o matrice pătratică cu n x n numere întregi. Să se scrie o funcţie


care să afişeze matricea obţinută prin interschimbarea unor elemente, astfel încât suma
elementelor de pe diagonala principală să fie maximă.

Rezolvare: Pentru că la ieşire trebuie să avem o matrice în condiţiile problemei, vom defini o
procedură AFISEAZA, care va avea ca parametru această matrice.

50
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
Se mai defineşte şi funcţia MAXLINIE, care determină numărul maxim dintr-o linie a matricii.
Program ATESTAT_2006_40_SUMA_ELEMENTE_DIAGONALA_PRINCIPALA ;
const
nmax = 30;
type
matrice = array [1..nmax, 1..nmax] of integer;
vector = array [1..nmax] of integer;
var
A : matrice;
nrlinie, s, n, i, j : integer;
function MAXLINIE ( nrlinie : integer) : integer;
var
max : integer;
begin
max := a [nrlinie, 1];
for j := 2 to n do
begin
if max < a [nrlinie, j] then
max := a [nrlinie, j]
end;
if A [nrlinie, nrlinie] < max then
A [nrlinie, nrlinie] := max;
MAXLINIE := max
end;
procedure AFISEAZA (VAR W : matrice; n : integer);
begin
for i := 1 to n do
begin
for j := 1 to n do
begin
write ( W [ i,j] ,' ');
end;
writeln;
end;
writeln;
end;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n <= nmax);
writeln ('Dati matricea A');
for i := 1 to n do
begin
for j := 1 to n do
begin
write ('Dati A [', i,',',j,'] = ');
readln (A [i,j])
end
end;
writeln ('Matricea A, in forma initiala, este');
AFISEAZA (A, n );
for i:= 1 to n do
a [i, i] := MAXLINIE (i)
writeln ('Matricea A DUPA schimbare este');
AFISEAZA (A, n );
s := 0;
for i := 1 to n do
s := s + a [i,i];
writeln ('Suma elementelor diagonalei principale este = ', s);
readln
end.

51
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
ATESTAT - 2006 - 41 – Fie A o matrice pătratică cu n x n numere întregi. Să se scrie o funcţie
care să afişeze elementele matricei care au proprietatea că sunt formate, fiecare în parte, din cifre
distincte. Stabiliţi apoi dacă elementele de pe diagonala principală formează o secvenţă
palindromică: a 11 = a n n, a 2 2 = a n - 1 n - 1, …

Rezolvare:
Vom defini o procedură AFISEAZAELEMENTECUCIFREDISTINCTE, în interiorul căreia se
fac testele, în condiţiile problemei şi care afişează elementele matricii care au proprietatea cerută. Se
mai defineşte şi funcţia VERIFICA, pentru testarea fiecărui element al matricii. Funcţia VERIFICA
este apelată în interiorul procedurii AFISEAZA. La rândul ei, funcţia VERIFICA face apel la
funcţia NRCIFRE, care numără cifrele unui întreg.
Program ATESTAT_2006_41_SECVENTA_PALINDROMICA_PE_DIAGONALA_PRINCIPALA ;
type
matrice = array [1..100, 1..100] of integer;
vector = array [1..100] of integer;
var
p, q, t, x, x1, n, i, j : integer;
z, diagonala, y : vector;
k : BOOLEAN;
A : matrice;

function NRCIFRE (y : integer) : integer;


var
m : integer;
begin
if y = 0 then
m := 1
else
begin
m := 0;
while y <> 0 do
begin
y := y DIV 10;
m := m + 1
end
end;
NRCIFRE := m
end;

function VERIFICA (numar : integer) : boolean;


begin
x1 := numar;
for p := 1 to NRCIFRE (numar) do
begin
y [ p ] := x1 MOD 10; {vector cu cifrele lui "numar"}
x1 := x1 DIV 10;
end;
k := FALSE; {FALSE - presupun ca "numar" nu are elemente egale}
for p := 1 to NRCIFRE (numar) - 1 do
for q:= p + 1 to NRCIFRE (numar) do
begin
if y [p] = y [q] then
k := TRUE {2 elemente egale}
end;
VERIFICA := k;
end;

52
Probleme rezolvate de programare – Subiecte propuse la ATESTAT
procedure AFISEAZAELEMENTECUCIFREDISTINCTE ;
begin
t := 0; {contor pt. distincte}
for i := 1 to n do
begin
for j := 1 to n do
begin
writeln ('a[',i,',',j,'] = ', a[i,j]);
{ writeln ('nrcifre = ', NRCIFRE ( a[i,j])); }
writeln ('VERIFICA = ', VERIFICA (a[i,j]) );
if VERIFICA ( a[i,j]) = FALSE then
begin
t := t + 1;
writeln ('t = ',t);
z [t] := a [i,j]
end;
end;
end;
for i := 1 to t do
begin
writeln ('z [', i,'] = ', z[i] );
end;
end;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = '); readln (n)
until (n >= 1) and (n <= nmax);
writeln ('Dati matricea A');
for i := 1 to n do
for j := 1 to n do
begin
write ('Dati A [', i,',',j,'] = ');
readln (A [i,j])
end;
AFISEAZAELEMENTECUCIFREDISTINCTE ;

{****************************************************************************}
{ partea a 2-a a problemei }
for i := 1 to n do {transfer diagonala matricei in vectorul "diagonala" }
diagonala [i] := a [i,i];
K := TRUE; {presupun ca exista SIMETRIE pe diagonala principala }
for i := 1 to n DIV 2 do
begin
if diagonala [i] <> diagonala [n - i + 1] then
k := FALSE
end;
if K = TRUE then
writeln ('Elementele diagonalei formeaza o secventa PALINDROMICA')
else
writeln ('Elementele diagonalei NU formeaza o secventa PALINDROMICA');
writeln ('Matricea A este');
for i := 1 to n do
begin
for j := 1 to n do
begin
write (A [ i,j] ,' ');
end;
writeln;
end;
writeln;
readln
end.

53

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