Sunteți pe pagina 1din 128

Probleme rezolvate de programare Subiecte propuse la ATESTAT

2007

ATESTAT - 2007 - 1 Scriei un program care citete de la tastatur 4 iruri de


caractere formate din litere mici. S se creeze fiierul BAC.TXT n care s se scrie
toate perechile de iruri dintre cele citite, perechi de forma x, y n care irul x este
subsecven a irului y sau irul y este subsecven a irului x. Fiecare pereche
determinat se va scrie n fiierul BAC.TXT pe cte un rnd, separat printr-o virgul.
Dac nu exist nici o astfel de pereche, n fiierul BAC.TXT se va scrie textul FR
SOLUIE.
Exemplu:

Se citesc:
ari
Calculator
mari
lat

Se scriu, n BAC.TXT, urmtoarele :


ari, mari
calculator, lat

Rezolvare: Aplicm funcia POS pentru a determina dac un subir aparine unui ir
dat.
Program ATESTAT_2007_1_SUBSECVENTA_SIRURI;
uses CRT;
VAR
vectorsiruri : array [1..4] of STRING;
n, i, j, k, nrperechi : integer;
sir, linie, x, y : STRING;
BAC : text;
Begin { PROGRAM PRINCIPAL }
clrscr;
ASSIGN (BAC, 'C:\BAC.TXT');
REWRITE (BAC);
write ('Dati numarul de siruri (in cazul nostru n =
4), n = ');
readln (n);
for i := 1 to n do
begin
write ('Dati sirul ', i,' = ');
readln (sir);
vectorsiruri [i] := sir;
end;
nrperechi := 0; {contor care numara perechile x, y ce
satisfac cerintele}
for i := 1 to n - 1 do
begin

Probleme rezolvate de programare Subiecte propuse la ATESTAT

for j := i + 1 to n do
begin
if POS (vectorsiruri [i], vectorsiruri [j]) <>
0 then
begin
nrperechi := nrperechi + 1;
write (BAC, vectorsiruri [i], ' ,
',vectorsiruri [j] );
writeln (BAC);
end;
if POS (vectorsiruri [j], vectorsiruri [i]) <>
0 then
begin
nrperechi := nrperechi + 1;
write (BAC, vectorsiruri [j], ' ,
',vectorsiruri [i] );
writeln (BAC);
end;
end;
end;

Probleme rezolvate de programare Subiecte propuse la ATESTAT

RESET (BAC);
IF nrperechi = 0 then
begin
writeln;
writeln ('FARA SOLUTIE')
end
ELSE
begin
while not EOF (BAC) DO
begin
readln (BAC, linie);
writeln (linie)
end;
end;
readln
end.

ATESTAT - 2007 - 2 Scriei un program care citete de la tastatur un numr


natural n
(2 < n < 21) i apoi n linii cu cte n numere ntregi, de cel mult 7
cifre, ce formeaz un tablou bidimensional A. S se afieze pe ecran diferena dintre
suma elementelor de pe diagonala principal i suma elementelor de pe diagonala
secundar a matricei A.
Rezolvare:
Elementele de pe diagonala principal sunt: A [i, i], pentru i = 1 . . n;
Elementele de pe diagonala secundar sunt: A [i, n i + 1] , pentru i = 1 . . n.
Program ATESTAT_2007_2_DIAGONALE_MATRICE;
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;
Dif, Sprincipala, Ssecundara : integer;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = ');
readln (n)
until (n>=1) and (n <=nmax);
writeln;
writeln ('Dati elementele matricii A');
writeln;
5

Probleme rezolvate de programare Subiecte propuse la ATESTAT

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;
Sprincipala := 0;
Ssecundara := 0;
for i:= 1 to n do
begin
Sprincipala := Sprincipala + A [i, i] ;
Ssecundara := Ssecundara + A [i, n i +
1]
end;

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Dif := Sprincipala - Ssecundara;


writeln ('Diferenta dintre sumele celor doua
diagonale este : ', Dif);
readln
end.

ATESTAT - 2007 - 3 Fiierele text X.TXT i Y.TXT conin, fiecare, numele a 7


persoane, cte un nume pe fiecare linie, fiecare nume avnd cel mult 15 litere. tiind
c n fiecare fiier numele sunt memorate n ordine alfabetic, scriei un program care
s citeasc din cele dou fiiere i s afieze pe ecran toate numele din cele dou
fiiere n ordine alfabetic, separate printr-un spaiu.
Exemplu :
Dac fiierul X.TXT are coninutul:
Ana
Dana
Daniel
Ene
Mara
Nae
Paul

iar fiierul Y.TXT are coninutul:


Angie
Cora
Dora
Horia
Oana
Paul
Tibi

se vor afia pe ecran urmtoarele nume:


Ana Angie Cora Dana Daniel Dora Ene Horia Mara Nae Oana Paul Paul Tibi.
Rezolvare: Aplicm un algoritm de interclasare pentru numele citite din cele dou
fiiere.
Program ATESTAT_2007_3_INTERCLASARE ;
uses CRT;
CONST
nmax = 50;
TYPE
vector = array [1..nmax] of STRING;
vectorrezultant = array [1..2*nmax] of STRING;
VAR
n, i, j, k : integer;
A, B : vector;
C : vectorrezultant;
X, Y, Z : TEXT;
linie : STRING;
Begin

{ PROGRAM
clrscr;

PRINCIPAL }

Probleme rezolvate de programare Subiecte propuse la ATESTAT

n := 7;
ASSIGN (X, 'C:\X.txt');
ASSIGN (Y, 'C:\Y.txt');
ASSIGN (Z, 'C:\Z.txt'); {Z = fisierul care va rezulta
prin INTERCLASARE}
rewrite (X);
rewrite (y);
A
A
A
A
A
A
A

[1]
[2]
[3]
[4]
[5]
[6]
[7]

:=
:=
:=
:=
:=
:=
:=

'Ana';
'Dana';
'Daniel';
'Ene';
'Mara';
'Nae';
'Paul';

Probleme rezolvate de programare Subiecte propuse la ATESTAT

B
B
B
B
B
B
B

[1]
[2]
[3]
[4]
[5]
[6]
[7]

:=
:=
:=
:=
:=
:=
:=

'Angie';
'Cora';
'Dora';
'Horia';
'Oana';
'Paul';
'Tibi';

for i := 1 to n do
begin
write (X, A[i] );
writeln (X);
write (Y, B [i] );
writeln (Y);
end;
writeln;
{OPTIONAL, afisam continuturile celor doua fisiere}
writeln ('Fisierul X este:');
RESET (X);
while not EOF (X) do
begin
READLN (X, linie);
writeln (linie);
end;
writeln;
writeln ('Fisierul Y este:');
RESET (Y);
while not EOF (Y) do
begin
READLN (Y, linie);
writeln (linie);
end;
{CITIREA DIN FISIERELE TEXT }
RESET (X);
i:=1;
While NOT EOF (X) do
begin
READLN (X, linie);
A [i] := linie;
i := i + 1
end;
RESET (Y);
j:=1;
While NOT EOF (Y) do
9

Probleme rezolvate de programare Subiecte propuse la ATESTAT

begin
READLN (Y, linie);
B [j] := linie;
j := j + 1
end;
k := 0;
{index in vectorul rezultant C}
i := 1;
j := 1;
WHILE (i <= n) AND (j <= n) do
begin
if A [i] <= B [j] then
begin
k := k + 1;
C [k] := A [i];
i := i + 1;
end

10

Probleme rezolvate de programare Subiecte propuse la ATESTAT

else
begin
k := k + 1;
C [k] := B [j];
j := j + 1;
end;
end;
WHILE i <= n do
begin
k := k + 1;
C [k] := A [i];
i := i + 1
end;
WHILE j <= n do
begin
k := k + 1;
C [k] := B [j];
j := j + 1
end;
writeln;
writeln ('Vectorul rezultat in urma interclasarii
este:');
writeln;
for k := 1 to n + n do
begin
writeln ('C [',k,'] = ', C [k] );
end;
REWRITE (Z); {Generare fisier rezultant}
for k := 1 to n + n DO
begin
WRITE (Z, C[k], ' ' );
end;
writeln;
writeln ('Continutul fisierul rezultant este:');
writeln;
RESET (Z); {Pregatire fisier pentru citire}
While not EOF (Z) do
begin
READ ( Z, linie);
write ( linie);
end;
readln
end.

11

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2007 - 4 Scriei un program care citete de la tastatur un numr


natural n (n <1 00) i un ir cu n numere ntregi din intervalul [100, 999]. Programul
construiete, n mod eficient din punctul de vedere al spaiului de memorie folosit, un
ir de numere rezultat prin nlocuirea fiecrui numr din irul citit cu numrul obinut
prin interschimbarea cifrei unitilor cu cifra sutelor. Numerele din noul ir se vor afia
pe ecran separate printr-un singur spaiu.
Exemplu : Pentru n = 3, dac irul de numere este 123, 904, 500, atunci se vor afia
numerele 321, 409, 5.
Rezolvare:
Vom trata numerele introduse ca pe iruri de caractere.
Fiind necesar inversarea cifrei sutelor cu cifra unitilor, iar numrul avnd doar 3
cifre, vom defini o funcie recursiv INVERS pentru inversarea numrului.
OBSERVAIE: Problema se poate rezolva i cu ajutorul operatorilor DIV i MOD.
Mai simplu este cu ajutorul datelor de tip STRING.

12

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Program ATESTAT_2007_4_INVERSAREA_ELEMENTELOR_UNUI_SIR ;
VAR
n, i : integer;
sir, inv : string;
Y : array [1..100] of 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 }
Begin { PROGRAM PRINCIPAL }
write ('Dati numarul de numere, n = ');
readln (n);
for i := 1 to n do
begin
write ('Dati un nou numar cuprins intre 100
si 999, x = ');
readln (sir);
Y [i] := INVERS (sir);
writeln (sir,'
', INVERS (sir));
end;
writeln;
for i:= 1 to n do
write ( Y[i],' ');
readln
end.

ATESTAT - 2007 - 5 Dou tablouri unidimensionale A i B, cu elementele A1,


A2, , An, respectiv B1, B2, Bn sunt n relaia A <= B dac: A1 <= B1, A2 <=
B2, , An <= Bn. Scriei definia complet a unui subprogram care primete :
- prin intermediul parametrilor A i B, dou tablouri unidimensionale cu acelai
numr de elemente de tip INTEGER;
- prin intermediul parametrului n, numrul de elemente pe care l are fiecare dintre
cele dou tablouri.
Subprogramul returneaz valoare 1, dac A <= B i 0, n caz contrar.
Rezolvare: Definim procedura VERIFICA pentru a face testele cerute de enun.
Program ATESTAT_2007_5_COMPARARE_VECTORI;
uses CRT;
13

Probleme rezolvate de programare Subiecte propuse la ATESTAT

CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
n, i : integer;
A, B : vector;
k : BOOLEAN;
procedure CITESTEVECTOR (VAR X:vector; m : integer);
begin
for i:= 1 to m do
begin
write ('Dati elementul [ ',i,' ] = ');
readln ( X [i])
end;
end;

14

Probleme rezolvate de programare Subiecte propuse la ATESTAT

procedure VERIFICA (A, B: vector; n : integer; VAR K :


boolean);
begin
k := TRUE ; {presupun indeplinita cerinta
problemei }
for i := 1 to n do
begin
IF A [i] > B[i] then
k := FALSE;
end;
end;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n<= nmax);
writeln;
writeln ('Dati vectorul A ');
for i:= 1 to n do
begin
write ('Dati A [', i, '] = ');
readln (A [i]);
end;
writeln;
writeln ('Dati vectorul B ');
for i:= 1 to n do
begin
write ('Dati B [', i, '] = ');
readln (B [i]);
end;
VERIFICA (A, B, n, K);
if k = true then
writeln ('A <= B')
else
writeln ('Cerintele nu sunt indeplinite macar de o
pereche de elemente');
writeln;
If k = true then
writeln ('Rezultatul este = 1')
else
writeln ('Rezultatul este = 0');
readln
end.
15

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2007 - 6 Scriei subprogramul SORTARE care primete, prin


intermediul parametrului A, un tablou unidimensional de numere reale cu 1000 de
componente i, prin intermediul parametrilor i i j, dou numere ntregi, care satisfac
relaia
1 <= i < j <= 1000. Subprogramul realizeaz
ordonarea cresctoare a elementelor Ai, Ai+1, , Aj. Scriei definiia complet a
subprogramului SORTARE.
Rezolvare: Aplicm algoritmul bubble sort n procedura de ordonare.
Program ATESTAT_2007_6_SORTARE_PARTIALA_VECTOR ;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
A : vector;
n, i, j, k, aux : integer;

16

Probleme rezolvate de programare Subiecte propuse la ATESTAT

procedure ORDONEAZACRESCATOR (VAR A : vector; pozi, pozj


: integer);
{pozi = pozitia initiala; pozj = pozitia finala; }
{ordonarea se aplica vectorului intre pozitiile pozi si
pozj }
VAR
k, aux, test : integer;
begin
repeat
test := 0;
k := pozi;
repeat
if A [k] > A [k + 1] then
begin
aux := A[k];
A [k] := A [k+1];
A [k + 1] := aux;
test := 1;
end;
k := k + 1
until k > pozj - 1
until test = 0
end;
Begin { PROGRAM PRINCIPAL }
Writeln ('Dati numarul de elemente');
writeln;
repeat
write ('Dati n = ');
readln (n)
until (n>=1) and (n <=nmax);
writeln;
writeln ('Dati vectorul A');
writeln;
for i:= 1 to n do
begin
write ('Dati a[', i, '] = ');
readln (A [ i ])
end;
writeln;
write ('Dati pozitia i = ');
readln ( i );
write ('Dati pozitia j = ');
readln ( j );
ORDONEAZACRESCATOR ( A, i, j);
17

Probleme rezolvate de programare Subiecte propuse la ATESTAT

writeln;
writeln ('Partea sortata din vectorul A, intre
pozitiile i si j, este:');
for k:= i to j do
begin
writeln ('A [', k,'] = ', A [k]);
end;
readln
end.

ATESTAT - 2007 - 7 Scriei programul care citete de la tastatur elementele


unui vector X cu 1000 de numere reale i care ordoneaz cresctor elementele
vectorului. Programul va afia pe ecran noile valori ale vectorului X, separate ntre ele
printr-un spaiu.
Rezolvare: Aplicm algoritmul bubble sort n procedura de ordonare.

18

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Program ATESTAT_2007_7_ORDONARE_VECTOR ;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
x : vector;
n, i : 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;
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;
ORDONEAZACRESCATOR (X, n);
writeln (Rezultatul sortarii este:);
for i := 1 to n do
begin
19

Probleme rezolvate de programare Subiecte propuse la ATESTAT

write (X[i],'

')

end;
readln
end.

ATESTAT - 2007 - 8 ntr-un sistem de coordonate carteziene se consider punctele


A (x1, y1) i B (x2, y2), unde coordonatele ntregi x1, y1, x2, y2 sunt, n aceast
ordine, urmtorii termeni consecutivi ai irului Fibonacci: fn, fn+1, fn+2, fn+3 (n
natural). Scriei un program care citete de la tastatur un numr natural n (1 <= n <=
20), determin i afieaz pe ecran, cu 3 zecimale, lungimea segmentului AB. Distana
dintre 2 puncte A (x1, y1) i B (x2, y2) se noteaz cu d .
Rezolvare: Definim procedura FIBO pentru a genera termeni ai irului lui Fibonacci.

20

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Program ATESTAT_2007_8_DISTANTA_DINTRE_DOUA_PUNCTE ;
CONST
nmax = 24;
TYPE
vector = array [1..nmax] of integer;
VAR
n, i : integer;
x1,x2,y1,y2 : integer;
d : real;
f : vector;
procedure FIBO (VAR f : vector; m : integer) ;
{ procedura FIBO genereaza termenii sirului lui Fibonacci
}
{ si-i depune in vectorul f }
begin
f [1] := 1;
f [2] := 1;
for i := 3 to m do
begin
f [i] := f [i-1] + f [i-2]
end;
end;
Begin { PROGRAM PRINCIPAL }
write ('Dati n = ');
readln (n);
writeln ;
FIBO (f, n + 3);
x1 := f [n];
x2 := f [n+1];
y1 := f [n+2];
y2 := f [n+3];
{Distanta dintre punctele A si B se calculeaza cu
relatia}
d := SQRT ( SQR (ABS (x1 - x2)) + SQR ( ABS (y1 y2))) ;
writeln ('Distanta dintre A si B este = ', d:10:3 );
readln
end.

ATESTAT - 2007 - 9 ntr-o list simplu nlnuit alocat dinamic, fiecare nod
(element al listei) reine n cmpul DATA un numr natural cu cel mult nou cifre
i n cmpul URM, adresa elementului urmtor din list. Scriei subprogramul
DIVIZOR care, prin parametrul p, primete adresa primului element al listei
21

Probleme rezolvate de programare Subiecte propuse la ATESTAT

descrise mai sus, prin parametrul x, primete un numr natural cu cel mult nou
cifre i care afieaz pe ecran, cte unul pe linie, numerele din list care au exact un
divizor comun cu x. Dac n list nu exist un astfel de element atunci se va afia
mesajul problema nu are soluie.
Rezolvare:
1 - Se determin numrul de elemente din list, prin TRAVERSAREA listei.
2 - Construim un tablou A, n care memorm toi divizorii lui X.
3 - Construim un tablou B, n care memorm toi divizorii unui numr Y din list.
4 - Numrm divizorii comuni din tablourile A i B.
5 - Numrm i numerele din list care au doar un divizor comun cu X, n afar de 1.
5 - Dac exist doar un singur divizor comun, n afar de 1, afim numrul curent Y
din list.
6 - Dac nu gsim nici un numr n list, n conditiile problemei, afim mesajul: NU
EXIST SOLUIE.

22

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Program
ATESTAT_2007_9_DIVIZORI_IN_LISTA_SIMPLU_INLANTUITA_ALOCATA
_DINAMIC ;
uses CRT;
label
10,500;
TYPE
lista = ^nod;
nod = record
cheie:integer;
data: LONGINT;
urm:lista
end;
VECTOR = array [1..1000] of LONGINT;
VAR
q, r, baza, p : lista;
nrdivizori, nrnoduri, n, i, j, k : integer;
X, Y, Z : LONGINT;
data: LONGINT;
c : char;
A, B, V : VECTOR; {vector in care se retin divizorii
gasiti}
procedure CITDATA; { introducere date utile }
begin
readln (data);
end;
procedure TRAVLISTA (VAR nrnoduri : integer);
{ traversare lista in ordinea introducerii }
begin
nrnoduri := 0;
p:=baza;
while p<>nil do
begin
writeln(' Nodul ',p^.cheie,' contine nr. =
',p^.data);
p:=p^.urm;
nrnoduri := nrnoduri + 1;
writeln
end;
end;
procedure DETDIVIZORI (Z : LONGINT; VAR nrdivizori:
integer; VAR V : vector);
{ determina divizorii unui nr Z din lista si-i scrie in
vectorul V }
VAR
nrdiv, diviz : LONGINT;
23

Probleme rezolvate de programare Subiecte propuse la ATESTAT

begin
k := 0; {index in vectorul V - vector cu divizorii
nr. Z }
nrdiv := 0;
for diviz := 2 to Z do
begin
if Z MOD diviz = 0 then
begin
nrdiv := nrdiv + 1;
k := k + 1;
V [ k ] := diviz;
end;
end;
writeln;
nrdivizori := nrdiv;
writeln ('Divizorii lui ', Z, ', in afara de 1,
sunt:');
for i := 1 to k do
begin
writeln ('Divizorul [ ', i, ' ] = ', V [i]
)
end;
writeln;
end;

24

Probleme rezolvate de programare Subiecte propuse la ATESTAT

procedure INSEREAZAPRIMUL ; {introduce primul element - la


incep. listei }
begin
baza:=nil;
new(p);
writeln;
p^.cheie := 1;
p^.urm := baza;
baza:=p;
write ('Dati primul numar al listei, nr. = ');
CITDATA;
p^.data:=data
end;
procedure INSEREAZAREST ; { introduce celelalte elem. - la
sfirs. listei }
begin
new (q);
q^.urm:=nil;
p^.urm:=q;
if j<=n then
begin
q^.cheie := j;
write ('Dati al ', j,'-lea numar al listei, nr =
');
CITDATA;
q^.data:=data;
p:=q
end
else
begin
q^.cheie:=N+1;
{
q^.data:='ACEST NOD NU SE VA STERGE SI NU SE
ADAUGA NIMIC DUPA EL'; }
p:=q
end
end;
procedure CREARELISTA ;
begin
INSEREAZAPRIMUL;
writeln;
if n > 1 then
begin
for j:=2 to n do
begin
INSEREAZAREST;
writeln
25

Probleme rezolvate de programare Subiecte propuse la ATESTAT

end
end;
end;
procedure DIVIZOR (P : LISTA; X : LONGINT; VAR V : vector
);
VAR
divizoricomuni, numere, diviz, nrdiv : integer;
nrdivX, nrdivY : integer; {nr. de divizori ai lui X,
respectiv Y }
begin
writeln(' LISTA ESTE : ');
TRAVLISTA (nrnoduri);
writeln ('Lista are ', nrnoduri,' noduri');
writeln;
write ('Dati numarul X = ');
readln (x);
writeln;
DETDIVIZORI (X, nrdivizori, A);
nrdivX := nrdivizori;
writeln;

26

Probleme rezolvate de programare Subiecte propuse la ATESTAT

writeln ('Numarul X = ', X,' are ', nrdivX,'


divizori');
writeln;
numere := 0 ; {contorul "numere" numara numerele
din lista }
{ce satisfac conditiile problemei}
p:=baza;
while p<>nil do
begin
Y := p^.data;
DETDIVIZORI (Y, nrdivizori, B);
nrdivY := nrdivizori;
writeln ('Nr. Y = ', Y,' are ',nrdivY,'
divizori, in afara de 1');
writeln ('Apasati ENTER');
readln;
CLRSCR;
divizoricomuni := 0; {numara divizorii
comuni ai lui X si Y }
for i := 1 to nrdivX do
begin
for j := 1 to nrdivY do
begin
if A [i] = B [j] then
begin
writeln ('Divizor comun al
numerelor ', X,' si ', Y,'
= ', A[i]);
divizoricomuni :=
divizoricomuni + 1;
end;
end;
end;
if divizoricomuni = 1 then
begin
numere := numere + 1;
V [numere] := B[j];
writeln;
writeln ('Elementul Y = ', Y,' are
',
divizoricomuni, ' divizor
comun cu X = ', X);
end;
p:=p^.urm;
27

Probleme rezolvate de programare Subiecte propuse la ATESTAT

writeln
end; {sfarsit While - traversare lista si
verificare}
writeln;
writeln ('Apasati ENTER');
readln;
if numere = 0 then
writeln ('NU EXISTA SOLUTIE')
else
begin
CLRSCR;
for k := 1 to numere do
writeln ('Numarul ', V [k], ' are un
singur divizor comun
cu ', X,', in afara de
1');
end;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
writeln;
writeln ('SUGESTIE : ');
writeln;
writeln ('Pentru simplitate, rulati programul cu
valorile urmatoare:');
writeln;
writeln ('Lista va avea un numar de noduri, n = 3');
writeln;

28

Probleme rezolvate de programare Subiecte propuse la ATESTAT

writeln ('Nodurile vor contine valorile 111, 222,


333');
writeln;
writeln ('Numarul X = 12');
writeln;
writeln ('Desigur, programul ruleaza corect si cu alte
valori.');
writeln ('Nu va complicati cu un n > 10. ');
writeln ('Dureaza mult, ca sa constatati acelasi lucru
ca si cu n = 3');
writeln;
writeln ('Apasati o tasta');
readln;
CLRSCR;
write ('Dati numarul de noduri, N = ');
readln(n);
writeln;
if n = 0 then
begin
writeln ('LISTA VIDA');
goto 500
end
else
CREARELISTA ;
writeln;
DIVIZOR (p, X, V);
500: readln
end.

ATESTAT - 2007 - 10 Fiierele text F1.txt i F2.txt conin, fiecare, elementele ale
cte unui ir de numere reale A, respective B. Fiierele conin numere distincte scrise
pe o linie i separate printr-un singur spaiu. Scriei un program care citete cele 2
iruri de numere din fiierele F1.txt i F2.txt i care scrie n fiierul F3.txt toate
elementele comune irurilor A i B, pe o linie i separate printr-un spaiu.
Exemplu : Dac fiierele F1.txt i F2.txt au coninuturile :
F1.txt :
10.3, 2.05, 5,
7.12, respectiv
F2.txt :
67, 7.12, 5,
3,
7.33, 9, atunci
F3.txt va conine: 7.12, 5.
Rezolvare: Se aplic procedurile specifice prelucrrii datelor de tip fiier.
Program ATESTAT_2007_10_FISIERE_TEXT_CU_ELEMENTE_COMUNE;
uses CRT;
CONST
29

Probleme rezolvate de programare Subiecte propuse la ATESTAT

nmax = 50;
TYPE
vector = array [1..nmax] of real;
VAR
f1, f2, f3 : TEXT;
ch : CHAR;
poz, k, m, n, i, j, ER : integer; {ER = variabila
EROARE in procedura VAL}
sir, linie1, linie2, linie3 : STRING;
A, B, C : vector;
nr : real;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
ASSIGN (f1, 'C:\f1.txt');
ASSIGN (f2, 'C:\f2.txt');
ASSIGN (f3, 'C:\f3.txt');

30

Probleme rezolvate de programare Subiecte propuse la ATESTAT

rewrite (f1);
rewrite (f2);
rewrite (f3);
linie1 := '10.3 2.05 5 7.12';
linie2 := '67 7.12 5 3 7.33 9';
write (f1, linie1);
write (f2, linie2);
RESET (f1);
RESET (f2);
READ (f1, linie1);
READ (f2, linie2);
i := 0; {index in vectorul A }
sir := '' ; {initializare cu sir vid }
poz := 1;
while poz < LENGTH (linie1) do
begin
IF linie1 [poz] <> ' ' then
sir := sir + linie1 [poz]
ELSE
begin
i := i + 1;
VAL (sir, nr, ER);
A [i] := nr;
sir := '' ;
writeln ('A [ ', i, ' ] = ', A [i]
: 10 : 2 );
end;
poz := poz + 1
end;
sir := sir + linie1 [poz];
i := i + 1;
VAL (sir, nr, ER);
A [i] := nr;
m := i;
writeln ('A [ ', i, ' ] = ', A [i] : 10 : 2 );
writeln;
writeln ('Vectorul A are m = ', m,' elemente');
writeln;
j := 0; {index in vectorul B }
sir := '' ; {initializare cu sir vid }
poz := 1;
while poz < LENGTH (linie2) do
begin
IF linie2 [poz] <> ' ' then
sir := sir + linie2 [poz]
31

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ELSE
begin
j := j + 1;
VAL (sir, nr, ER);
B [j] := nr;
sir := '' ;
writeln ('B [ ', j, ' ] = ', B [j]
: 10 : 2 );
end;
poz := poz + 1
end;
sir := sir + linie2 [poz];
j := j + 1;
VAL (sir, nr, ER);
B [j] := nr;
n := j;
writeln ('B [ ', j, ' ] = ', B [j] : 10 : 2 );
writeln;

32

Probleme rezolvate de programare Subiecte propuse la ATESTAT

writeln ('Vectorul B are n = ', n,' elemente');


writeln;
{VERIFICARE ELEMENTE COMUNE SI SCRIEREA LOR IN F3.txt }
k := 0; {index in vectorul C };
for i := 1 to m do
begin
for j := 1 to n do
begin
if A[i] = B [j] then
begin
k := k + 1;
C [k] := A [i];
writeln;
writeln ('C [ ', k, ' ] =', C
[k] : 10 : 2 );
end
end
end;
for i := 1 to k do
begin
STR ( C[i], sir ); {transformam C [i] in sir
}
write (f3, sir + ' ');
end;
RESET (f3);
writeln;
READ (f3, linie3);
writeln;
writeln ('Fisierul f3.txt contine: ', linie3);
readln
end.

ATESTAT - 2007 - 11 Scriei un program eficient din punct de vedere al duratei de


executare, care afieaz toate numerele naturale formate din cifre identice, mai mari
dect 10 i mai mici dect o valoare dat "n" (n <= 2.000.000.000).
Exemplu : Pentru n = 195, se afieaz : 11, 22, 33, 44, 55, 66, 77, 88, 99, 111.
Rezolvare:
1 - Determinm numrul de cifre ale numrului n.
2 - Folosim un vector V cu un numr de elemente = n.
33

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Program
ATESTAT_2007_11_NUMERE_NATURALE_FORMATE_DIN_CIFRE_IDENTICE
;
uses CRT;
VAR
n : LONGINT;
procedure ZECI (nr : LONGINT);
begin
nr := 11;
while (nr <= n) AND (nr <= 100)
begin
write (nr, ' ');
nr:= nr + 11;
end;
end;

34

do

Probleme rezolvate de programare Subiecte propuse la ATESTAT

procedure SUTE (nr : LONGINT);


begin
nr := 111;
while (nr <= n) AND (nr <= 1000)
do
begin
write (nr, ' ');
nr:= nr + 111;
end;
end;
procedure MII (nr : LONGINT);
begin
nr := 1111;
while (nr <= n) AND (nr <= 10000)
do
begin
write (nr, ' ');
nr:= nr + 1111;
end;
end;
procedure ZECIDEMII (nr : LONGINT);
begin
nr := 11111;
while (nr <= n) AND (nr <= 100000)
do
begin
write (nr, ' ');
nr:= nr + 11111;
end;
end;
procedure SUTEDEMII (nr : LONGINT);
begin
nr := 111111;
while (nr <= n) AND (nr <= 1000000)
do
begin
write (nr, ' ');
nr:= nr + 111111;
end;
end;
procedure MILIOANE (nr : LONGINT);
begin
nr := 1111111;
while (nr <= n) AND (nr <= 10000000)
do
begin
write (nr, ' ');
nr:= nr + 1111111;
end;
end;
procedure ZECIDEMILIOANE (nr : LONGINT);
35

Probleme rezolvate de programare Subiecte propuse la ATESTAT

begin
nr := 11111111;
while (nr <= n) AND (nr <= 100000000) do
begin
write (nr, ' ');
nr:= nr + 11111111;
end;
end;
procedure SUTEDEMILIOANE (nr : LONGINT);
begin
nr := 111111111;
while (nr <= n) AND (nr <= 1000000000) do
begin
write (nr, ' ');
nr:= nr + 111111111;
end;
end;

36

Probleme rezolvate de programare Subiecte propuse la ATESTAT

procedure MILIARDE (nr : LONGINT);


begin
nr := 1111111111;
while (nr <= n) AND (nr <= 1000000000) do
begin
write (nr, ' ');
nr:= nr + 1111111111;
end;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati n = ');
readln (n);
writeln;
if (n > 10) and (n <= 100) then
begin
ZECI (n)
end;
if (n > 100) and (n <= 1000) then
begin
ZECI (n);
writeln;
SUTE (n);
end;
if (n > 1000) and (n <= 10000) then
begin
ZECI (n);
writeln;
SUTE (n);
writeln;
MII (n);
end;
if (n > 10000) and (n <= 100000) then
begin
ZECI (n);
writeln;
SUTE (n);
writeln;
MII (n);
writeln;
ZECIDEMII (n);
end;
if (n > 100000) and (n <= 1000000) then
begin
ZECI (n);
writeln;
SUTE (n);
37

Probleme rezolvate de programare Subiecte propuse la ATESTAT

writeln;
MII (n);
writeln;
ZECIDEMII (n);
writeln;
SUTEDEMII (n);
end;
if (n > 1000000) and (n <= 10000000) then
begin
ZECI (n);
writeln;
SUTE (n);
writeln;
MII (n);
writeln;
ZECIDEMII (n);
writeln;

38

Probleme rezolvate de programare Subiecte propuse la ATESTAT

SUTEDEMII (n);
writeln;
MILIOANE (n);
end;
if (n > 10000000) and (n <= 100000000) then
begin
ZECI (n);
writeln;
SUTE (n);
writeln;
MII (n);
writeln;
ZECIDEMII (n);
writeln;
SUTEDEMII (n);
writeln;
MILIOANE (n);
writeln;
ZECIDEMILIOANE (n);
end;
if (n > 100000000) and (n <= 1000000000) then
begin
ZECI (n);
writeln;
SUTE (n);
writeln;
MII (n);
writeln;
ZECIDEMII (n);
writeln;
SUTEDEMII (n);
writeln;
MILIOANE (n);
writeln;
ZECIDEMILIOANE (n);
writeln;
SUTEDEMILIOANE (n);
end;
if (n > 1000000000) and (n <= 2000000000) then
begin
ZECI (n);
writeln;
SUTE (n);
writeln;
MII (n);
writeln;
39

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ZECIDEMII (n);
writeln;
SUTEDEMII (n);
writeln;
MILIOANE (n);
writeln;
ZECIDEMILIOANE (n);
writeln;
SUTEDEMILIOANE (n);
writeln;
MILIARDE (n);
end;
readln
end.

40

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2007 - 12 Prin asocierea fiecrei litere mici din alfabetul englez
cu un numr egal cu poziia cifrei n alfabet, se poate codifica orice secven de litere
mici cu o secven de numere. Scriei un program care citete din fiierul text
COD.TXT un numr "n" (0 < n < 30000) i, de pe rndul urmtor, o secven de n
litere mici. Folosind un algoritm eficient din punctul de vedere al gestionrii
memoriei, programul va codifica secvena de caractere citit i va scrie pe ecran
numerele asociate, separate prin spaii.
Exemplu : pentru fiierul COD.TXT:
7
bacinfo
se vor afia pe ecran, n ordine, numerele :
2 1 3 9 14 6 15
Rezolvare:
Stiind c literele mici au codurile ASCII ncepnd cu 97,
a = 97, b = 98, c = 99 ...
vom asocia noi coduri literelor mici astfel:
codul lui a = 97 - 96, adic ORD ('a') - 96
codul lui b = 98 - 96, adic ORD ('b') - 96
..............................................
codul lui z = ORD ('z') - 96
Program ATESTAT_2007_12_CODURI_ASCII ;
uses CRT;
CONST
nmax = 100;
VAR
c, literamica : CHAR;
n, ER, nr, i : integer;
COD : array ['a'..'z'] of 1..30;
f : text;
linie1, linie2, sir, sircitit : STRING;
Begin { PROGRAM PRINCIPAL }
ASSIGN ( f, 'C:\COD.txt');
REWRITE (f);
{----------------------------------------------}
{CODIFICARE LITERE MICI}
i := 0;
for literamica := 'a' to 'z' do
begin
i := i + 1;
COD [ literamica ] := ORD (literamica) - 96;
end;
{-----------------------------------------------}
CLRSCR;
41

Probleme rezolvate de programare Subiecte propuse la ATESTAT

write ('Dati un numar de litere, n = ');


readln (n);
STR (n, sir); { transform nr. n in sir pt. a-l scrie
in fisierul COD.txt}
linie1 := sir;
writeln (f, linie1);
writeln;
writeln ('Scrieti un sir de caractere cu lungimea mai
mica de 255');
write ('AICI introduceti textul = ');
readln (linie2);
writeln (f, linie2); { scriem textul in fisierul
COD.txt }

42

Probleme rezolvate de programare Subiecte propuse la ATESTAT

RESET (f);
readln (f, linie1); {linie1 contine doar caractere
numerice }
VAL (linie1, nr, ER); { transform linie1 in numar }
writeln;
sircitit := '' ; {initializare sir citit din fisier
cu sirul vid}
for i := 1 to nr do
begin
read (f, c);
sircitit := sircitit + c;
end;
writeln ('sircitit = ', sircitit);
writeln;
writeln ('Sirul citit codificat numeric este:');
for i := 1 to LENGTH (sircitit) do
begin
write ( COD [sircitit [i] ] , ' ')
end;
readln
end.

ATESTAT - 2007 - 13 Scriei un program care citete de la tastatur trei numere


naturale x, y i k, (1 < x < y < 2.000.000, k<1.000) i afieaz pe ecran cele mai mari k
numere prime din intervalul [x, y], pe una sau mai multe linii separate printr-un
singur spaiu. Dac nu exist k numere prime n intervalul [x, y], se vor afia toate
numerele prime gsite, iar pe linia urmtoare se va afia mesajul S-au gsit mai
puine numere prime: , urmat de numrul acestora.
Exemplu : pentru x = 3, y = 12 i k = 5 se vor afia pe ecran:
3
5
7
11
S-au gsit mai puine numere prime: 4
Rezolvare: Aplicm un algoritm de testare a primalitii unui ntreg.
Program ATESTAT_2007_13_NUMERE_PRIME;
uses CRT;
VAR
x, y, k, i, j : LONGINT ;
nrprime : LONGINT; {contor care numara numerele prime
gasite }
PRIME : array [1..10000] of LONGINT; {vector cu
numerele prime gasite}
43

Probleme rezolvate de programare Subiecte propuse la ATESTAT

nr : LONGINT; {un numar oarecare din intervalul [X, y]


}
function PRIM (z : LONGINT) : BOOLEAN;
VAR
B : boolean;
divizor, nrdiv : LONGINT;
begin
nrdiv := 0;
divizor := 1;
for divizor := 1 to Z do
begin
if Z MOD divizor = 0 then
nrdiv := nrdiv + 1;
end;
if nrdiv <= 2 then
B := TRUE
else
B := FALSE;
PRIM := B
end;

44

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Begin { PROGRAM PRINCIPAL }


CLRSCR;
writeln ('Dati intervalul [x, y] in care se cauta k
numere prime');
writeln;
write ('Dati x = ');
readln (x);
writeln;
write ('Dati y = ');
readln (y);
writeln;
write ('Precizati cate numere prime cautati, k = ');
readln (k);
i := 0;
{index in vectorul de numere prime}
nrprime := 0; {nrprime = contor pentru numerele prime
gasite}
for nr := y DOWNTO x do {Se cere afisarea celor MAI
MARI numere prime}
{Incepem cautarea de la y spre
x}
begin
if PRIM (nr) = TRUE then
begin
i := i + 1;
PRIME [i] := nr;
nrprime := nrprime + 1;
end;
end;
writeln;
if nrprime >= k then
begin
writeln ('S-au gasit ', k,' numere prime');
writeln;
writeln ('Cele ', k,' numere prime sunt:');
for i := 1 to k do
writeln ('Numarul prim ', i,' este = ', PRIME
[i] );
end
else
begin
if (nrprime < k) AND (nrprime > 0) then
begin
writeln ('Nu s-au gasit ', k,' numere prime,
ci doar ',
nrprime,' numere prime');
writeln ('Aceste numere prime sunt:');
for i := nrprime DOWNTO 1 do {le afisam in
ordine CRESCATOARE}
45

Probleme rezolvate de programare Subiecte propuse la ATESTAT

write ( PRIME [i], ' ')


end
else
writeln ('NU s-au gasit numere prime in
intervalul [',x,', ', y,']');
end;
readln
end.

ATESTAT - 2007 - 14 Scriei un program care citete un numr natural nenul par,
"n", n < 100 i apoi "n" numere naturale de cel mult 4 cifre fiecare i determin cea
mai mare sum care poate fi obinut adunnd numai o jumtate din toate numerele
naturale citite. Rezultatul se va afiat pe ecran.
Exemplu : Pentru n = 6 i numerele 728, 10, 103, 44, 1000, 94 se va afia : 1731
(reprezentnd suma : 728 + 103 + 1000).
Rezolvare:
1 - Introducem cele n numere, pe care le reinem n vectorul X.
2 - Ordonm descresctor vectorul X.
3 - Facem suma primelor n / 2 numere X [i].

46

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Program ATESTAT_2007_14_SUMA_NUMERE;
uses CRT;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
n, i, j : integer;
SUMA : integer;
X : vector;
procedure ORDONEAZA (VAR X : vector); {ordonare dupa
algoritmul bubble sort}
VAR
aux, k : integer;
begin
REPEAT
k := 0;
i := 1;
REPEAT
if X [i] < X [i + 1] then
begin
aux := X [i];
X [i] := X [i+1];
X [i+1] := aux;
k := 1
end;
i := i + 1
until (i > n-1)
until (k = 0);
end;
Begin

{ PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati numarul de numere, n = ');
readln (n);
writeln;
writeln ('Introduceti numerele intregi mai mici ca
30.000');
writeln;
for i := 1 to n do
begin
write ('Dati X [ ', i, ' ] = ');
readln ( X [ i ]);
end;
47

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ORDONEAZA ( X );
SUMA := 0;
for i := 1 to n DIV 2 do {se aduna doar jumatate
din numere}
begin
SUMA := SUMA + X [i];
end;
writeln;
writeln ('Suma maxima ce se poate obtine din
numerele citite = ', SUMA);
writeln;
writeln ('Ea rezulta din insumarea numerelor');
for i := 1 to n DIV 2 do
begin
writeln (X [i]);
end;
readln;
end.

48

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2007 - 15 Scriei un program care citete din fiierul text BAC.TXT
cel mult 100 de numere naturale, aflate pe o singur linie, formate din cel mult 9 cifre
fiecare, separate prin spaii i, dintre acestea, le afieaz pe ecran doar pe acelea care
au proprietatea de a fi palindrom. Dac nu se citesc numere palindrom, se va afia pe
ecran valoarea 1. Un numr are proprietatea de a fi palindrom dac citit de la dreapta
la stnga sau de la stnga la dreapta are aceeai valoare. (1221 este palindrom, n timp
ce 1210 nu este palindrom).
Exemplu : dac din fiierul BAC.TXT se citesc numerele : 7341, 8228, 660, 2, 80,
131, atunci pe ecran se vor afia : 8228, 2, 131.
Rezolvare: Pentru a verifica simetria unui numr, trebuie s tim cte cifre are
numrul. Vom defini, deci, funcia NRCIFRE.
De asemenea, definim i procedura EXTRAGENUMEREDINFISIERTEXT, n care
apelm procedura VAL pentru transformarea unui ir ntr-un mumr.
Program ATESTAT_2007_15_PALINDROAME_IN_FISIER_TEXT;
uses CRT;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of LONGINT;
VAR
nr, n, i, t : LONGINT;
f : text;
sir, linie : STRING;
EROARE : integer; {variabila EROARE din apelul
procedurii VAL}
A : vector;
palindroame : integer; {contor care numara
palindroamele gasite}
function NRCIFRE ( nr : LONGINT) : integer;
VAR
m : integer; {contor pt. nr. cifre}
begin
if nr = 0 then
m := 1
else
begin
m := 0;
while nr <> 0 do
begin
nr := nr DIV 10;
m := m + 1
end
end;
49

Probleme rezolvate de programare Subiecte propuse la ATESTAT

NRCIFRE := m
end;
function PALINDROM (nr : LONGINT) : BOOLEAN;
VAR
nrcif : integer;
x1 : LONGINT;
k : BOOLEAN;
y : vector; {y = vector in care scriem cifrele
numarului nr}
begin
nrcif := NRCIFRE ( nr );
x1 := nr;
for i := 1 to nrcif do
begin
y [ i ] := x1 MOD 10;
x1 := x1 DIV 10;
end;

50

Probleme rezolvate de programare Subiecte propuse la ATESTAT

K := TRUE;
for i := 1 to nrcif DIV 2 do
begin
if y[i] <> y [nrcif - i + 1] then {verificam
SIMETRIA}
k := FALSE
end;
PALINDROM := K;
end;
procedure EXTRAGENUMEREDINFISIERTEXT (VAR f: text; VAR A :
vector);
VAR
poz, k : integer;
numar : LONGINT;
begin
RESET ( f );
read (f, linie);
i := 0; { i = index vector A }
sir := ''; {initializare cu sirul vid}
{ In "sir" se citeste cate un numar
din linie}
poz := 1;
while poz <
begin

LENGTH (linie) do
k:= poz;
while linie [ k ] <> ' ' do
begin
sir := sir + linie [ k ];

{concatenare}
k := k + 1;
end;
poz := k;
i := i + 1;
VAL (sir, numar, EROARE); {transforma
sir

in

numar }
A [i ] := numar;

sir :='' ;
poz := poz + 1;
end; {sfarsit WHILE exterior}
end; {sfarsit procedura}
51

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Begin

{ PROGRAM PRINCIPAL }
CLRSCR;
ASSIGN (f, 'C:\BAC.txt');
rewrite (f); {generam fisierul text}
writeln ('Scrieti, in BAC.TXT, n numere naturale cu
cel mult 9 cifre');
writeln;
write ('Cate numere doriti sa introduceti, n = ');
readln (n);
writeln;
linie := ''; {initializare variabila "linie" cu sirul
vid}
{"linie" = un STRING care se va
introduce in fisierul text}
{"linie" va contine cele n numere
separate de spatii}
for i:= 1 to n do
begin
write ('Dati un numar natural, nr = ');
readln ( nr );
STR (nr, sir); {transforma nr in sir, pentru al memora in fisier}
linie := linie + sir + ' '; {construim "linie"
prin concatenare,}
end;
{scriind un
"spatiu" dupa fiecare sir }
writeln (f, linie); {scriem "linie" in fisierul text}
writeln;

52

Probleme rezolvate de programare Subiecte propuse la ATESTAT

writeln ('Fisierul text are continutul:');


RESET (f);
READLN (f, linie);
writeln (linie);
writeln;
{ Din STRING-ul "linie" trebuie s extragem numerele
}
EXTRAGENUMEREDINFISIERTEXT ( f, A );
writeln;
writeln ('Vectorul A, rezultat dupa extragere
este:');
for i := 1 to n do
begin
writeln ('A [ ',i,' ] = ', A[i] );
end;
writeln;
palindroame := 0;
for t := 1 to n do
begin
if PALINDROM ( A [t] ) = TRUE then
begin
palindroame := palindroame + 1;
writeln ('A [ ',t,' ] = ', A [t],' este
PALINDROM');
writeln;
end
else
begin
writeln ('A [ ',t,' ] = ', A [t],' NU
este PALINDROM');
writeln;
end;
end; {sfarsit FOR}
writeln;
writeln ('Apasati ENTER');
readln;
CLRSCR;
if palindroame = 0 then
begin
writeln ('Nu exista palindroame in fisierul
text');
writeln ('Rezultatul cautarii = -1');
end
else
begin
53

Probleme rezolvate de programare Subiecte propuse la ATESTAT

for t := 1 to n do
begin
if PALINDROM ( A [t] ) = TRUE then
begin
writeln ('A [ ',t,' ] = ', A
[t],' este PALINDROM')
end
end;
end;
readln
end.

ATESTAT - 2007 - 16 Scriei un program care citete un numr natural nenul "n" (n
< 100) i un ir de n numere naturale nenule, de cel mult 4 cifre fiecare, i care
afieaz pe ecran irul ordonat cresctor, n funcie de suma cifrelor corespunztoare
fiecrui termen al su. Dac dou numere au aceeai sum a cifrelor, se va afia cel
mai mic dintre ele.
Exemplu :
Pentru n = 5 i numerele 701, 1000, 49, 99, 143, se va afia irul 1000 44 143
701 99.

54

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Rezolvare:
1 - Introducem cele n numere, pe care le reinem n vectorul X.
2 - Pentru fiecare numr X [i], determinm numrul de cifre.
3 - Pentru fiecare numr calculm suma cifrelor i o depunem n vectorul S.
Evident, unui numr X[i] i corespunde un S[i].
4 - Ordonm vectorul S descresctor i, simultan, rearanjm numerele X[i], astfel ca
unui S [i] s-i
corespund acelai X [i].
5 - Facem suma primelor n / 2 numere X [i].
Program ATESTAT_2007_16_SUMA_CIFRE;
uses CRT;
LABEL
100;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
aux1, aux2, t, n, nr, i, j : integer;
SUMA, nrcifre : integer;
S, X, A : vector; {X = vectorul cu toate numerele}
{A = vectorul cu jumatate din numerele
lui X }
{care satisfac conditiile problemei }
CIFRA : vector; {vector care retine cifrele unui numar}
EGALE : BOOLEAN;
function MIN (nr1, nr2 : integer) : integer;
begin
if nr1 < nr2 then
MIN := nr1
else
MIN := nr2
end;
procedure ORDONEAZA (VAR S, X : vector);
VAR
aux1, aux2, k : integer;
begin
REPEAT
k := 0;
i := 1;
REPEAT
if S [i] > S [i + 1] then
begin
aux1 := S [i];
S [i] := S [i+1];
55

Probleme rezolvate de programare Subiecte propuse la ATESTAT

S [i+1] := aux1;
aux2 := X [i];
X [i] := X [i+1];
X [i+1] := aux2;
k := 1
end;
i := i + 1
until (i > n-1)
until (k = 0);
end;
function NRCIF (y : integer) : integer;
VAR
nr : integer;
begin
if y = 0 then
nr := 1

56

Probleme rezolvate de programare Subiecte propuse la ATESTAT

else
begin
nr := 0;
while y <> 0 do
begin
nr := nr + 1;
y := y DIV 10
end;
end;
NRCIF := nr
end;
procedure DETCIFRE (VAR nr : integer; VAR CIFRA : vector);
VAR
numar : integer;
begin
numar := nr;
for j := 1 to NRCIF (numar) do
begin
CIFRA [j] := numar MOD 10;
numar := numar DIV 10;
end;
{
write ('Cifrele lui ', nr, ' sunt ');
for j := NRCIF (nr) DOWNTO 1 do
write ( CIFRA [j], ' ');
}
writeln;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati numarul de numere, n = ');
readln (n);
writeln;
writeln ('Introduceti numerele intregi mai mici ca
30.000');
writeln;
for i := 1 to n do
begin
write ('Dati X [ ', i, ' ] = ');
readln ( X [ i ]);
{ writeln ('X [ ', i, ' ] are ', NRCIF (x [i]
),' cifre'); }
DETCIFRE ( X [i], CIFRA ); {determinam
cifrele lui X [i] }
S [i] := 0;
for j:= 1 to NRCIF ( X[i] ) do
begin
S [i] := S [i] + CIFRA [j];
57

Probleme rezolvate de programare Subiecte propuse la ATESTAT

end;
end;
ORDONEAZA ( S, X);
writeln;
100:
writeln ('Numerele ordonate crescator dupa suma
cifrelor sunt:');
for i := 1 to n do
begin
writeln (' X [ ', i, ' ] = ', X[i],'
S [
', i, ' ] = ', S[i] );
end;
writeln;
EGALE := FALSE;
for i := 1 to n-1 do
begin
if S[i] = S[i+1] then
begin
EGALE := TRUE;
end;
end;

58

Probleme rezolvate de programare Subiecte propuse la ATESTAT

if EGALE = TRUE then


begin
for i := 1 to n-1 do
begin
if S[i] = S[i+1] then
begin
X [i] := MIN ( X[i], X[i+1] );
for t := i to n-1 do
begin
S [t] := S [t+1];
end;
for t:= i+1 to n-1 do
begin
X [t] := X [t+1]
end;
end; { END IF }
end; { END FOR }
n := n - 1;
GOTO 100;
end;
readln;
end.

ATESTAT - 2007 - 17 Pentru orice numr natural nenul "n" definim n factorial
(notat n !) ca fiind produsul tuturor numerelor naturale nenule mai mici sau egale cu n
(n ! = 1*2*3**n). De exemplu : 3 ! = 1*2*3 = 6 ;
5 ! = 1*2*3*4*5 = 120.
Descriei n limbaj natural o metod eficient de determinare a numrului de cifre nule
aflate pe ultimele poziii consecutive ale valorii obinute n urma evalurii lui n !, n
fiind un numr natural de cel mult 4 cifre.
Exemplu: dac n = 10, n ! =3.628.800 rezultatul va fi 2, deoarece 3.628.800 are doi de
0 la sfrit.
Rezolvare:
1 - Calculm n FACTORIAL i memorm rezultatul n variabila F.
2 - Determinm numrul de cifre pentru F.
3 - Determinm cifrele lui F i le memorm ntr-un vector.
4 - Numrm cifrele nule consecutive de la sfritul lui F.
Program ATESTAT_2007_17_NR_CIFRE_NULE_LA_FACTORIAL;
uses CRT;
LABEL
100;
CONST
nmax = 100;
TYPE
59

Probleme rezolvate de programare Subiecte propuse la ATESTAT

vector = array [1..nmax] of integer;


VAR
n, nr, i, j : LONGINT;
NULE, nrcifre : integer;
F : LONGINT;
CIFRA : vector; {vector care retine cifrele unui numar}
function FACTORIAL (m: integer): LONGINT;
VAR
f1 : LONGINT;
i : integer;
begin
f1 := 1;
for i := 1 to m do
f1 := f1 * i;
FACTORIAL := F1
end;

60

Probleme rezolvate de programare Subiecte propuse la ATESTAT

function NRCIF (y : LONGINT) : integer;


VAR
nr : LONGINT;
begin
if y = 0 then
nr := 1
else
begin
nr := 0;
while y <> 0 do
begin
nr := nr + 1;
y := y DIV 10
end;
end;
NRCIF := nr
end;
procedure DETCIFRE (VAR nr : LONGINT; VAR CIFRA : vector);
VAR
numar : LONGINT;
begin
numar := nr;
for j := NRCIF (numar) DOWNTO 1 do
begin
CIFRA [j] := numar MOD 10;
numar := numar DIV 10;
end;
{
write ('Cifrele lui ', nr, ' sunt ');
for j := NRCIF (nr) DOWNTO 1 do
write ( CIFRA [j], ' ');
}
writeln;
end;
Begin

{ PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati numarul n = ');
readln (n);
writeln;
F := FACTORIAL (n);
nrcifre := NRCIF (F);
DETCIFRE ( F, CIFRA ); { determinam cifrele lui F si

}
{ le memoram in vectorul CIFRA
}
NULE := 0; {contor care numara cifrele nule}
61

Probleme rezolvate de programare Subiecte propuse la ATESTAT

for i := NRCIF (F) DOWNTO 1 do


begin
if CIFRA [i] = 0 then
begin
writeln ('CIFRA [ ',i,' ] = ', CIFRA [i]
);
NULE := NULE + 1;
end
else
GOTO 100;
end;
writeln;
100:
writeln ('Nr. ', F,' are ', NULE,' cifre
consecutive NULE la sfarsit');
readln;
end.

62

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2007 - 18 Scriei un program care citete de la tastatur un numr


natural nenul "n" de cel mult 4 cifre i afieaz pe ecran numrul de cifre nenule aflate
la sfritul lui n !.
Rezolvare:
1 Cu funcia FACTORIAL calculm n factorial i memorm rezultatul n variabila
F.
2 - Determinm numrul de cifre pentru F, folosind o funcie NRCIF.
3 Definim o funcie DETCIFRE cu care determinm cifrele lui F i le memorm
ntr-un vector.
4 - Numrm cifrele NEnule consecutive de la sfritul lui F.
Program
ATESTAT_2007_18_NR_CIFRE_NENULE_LA_SFARSIT_FACTORIAL;
uses CRT;
LABEL
100;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
n, nr, i, j : LONGINT;
NENULE, nrcifre : integer;
F : LONGINT;
CIFRA : vector; {vector care retine cifrele unui numar}
function FACTORIAL (m: integer): LONGINT;
VAR
f1 : LONGINT;
i : integer;
begin
f1 := 1;
for i := 1 to m do
f1 := f1 * i;
FACTORIAL := F1
end;
function NRCIF (y : LONGINT) : integer;
VAR
nr : LONGINT;
begin
if y = 0 then
nr := 1
else
begin
nr := 0;
while y <> 0 do
63

Probleme rezolvate de programare Subiecte propuse la ATESTAT

begin
nr := nr + 1;
y := y DIV 10
end;
end;
NRCIF := nr
end;
procedure DETCIFRE (VAR nr : LONGINT; VAR CIFRA : vector);
VAR
numar : LONGINT;
begin
numar := nr;
for j := NRCIF (numar) DOWNTO 1 do
begin
CIFRA [j] := numar MOD 10;
numar := numar DIV 10;
end;

64

Probleme rezolvate de programare Subiecte propuse la ATESTAT

write ('Cifrele numarului ', nr, ' sunt ');


for j := NRCIF (nr) DOWNTO 1 do
write ( CIFRA [j], ' ');
}
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati numarul n = ');
readln (n);
F := FACTORIAL (n);
nrcifre := NRCIF (F);
DETCIFRE ( F, CIFRA ); { determinam cifrele lui F si
}
{ le memoram in vectorul CIFRA
}
NENULE := 0; {contor care numara cifrele nule}
for i := NRCIF (F) DOWNTO 1 do
begin
if CIFRA [i] <> 0 then
begin
writeln ('CIFRA [ ',i,' ] = ', CIFRA [i]
);
NENULE := NENULE + 1;
end
else
GOTO 100;
end;
writeln;
100: writeln ('Nr. ', F,' are ', NENULE,' cifre
consecutive NENULE la sfarsit');
readln;
end.

ATESTAT - 2007 - 19 Scriei un program care citete din fiierul text DATE.IN cel
mult 100 de numere naturale nenule aflate pe o singur linie, formate din cel mult 4
cifre fiecare, separate prin spaii i le scrie n fiierul DATE.OUT, n ordine invers
fa de cea n care au fost citite, pe o singur linie, separate prin spaii. De exemplu,
dac din fiierul DATE.IN se citesc numerele
93 207 15 1982 3762, atunci
coninutul fiierului DATE.OUT va fi : 3762 1982 15 207 93.
Rezolvare: Pentru a extrage numerele din fiierul text DATE.IN, definim procedura
EXTRAGENUMEREDINFISIERTEXT.
Program ATESTAT_2007_19_INVERSAREA_ELEMENTELOR_UNUI_SIR;
uses CRT;
CONST
65

Probleme rezolvate de programare Subiecte propuse la ATESTAT

nmax = 100;
TYPE
vector = array [1..nmax] of LONGINT;
VAR
nr, n, i, t : LONGINT;
sir, linie : STRING;
EROARE : integer; {variabila EROARE din apelul
procedurii VAL}
A : vector;
f1, f2 : TEXT;
linie1, linie2 : STRING; {linii din cele doua fisiere
text}
procedure EXTRAGENUMEREDINFISIERTEXT (VAR f: text; VAR A :
vector);
VAR
poz, k : integer;
numar : LONGINT;
begin
RESET ( f );
read (f, linie);
i := 0; { i = index vector A }
sir := ''; {initializare cu sirul vid}
{ Cu variabila "sir" se citeste cate
un numar din linie}

66

Probleme rezolvate de programare Subiecte propuse la ATESTAT

poz := 1;
while poz <
begin

LENGTH (linie) do
k:= poz;
while linie [ k ] <> ' ' do
begin
sir := sir + linie [ k ];

{concatenare}
k := k + 1;
end;
poz := k;
i := i + 1;
VAL (sir, numar, EROARE); {transf. sir
-> in numar }
A [i ] := numar;
sir :='' ;
poz := poz + 1;
end;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
ASSIGN (f1, 'C:\DATE.IN');
ASSIGN (f2, 'C:\DATE.OUT');
REWRITE (f1); {Generare (initializare) fisiere}
REWRITE (f2);
writeln ('Introduceti, in fisierul DATE.IN, n numere
naturale cu cel mult 4 cifre');
writeln;
write ('Cate numere doriti sa introduceti, n = ');
readln (n);
writeln;
linie1 := ''; {initializare variabila "linie1" cu
sirul vid}
{"linie1" va contine cele n numere separate
de spatii}
{"linie1" = un STRING care se va
introduce in fisierul text}
for i:= 1 to n do
begin
write ('Dati un numar natural, nr = ');
readln ( nr );
STR (nr, sir); {transformam numarul in sir,
pentru a-l memora in
fisierul text}
linie1 := linie1 + sir + ' '; {construim
"linie1" prin concatenare,}
67

Probleme rezolvate de programare Subiecte propuse la ATESTAT

end;
{scriind un
"spatiu" dupa fiecare sir }
writeln (f1, linie1); {scriem "linie1" in fisierul
text DATE.IN}
writeln;
writeln ('Fisierul text DATE.IN are continutul:');
RESET (f1);
READLN (f1, linie1);
writeln ('Linie 1 = ', linie1);
writeln;
{Din STRING-ul "linie1" trebuie sa extragem numerele
}
EXTRAGENUMEREDINFISIERTEXT ( f1, A );
writeln;
{
writeln ('Vectorul A, rezultat dupa extragere numere
din fisierul DATE.IN este:');
for i := 1 to n do
begin
writeln ('A [ ',i,' ] = ', A[i] );
end;
}
writeln;
{Construim linie2 pe care o vom scrie in fisierul
DATE.OUT}
linie2 := ''; {initializare variabila "linie2" cu
sirul vid}
{"linie2" va contine cele n numere separate
de spatii}
{"linie2" = un STRING care se va
introduce in fisierul text}

68

Probleme rezolvate de programare Subiecte propuse la ATESTAT

for i:= n DOWNTO 1 do


begin
STR ( A[i], sir); {transformam numarul A [i] in
sir, }
{pentru a-l memora in
fisierul text}
linie2 := linie2 + sir + ' '; {construim
"linie2" prin concatenare}
end;
{scriind un
"spatiu" dupa fiecare sir }
writeln (f2, linie2); {scriem "linie2" in fisierul
text DATE.OUT}
writeln;
writeln ('Fisierul text DATE.OUT are continutul:');
RESET (f2);
READLN (f2, linie2);
writeln ('Linie 2 = ', linie2);
writeln;
RESET (f1);
RESET (f2);
readln (f1, linie1);
readln (f2, linie2);
writeln;
writeln
('============================================');
writeln;
writeln ('Linie 1 = ', linie1);
writeln;
writeln ('Linie 2 = ', linie2);
writeln;
readln
end.

ATESTAT - 2007 - 20 Scriei un program care citete de pe prima linie a fiierului


text BAC.TXT, cel mult 100 de numere naturale nenule, formate din cel mult 4 cifre
fiecare, separate prin spaii i afieaz pe ecran cifra care apare de cele mai multe
ori n scrierea numerelor citite. Dac exist mai multe cifre care apar de cele mai
multe ori, se vor afia toate acestea.
Exemplu: dac din fiier se citesc numerele : 90, 73, 109, 1248, 2771, atunci se
afieaz 1, 7, deoarece fiecare dintre aceastea apare de cte 3 ori.
Rezolvare: Definim o procedur ORDONEAZA pentru a ordona vectorul
FRECVENTA (n care se rein frecvenele apariiilor cifrelor.
69

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Program
ATESTAT_2007_20_FRECVENTA_APARITIE_CIFRE_IN_FISIER_TEXT;
uses CRT;
TYPE
vectorCIFRE = array ['0'..'9'] of integer;
vector1 = array [0..9] of integer; {tip pt. vector
FRECVENTA aparitii }
vector2 = array [0..9] of '0'..'9';
VAR
cifra : char;
sir, linie : string;
nrmax : integer; {numarul maxim de aparitii ale unei
cifre }
NRCIFRE : vectorCIFRE;
FRECVENTA : vector1;
CIFRE : vector2;
{ vector auxiliar folosit la ordonarea
vectorului FRECVENTA }
nr, n, i : Integer;
f : text;

70

Probleme rezolvate de programare Subiecte propuse la ATESTAT

procedure ORDONEAZA (VAR v1 : vector1; VAR v2 : vector2; m


: integer);
VAR
cif : CHAR ;
j, aux1, aux2, test : integer;
begin
repeat
test := 0;
cif := '0';
j := 0;
repeat
if v1 [j] < v1 [j + 1] then
begin
aux1 := v1 [j];
v1 [j] := v1 [j+1];
v1 [j + 1] := aux1;
cif := v2 [ j ];
v2 [ j ] := v2 [ j + 1 ];
v2 [ j + 1 ] := cif;
test := 1;
end;
j := j + 1 ;
until j > m - 1
until test = 0
end;
procedure ORDONEAZANRCIFRE (VAR v : vectorCIFRE );
VAR
cif : CHAR ;
aux, test : integer;
begin
repeat
test := 0;
cif := '0';
repeat
if v [ cif ] < v [ SUCC (cif ) ] then
begin
aux := v[ cif ];
v [ cif ] := v [ SUCC (cif) ];
v [ SUCC (cif) ] := aux;
test := 1;
end;
cif := SUCC (cif)
until cif > '9'
until test = 0
end;
Begin { PROGRAM PRINCIPAL }
71

Probleme rezolvate de programare Subiecte propuse la ATESTAT

CLRSCR;
ASSIGN (f, 'C:\BAC.txt');
rewrite (f); {generam fisierul text}
writeln ('Introduceti, in fisierul BAC.TXT, n numere
naturale NENULE, de cel
mult 4 cifre');
write ('Cate numere doriti sa introduceti, n = ');
readln (n);
linie := ''; {initializare variabila "linie" cu sirul
vid}
{"linie" = un STRING care se va
introduce in fisierul text}
{"linie" va contine cele n numere
separate de spatii}
for i:= 1 to n do
begin
write ('Dati un numar natural, nr = ');
readln ( nr );
STR (nr, sir); {transformam numarul in sir,
pentru a-l memora in
fisierul text}
linie := linie + sir + ' '; {construim "linie"
prin concatenare}
end;
{scriind un
"spatiu" dupa fiecare sir }

72

Probleme rezolvate de programare Subiecte propuse la ATESTAT

writeln (f, linie); {scriem "linie" in fisierul text}


writeln;
writeln ('Fisierul text are continutul:');
RESET (f);
READLN (f, linie);
writeln (linie);
{ Din STRING-ul "linie" trebuie sa extragem numerele
}
RESET (f);
READLN (f, linie);
for cifra := '0' to '9' do
begin
NRCIFRE [ cifra ] := 0 {initializare
elemente vector NRCIFRE }
end;
CIFRE [0] := '0';
{ Initializare vector CIFRE
}
CIFRE [1] := '1';
CIFRE [2] := '2';
CIFRE [3] := '3';
CIFRE [4] := '4';
CIFRE [5] := '5';
CIFRE [6] := '6';
CIFRE [7] := '7';
CIFRE [8] := '8';
CIFRE [9] := '9';
for i := 1 to LENGTH ( linie ) do
begin
for cifra := '0' to '9' do
begin
if linie [i] = cifra then
NRCIFRE [ cifra ] := NRCIFRE [
cifra ] + 1
end
end;
{
for cifra := '0' to '9' do
begin
writeln ('Cifra ', cifra,' apare in linie de ',
NRCIFRE [cifra],' ori');
end;
}
cifra := '0';
for i := 0 to 9 do
begin
FRECVENTA [i] := NRCIFRE [cifra];
writeln ('Frecventa cifrei ', cifra, ' este = ',
FRECVENTA [i] );
73

Probleme rezolvate de programare Subiecte propuse la ATESTAT

cifra := SUCC (cifra);


{ writeln ('Cifra = ', cifra); }
end;
ORDONEAZA (FRECVENTA, CIFRE, 9);
{
for i := 0 to 9 do
begin
writeln ('FRECVENTA [',i,'] = ', FRECVENTA [i],'
CIFRE [',i,'] = ', CIFRE [i]);
end;
}
nrmax := FRECVENTA [0];
writeln;
writeln ('Cifrele care apar de cele mai multe ori,
adica de ', nrmax,' ori, sunt:');
for i := 0 to 9 do
begin
if FRECVENTA [i] = nrmax then
writeln ('Cifra = ', CIFRE [i] )
end;
readln
end.

74

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2007 - 21 Scriei un program care citete de pe prima linie a fiierului


text BAC.TXT trei numere naturale A, B, C formate din cel mult patru cifre fiecare,
separate prin cte un spaiu i afieaz pe ecran cel mai mare divizor comun al
acestora.
Exemplu: Dac din fiier se citesc numerele: 9, 27, 15, atunci se afieaz 3.
Rezolvare: Definim funciile CMMDC i DIVCOM, care determin CMMDC printrun algoritm iterativ, respectiv prin metoda DEI.
De asemenea, definim procedura EXTRAGENUMEREDINFISIERTEXT.
Program ATESTAT_2007_21_CMMDC_PENTRU_3_NUMERE;
uses CRT;
{ ATENTIE ! Programul se poate aplica i pentru n numere
naturale }
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
A : vector;
C, n, i : integer;
linie, sir : string;
nr, EROARE : integer;
f : TEXT;
function CMMDC (P, Q : integer) : integer;
VAR
aux, R : integer;
begin
if P < Q then
begin
aux := P;
P := Q;
Q := aux
end;
R := P MOD Q;
while R <> 0 do
begin
P := Q;
Q := R;
R := P MOD Q
end;
CMMDC := Q
end; { sf. fct. CMMDC }
function DIVCOM (incep, sf : integer): integer;
{ determina CMMDC prin DEI }
VAR
75

Probleme rezolvate de programare Subiecte propuse la ATESTAT

mij, C1, C2 : integer;


begin
if incep = sf then
DIVCOM := A [incep]
else
begin
if sf - incep = 1 then
DIVCOM := CMMDC ( A [incep], A [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 }

76

Probleme rezolvate de programare Subiecte propuse la ATESTAT

procedure EXTRAGENUMEREDINFISIERTEXT (VAR f: text; VAR A :


vector);
VAR
poz, k : integer;
numar : LONGINT;
begin
RESET ( f );
read (f, linie);
i := 0; { i = index vector A }
sir := ''; {initializare cu sirul vid}
{ In "sir" se citeste cate un numar
din linie}
poz := 1;
while poz < LENGTH (linie) do
begin
k:= poz;
while linie [ k ] <> ' ' do
begin
sir := sir + linie [ k ];
{concatenare}
k := k + 1;
end;
poz := k;
i := i + 1;
VAL (sir, numar, EROARE); {transf. sir
-> in numar }
A [i ] := numar;
sir :='' ;
poz := poz + 1;
end;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
ASSIGN (f, 'C:\BAC.txt');
rewrite (f); {generam fisierul text}
writeln ('Introduceti, in fisierul BAC.TXT, n numere
naturale cu cel mult 9
cifre');
write ('Cate numere doriti sa introduceti, n = ');
readln (n);
linie := ''; {initializare variabila "linie" cu sirul
vid}
{"linie" va contine cele n numere separate de
spatii}
{"linie" = un STRING care se va
introduce in fisierul text}
77

Probleme rezolvate de programare Subiecte propuse la ATESTAT

for i:= 1 to n do
begin
write ('Dati un numar natural, nr = ');
readln ( nr );
STR (nr, sir); {transformam numarul in sir,
pentru a-l memora in fisierul text}
linie := linie + sir + ' '; {construim "linie"
prin concatenare}
end;
{scriind un
"spatiu" dupa fiecare sir }
writeln (f, linie); {scriem "linie" in fisierul text}
writeln ('Fisierul text are continutul:');
RESET (f);
READLN (f, linie);
writeln (linie);
writeln;
{ Din STRING-ul "linie" trebuie sa extragem numerele
}
EXTRAGENUMEREDINFISIERTEXT ( f, A );
{
writeln ('Vectorul A, rezultat dupa extragere
este:');
for i := 1 to n do
begin
writeln ('A [ ',i,' ] = ', A[i] );
end;
}
writeln;
C := DIVCOM (1, n);
writeln ('CMMDC al celor ', n, ' numere este = ', C);
readln
end.

78

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2007 - 22 Se consider programul pseudocod n care s-a folosit notaia


[x] pentru partea ntreag a lui x :
citete n (numr natural)
repet
n <- [n / 10]
pn cnd n < 10
scrie n
Scriei algoritmul pseudocod echivalent cu algoritmul dat, dar care s utilizeze un alt
tip de structur repetitiv.
Rezolvare:
Transformm ciclul cu test final "REPET" - REPEAT
n ciclu cu test iniial "CT TIMP" - WHILE
citete n (numr natural)
ct timp n >= 10 execut
n <- [n / 10]
sfrit structur "ct timp"
scrie n
Program ATESTAT_2007_22_STRUCTURI_ECHIVALENTE;
uses CRT;
VAR
n : integer;
Begin

{ PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati n = ');
readln (n);
writeln;
writeln ('Varianta 1 - Cu REPEAT');
writeln ('==========');
REPEAT
n := n DIV 10
UNTIL n < 10;
writeln ('Dupa rulare, n = ', n);
writeln;
writeln ('Varianta 2 - Cu WHILE');
writeln ('==========');
WHILE n >= 10 do
begin
n := n DIV 10
end;
writeln ('Dupa rulare, n = ', n);
readln

end.
79

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2007 - 23 Se consider programul pseudocod n care s-a folosit notaia


[x] pentru partea ntreag a lui x :
citete n (numr natural)
repet
n <- [n / 10]
pn cnd n < 10
scrie n
Scriei programul pentru algoritmul dat, apoi afiati numrul de repetiii efectuate de
algoritm.

80

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Rezolvare:
Pentru ciclul cu test final "REPET", n program folosim REPEAT.
Folosim un contor "i" care numr repetiiile.
Program ATESTAT_2007_23_PSEUDOCOD;
uses CRT;
VAR
n, i : integer;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati n = ');
readln (n);
writeln;
i := 0;
REPEAT
n := n DIV 10;
i := i + 1
UNTIL n < 10;
writeln ('Dupa rulare, n = ', n);
writeln;
writeln ('Numarul de repetitii, i = ', i);
readln
end.

ATESTAT - 2007 - 24 Se consider subprogramul NRDIVIZORI, care:


- primete, prin intermediul unicului su parametru, A, un numr natural de cel
mult 4 cifre;
- returneaz numrul divizorilor lui A;
Scriei un program care stabilete dac un numr este prim, utiliznd aceast funcie.
Rezolvare: Funcia NRDIVIZORI face testul de primalitate pentru un ntreg A.
Program ATESTAT_2007_24_VERIFICARE_NUMAR_PRIM ;
uses CRT;
VAR
x : integer ;
function NRDIVIZORI ( A : integer) : integer;
VAR
divizor, nrdiv : integer;
begin
nrdiv := 0;
divizor := 1;
for divizor := 1 to A do
begin
if A MOD divizor = 0 then
81

Probleme rezolvate de programare Subiecte propuse la ATESTAT

nrdiv := nrdiv + 1;
end;
NRDIVIZORI := nrdiv;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati un numar natural format din cel mult 4
cifre, x = ');
readln (x);
if NRDIVIZORI (x) <= 2 then
writeln ('Numarul ', x,' este PRIM')
else
writeln ('Numarul ', x,' NU este PRIM');
readln
end.

82

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2007 - 25 Scriei un program care verific dac un numr natural k (1


< k < 100.000) introdus de la tastatur este prim. Programul va afia pe ecran mesajul
DA sau mesajul NU;
Rezolvare: Definim funcia PRIM pentru a testa primalitatea numrului ntreg k.
Program ATESTAT_2007_25_VERIFICARE_NUMAR_PRIM ;
uses CRT;
VAR
k : LONGINT ;
function PRIM (z : LONGINT) : BOOLEAN;
VAR
B : boolean;
divizor, nrdiv : LONGINT;
begin
nrdiv := 0;
divizor := 1;
for divizor := 1 to Z do
begin
if Z MOD divizor = 0 then
nrdiv := nrdiv + 1;
end;
if nrdiv <= 2 then
B := TRUE
else
B := FALSE;
PRIM := B
end; {sfarsit functie}
Begin { PROGRAM PRINCIPAL }
CLRSCR;
writeln ('Introduceti un numar intre 1 si 100.000');
writeln ;
write ('Dati numarul k = ');
readln (k);
if PRIM ( k ) = TRUE then
writeln ('DA, ', k,' este numar PRIM')
else
writeln ('NU, ', k,' NU este numar PRIM');
readln
end.

83

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2007 - 26 Se citesc dou numere naturale A i B nenule, cu maximum


9 cifre. S se verifice dac cele dou numere sunt doi termeni consecutivi ai irului lui
Fibonacci. irul lui Fibonacci are urmtoarea definiie :
f1 = 1
f2 = 1
fi = fi-1 + fi-2, dac i>2.
Exemplu: dac A = 3 i B = 5, atunci se va afia mesajul Da , iar pentru A = 21 i
B = 5 se va afia mesajul Nu .
Rezolvare: Definim funcia recursiv FIBO, pe care o vom apela n funcia
VERIFICA, pentru a face testele cerute de enun.
Program ATESTAT_2007_26_TERMENI_CONSECUTIVI_SIR_FIBONACCI
;
VAR
A, B : LONGINT;

84

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 : LONGINT;
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;
function SUCCESIVE (A, B : LONGINT) : BOOLEAN;
VAR
aux : LONGINT;
begin
if A > B then
begin
aux := A;
A := B;
{ schimbam A si B intre ele,
pentru a avea A < B }
B := aux;
end;
{ A si B sunt doi termeni SUCCESIVI ai sirului
Fibonacci daca: }
{ - atat A, cat si B sunt termeni ai sirului, }
{ - diferenta B - A este, de asemenea, termen al
sirului Fibonacci }
{ - diferenta B - A < A }
85

Probleme rezolvate de programare Subiecte propuse la ATESTAT

if ( VERIFICA (A) = TRUE ) AND ( VERIFICA (B) = TRUE


) then
begin
if ( VERIFICA (B - A) = TRUE ) AND ( B - A <=
A ) then
SUCCESIVE := TRUE
else
SUCCESIVE := FALSE;
end
else
SUCCESIVE := FALSE;
end;
Begin { PROGRAM PRINCIPAL }
write ('Dati A = ');
readln (A);
writeln ;
write ('Dati B = ');
readln (B);
writeln ;
if VERIFICA (A) = TRUE then
writeln (A,' apartine sirului lui Fibonacci')

86

Probleme rezolvate de programare Subiecte propuse la ATESTAT

else
writeln (A,' NU apartine sirului lui Fibonacci');
if VERIFICA (B) = TRUE then
writeln (B,' apartine sirului lui Fibonacci')
else
writeln (B,' NU apartine sirului lui Fibonacci');
writeln;
if SUCCESIVE (A, B) = TRUE then
writeln ('Da, ', A,' si ', B,' sunt termeni
SUCCESIVI ai sirului Finonacci')
else
writeln ('Nu, ', A,' si ', B,' NU sunt termeni
SUCCESIVI ai sirului Finonacci');
readln
end.

ATESTAT - 2007 - 27 Se consider fiierul text DATE.IN care conine exact 899
numere distincte formate fiecare din cte 3 cifre. S se afieze i s se scrie n fiierul
text DATE.OUT numrul format din 3 cifre care lipsete din fiierul DATE.IN.
Rezolvare:
TOATE numerele de 3 cifre sunt cuprinse ntre 100 i 999.
n total sunt 900 de numere, adic 999 - 100 + 1.
Dac n fiierul DATE.IN sunt exact 899 numere DISTINCTE formate din 3 cifre,
rezult c, ntr-adevr, lipsete doar un singur numr.
Prelum toate numerele din fiierul DATE.IN ntr-un vector X.
Ordonm vectorul i cutm numrul care lipsete, tiind c, dup ordonare,
vectorul va conine doar numere consecutive, cu excepia locului unde lipsete
numrul cutat.
Atunci cnd diferena dintre dou numere succesive din vector este > 1, rezult c
n acel loc lipsete nu numr, care nu poate fi dect media aritmetic a celor dou
numere succesive.
Program ATESTAT_2007_27_NUMERE_CONSECUTIVE ;
uses CRT;
CONST
nmax = 1000;
TYPE
vector = array [1..nmax] of integer;
VAR
x, y, i, j, t : integer;
f1, f2 : text;
sir, linie1, linie2 : STRING;
87

Probleme rezolvate de programare Subiecte propuse la ATESTAT

EROARE : integer; {variabila EROARE din apelul


procedurii VAL}
A : vector;
procedure EXTRAGENUMEREDINFISIERTEXT (VAR f: text; VAR A :
vector);
VAR
c : CHAR;
poz, k : integer;
numar : integer;
nrcaractere : integer;
begin
RESET ( f );
i := 0; { i = index vector A }
nrcaractere := 0; {contor care numara toate
caracterele din fisier }
while not EOF (f) do
begin
read (f, c);
nrcaractere := nrcaractere + 1
end;

88

Probleme rezolvate de programare Subiecte propuse la ATESTAT

writeln;
writeln ('Fisierul DATE.IN are ', nrcaractere,'
caractere');
writeln;
RESET (f);
poz := 1;
sir := ''; {initializare cu sirul vid}
{ In "sir" se citeste cate un numar
din fisier}
while not EOF (f) do
{ while poz < nrcaractere do }
begin
READ (f, c);
k:= poz;
while c <> ' ' do
begin
sir := sir + c ; {concatenare}
READ (f, c);
end;
poz := k;
i := i + 1;
VAL (sir, numar, EROARE); {transf. sir
-> in numar }
A [i ] := numar;
sir :='' ;
poz := poz + 1;
end;
end;
procedure AFISAREVECTOR ;
begin
for i := 1 to 200 do
begin
write ( A[i],'
' );
end;
writeln;
writeln ('Apasati ENTER');
readln;
for i := 201 to 400 do
begin
write ( A[i],'
' );
end;
writeln;
writeln ('Apasati ENTER');
readln;
for i := 401 to 600 do
begin
89

Probleme rezolvate de programare Subiecte propuse la ATESTAT

write ( A[i],'
' );
end;
writeln;
writeln ('Apasati ENTER');
readln;
for i := 601 to 800 do
begin
write ( A[i],'
' );
end;
writeln ('Apasati ENTER');
readln;
for i := 801 to 899 do
begin
write ( A[i],'
' );
end;
writeln ('Apasati ENTER');
readln;
end;

90

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Begin

{ PROGRAM PRINCIPAL }
CLRSCR;
ASSIGN (f1, 'C:\DATE.IN');
ASSIGN (f2, 'C:\DATE.OUT');
rewrite (f1); {generam fisierul text f1}
rewrite (f2); {generam fisierul text f2}
{ Introducem cele 899 numere din 3 cifre in fisierul
DATE.IN }
{ mai putin un numar, de exemplu x = 456 }
write ('Ce numar de 3 cifer doriti sa lipseasca ?
Dati numarul x = ');
readln (x);
sir := ''; {initializare cu sirul vid}
for i := 100 to x -1 do
begin
STR (i, sir);
{transformam numarul "i" in sir, pentru a-l
memora in fisierul text}
sir := sir + ' '; {construim "sir" prin
concatenare}
{scriind un "spatiu" dupa
fiecare sir }
write (f1, sir);
end;
for i := x + 1 to 999 do
begin
STR (i, sir);
{transformam numarul "i" in sir, pentru a-l
memora in fisierul text}
sir := sir + ' '; {construim "sir" prin
concatenare}
{scriind un "spatiu" dupa
fiecare sir }
write (f1, sir);
end;
EXTRAGENUMEREDINFISIERTEXT ( f1, A );
writeln ('Vectorul A, rezultat dupa extragere
este:');
AFISAREVECTOR
for i := 1 to
begin
if A
y
end;

;
898 do
[i + 1] - A [i] > 1 then
:= ( A[i] + A [i+1] ) DIV 2
91

Probleme rezolvate de programare Subiecte propuse la ATESTAT

writeln ('Numarul care lipseste este y = ', y);


readln
end.

ATESTAT - 2007 - 28 Se citesc dou numere naturale nenule m i n (2 < m, n <


20). S se scrie programul care construiete n memorie o matrice A cu m linii i n
coloane cu proprietatea c elementul A [i, j] este egal cel mai mare divizor comun
dintre numerele i i j. Matricea se va afia pe ecran, cte o linie a matricei pe cte o
linie a ecranului, elementele fiecrei linii fiind separate prin spaii.
Exemplu: pentru m = 3 i n = 4, se va afia matricea urmtoare :
1 1 1 1
1 2 1 2
1 1 3 1
Rezolvare: Pentru generarea matricii A, definim funcia CMMDC.
Program ATESTAT_2007_28_MATRICE_CU_CMMDC_AL_INDECSILOR ;
CONST
nmax = 20;
TYPE
matrice = array [1..nmax, 1..nmax] of integer;

92

Probleme rezolvate de programare Subiecte propuse la ATESTAT

VAR
A : matrice;
m, n, i, j : 1..20;
function CMMDC ( X, Y : integer) : integer;
VAR
aux, R : integer;
begin
if X < Y then
begin
aux := X;
X := Y;
Y := aux
end;
R := X MOD Y;
while R <> 0 do
begin
X := Y;
Y := R;
R := X MOD Y
end;
CMMDC := Y
end; { sf. fct. CMMDC }
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;
{ Generam elementele matricii A }
for i := 1 to m do
begin
for j := 1 to n do
begin
A [ i, j ] := CMMDC (i, j);
end
end;
writeln ('Matricea A este:');
for i := 1 to m do
begin
for j := 1 to n do
begin
write ( A [ i, j ] , ' ');
93

Probleme rezolvate de programare Subiecte propuse la ATESTAT

end ;
writeln;
end;
readln
end.

ATESTAT - 2007 - 29 Se citete de la tastatur un numr natural nenul "n" (n <


1.000). Scriei un program care construiete fiierul text BAC.TXT, care conine pe
prima linie toi divizorii lui n n ordine strict descresctoare. Divizorii vor fi separai
prin spaiu.
Exemplu: dac n = 10, atunci fiierul BAC.TXT va conine: 10, 5, 2, 1.
Rezolvare: Aplicm un algoritm de determinare a divizorilor unui ntreg, precum i un
algoritm
de
sortare.

94

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Program
ATESTAT_2007_29_DIVIZORII_UNUI_NUMAR_IN_ORDINE_DESCRESCATO
ARE ;
uses CRT;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
n, nr, i, j, s1 : integer;
divizor, nrdiv, EROARE : integer;
x, A : vector;
f : text;
sir, linie : STRING;
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;
procedure EXTRAGENUMEREDINFISIERTEXT (VAR f: text; VAR A :
vector);
VAR
poz, k : integer;
numar : LONGINT;
begin
RESET ( f );
read (f, linie);
i := 0; { i = index vector A }
sir := ''; {initializare cu sirul vid}
95

Probleme rezolvate de programare Subiecte propuse la ATESTAT

{ In "sir" se citeste cate un numar


din linie}
poz := 1;
while poz <
begin

LENGTH (linie) do
k:= poz;
while linie [ k ] <> ' ' do
begin
sir := sir + linie [ k ];

{concatenare}
k := k + 1;
end;
poz := k;
i := i + 1;
VAL (sir, numar, EROARE); {transf. sir
-> in numar }
A [i ] := numar;
sir :='' ;
poz := poz + 1;
end; {END While }
end; {END Procedura }

96

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Begin

{ PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati numarul n = ');
readln (n);
i := 0 ; {index pt. vectorul X in care scriu
divizorii lui n }
nrdiv := 0 ; {contor care numara divizorii lui n }
for divizor := 1 to n do
begin
if n MOD divizor = 0 then
begin
nrdiv := nrdiv + 1;
i := i + 1;
X [i] := divizor
end;
end;
ORDONEAZADESCRESCATOR ( X , nrdiv);
writeln ('Divizorii lui ', n,', ordonati
descrescator, sunt:');
writeln;
for i:= 1 to nrdiv do
begin
write ( x [i],' ' );
end;
writeln;
ASSIGN (f, 'C:\BAC.txt');
rewrite (f); {generam fisierul text}
linie := ''; {initializare variabila "linie" cu sirul
vid}
{"linie" = un STRING care se va
introduce in fisierul text}
{"linie" va contine cele n numere
separate de spatii}
for i:= 1 to nrdiv do
begin
STR ( X [i], sir);
{transforma numarul X [i] in sir, pentru a-l
memora in fisierul text}
linie := linie + sir + ' '; {construim "linie"
prin concatenare}
end;
{scriind un
"spatiu" dupa fiecare sir }
writeln (f, linie); {scriem "linie" in fisierul text}
writeln;
writeln ('Fisierul text are continutul:');
RESET (f);
97

Probleme rezolvate de programare Subiecte propuse la ATESTAT

READLN (f, linie);


writeln (linie);
writeln;
{ Din STRING-ul "linie" trebuie sa extragem numerele
}
EXTRAGENUMEREDINFISIERTEXT ( f, A );
writeln;
writeln ('Vectorul A, rezultat dupa extragere numere
din fisier, este:');
for i := 1 to nrdiv do
begin
writeln ('A [ ',i,' ] = ', A[i] );
end;
readln
end.

ATESTAT - 2007 - 30 Se consider fiierul text CUVINTE.IN, care conine pe


prima linie un numr natural nenul n (n <= 100), iar pe urmtoarele n linii cte un
cuvnt cu maximum 10 caractere. S se afieze pe ecran cuvintele din fiierul dat care
sunt palindroame. n cazul n care nu exist nici un cuvnt palindrom, se va afia
mesajul NU. Un cuvnt este palindrom dac citindu-l de la dreapta la stnga sau de
la stnga la dreapta se obine acelai cuvnt.
Exemplu: dac fiierul CUVINTE.IN are urmtorul coninut :
3
sas
creion
Ion

98

Probleme rezolvate de programare Subiecte propuse la ATESTAT

atunci se va afia pe ecran :


sas
Rezolvare: Definim funcia PALINDROM, pentru a testa simetria unui ntreg.
Program ATESTAT_2007_30_PALINDROAME_IN_FISIER_TEXT;
uses CRT;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of STRING;
VAR
nr, n, i, t : integer;
f : text;
cuvant, sir, linie : STRING;
EROARE : integer; {variabila EROARE din apelul
procedurii VAL}
A : vector;
palindroame : integer; {contor care numara
palindroamele gasite}
function PALINDROM ( sir : STRING) : BOOLEAN; {verifica
sirul este palindrom}
VAR
k : BOOLEAN;
begin
K := TRUE;
for i := 1 to LENGTH (sir) DIV 2 do
begin
if sir [i] <> sir [ LENGTH (sir) - i + 1] then
{verificam SIMETRIA}
k := FALSE
end;
PALINDROM := K;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
ASSIGN (f, 'C:\CUVINTE.IN');
REWRITE (f); {generam fisierul text}
writeln ('Introduceti, in fisierul CUVINTE.IN, n
CUVINTE cu cel mult 10 caractere');
writeln;
write ('Cate cuvinte doriti sa introduceti, n = ');
readln (n);
writeln;
STR (n, sir); {transformam numarul n in sir, inainte
de a-l scrie in fisier}
99

Probleme rezolvate de programare Subiecte propuse la ATESTAT

writeln (f, sir); {scriem n in fisierul text pe prima


linie }
{scriem cele n cuvinte in fisierul text }
for i:= 1 to n do
begin
write ('Dati cuvantul nr ', i,' = ');
readln ( cuvant );
writeln (f, cuvant);
{ folosim "writeln" si NU "write"
pentru a scrie }
{ fiecare cuvant pe cate o linie }
end;
writeln;
writeln ('Fisierul text are continutul:');
RESET (f);
readln (f, linie); {citim prima linie, care contine
numarul n }
i := 0; {contor - optional, pt. numarare linii din
fisierul text }
while not EOF (f) do
begin
READLN (f, linie); {se citesc urmatoarele linii
din fisier}
i := i + 1;
A [i] := linie;
writeln ('Linia ', i,' = ', linie);
end;

100

Probleme rezolvate de programare Subiecte propuse la ATESTAT

writeln ('Vectorul A contine cuvintele din fisierul


text');
writeln;
palindroame := 0; {contor care numara palindroamele }
for t := 1 to n do
begin
if PALINDROM ( A [t] ) = TRUE then
begin
palindroame := palindroame + 1;
writeln ('A [ ',t,' ] = ', A [t],' este
PALINDROM');
end
else
begin
writeln ('A [ ',t,' ] = ', A [t],' NU
este PALINDROM');
end;
end; {sf. FOR}
writeln ('Apasati ENTER');
readln;
CLRSCR;
if palindroame = 0 then
writeln ('NU exista palindroame in fisierul
text')
else
begin
for t := 1 to n do
begin
if PALINDROM ( A [t] ) = TRUE then
writeln ('A [ ',t,' ] = ', A
[t],' este PALINDROM')
end;
end;
readln
end.

ATESTAT - 2007 - 31 Scriei definiia unui subprogram SUMADIVIZORI cu


doi parametri, subprogram care:
- primete, prin intermediul parametrului n, un numr ntreg de maxim 9 cifre;
- returneaz, prin intermediul celui de-al doilea parametru k, suma tuturor divizorilor
lui n.
Exemplu: pentru n = 6, valoarea lui k va fi 12 (1 + 2 + 3 + 6).
Rezolvare: Definim procedura SUMADIVIZORI, bazat pe un algoritm de
determinare a divizorilor unui ntreg. Divizorii gsii vor fi nsumai.
101

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Program ATESTAT_2007_31_SUMA_DIVIZORILOR_UNUI_NUMAR ;
uses CRT;
VAR
n, K : LONGINT;
procedure SUMADIVIZORI (nr : LONGINT ; VAR S : LONGINT );
VAR
divizor : LONGINT;
nrdiv : integer;
begin
S := 0;
nrdiv := 0;
for divizor := 1 to nr do
begin
if nr MOD divizor = 0 then
begin
nrdiv := nrdiv + 1;
S := S + divizor
end;
end;
end;

102

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Begin

{ PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati numarul n = ');
readln (n);
SUMADIVIZORI (n, k); {apelul procedurii, in urma
caruia obtin k }
writeln ('Suma divizorilor lui ', n,' = ', k );
readln
end.

ATESTAT - 2007 - 32 Scriei un program care s determine n mod eficient primele


"p" perechi distincte de numere prietene. Fiecare pereche va fi afiat pe cte un
rnd, iar elementele unei perechi vor fi separate prin cte un spaiu. Dou numere
naturale distincte A i B sunt numere prietene dac A este egal cu suma divizorilor
lui B mai mici dect B, iar B este egal cu suma divizorilor lui A mai mici dect A.
Valoarea numrului p se citete de la tastatur. (1 <= p <= 8).
Exemplu: pentru p = 3 se vor afia :
220
284
1184 1210
2620
2924
Rezolvare: Definim o funcie PRIETENE, n care determinm divizorii celor dou
numere A i B, nsumm divizorii gsii i facem comparaiile din enun.
Program
ATESTAT_2007_32_PERECHI_DISTINCTE_DE_NUMERE_PRIETENE ;
uses CRT;
LABEL
afisare;
const
nmax = 100;
type
matrice = array [1..nmax, 1..nmax] of integer;
{matricea perechilor}
var
SA, SB, A, B, divizor : integer;
i, j, p, per : integer;
PERECHE : matrice; {matricea perechilor }
function PRIETENE (A, B : integer) : boolean;
VAR
SA, SB : integer;
divizor : integer;
begin
SA := 0;
SB := 0;
for divizor := 1 to A-1 do
begin
103

Probleme rezolvate de programare Subiecte propuse la ATESTAT

if A MOD divizor = 0 then


SA := SA + divizor;
end;
for divizor := 1 to B-1 do
begin
if B MOD divizor = 0 then
SB := SB + divizor;
end;
if ( SA = B ) AND ( SB = A ) then
begin
PRIETENE := TRUE
end
else
begin
PRIETENE := FALSE
end;
end;

104

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Begin

{ PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati numarul de perechi cautate (p < 8), p =

');
readln (p);
per := 0;
for A:= 220 to 10000 do {sau for A:= 1 to 10000
dureaza mai mult}
begin
for B := 280 to 10000 do {sau for B:= 1 to
10000 }
begin
if PRIETENE (A, B) then
begin
writeln (A,' si ', B,' sunt
prietene ');
writeln;
per := per + 1;
PERECHE [per, 1] := A;
PERECHE [per, 2] := B;
if per = p then
GOTO afisare;
end
else
{ writeln (A,' si ', B,' NU sunt
prietene '); }
writeln;
end;
end;
afisare:
writeln;
for i := 1 to p do
writeln ('Perechea ', i,' este: ', PERECHE [i,
1],' ', PERECHE [i, 2] );
readln
end.

ATESTAT - 2007 - 33 Se citete de la tastatur un numr natural nenul "n", care


are cel mult 9 cifre. S se scrie n fiierul DATE.OUT numrul natural "k", astfel
nct produsul 1*2**(k-1)*k s aib o valoare ct mai apropiat de numrul "n".
Exemplu: dac se citete numrul n = 25, n fiierul DATE.OUT se va scrie 4 (4 ! =
24), iar dac se citete numrul n = 119, n fiierul DATE.OUT se va scrie 5 (5 ! =
125).
105

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Rezolvare: Definim funcia FACTORIAL, pentru a calcula k ! (k factorial) n


condiiile din enun.
Program
ATESTAT_2007_33_FACTORIAL_IN_PROXIMITATEA_UNUI_NUMAR_NATUR
AL ;
uses CRT;
VAR
f : TEXT;
MIN, nr, n, k, diferenta1, diferenta2 : LONGINT;
sir : STRING;
EROARE : integer; {variabila eroare din apelul
procedurii VAL}
function factorial ( m: integer): integer;
VAR
p, i : integer;
begin
p := 1;
for i:= 1 to m do
p := p * i ;
factorial := p
end;

106

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Begin { PROGRAM PRINCIPAL }


CLRSCR;
ASSIGN (f, 'C:\DATE.OUT');
REWRITE (f); {generare-initializare fisier}
write ('Dati un numar format din cel mult 9 cifre, n =
');
readln (n);
k := 1;
while FACTORIAL (K) <= n do
begin
diferenta1 := ABS (n - FACTORIAL (k));
writeln ('Pentru k = ', k, ', Factorial (',k,') =
', FACTORIAL (K),
', iar diferenta ', n,' - FACTORIAL (',K,') = ',
diferenta1);
k := k + 1;
end;
writeln;
diferenta2 := ABS ( n - FACTORIAL (k)) ;
writeln ('Pentru k = ', k, ', Factorial (',k,') = ',
FACTORIAL (K),
', iar diferenta |', n,' - FACTORIAL (',K,')| = ',
diferenta2);
if diferenta2 > diferenta1 then
K := k - 1 ;
if diferenta2 > diferenta1 then
MIN := diferenta1
else
MIN := diferenta2;
writeln;
writeln ('Rezulta ca numarul k pentru care diferenta
dintre n si FACTORIAL (k)');
writeln ('este minima, adica diferenta = ', MIN,',
este k = ', k);
writeln;
STR (k, sir); {transform k in sir, pt. a-l scrie in
fisierul text}
write (f, k); {scriu valoarea lui k in fisierul
DATE.OUT}
RESET (f); {pregatim fisierul pentru citire}
read (f, sir);
VAL (sir, nr, EROARE);
writeln ('Numarul scris "in" si citit "din" fisier
este nr = ', nr);
writeln ('Acest numar trebuie sa fie egal cu k = ',
k);
readln
107

Probleme rezolvate de programare Subiecte propuse la ATESTAT

end.

ATESTAT - 2007 - 34 Pentru o valoare "n" (numr natural, 1 <= n <= 100) citit
de la tastatur, concepei un program care scrie n fiierul BAC.TXT un tablou
bidimensional cu n linii i n coloane cu formatul de jos. Elementele de pe fiecare linie
sunt separate prin spaiu.
1
0 0
0...0
2
1 0
0...0
3
2 1
0...0
...............
n
n-1 n-2 n-3 ...1
Exemplu: pentru n = 4, coninutul fiierului BAC.TXT este:
1
0 0
0
2
1 0
0
3
2 1
0
4
3 2
1
Rezolvare: Observm c diagonala principal este format din cifre de 1, iar deasupra
diagonalei principale toate elementele sunt 0. Pe fiecare coloan, elementele se afl n
ordine cresctoare.

Program
ATESTAT_2007_34_ELEMENTE_NULE_DEASUPRA_DIAGONALEI_PRINCIPA
LE ;
uses CRT;
CONST
nmax = 100;
TYPE
MATRICE = array [1..nmax, 1..nmax] of integer;
VAR
n, i, j, k : integer;
A : matrice;
f : TEXT;
linie, sir : STRING;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
ASSIGN (f,'C:\BAC.TXT');
REWRITE (f); {generare-initializare fisier}
repeat
write ('Dati n = ');
readln (n)
108

Probleme rezolvate de programare Subiecte propuse la ATESTAT

until (n >= 1) AND (n <= nmax);


{Generam elementele matricii}
for i := 1 to n do
begin
for j := 1 to n do
begin
A [i, j] := i - j + 1;
if A [i, j] < 0 then
A [i, j] := 0;
end;
end;
writeln;
writeln ('Matricea este:');
for i := 1 to n do
begin
for j := 1 to n do
begin
write (A [i, j],' ');
end;
writeln
end;
writeln;
{ Scriem matricea in fisierul text }
for i := 1 to n do
begin
linie := ''; {initializare linie cu sirul vid}
for j := 1 to n do
begin
STR ( A[i,j], sir ); {transformam fiecare
element in sir }
linie := linie + sir + ' '; {adaug "sir" la
"linie" prin
concatenare}
end;
writeln (f, linie); {scriu "linie" in fisierul
text}
end;
writeln;
writeln ('Continutul fisierului text este:');
RESET (f);
while NOT EOF (f) do
begin
readln (f, linie);
writeln (linie)
end;
readln
109

Probleme rezolvate de programare Subiecte propuse la ATESTAT

end.

110

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2007 - 35 Scriei un program care citete un numr natural n > 1, cu


maximum 9 cifre, i afieaz valoarea celui mai mic divizor prim a lui n, precum i
puterea la care acest divizor apare n descompunerea n factori primi a numrului n.
Rezolvare: Definim funcia PRIM, care testeaz primalitatea unui ntreg.
Program
ATESTAT_2007_35_CEL_MAI_MIC_DIVIZOR_PRIM_AL_UNUI_NUMAR ;
{det. divizorul care apare la puterea maxima }
uses CRT;
VAR
x, d, diviz, p, MAX : integer;
function PRIM (nr : integer) : BOOLEAN;
VAR
nrdiv, divizor : integer;
begin
nrdiv := 0;
divizor := 1;
for divizor := 1 to nr do
begin
if nr MOD divizor = 0 then
begin
nrdiv := nrdiv + 1;
end;
end;
if nrdiv <= 2 then
PRIM := TRUE
else
PRIM := FALSE;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati x = ');
readln (x);
d := 2;
{primul divizor}
max := 0; {initializare MAX; MAX = puterea maxima}
p := 0; {initializare putere p = numar de impartiri
la d}
while x > 1 do
begin
If x MOD d = 0 then {daca x se imparte la d}
begin
p := p + 1;
x := x DIV d;
if max < p then {daca MAX anterior < puterea
maxima actuala a lui d}
111

Probleme rezolvate de programare Subiecte propuse la ATESTAT

begin
max := p;
{ writeln ('Divizorul ', d,' apare la
puterea ',max ); }
diviz := d;
end
end
else
begin
d := d + 1; { se trece la urmatorul
divizor }
p := 0 ; {pt. noul divizor, se
reinitializeaza putere }
end;
end;
writeln ('Divizorul ', diviz,' apare la puterea
maxima, Pmax = ',max );
if PRIM (diviz) then
writeln (diviz,' este numar prim')
else
writeln (diviz,' NU este numar prim');
readln
end.

112

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2007 - 36 Scriei un program care citete de la tastatur dou numere


naturale "n" i "x" (x, n >1), cu maximum 9 cifre i verific dac "x" este divizibil
cu 2 la puterea "n". Programul afieaz DA, n caz afirmativ i NU, n caz contrar.
Rezolvare: Definim funcia PUTERE, pentru a face testul din enun.
Program ATESTAT_2007_36_DIVIZIBILITATE_CU_O_PUTERE_A_LUI_2
;
uses CRT;
VAR
n, x : LONGINT;
function PUTERE ( y : LONGINT; m : LONGINT ) : LONGINT;
VAR
p, i : LONGINT;
begin
p := 1;
for i := 1 to m do
p := p * y;
PUTERE := p
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati un numar natural cu cel mult 9 cifre, X =
');
readln (x);
write ('Dati un numar natural cu cel mult 9 cifre, care
va fi exponentul lui
2, n = ');
readln (n);
writeln;
if X MOD ( PUTERE (2, n)) = 0 then
writeln (X,' este divizivil cu 2 la puterea ', n,' =
', PUTERE (2, n))
else
writeln (X,' NU este divizivil cu 2 la puterea ',
n,' = ', PUTERE (2, n));
readln
end.

ATESTAT - 2007 - 37 Se citete de la tastatur un numr natural "n" (1 <= n <=


100). S se afieze pe ecran al n-lea termen al irului 11, 22, 33, 44, 55, 66, 77, 88, 99,
111, 222, 333, 444, etc.
Exemplu: dac n = 11, se va afia 222.
113

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Rezolvare:
ATENIE ! NU introducei un n > 73.
Pentru n = 73, se obine numrul 1.111.111.111.
Pentru n = 74, ar trebui s se afieze 2.222.222.222, dar se stie c,
pentru tipul LONGINT, numrul ntreg maxim este MAXLONGINT =
2.147.483.647.
Deci, pentru orice n > 74, vom obine rezultate eronate.
Program ATESTAT_2007_37_SIR_DE_NUMERE_CU_CIFRE_IDENTICE ;
uses CRT;
VAR
n : integer;
function ZECI (m:integer) : LONGINT ;
begin
if m = 1 then
ZECI := 11
else
ZECI := 11 + ZECI (m-1)
end;

114

Probleme rezolvate de programare Subiecte propuse la ATESTAT

function SUTE (m:integer) : LONGINT ;


begin
if m = 10 then
SUTE := 111
else
SUTE := 111 + SUTE (m-1)
end;
function MII (m:integer) : LONGINT ;
begin
if m = 19 then
MII := 1111
else
MII := 1111 + MII (m-1)
end;
function ZECIDEMII (m:integer) : LONGINT ;
begin
if m = 28 then
ZECIDEMII := 11111
else
ZECIDEMII := 11111 + ZECIDEMII
(m-1)
end;
function SUTEDEMII (m:integer) : LONGINT ;
begin
if m = 37 then
SUTEDEMII := 111111
else
SUTEDEMII := 111111 + SUTEDEMII
(m-1)
end;
function MILIOANE (m:integer) : LONGINT ;
begin
if m = 46 then
MILIOANE := 1111111
else
MILIOANE := 1111111 + MILIOANE
(m-1)
end;
function ZECIDEMILIOANE (m:integer) : LONGINT ;
begin
if m = 55 then
ZECIDEMILIOANE := 11111111
else
ZECIDEMILIOANE := 11111111 +
ZECIDEMILIOANE (m-1)
end;
115

Probleme rezolvate de programare Subiecte propuse la ATESTAT

function SUTEDEMILIOANE (m:integer) : LONGINT ;


begin
if m = 64 then
SUTEDEMILIOANE := 111111111
else
SUTEDEMILIOANE := 111111111 +
SUTEDEMILIOANE (m-1)
end;
function MILIARDE (m:integer) : LONGINT ;
begin
if m = 73 then
MILIARDE := 1111111111
else
MILIARDE := 1111111111 +
MILIARDE (m-1)
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati n = ');
readln (n);

116

Probleme rezolvate de programare Subiecte propuse la ATESTAT

if ( n >= 1) and ( n <= 9) then


begin
writeln ( ZECI (n) ) ;
end;
if (n >= 10) and (n <= 18) then
begin
writeln ( SUTE (n) ) ;
end;
if ( n >= 19) and (n <= 27) then
begin
writeln ( MII (n) ) ;
end;
if (n >= 28) and (n <= 36) then
begin
writeln ( ZECIDEMII (n) ) ;
end;
if (n >= 37) and (n <= 45) then
begin
writeln ( SUTEDEMII (n) ) ;
end;
if (n >= 46) and (n <= 54) then
begin
writeln ( MILIOANE (n) ) ;
end;
if (n >= 55) and (n <= 63) then
begin
writeln ( ZECIDEMILIOANE (n) ) ;
end;
if (n >= 64) and (n <= 72) then
begin
writeln ( SUTEDEMILIOANE (n) ) ;
end;
if (n = 73) then
begin
writeln ( MILIARDE (n) ) ;
end;
readln
end.

ATESTAT - 2007 - 38 Scriei un program care citete de la tastatur un numr


natural "n"
(2 < n < 30) i construiete n memorie o matrice patratic n x n,
format numai din valori ce aparin mulimii {1, 2, 3, , n}, astfel nct elementele
din matrice situate pe diagonala secundar s fie egale cu n, elementele situate pe
celelalte dou "semidiagonale" paralele cu diagonala secundar, de o parte i de alta
117

Probleme rezolvate de programare Subiecte propuse la ATESTAT

a acesteia, s fie egale cu n - 2 etc. Matricea se va afia pe ecran, cte o linie a matricei
pe cte o linie a ecranului, cu spaii ntre elementele fiecrei linii (ca n Exemplu).
Exemplu: pentru n = 5, se construiete n memorie i se afieaz matricea :
a11
a21
a31
a41
a51

a12
a22
a32
a42
a52

a13
a23
a33
a43
a53

a14
a24
a34
a44
a54

a15
a25
a35
a45
a55

1
2
3
4
5

2
3
4
5
4

3
4
5
4
3

4
5
4
3
2

5
4
3
2
1

Rezolvare:
Elementele de pe diagonala secundar sunt: a15 a24 a33 a42 a51.
Observm c i = 1 . . 5, iar j = 5 . . 1.
k=0
La aceste elemente, indicii i i j satisfac relaia i + j = 6 = n - k + 1.

118

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Elementele de pe diagonala imediat vecin-sus cu diagonala secundar sunt: a14 a23


a32 a41.
Observm c i = 1 . . 4, iar j = 4 . . 1.
k=1
La aceste elemente, indicii i i j satisfac relaia: i + j = 5 = n - k + 1.
--------------------------------------Elementele de pe urmtoarea diagonal vecin-sus cu diagonala secundar sunt: a13
a22 a31.
Observm c i = 1 . . 3, iar j = 3 . . 1.
k=2
La aceste elemente, indicii i i j satisfac relaia: i + j = 4 = n - k + 1.
--------------------------------------Elementele de pe urmtoarea diagonal vecin-sus cu diagonala secundar sunt: a12
a21.
Observm c i = 1 . . 2, iar j = 2 . . 1.
k=3
La aceste elemente, indicii i i j satisfac relaia i + j = 3 = n - k + 1.
--------------------------------------Elementele de pe urmtoarea diagonal vecin-sus cu diagonala secundar sunt: a11.
Observm c i = 1, iar j = 1.
k=4
La aceste elemente, indicii i i j satisfac relaia i + j = 2 = n - k + 1.
--------------------------------------Pentru diagonalele secundar i cele de DEASUPRA ei, indecii i i j iau valori n
intervalele:
i = 1 . . n k i j = n k . . 1
unde k ia valori de la 0 . . n 1.
Indecii satisfac relaia
i + j = n-k+1
Un element
A [i, j] = n - k
--------------------------------------Elementele de pe diagonala imediat vecin SUB diagonala secundar sunt: a25 a34
a43 a52.
Observm c i = 2 . . 5, iar j = 5 . . 2.
k=2
La aceste elemente, indicii i i j satisfac relaia i + j = 7 = n + k.
--------------------------------------Elementele de pe urmtoarea diagonala vecin SUB diagonala secundar sunt: a35
a44 a53.
Observm c i = 3 . . 5, iar j = 5 . . 3.
k=3
La aceste elemente, indicii i i j satisfac relaia i + j = 8 = n + k.
--------------------------------------Elementele de pe urmtoarea diagonala vecin SUB diagonala secundar sunt: a45
a54.
Observm c i = 4 . . 5, iar j = 5 . . 4.
k=4
La aceste elemente, indicii i i j satisfac relaia i + j = 9 = n + k.
--------------------------------------Elementele de pe urmtoarea diagonala vecin SUB diagonala secundar sunt: a55.
119

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Observm c i = 5, iar j = 5.
k=5
La aceste elemente, indicii i i j satisfac relaia i + j = 10 = n + k.
--------------------------------------Pentru diagonalele secundar i cele de SUB ea, indecii i i j iau valori n intervalele
i=k..n j=n..k
unde k ia valori de la 2 . . n.
Indecii satisfac relaia
i+j=n+k
Un element
A [i, j] = n - (k - 1).
Program ATESTAT_2007_38_DIAGONALA_SECUNDARA_MATRICE ;
uses CRT;
CONST
nmax = 30;

120

Probleme rezolvate de programare Subiecte propuse la ATESTAT

TYPE
MATRICE = array [1..nmax, 1..nmax] of integer;
VAR
n, i, j, k : integer;
A : matrice;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) AND (n <= nmax);
{ Generam elementele matricii}
{ Elementele de DEASUPRA diagonalei secundare}
{--------------------------------------------}
k := 0;
while k <= n - 1 do
begin
i := 1;
while i <= n - k do
begin
j := n - k;
while j >= 1 do
begin
if i + j = n - k + 1 then
begin
A [i, j] := n - k;
{
write ('A [ ',i,',',j,' ]
= ', A[i,j]);
readln;
}
end;
j := j - 1
end;
i := i + 1
end;
k := k + 1
end;
{ Elementele de SUB diagonala secundare}
{--------------------------------------------}
k := 2;
while k <= n do
begin
i := k;
while i <= n do
121

Probleme rezolvate de programare Subiecte propuse la ATESTAT

begin
j := n;
while j >= k do
begin
if i + j = n + k then
begin
A [i, j] := n - (k - 1);
{
write ('A [ ',i,',',j,' ]
= ', A[i,j]);
readln;
}
end;
j := j - 1
end;
i := i + 1
end;
k := k + 1
end;

122

Probleme rezolvate de programare Subiecte propuse la ATESTAT

writeln ('Matricea 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.

');

ATESTAT - 2007 - 39 Scriei un program care citete de la tastatur un ir "S" de


cel mult 30 de caractere i un caracter "C" ; programul realizeaz dublarea fiecrei
apariii a caracterului C n S i apoi scrie noul ir obinut n fiierul text BAC.TXT.
Exemplu: dac se citete de la tastatur irul alfabetar i caracterul "a", atunci fiierul
BAC.TXT va conine irul : aalfaabetaar.
Rezolvare: Se determin poziia poz, n care apare caracterul C n ir i se dubleaz
acest caracter.
Program ATESTAT_2007_39_DUBLAREA_UNUI_CARACTER;
uses CRT;
VAR
c : CHAR ;
sir : STRING;
SirNou : array [1..255] of CHAR ;
lungimesir, i, poz : integer;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati sirul S = '); readln (sir);
writeln;
write ('Dati caracterul ale carui aparitii trebuie
dublate, c = ');
readln (c);
poz := 0; {pozitie in sirul al doilea }
lungimesir := LENGTH (sir) ;
for i := 1 to lungimesir do
begin
poz := poz + 1;
SirNou [poz] := Sir [i];
if Sir [i] = c then
123

Probleme rezolvate de programare Subiecte propuse la ATESTAT

{
[poz] );

begin
poz := poz + 1;
SirNou [poz] := c;
writeln ('SirNou [ ', poz,' ] = ', SirNou
}
end;

end;
writeln;
writeln ('Noul sir este :');
for i := 1 to poz do
write (SirNou [i] );
readln
end.

124

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2007 - 40 Scriei un program care citete de la tastatur dou iruri de


caractere, fiecare ir fiind format din cel mult 100 de litere din alfabetul englez, i care
afieaz mesajul DA , dac toate literele din primul ir se gsesc i n cel de-al
doilea ir, nu neaprat n aceeai ordine i de acelai numr de ori, sau mesajul
NU , n caz contrar.
Exemplu: dac primul ir este baraca , iar cel de-al doilea ir este
abracadabra , programul trebuie s afieze mesajul DA , deoarece toate literele
primului ir apar n cel de-al doilea ir.
Rezolvare: Pentru a rezolva mai simplu problema, apelm la date de tip mulime.
Program ATESTAT_2007_40_COMPARARE_SIRURI;
uses CRT;
VAR
sir1, sir2 : STRING;
litera, c : CHAR;
cuvant, cuvant1, cuvant2 : set of CHAR;
i : integer;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati primul sir = ');
readln (sir1);
writeln;
write ('Dati al doilea sir = ');
readln (sir2);
{-------------------------------------------------}
cuvant1 := [ ] ; {initializare multime cuvant1 cu
multimea vida }
for i := 1 to LENGTH (sir1) do
begin
litera := sir1 [i];
cuvant1 := cuvant1 + [litera]
{ construim multimea cuvant1 prin reuniune (
operatorul " + " ) }
end;
writeln;
writeln ('Sirul 1 contine literele :');
for litera := 'a' to 'z' do
begin
if litera IN cuvant1 then
write (litera,' ')
end;
{-------------------------------------------------}
cuvant2 := [ ] ; {initializare multime cuvant2 cu
multimea vida }
for i := 1 to LENGTH (sir2) do
125

Probleme rezolvate de programare Subiecte propuse la ATESTAT

begin
litera := sir2 [i];
cuvant2 := cuvant2 + [litera]
{ construim multimea cuvant2 prin reuniune (
operatorul " + " ) }
end;
writeln;
writeln ('Sirul 2 contine literele :');
for litera := 'a' to 'z' do
begin
if litera IN cuvant2 then
write (litera,' ')
end;
writeln;
if cuvant1 <= cuvant2 then { testarea INCLUZIUNII
celor doua multimi }
writeln ('TOATE literele din primul sir se regasesc
si in al doilea sir')
else
writeln ('NU toate literele din primul sir se
regasesc si in al doilea');
readln
end.

126

Probleme rezolvate de programare Subiecte propuse la ATESTAT

ATESTAT - 2007 - 41 Pe prima linie a fiierului text BAC.TXT se afl un numr


natural nenul n (2 <= n < 1000000), iar pe a doua linie a fiierului se afl un ir format
din n numere ntregi, desprite prin cte un spaiu, fiecare numr fiind format din cel
mult 4 cifre. tiind c n fiier exist cel puin un numr strict pozitiv, se cere s se
afieze lungimea maxim a unei secvene din ir, care are proprietatea c este
format doar din valori strict pozitive. O secven a unui ir este format dintr-unul
sau mai multe elemente aflate pe poziii consecutive. Alegei o metod eficient de
rezolvare, att ca timp de executare, ct i ca gestionare a memoriei.
Exemplu: dac fiierul BAC.TXT are coninutul :
10
7 22 - 3 10 3 14 0 21 10
atunci programul trebuie s afieze pe ecran doar valoarea 3, deoarece, n irul
considerat, exist mai multe secvene care sunt formate doar din numere strict
pozitive, dar lungimea maxim a unei astfel de secvene este 3.
Rezolvare: Se extrage din fiier cte un numr i se fac testele din enun.
Program ATESTAT_2007_41_SECVENTA_A_UNUI_SIR;
uses CRT;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of LONGINT;
VAR
nr, n, i, t : LONGINT;
f : text;
sir, linie : STRING;
EROARE : integer; { variabila EROARE din apelul
procedurii VAL }
A : vector;
Lung, Lmax : integer; { Lung si Lmax = lungimea
curenta, respectiv
lungimea maxima a unei secvente de
numere }
procedure EXTRAGENUMEREDINFISIERTEXT (VAR f: text; VAR A :
vector; VAR m: LONGINT);
VAR
poz, k : integer;
numar : LONGINT;
begin
RESET ( f );
readln (f, linie);
{citim "n" de pe prima
linie a fisierului }
VAL (linie, m, EROARE); {transforma sirul
linie in numarul m }
127

Probleme rezolvate de programare Subiecte propuse la ATESTAT

readln (f, linie); { citim a doua linie, care


contine cele n numere}
i := 0; { i = index in vectorul A }
sir := ''; { initializare cu sirul vid}
{ In "sir" se citeste cate un numar
din linie}
poz := 1; { poz = pozitie curenta in linia cu
numere din fisier }
while poz < LENGTH (linie) do
begin
k:= poz;
while linie [ k ] <> ' ' do
begin
sir := sir + linie [ k ];
{concatenare}
k := k + 1;
end;
poz := k;
i := i + 1;
VAL (sir, numar, EROARE); {transforma
sir in numar }
A [i ] := numar;
sir :='' ;
poz := poz + 1;
end;
end;

128

Probleme rezolvate de programare Subiecte propuse la ATESTAT

Begin

{ PROGRAM PRINCIPAL }
CLRSCR;
ASSIGN (f, 'C:\BAC.txt');
rewrite (f); {generam fisierul text}
writeln ('Introduceti, in fisierul BAC.TXT, n numere
INTREGI cu cel mult 9 cifre');
writeln;
write ('Cate numere doriti sa introduceti, n = ');
readln (n);
writeln;
writeln (f, n); {Se scrie n pe prima linie din
fisierul text}
linie := ''; {initializare variabila "linie" cu sirul
vid}
{"linie" va contine cele n numere separate de
spatii}
{"linie" = un STRING care se va
introduce in fisierul text}
for i:= 1 to n do
begin
write ('Dati un numar INTREG, nr = ');
readln ( nr );
STR (nr, sir); {transformam numarul nr in
sir, pentru a-l memora
in fisierul text}
linie := linie + sir + ' '; {construim "linie"
prin concatenare}
end;
{scriind un
"spatiu" dupa fiecare sir }
writeln (f, linie); {scriem "linie" in fisierul text}
writeln;
writeln ('Fisierul text are continutul:');
RESET (f);
while not EOF (f) do
begin
READLN (f, linie);
writeln (linie);
end;
writeln;
{ Din STRING-ul "linie" trebuie sa extragem numerele
}
EXTRAGENUMEREDINFISIERTEXT ( f, A, n );
writeln;
writeln ('Numarul n citit de pe prima linie este n =
', n);
writeln;
129

Probleme rezolvate de programare Subiecte propuse la ATESTAT

writeln ('Vectorul A, rezultat dupa extragere


este:');
for i := 1 to n do
begin
writeln ('A [ ',i,' ] = ', A[i] );
end;
writeln;
Lmax := 0; { initializare Lmax }
Lung := 0; { initializare lungime curenta a unei
secvente }
for i := 1 to n do
begin
if A [i] > 0 then
begin
Lung := Lung + 1;
end
else
begin
if Lung > Lmax then
Lmax := Lung;
Lung := 0
end;
end;
writeln ('Lungimea maxima a unei secvente de numere
pozitive,Lmax =',Lmax);
readln;
CLRSCR;
end.

130

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