Sunteți pe pagina 1din 67

Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008

ATESTAT - 2008 - 1 Scrieţi un program care citeşte de la tastatură două şiruri de caractere formate din
litere mici. Să se creeze fişierul BAC.TXT, în care să se scrie unul din cele două şiruri care se dovedeşte a fi o
subsecvenţă a celuilalt şir. Dacă cele două şiruri nu au această proprietate, atunci în fişierul BAC.TXT se va
scrie textul “FĂRĂ SOLUŢIE”.
Exemplu:
Se citesc şirurile: Se afişează în BAC.TXT :
calculator lat
lat sau lat este subşir al şirului calculator

Rezolvare :

Program ATESTAT_2008_1_SUBSECVENTA_SIRURI;
uses CRT;
VAR
vectorsiruri : array [1..2] of STRING;
n, i, j, k : integer;
sir1, sir2, sir, subsir, linie : STRING;
GASIT : BOOLEAN; {GASIT = TRUE, daca este satisfacuta cerinta problemei}
BAC : text;
Begin { PROGRAM PRINCIPAL }
clrscr;

writeln;
writeln;

ASSIGN (BAC, 'C:\BAC.TXT');


REWRITE (BAC);

write ('Dati sirul 1 = ');


readln (sir1);

write ('Dati sirul 2 = ');


readln (sir2);

writeln;
writeln;

GASIT := FALSE ; {presupunem ca sirurile introduse NU satisfac cerintele}

if POS ( sir1, sir2) <> 0 then


begin
GASIT := TRUE; {sirurile SATISFAC cerintele problemei}
subsir := sir1;
sir := sir2;
write (BAC, subsir,' este subsir al sirului ', sir );
writeln (BAC);
end;

if POS ( sir2, sir1) <> 0 then


begin
GASIT := TRUE; {sirurile SATISFAC cerintele problemei}
subsir := sir2;
sir := sir1;
write (BAC, subsir,' este subsir al sirului ', sir );
writeln (BAC);
end;

RESET (BAC);

IF GASIT = FALSE then


begin
writeln;
writeln ('FARA SOLUTIE')
1
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
end
ELSE
begin
while not EOF (BAC) DO
begin
readln (BAC, linie);
writeln (linie)
end;
end;
readln
end.

ATESTAT - 2008 - 2 REPETA 2007 – 2 Scrieţi un program care citeşte de la tastatură un număr
natural n (2 < n < 21) şi apoi n linii cu câte n numere întregi de cel mult 7 cifre ce formează un tablou
bidimensional A.
Să se afişeze pe ecran diferenţa 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_2008_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;
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;
Dif := Sprincipala - Ssecundara;
writeln ('Diferenta dintre sumele celor doua diagonale este : ', Dif);
readln
end.

2
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
ATESTAT - 2008 – 3 (REPETA 2007 – 3) Fişierele text X.TXT şi Y.TXT conţin fiecare numele a
7 persoane, câte un nume pe fiecare linie, fiecare nume având cel mult 15 litere. Ştiind că în fiecare fişier
numele sunt memorate în ordine alfabetică, scrieţi un program care să citească din cele două fişiere şi să afişeze
pe ecran toate numele din cele două fişiere în ordine alfabetică, separate printr-un spaţiu.
Exemplu :
Dacă fişierul X.TXT are conţinutul: iar fişierul Y.TXT are conţinutul:
Ana Angie
Dana Cora
Daniel Dora
Ene Horia
Mara Oana
Nae Paul
Paul Tibi
se vor afişa pe ecran următoarele nume:
Ana Angie Cora Dana Daniel Dora Ene Horia Mara Nae Oana Paul Paul Tibi.

Rezolvare:
Program ATESTAT_2008_3_INTERCLASARE ;
uses CRT;
CONST
nmax = 50;
TYPE
vector = array [1..nmax] of STRING;
vectorrezultant = array [1..2*nmax] of STRING;
VAR
m, n, i, j, k : integer;
A, B : vector;
C : vectorrezultant;
X, Y, Z : TEXT;
linie : STRING;
Begin { PROGRAM PRINCIPAL }
clrscr;

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 [1] := 'Ana';
A [2] := 'Dana';
A [3] := 'Daniel';
A [4] := 'Ene';
A [5] := 'Mara';
A [6] := 'Nae';
A [7] := 'Paul';

B [1] := 'Angie';
B [2] := 'Cora';
B [3] := 'Dora';
B [4] := 'Horia';
B [5] := 'Oana';
B [6] := 'Paul';
B [7] := 'Tibi';

for i := 1 to n do
begin
3
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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
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
else
begin
k := k + 1;
C [k] := B [j];
j := j + 1;
end;
end;
WHILE i <= m do
begin
k := k + 1;
C [k] := A [i];
4
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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.

ATESTAT - 2008 - 4 (REPETA 2007 – 4) Scrieţi programul care citeşte de la tastatură un număr
natural n (n < 100) şi un şir cu n numere întregi din intervalul [100, 999]. Programul construieşte un şir de
numere rezultat prin înlocuirea fiecărui număr din şirul citit cu numărul obţinut prin interschimbarea cifrei
unităţilor cu cifra sutelor. Numerele din noul şir se vor afişa pe ecran separate printr-un singur spaţiu.
Exemplu: pentru n = 3 şi şirul 123, 904, 500, se afişează 321, 409, 5.

Rezolvare:
 Vom trata numerele introduse ca pe şiruri de caractere.
 Fiind necesară inversarea cifrei sutelor cu cifra unităţilor, iar numărul având doar 3 cifre, vom defini o
funcţie recursivă INVERS pentru inversarea numărului.

OBSERVAŢIE:
Problema se poate rezolva şi cu ajutorul operatorilor DIV şi MOD. Mai simplu este cu STRING.

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

5
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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 - 2008 - 5 (SIMILAR 2007 – 5) Două tablouri unidimensionale A şi B, cu elementele


A1, A2, …, An, respctiv B1, B2, …, Bn sunt în relaţia A < = B dacă A1 < = B1, A2 < = B2, …, An < =
Bn. Scrieţi un program care citeşte două tablouri unidimensionale A şi B cu acelaşi număr de elemente de tip
întreg şi verifică dacă A < = B sau B < = A, afişând un mesaj adecvat.

Rezolvare:
Program ATESTAT_2008_5_COMPARARE_VECTORI;

{ In urma executiei subprogramului VERIFICA, vom avea valorile: }

{ k1 = TRUE daca A <= B }


{ k2 = TRUE daca B <= A }
{ k1 = k2 = FALSE daca nici una din cele doua conditii nu este satisfacuta }

program COMPARARE_VECTORI;
uses CRT;
const
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
var
n, i : integer;
A, B : vector;
k1, k2, 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;

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;

6
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
begin
CLRSCR;
writeln;
writeln;
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;
writeln;
writeln;

VERIFICA (A, B, n, K);

k1 := k;

VERIFICA (B, A, n, K);

k2 := k;

if k1 = TRUE then
writeln ('A <= B')
else
begin
if k2 = TRUE then
writeln ('B < A')
else
writeln ('Cerintele problemei nu sunt indeplinite de cel putin o pereche de
elemente');
end;

writeln;
readln
end.

ATESTAT - 2008 - 6 (REPETA 2007 – 06) Scrieţi subprogramul SORTARE care primeşte, prin
intermediul parametrului A, un tablou unidimensional cu 1000 de componente reale şi prin intermediul
parametrilor i şi j două numere întregi, 1 < = i < j < = 1000. Subprogramul realizează ordonarea
crescătoare a elementelor Ai, Ai+1, …, Aj.

Rezolvare: Aplicăm algoritmul bubble sort în procedura de ordonare.


Program ATESTAT_2008_6_SORTARE_PARTIALA_VECTOR ;
CONST
nmax = 100;
TYPE

7
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
vector = array [1..nmax] of integer;
VAR
A : vector;
n, i, j, k, aux : integer;
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);

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 - 2008 - 7 REPETA 2007 – 7 Scrieţi programul care citeşte de la tastatură elementele
unui vector X cu 1000 de numere reale şi care ordonează crescător termenii şirului. Programul va afişa pe
ecran noile valori ale vectorului X separate între ele prin spaţiu.

8
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
Rezolvare: Aplicăm algoritmul bubble sort în procedura de ordonare.
Program ATESTAT_2008_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
write (X[i],' ')
end;
readln
end.

ATESTAT - 2008 - 8 SIMILAR 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,
următorii termeni consecutivi ai şirului Fibonacci : fn, fn+1, fn+2, fn+3 (n natural). Scrieţi un program care
citeşte de la tastatură un număr natural n (1 < = n < = 20), determină şi afişează pe ecran distanţa dintre
cele două puncte A şi B astfel determinate. Distanţa dintre 2 puncte A (x1, y1) şi B (x2, y2) se notează cu “d “.

9
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
Rezolvare:

Program ATESTAT_2007_8_DISTANTA_DINTRE_DOUA_PUNCTE ;
CONST
nmax = 24;
TYPE
vector = array [1..nmax] of LONGINT;
VAR
n, i : integer;
x1, x2, y1, y2 : LONGINT;
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 );


readln
end.

ATESTAT - 2008 - 9 – REPETA 2007 – 9 Într-o listă simplu înlănţuită alocată dinamic, fiecare nod
(element al listei) reţine în câmpul “DATA“ un număr natural cu cel mult nouă cifre şi în câmpul “URM“,
adresa elementului următor din listă. Scrieţi subprogramul DIVIZOR care, prin parametrul “p“, primeşte
adresa primului element al listei descrise mai sus, prin parametrul “x“, primeşte un număr natural cu cel mult
nouă cifre şi care afişează pe ecran, câte 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 afişa mesajul “problema nu are soluţie”.

Rezolvare:

1 - Se determină numărul de elemente din listă, prin TRAVERSAREA listei.


2 - Construim un tablou A, în care memorăm toţi divizorii lui X.
3 - Construim un tablou B, în care memorăm toţi divizorii unui număr Y din listă.
4 - Numărăm divizorii comuni din tablourile A şi B.
5 - Numărăm ş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, afişăm numărul curent Y din listă.
6 - Dacă nu găsim nici un număr în listă, în conditiile problemei, afişăm mesajul: “NU EXISTĂ SOLUŢIE”.
10
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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;
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;
11
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
writeln;
end;
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
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;
writeln ('Numarul X = ', X,' are ', nrdivX,' divizori');
12
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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;

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;
writeln ('Nodurile vor contine valorile 111, 222, 333');
13
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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 - 2008 - 10 REPETA 2007 – 10 – Fişierele text F1.txt şi F2.txt conţin, fiecare,
elementele ale câte unui şir de numere reale A, respective B. Fişierele conţin numere distincte scrise pe o linie
şi separate printr-un singur spaţiu. Scrieţi un program care citeşte cele 2 şiruri de numere din fişierele F1.txt şi
F2.txt şi care scrie în fişierul F3.txt toate elementele comune şirurilor A şi B pe o linie şi separate printr-un
spaţiu.
Exemplu : Dacă fişierele F1.txt şi F2.txt au conţinuturile :
F1.txt : 10.3, 2.05, 5, 7.12, respectiv
F2.txt : 67, 7.12, 5, 3, 7.33, 9, atunci
F3.txt va conţine: 7.12, 5.

Rezolvare:
Program ATESTAT_2008_10_FISIERE_TEXT_CU_ELEMENTE_COMUNE;
uses CRT;
CONST
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');
rewrite (f1);
rewrite (f2);
rewrite (f3);
linie1 := '10.3 2.05 5 7.12';
linie2 := '67 7.12 5 3 7.33 9';

14
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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]
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;
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
15
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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 - 2008 - 11 ( REPETA 2007 – 11) Scrieţi un program care afişează toate numerele
naturale formate din cifre identice, mai mari decât 10 şi mai mici decât o valoare dată n, n < = 2.000.000.000.
Exemplu: pentru n = 195, se afişează : 11, 22, 33, 44, 55, 66, 77, 88, 99, 111.

Rezolvare:
1 - Determinăm numărul de cifre ale numărului n.
2 - Folosim un vector V cu un număr de elemente = n.
Program ATESTAT_2008_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) do
begin
write (nr, ' ');
nr:= nr + 11;
end;
end;
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;

16
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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);
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;
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;

17
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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);
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;
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);
18
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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;
ZECIDEMII (n);
writeln;
SUTEDEMII (n);
writeln;
MILIOANE (n);
writeln;
ZECIDEMILIOANE (n);
writeln;
SUTEDEMILIOANE (n);
writeln;
MILIARDE (n);
end;
readln
end.

ATESTAT - 2008 – 12 REPETA 2007 - 12 Prin asocierea fiecărei litere mici din alfabetul englez cu
un număr egal cu poziţia cifrei în alfabet, se poate codifica orice secvenţă de litere mici cu o secvenţă de
numere. Scrieţi un program care citeşte din fişierul text COD.TXT un număr "n" (0 < n < 30000) şi, de pe
rândul următor, o secvenţă de n litere mici. Programul va codifica secvenţa de caractere citită şi va scrie pe
ecran numerele asociate, separate prin spaţii.
Exemplu: pentru fişierul COD.TXT : 7
bacinfo
se vor afişa pe ecran, în ordine, numerele :
2 1 3 9 14 6 15

Rezolvare:
Stiind că literele mici au codurile ASCII începând cu 97,
a = 97, b = 98, c = 99 ...
vom asocia noi coduri literelor mici astfel:
19
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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_2008_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;
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 }

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
20
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
write ( COD [sircitit [i] ] , ' ')
end;
readln
end.

ATESTAT - 2008 - 13 REPETA 20076 – 13 Scrieţi un program care citeşte de la tastatură trei
numere naturale x, y şi k, (1 < x < y < 2.000.000, k < 1.000) şi afişează pe ecran k numere prime din intervalul
[x, y]. Dacă nu există k numere prime în intervalul [x, y], se vor afişa toate numerele prime găsite, iar pe linia
următoare se va afişa mesajul “S-au găsit mai puţine numere prime: ”, urmat de numărul acestora.
Exemplu: pentru x = 3, y = 12 şi k = 5 se vor afişa pe ecran:
3 5 7 11
s-au găsit mai puţine numere prime: 4

Rezolvare:
Program ATESTAT_2008_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}
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;
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;
21
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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}
write ( PRIME [i], ' ')
end
else
writeln ('NU s-au gasit numere prime in intervalul [',x,', ', y,']');
end;
readln
end.

ATESTAT - 2008 - 14 REPETA 2007 - 14 Scrieţi un program care citeşte un număr natural "n"
nenul şi par, n < 100 şi apoi n numere naturale de cel mult 4 cifre fiecare şi determină cea mai mare sumă care
poate fi obţinută adunând numai o jumătate din toate numerele naturale citite. Rezultatul se va afişa pe ecran.
Exemplu: pentru n = 6 şi numerele 728, 10, 103, 44, 1000, 94 se va afişa:
1731 (reprezentând suma : 728 + 103 + 1000).

Rezolvare:
1 - Introducem cele n numere, pe care le reţinem în vectorul X.
2 - Ordonăm descrescător vectorul X.
3 - Facem suma primelor n / 2 numere X [i].

Program ATESTAT_2008_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];

22
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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;

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.

ATESTAT - 2008 - 15 REPETA 2007 - 15 Scrieţi un program care citeşte din fişierul text
BAC.TXT, cel mult 100 de numere naturale aflate pe o singură linie, formate din cel mult 9 cifre fiecare,
separate prin spaţii şi dintre aceastea le afişează pe ecran doar pe acelea care au proprietatea de a fi palindrom.
Dacă nu se găsesc numere palindrom, se va afişa pe ecran valoarea –1. Un număr are proprietatea de a fi
palindrom dacă citit de la dreapta la stânga sau de la stânga la dreapta are aceeaşi valoare. De exemplu, 1221
este palindrom, în timp ce 1210 nu este palindrom.
Exemplu : dacă din fişierul BAC.TXT se citesc numerele : 7341, 8228, 660, 2, 80, 131, atunci pe ecran se vor
afişa : 8228, 2, 131.

Rezolvare:

Program ATESTAT_2008_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;

23
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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;
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;
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 < LENGTH (linie) do
begin
k:= poz;
while linie [ k ] <> ' ' do
begin
sir := sir + linie [ k ]; {concatenare}
k := k + 1;
24
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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}

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 a-l 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;
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');
25
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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
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 - 2008 - 16 REPETA 2007 - 16 Scrieţi un program care citeşte un număr natural nenul n
(n < 100) şi un şir de n numere naturale nenule de cel mult 4 cifre fiecare, şi care afişează pe ecran şirul
ordonat crescător în funcţie de suma cifrelor corespunzătoare fiecărui termen al său. Dacă două numere au
aceeaşi sumă a cifrelor, se va afişa cel mai mic dintre ele.
Exemplu: pentru n = 5 şi numerele 701, 1000, 49, 99, 143, se va afişa şirul 1000 44 143 701 99.

Rezolvare:
1 - Introducem cele n numere, pe care le reţinem în vectorul X.
2 - Pentru fiecare număr X [i], determinăm numărul de cifre.
3 - Pentru fiecare număr calculăm suma cifrelor şi o depunem în vectorul S.
Evident, unui număr X[i] îi corespunde un S[i].
4 - Ordonăm vectorul S descrescător şi, simultan, rearanjăm numerele X[i], astfel ca unui S [i] să-i
corespundă acelaşi X [i].
5 - Facem suma primelor n / 2 numere X [i].

Program ATESTAT_2008_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;

26
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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];
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
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;

27
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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];
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;

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;
n := n - 1;
GOTO 100;
end;
readln;
end.

28
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
ATESTAT - 2008 - 17 (REPETA 2007 – 17) Pentru orice număr 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. Descrieţi în limbaj natural o metodă eficientă de
determinare a numărului de cifre nule aflate pe ultimele poziţii consecutive ale valorii obţinute în urma
evaluării lui n !, n fiind un număr 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 sfârşit.

Rezolvare:
1 - Calculăm n FACTORIAL şi memorăm rezultatul în variabila F.
2 - Determinăm numărul de cifre pentru F.
3 - Determinăm cifrele lui F şi le memorăm într-un vector.
4 - Numărăm cifrele nule consecutive de la sfârşitul lui F.

Program ATESTAT_2008_17_NR_CIFRE_NULE_LA_FACTORIAL;
uses CRT;
LABEL
100;
CONST
nmax = 100;
TYPE
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;
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

29
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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}
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.

ATESTAT - 2008 - 18 (REPETA 2007 – 18) Scrieţi un program care citeşte de la tastatură un
număr natural nenul "n" de cel mult 4 cifre şi afişează pe ecran numărul de cifre nenule aflate la sfârşitul lui n
!
Exemplu: pentru n = 6 se va afişa 0.

Rezolvare:
1 – Cu funcţia FACTORIAL calculăm n factorial şi memorăm rezultatul în variabila F.
2 - Determinăm numărul de cifre pentru F, folosind o funcţie NRCIF.
3 – Definim o funcţie DETCIFRE cu care determinăm cifrele lui F şi le memorăm într-un vector.
4 - Numărăm cifrele NEnule consecutive de la sfârşitul lui F.

Program ATESTAT_2008_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;

30
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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
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], ' '); }
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 - 2008 - 19 (REPETA 2007 – 19) Scrieţi un program care citeşte din fişierul text
DATE.IN cel mult 100 de numere naturale nenule aflate pe o singură linie, formate din cel mult 4 cifre fiecare,
separate prin spaţii şi scrie în fişierul DATE.OUT, în ordine inversă faţă de cea în care au fost citite, pe o

31
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
singură linie, separate prin spaţii. Exemplu: dacă din fişierul DATE.IN se citesc numerele 93 207 15 1982
3762, atunci conţinutul fişierului DATE.OUT va fi 3762 1982 15 207 93.

Rezolvare: Pentru a extrage numerele din fişierul text DATE.IN, definim procedura
EXTRAGENUMEREDINFISIERTEXT.

Program ATESTAT_2008_19_INVERSAREA_ELEMENTELOR_UNUI_SIR;
uses CRT;
CONST
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}
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 (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 );
32
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
STR (nr, sir); {transformam numarul in sir, pentru a-l memora in
fisierul text}
linie1 := linie1 + sir + ' '; {construim "linie1" prin concatenare,}
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}
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 - 2008 - 20 (REPETA 2007 – 20) Scrieţi un program care citeşte de pe prima linie a
fişierului text BAC.TXT, cel mult 100 de numere naturale nenule formate din cel mult 4 cifre fiecare, separate
prin spaţii şi afişează 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 afişa toate acestea.
Exemplu: dacă din fişier se citesc numerele : 90, 73, 109, 1248, 2771, atunci se afişează 1, 7, deoarece fiecare
dintre aceastea apare de 3 ori.

Rezolvare:

Program ATESTAT_2008_20_FRECVENTA_APARITIE_CIFRE_IN_FISIER_TEXT;
uses CRT;
33
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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;

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 }
CLRSCR;
ASSIGN (f, 'C:\BAC.txt');
34
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
rewrite (f); {generam fisierul text}
writeln ('Introduceti, in fisierul BAC.TXT, n numere naturale NENULE, de cel mult 4
cifre');
writeln;
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 }
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] );
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]);
35
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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.

ATESTAT - 2008 - 21 (REPETA 2007 – 21) Scrieţi un program care citeşte de pe prima linie a
fişierului text BAC.TXT trei numere naturale A, B, C formate din cel mult patru cifre fiecare, separate prin
câte un spaţiu şi afişează pe ecran cel mai mare divizor comun al acestora.
Exemplu: dacă din fişier se citesc numerele: 9 27 15, atunci se afişează 3.

Rezolvare:

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
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] )

36
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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 }
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');
writeln;
write ('Cate numere doriti sa introduceti, n = ');
readln (n);
writeln;
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 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;
writeln ('Fisierul text are continutul:');
RESET (f);
READLN (f, linie);
writeln (linie);
writeln;
{ Din STRING-ul "linie" trebuie sa extragem numerele }
EXTRAGENUMEREDINFISIERTEXT ( f, A );
37
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
{ writeln;
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.

ATESTAT - 2008 - 22 – REPETA 2007 – 22 Se consideră programul pseudocod în care s-a folosit notaţia [x]
pentru partea întreagă a lui x :
citeşte n (număr natural)
repetă
n <- [n / 10]
până când n < 10
scrie n
Scrieţi algoritmul pseudocod echivalent cu algoritmul dat, dar care să utilizeze un alt tip de structură repetitivă.

Rezolvare:
Transformăm ciclul cu test final "REPETĂ" - REPEAT
în ciclu cu test iniţial "CÂT TIMP" - WHILE
citeşte n (număr natural)
cât timp n >= 10 execută
n <- [n / 10]
sfârşit structură "cât timp"
scrie n
Program ATESTAT_2008_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.

38
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
ATESTAT - 2008 - 23 (REPETA 2007 – 23) Se consideră programul pseudocod în care s-a folosit notaţia [x]
pentru partea întreagă a lui x :
citeşte n (număr natural)
repetă
n <- [n / 10]
până când n < 10
scrie n
Scrieţi programul pentru algoritmul dat, apoi afişati numărul de repetiţii efectuate de algoritm.

Rezolvare:
Pentru ciclul cu test final "REPETĂ", în program folosim REPEAT.
Folosim un contor "i" care numără repetiţiile.

Program ATESTAT_2008_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 - 2008 - 24 (REPETA 2007 – 24) Se consideră subprogramul NRDIVIZORI, care:


- primeşte, prin intermediul unicului său parametru, A, un număr natural de cel mult 4 cifre;
- returnează numărul divizorilor lui A;
Scrieţi un program care stabileşte dacă un număr este prim, utilizând această funcţie.

Rezolvare:

Program ATESTAT_2008_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
nrdiv := nrdiv + 1;
end;
NRDIVIZORI := nrdiv;
end;

39
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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.

ATESTAT - 2008 - 25 (REPETA 2007 – 25) Scrieţi un program care verifică dacă un număr natural k
(1 < k < 100.000) citit de la tastatură este prim. Programul va afişa pe ecran mesajul DA sau mesajul NU;

Rezolvare:

Program ATESTAT_2008_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.

ATESTAT - 2008 - 26 (REPETA 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 următoarea definiţie :
f1 = 1
f2 = 1
fi = fi-1 + fi-2, dacă i>2.
Exemplu: dacă A = 3 şi B = 5, atunci se va afişa mesajul « Da », iar pentru A = 21 şi B = 5 se va afişa mesajul
« Nu ».

40
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
Rezolvare:

Program ATESTAT_2008_26_TERMENI_CONSECUTIVI_SIR_FIBONACCI ;
VAR
A, B : LONGINT;
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 }

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 ;
41
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
if VERIFICA (A) = TRUE then
writeln (A,' apartine sirului lui Fibonacci')
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 - 2008 - 27 (REPETA 2007 – 27) Se consideră fişierul text DATE.IN care conţine exact 899
numere distincte formate fiecare din câte 3 cifre. Să se afişeze şi să se scrie în fişierul text DATE.OUT
numărul format din 3 cifre care lipseşte din fişierul 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 fişierul DATE.IN sunt exact 899 numere DISTINCTE formate din 3 cifre, rezultă că, într-adevăr,
lipseşte doar un singur număr.
 Preluăm toate numerele din fişierul DATE.IN într-un vector X.
 Ordonăm vectorul şi căutăm numărul care lipseşte, ştiind că, după ordonare, vectorul va conţine doar
numere consecutive, cu excepţia locului unde lipseşte numărul căutat.
 Atunci când diferenţa dintre două numere succesive din vector este > 1, rezultă că în acel loc lipseşte nu
număr, care nu poate fi decât media aritmetică a celor două numere succesive.

Program ATESTAT_2008_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;
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;
writeln;
writeln ('Fisierul DATE.IN are ', nrcaractere,' caractere');
42
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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
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;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
ASSIGN (f1, 'C:\DATE.IN');
43
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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 898 do
begin
if A [i + 1] - A [i] > 1 then
y := ( A[i] + A [i+1] ) DIV 2
end;
writeln ('Numarul care lipseste este y = ', y);
readln
end.

ATESTAT - 2008 - 28 (REPETA 2007 – 28) Se citesc două numere naturale nenule m şi n (2 < m, n < 20).
Să se scrie programul care construieşte î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 afişa pe ecran,
câte o linie a matricei pe câte o linie a ecranului, elementele fiecărei linii fiind separate prin spaţii.
Exemplu: pentru m = 3 şi n = 4, se va afişa matricea următoare :
1 1 1 1
1 2 1 2
1 1 3 1
Rezolvare:

Program ATESTAT_2008_28_MATRICE_CU_CMMDC_AL_INDECSILOR ;
CONST
nmax = 20;
TYPE
matrice = array [1..nmax, 1..nmax] of integer;
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;
44
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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 ] , ' ');
end ;
writeln;
end;
readln
end.

ATESTAT - 2008 - 29 (REPETA 2007 – 29) Se citeşte de la tastatură un număr natural nenul "n" (n < 1.000).
Scrieţi un program care construieşte fişierul text BAC.TXT, care conţine pe prima linie toţi divizorii lui n în
ordine strict descrescătoare. Divizorii vor fi separaţi prin spaţiu.
Exemplu: dacă n = 10, atunci fişierul BAC.TXT va conţine: 10, 5, 2, 1.

Rezolvare:

Program ATESTAT_2008_29_DIVIZORII_UNUI_NUMAR_IN_ORDINE_DESCRESCATOARE ;
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);

45
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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}
{ 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;
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;
writeln ('Divizorii lui ', n,', ordonati descrescator, sunt:');
writeln;
46
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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);
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 - 2008 - 30 (REPETA 2007 – 30) Se consideră fişierul text CUVINTE.IN, care conţine pe prima
linie un număr natural nenul n (n <= 100), iar pe următoarele n linii câte un cuvânt cu maximum 10 caractere.
Să se afişeze pe ecran cuvintele din fişierul dat care sunt palindroame. În cazul în care nu există nici un cuvânt
palindrom, se va afişa mesajul ”NU”. Un cuvânt este palindrom dacă citindu-l de la dreapta la stânga sau de la
stânga la dreapta se obţine acelaşi cuvânt.
Exemplu: dacă fişierul CUVINTE.IN are următorul conţinut :
3
sas
creion
Ion
atunci se va afişa pe ecran :
sas

Rezolvare:
Program ATESTAT_2008_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
47
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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 scri in fisier}
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;
writeln;
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
begin
writeln ('NU exista palindroame in fisierul text');
end
else
48
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
begin
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 - 2008 - 31 (REPETA 2007 – 31) Scrieţi definiţia unui subprogram SUMADIVIZORI cu doi
parametri, subprogram care:
- primeşte, prin intermediul parametrului n, un număr î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:

Program ATESTAT_2008_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;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati numarul n = ');
readln (n);
writeln;
SUMADIVIZORI (n, k); {apelul procedurii, in urma caruia obtin k }
writeln ('Suma divizorilor lui ', n,' = ', k );
readln
end.

ATESTAT - 2008 - 32 (REPETA 2007 – 32) Scrieţi un program care să determine în mod eficient primele
"p" perechi distincte de numere prietene. Fiecare pereche va fi afişată pe câte un rând, iar elementele unei
perechi vor fi separate prin câte un spaţiu. Două numere naturale distincte A şi B sunt numere prietene dacă A
este egal cu suma divizorilor lui B mai mici decât B, iar B este egal cu suma divizorilor lui A mai mici
decât A. Valoarea numărului p se citeşte de la tastatură. (1 <= p <= 8).
Exemplu: pentru p = 3 se vor afişa :
220 284
1184 1210
2620 2924
Rezolvare:
49
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008

Program ATESTAT_2008_32_PERECHI_DISTINCTE_DE_NUMERE_PRIETENE ;
uses CRT;
CONST
nmax = 100;
TYPE
matrice = array [1..nmax, 1..nmax] of integer; {matricea perechilor}

VAR
SA, SB, A, B, divizor : integer;
i, j, p : 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
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;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
p := 0;
while p <= 6 do
begin
for A:= 1 to 100 do
begin
for B := 1 to 100 do
begin
if PRIETENE (A, B) then
begin
writeln (A,' si ', B,' sunt prietene ');
p := p + 1;
PERECHE [p, 1] := A;
PERECHE [p, 2] := B;
end
else
writeln (A,' si ', B,' NU sunt prietene ');
end;
end;
end;
readln
end.

50
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
ATESTAT - 2008 - 33 (REPETA 2007 – 33) Se citeşte de la tastatură un număr natural nenul "n", care are
cel mult 9 cifre. Să se scrie în fişierul DATE.OUT numărul natural "k", astfel încât produsul 1*2*…*(k-1)*k
să aibă o valoare cât mai apropiată de numărul "n".
Exemplu: dacă se citeşte numărul n = 25, în fişierul DATE.OUT se va scrie 4 (4 ! = 24), iar dacă se citeşte
numărul n = 119, în fişierul DATE.OUT se va scrie 5 (5 ! = 125).
Rezolvare:
Program ATESTAT_2008_33_FACTORIAL_IN_PROXIMITATEA_UNUI_NUMAR_NATURAL ;
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
begin
p := p * i
end;
factorial := p
end;
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);
writeln;
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
end.

51
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
ATESTAT - 2008 - 34 (REPETA 2007 – 34) Pentru o valoare "n" (număr natural, 1 <= n <= 100) citită de la
tastatură, concepeţi un program care scrie în fişierul BAC.TXT un tablou bidimensional cu n linii şi n coloane
cu formatul de jos. Elementele de pe fiecare linie sunt separate prin spaţiu.
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, conţinutul fişierului BAC.TXT este:
1 0 0 0
2 1 0 0
3 2 1 0
4 3 2 1
Rezolvare:

Program ATESTAT_2008_34_ELEMENTE_NULE_DEASUPRA_DIAGONALEI_PRINCIPALE ;
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)
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
52
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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
end.

ATESTAT - 2008 - 35 (REPETA 2007 – 35) Scrieţi un program care citeşte un număr natural n > 1, cu
maximum 9 cifre, şi afişează valoarea celui mai mic divizor prim a lui n, precum şi puterea la care acest
divizor apare în descompunerea în factori primi a numărului n.

Rezolvare:

Program ATESTAT_2008_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;

53
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
x := x DIV d;
if max < p then {daca MAX anterior < puterea maxima actuala a lui d}
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.

ATESTAT - 2008 - 36 (REPETA 2007 – 36) Scrieţi programul care citeşte de la tastatură două numere
naturale “x” şi “n” (x, n > 1), cu maximum 9 cifre şi verifică dacă “x” este divizibil cu 2n. Programul
afişează DA, în caz afirmativ şi NU, în caz contrar.

Rezolvare:

Program ATESTAT_2008_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 - 2008 - 37 (REPETA 2007 – 37) Se citeşte de la tastatură un număr natural "n" (1 <= n <= 100).
Să se afişeze pe ecran al n-lea termen al şirului 11, 22, 33, 44, 55, 66, 77, 88,9 9, 111, 222, 333, 444, etc.
Exemplu: dacă n = 11, se va afişa 222.

Rezolvare:
54
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
ATENŢIE ! NU introduceţi un n > 73.
Pentru n = 73, se obţine numărul 1.111.111.111.
Pentru n = 74, ar trebui să se afişeze 2.222.222.222, dar se ştie că,
pentru tipul LONGINT, numărul întreg maxim este MAXLONGINT = 2.147.483.647.
Deci, pentru orice n > 74, vom obţine rezultate eronate.

Program ATESTAT_2008_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;
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;
function SUTEDEMILIOANE (m:integer) : LONGINT ;
begin
55
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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);
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 - 2008 - 38 (REPETA 2007 – 38) Scrieţi un program care citeşte de la tastatură un număr natural
"n" (2 < n < 30) şi construieşte în memorie o matrice patratică n x n, formată numai din valori ce aparţin
mulţimii {1, 2, 3, … , n}, astfel încât 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 a
acesteia, să fie egale cu n - 2 etc. Matricea se va afişa pe ecran, câte o linie a matricei pe câte o linie a ecranului,
cu spaţii între elementele fiecărei linii (ca în exemplu).
Exemplu: pentru n = 5, se construieşte în memorie şi se afişează matricea :
a11 a12 a13 a14 a15 1 2 3 4 5
56
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
a21 a22 a23 a24 a25 2 3 4 5 4
a31 a32 a33 a34 a35 3 4 5 4 3
a41 a42 a43 a44 a45 4 5 4 3 2
a51 a52 a53 a54 a55 5 4 3 2 1
Rezolvare:
Elementele de pe diagonala secundară sunt: a15 a24 a33 a42 a51.
Observăm că i = 1 . . 5, iar j = 5 . . 1.
k=0
La aceste elemente, indicii i şi j satisfac relaţia i + j = 6 = n - k + 1.
---------------------------------------
Elementele de pe diagonala imediat vecină-sus cu diagonala secundară sunt: a14 a23 a32 a41.
Observăm că i = 1 . . 4, iar j = 4 . . 1.
k=1
La aceste elemente, indicii i şi j satisfac relaţia: i + j = 5 = n - k + 1.
---------------------------------------
Elementele de pe următoarea diagonală vecină-sus cu diagonala secundară sunt: a13 a22 a31.
Observăm că i = 1 . . 3, iar j = 3 . . 1.
k=2
La aceste elemente, indicii i şi j satisfac relaţia: i + j = 4 = n - k + 1.
---------------------------------------
Elementele de pe următoarea diagonală vecină-sus cu diagonala secundară sunt: a12 a21.
Observăm că i = 1 . . 2, iar j = 2 . . 1.
k=3
La aceste elemente, indicii i şi j satisfac relaţia i + j = 3 = n - k + 1.
---------------------------------------
Elementele de pe următoarea diagonală vecină-sus cu diagonala secundară sunt: a11.
Observăm că i = 1, iar j = 1.
k=4
La aceste elemente, indicii i şi j satisfac relaţia i + j = 2 = n - k + 1.
---------------------------------------
Pentru diagonalele secundară şi cele de DEASUPRA ei, indecşii 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.
Indecşii satisfac relaţia 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.
Observăm că i = 2 . . 5, iar j = 5 . . 2.
k=2
La aceste elemente, indicii i şi j satisfac relaţia i + j = 7 = n + k.
---------------------------------------
Elementele de pe următoarea diagonala vecină SUB diagonala secundară sunt: a35 a44 a53.
Observăm că i = 3 . . 5, iar j = 5 . . 3.
k=3
La aceste elemente, indicii i şi j satisfac relaţia i + j = 8 = n + k.
---------------------------------------

Elementele de pe următoarea diagonala vecină SUB diagonala secundară sunt: a45 a54.
Observăm că i = 4 . . 5, iar j = 5 . . 4.
k=4
La aceste elemente, indicii i şi j satisfac relaţia i + j = 9 = n + k.
---------------------------------------
Elementele de pe următoarea diagonala vecină SUB diagonala secundară sunt: a55.
Observăm că i = 5, iar j = 5.
k=5
La aceste elemente, indicii i şi j satisfac relaţia i + j = 10 = n + k.
---------------------------------------
Pentru diagonalele secundară şi cele de SUB ea, indecşii i şi j iau valori în intervalele

57
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
i=k..n j=n..k
unde k ia valori de la 2 . . n.
Indecşii satisfac relaţia i+j=n+k
Un element A [i, j] = n - (k - 1).

Program ATESTAT_2008_38_DIAGONALA_SECUNDARA_MATRICE ;
uses CRT;
CONST
nmax = 30;
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
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]);
58
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
readln;
}
end;
j := j - 1
end;
i := i + 1
end;
k := k + 1
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;
readln
end.

ATESTAT - 2008 - 39 (REPETA 2007 – 39) Scrieţi un program care citeşte de la tastatură un şir "S" de cel
mult 30 de caractere şi un caracter "C" ; programul realizează dublarea fiecărei apariţii a caracterului C în S şi
apoi scrie noul şir obţinut în fişierul text BAC.TXT.
Exemplu: dacă se citeşte de la tastatură şirul alfabetar şi caracterul "a", atunci fişierul BAC.TXT va conţine
şirul : aalfaabetaar.

Rezolvare:
Program ATESTAT_2008_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
begin
poz := poz + 1;
SirNou [poz] := c;
{ writeln ('SirNou [ ', poz,' ] = ', SirNou [poz] ); }
end;
end;
writeln;
writeln ('Noul sir este :');
for i := 1 to poz do
write (SirNou [i] );
readln
end.

59
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
ATESTAT - 2008 - 40 (REPETA 2007 – 40) Scrieţi un program care citeşte de la tastatură două şiruri de
caractere, fiecare şir fiind format din cel mult 100 de litere din alfabetul englez, şi care afişează mesajul
« DA », dacă toate literele din primul şir se găsesc şi în cel de-al doilea şir, nu neapărat în aceeaşi ordine şi de
acelaşi număr 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ă
afişeze mesajul « DA », deoarece toate literele primului şir apar în cel de-al doilea şir.

Rezolvare: Pentru a rezolva mai simplu problema, apelăm la date de tip mulţime.

Program ATESTAT_2008_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
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.

60
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
ATESTAT - 2008 - 41 (REPETA 2007 – 41) Pe prima linie a fişierului text BAC.TXT se află un număr
natural nenul n (2 <= n < 1000000), iar pe a doua linie a fişierului se află un şir format din n numere întregi,
despărţite prin câte un spaţiu, fiecare număr fiind format din cel mult 4 cifre. Ştiind că în fişier există cel puţin
un număr strict pozitiv, se cere să se afişeze lungimea maximă a unei secvenţe 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 poziţii consecutive. Alegeţi o metodă eficientă de rezolvare, atât ca timp de executare, cât şi
ca gestionare a memoriei.
Exemplu: dacă fişierul BAC.TXT are conţinutul :
10
7 22 - 3 10 3 14 0 21 10
atunci programul trebuie să afişeze pe ecran doar valoarea 3, deoarece, în şirul considerat, există mai multe
secvenţe care sunt formate doar din numere strict pozitive, dar lungimea maximă a unei astfel de secvenţe este
3.

Rezolvare:

Program ATESTAT_2008_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” }

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 :='' ;
61
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
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 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;

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
62
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
begin
if Lung > Lmax then
Lmax := Lung;
Lung := 0
end;
end;
writeln;
writeln ('Lungimea maxima a unei secvente de numere pozitive,Lmax =',Lmax);
readln;
CLRSCR;
end.

ATESTAT - 2008 - 42 Se citesc de la tastatură patru numerere naturale nenule A, B, C, D. Scrieţi un program
care să afişeze rezultatul expresiei A / B + C / D sub forma unei fracţii ireductibile.

Rezolvare:

program ATESTAT_2008_42_FRACTII_IREDUCTIBILE;

uses CRT;
function CMMDC (A1, B1 : integer) : integer;
var
A1init, B1init, aux, R : integer;
begin
A1init := A1;
B1init := B1;
if A1init < B1init then
begin
aux := A1init;
A1init := B1init;
B1init := aux
end;
R := A1init MOD B1init;
while R <> 0 do
begin
A1init := B1init;
B1init := R;
R := A1init MOD B1init
end;
CMMDC := B1init;
end;
VAR
A, A1, B, B1, C, C1, D, D1 : integer ;
numarator, numarator1, numitor, numitor1, numarator2, numitor2 : integer;

begin {PROGRAM PRINCIPAL}


CLRSCR;
writeln;
writeln;

write ('Dati A = ');


readln (A);
writeln;
write ('Dati B = ');
readln (B);
writeln;

write ('Dati C = ');


readln (C);
writeln;
write ('Dati D = ');
readln (D);
writeln;
63
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008

writeln ('CMMDC (A, B) = CMMDC (', A, ',', B,') = ', CMMDC (A, B) );
writeln;
writeln ('CMMDC (C, D) = CMMDC (', C, ',', D,') = ', CMMDC (C, D) );
writeln;

A1 := A DIV CMMDC (A, B);


B1 := B DIV CMMDC (A, B);
C1 := C DIV CMMDC (C, D);
D1 := D DIV CMMDC (C, D);

numarator := A * D + B * C ;
numitor := B * D;

numarator1 := A1 * D1 + B1 * C1 ;
numitor1 := B1 * D1;

numarator2 := numarator1 DIV CMMDC ( numarator1, numitor1);


numitor2 := numitor1 DIV CMMDC ( numarator1, numitor1);

writeln ('Fractia IREDUCTIBILA obtinuta din ');


writeln;
writeln (A, ' / ', B,' + ', C, ' / ', D, ' = ',
A1, ' / ', B1,' + ', C1, ' / ', D1, ' = ',

numarator, ' / ', numitor,' = ', numarator1,' / ', numitor1, ' = ',
numarator2, ' / ', numitor2 );
readln
end.

ATESTAT - 2008 - 43 Se citesc de la tastatură patru numerere naturale nenule A, B, C, D. Scrieţi un program
care să afişeze rezultatul expresiei A / B * C / D sub forma unei fracţii ireductibile.
{ Se citesc de la tastatura patru numerere naturale nenule A, B, C, D. }
{ Scrieti un program care sa afiseze rezultatul expresiei A / B * C / D }
{ sub forma unei fractii ireductibile. }

Rezolvare:

program ATESTAT_2008_43_FRACTII_IREDUCTIBILE;

uses CRT;
function CMMDC (A1, B1 : integer) : integer;
var
A1init, B1init, aux, R : integer;
begin
A1init := A1;
B1init := B1;
if A1init < B1init then
begin
aux := A1init;
A1init := B1init;
B1init := aux
end;
R := A1init MOD B1init;
while R <> 0 do
begin
A1init := B1init;
B1init := R;
R := A1init MOD B1init
end;
CMMDC := B1init;
end;
VAR
64
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
A, A1, B, B1, C, C1, D, D1 : integer ;
numarator, numarator1, numitor, numitor1, numarator2, numitor2 : integer;

begin {PROGRAM PRINCIPAL}


CLRSCR;
writeln;
writeln;

write ('Dati A = ');


readln (A);
writeln;
write ('Dati B = ');
readln (B);
writeln;

write ('Dati C = ');


readln (C);
writeln;
write ('Dati D = ');
readln (D);
writeln;

writeln ('CMMDC (A, B) = CMMDC (', A, ',', B,') = ', CMMDC (A, B) );
writeln;
writeln ('CMMDC (C, D) = CMMDC (', C, ',', D,') = ', CMMDC (C, D) );
writeln;

A1 := A DIV CMMDC (A, B);


B1 := B DIV CMMDC (A, B);
C1 := C DIV CMMDC (C, D);
D1 := D DIV CMMDC (C, D);

numarator := A * C ;
numitor := B * D;

numarator1 := A1 * C1 ;
numitor1 := B1 * D1;

numarator2 := numarator1 DIV CMMDC ( numarator1, numitor1);


numitor2 := numitor1 DIV CMMDC ( numarator1, numitor1);

writeln ('Fractia IREDUCTIBILA obtinuta din ');


writeln;
writeln (A, ' / ', B,' * ', C, ' / ', D, ' = ',
A1, ' / ', B1,' * ', C1, ' / ', D1, ' = ',

numarator, ' / ', numitor,' = ', numarator1,' / ', numitor1, ' = ',
numarator2, ' / ', numitor2 );
readln
end.

ATESTAT - 2008 - 44 Se citesc de la tastatură patru numerere naturale nenule A, B, C, D cu care se formează
numerele complexe Z = (A, B) şi T = (C, D). Scrieţi un program care să afişeze pe ecran rezultatul expresiei
Z * T.

Rezolvare:
{ Z = A + j B, iar T = C + j D }

65
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
Program ATESTAT_2008_44_NUMERE_COMPLEXE_1;
uses CRT;
VAR
A, B, C, D : integer;

begin {PROGRAM PRINCIPAL}


CLRSCR;
writeln;
writeln;

write ('Dati A = ');


readln ( A );
writeln;

write ('Dati B = ');


readln ( B );
writeln;

write ('Dati C = ');


readln ( C );
writeln;

write ('Dati D = ');


readln ( D );
writeln;
writeln ('Z = A + j * B = ', A,' + j * ', B);
writeln;
writeln ('T = C + j * D = ', C,' + j * ', D);
writeln;
writeln ('Z * T = (AC - BD) + j (AD + BC) = ', A*C - B*D,' + j * ', A*D + B*C);
writeln;
readln
end.

ATESTAT - 2008 - 45 Se citesc de la tastatură patru numerere naturale nenule A, B, C, D cu care se formează
numerele complexe Z = (A, B) şi T = (C, D). Scrieţi un program care să afişeze pe ecran rezultatul expresiei
Z / T.

Rezolvare:

{ Z = A + j B, iar T = C + j D }

{ Vom inmulti si numitorul si numaratorul cu aceeasi cantitate = C - j D}


{ Astfel, numitorul nu mai este complex }

Program ATESTAT_2008_45_NUMERE_COMPLEXE_2;
uses CRT;
VAR
A, B, C, D : integer;
ParteaReala, ParteaImaginara : real ;

begin {PROGRAM PRINCIPAL}


CLRSCR;
writeln;
writeln;

write ('Dati A = ');


readln ( A );
writeln;

write ('Dati B = ');


readln ( B );
66
Probleme rezolvate de programare – Subiecte propuse la ATESTAT - 2008
writeln;

write ('Dati C = ');


readln ( C );
writeln;

write ('Dati D = ');


readln ( D );
writeln;
writeln ('Z = A + j * B = ', A,' + j * ', B);
writeln;
writeln ('T = C + j * D = ', C,' + j * ', D);
writeln;
ParteaReala := (A*C + B*D) / (C*C + D*D);
ParteaImaginara := (B*C - A*D) / (C*C + D*D);

writeln ('Z / T = (AC + BD) / (C*C + D*D) + j (BC - AD)/ (C*C + D*D) = ',
ParteaReala:4:2,' + j * ', ParteaImaginara:4:2);
writeln;
readln
end.

67

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