Documente Academic
Documente Profesional
Documente Cultură
Probleme Pentru Atestat - 2004
Probleme Pentru Atestat - 2004
2004
Pentru anul 2004, am inclus n lucrarea de fa doar problemele noi, care nu au fost propuse i n 2003 la
examenul de atestat.
ATESTAT - 2004 - 4 - Se citesc pe rnd numere naturale pn la introducerea lui 55. Stabilii cte
cifre de zero i cte cifre de 1 sunt necesare pentru reprezentarea n baza 2 a tuturor numerelor
anterioare.
Rezolvare:
Din enun nu rezult, n mod necesar, c numerele naturale introduse sunt consecutive. Prin
urmare, se pot introduce numere naturale la ntmplare, numrul acestor numere nefiind precizat.
Introducerea se va ncheia la ntlnirea numrului 55. O variant simplificat a problemei const
n introducerea tuturor numerelor naturale ntre 1 i 55. Vom lua n consideraie ambele situaii.
Pentru transformarea numrului ZECIMAL n numr BINAR, mprim numrul ZECIMAL la
2 i reinem resturile obinute la mprire ntr-un vector de resturi R. Numrul BINAR
echivalent se obine citind vectorul R de la sfrit ctre nceput. Pe noi ne intereseaz doar cifrele
numrului BINAR, deci este suficient s numrm cifrele de ZERO i de UNU din vectorul R
asociat numrului BINAR.
Definim o procedur TRANSFORMA, care convertete fiecare numr natural (zecimal)
introdus din n numr binar. Procedura va avea ca parametru de ieire vectorul de resturi R, dar
i numrul de cifre n ale numrului binar echivalent, adic numrul de elemente din R.
n procedur, folosim o variabil auxZECIMAL, ale crei valori vor evolua ntre
NRZECIMAL i 1, pe msur ce auxZECIMAL va fi mprit la 2. Folosind auxZECIMAL,
vom conserva (vom pstra neschimbat) valoarea lui NRZECIMAL.
Folosim doi contori zero i unu, care numr cifrele de 0 i de 1 din numrul binar obinut.
Program ATESTAT_2004_4_NUMARA_CIFRE_BINARE;
uses CRT;
Const
nmax = 100;
TYPE
vector = array [1..100] of integer;
VAR
NRZECIMAL, auxZECIMAL, zero, unu, n, i, rest:
R : vector;
{vector de resturi}
procedure TRANSFORMA (NRZECIMAL : integer; VAR R
begin
if NRZECIMAL = 0 then
begin
auxZECIMAL := 0;
i:=1;
R[i] := 0
end
else
begin
i := 0;
auxZECIMAL := NRZECIMAL;
while auxZECIMAL <> 1 do
begin
rest := auxZECIMAL
MOD
i := i + 1;
R [i] := rest;
auxZECIMAL := auxZECIMAL
end;
i := i + 1;
R [i] := auxZECIMAL;
end;
n := i;
end; {sfarsit procedura}
integer;
: vector; VAR n : integer);
2;
DIV
2;
PRINCIPAL }
{initializare contori care numara cifrele de zero si de unu}
REPEAT
write ('Dati urmatorul numarul zecimal = ');
readln (NRZECIMAL);
TRANSFORMA (NRZECIMAL, R, n);
writeln;
write ('Numarul binar echivalent lui ', NRZECIMAL,' este
for i := n DOWNTO 1 do
write (R[i]);
');
writeln;
writeln;
for i := 1 to n do
begin
if R [i] = 0 then
zero := zero + 1
else
unu := unu + 1
end;
UNTIL (NRZECIMAL = 55);
writeln;
writeln;
writeln ('Total cifre de ZERO = ', zero);
writeln;
writeln ('Total cifre de UNU = ', unu);
readln
end.
Varianta B Dac numerele naturale introduse sunt cuprinse ntre 1 i 55, vom folosi o structur
FOR:
begin
{ PROGRAM PRINCIPAL }
clrscr;
zero := 0;
{initializare contori care numara cifrele de zero si de unu}
unu := 0;
writeln;
FOR NRZECIMAL := 1 to 55 do
begin
TRANSFORMA (NRZECIMAL, R, n);
writeln;
write ('Numarul binar echivalent lui ', NRZECIMAL,' este
for i := n DOWNTO 1 do
write (R[i]);
writeln;
writeln;
');
n = ');
nrsol:=0;
x := 1;
f [x] := 0;
{ virful stivei } {
x = linie }
while x > 0 do
{ cat timp stiva nu este vida }
begin
while f [x] < n do
{ cat timp exista valori disponibile }
begin
f [x] := f [x] + 1;
ok := true;
for i := 1 to x do
begin
cond1 := (f[i] = f[x]) and (ABS(x-i) = 1) ;
{Daca sunt pe aceeasi coloana, fi=fx}
{dar pe linii vecine, adica x-i=1}
{ cond1 := (i > 1) AND (f[i-1] = f[i]) ;
}
{Daca sunt pe aceeasi coloana, f[i-1]=f[i]}
{dar pe linii vecine, adica pe i si i-1}
cond2 := (ABS (i-x) = ABS (f[i] - f[x] ))
ATESTAT - 2004 - 18 - Se d un fiier text care conine pe prima linie numere naturale. S se
afieze numrul valorilor din fiier i valoarea maxim a acestora.
Rezolvare:
n ipoteza c fiierul text nu exist deja pe disc, vom crea acest fiier cu acelai program care face
i celelalte determinri cerute de enun. Vom introduce n fiierul text n numere naturale,
folosind o bucl FOR, astfel:
Dup citirea de la tastatur a unui numr x, l vom converti ntr-un ir, prin apelarea
procedurii STR.
Dup fiecare astfel de ir, vom lsa un singur spaiu liber (blank). n acest fel, se va crea
o linie n fiierul text. Evident, linie este tot un i de caractere.
Celelalte etape sunt comentate direct n program.
Program ATESTAT_2004_18_FISIER_TEXT_CU_NUMERE_NATURALE;
const
nmax = 100;
type
vector = array [1..nmax] of integer;
var
f : text;
linie, sir : string; {linie = o linie din fisierul text}
{sir = sirul in care se transforma numarul x cu STR }
poz : integer; {pozitie in sirul de caractere "linie"}
ER : integer;
{variabila EROARE = parametru al procedurii VAL}
c : char;
max, n, i, x : integer;
V : vector;
ATESTAT - 2004 - 19 - S se scrie un program recursiv care calculeaz maximul elementelor unui
vector cu n componente.
Rezolvare:
Definim o funcie recursiv denumit MAXIM, cu care vom determina maximul ntr-un interval
din vector cuprins ntre dou valori notate cu ncep, respectiv sf. Funcia va fi apelat iniial
pentru ncep = 1 i sf = n (poziiile extreme din vectorul x).
Dac sf ncep <> 1, se determina mijlocul intervalului sf ncep i se apeleaz funcia
MAXIM pentru jumtatea stng, respectiv dreapt a intervalului al crui mijloc a fost calculat.
Se determin, astfel, dou maxime, notate m1 i m2, pentru cele dou subintervale. n final, va fi
validat cea mai mare dintre valorile determinate.
Program ATESTAT_2004_19_Determinare_MAXIM_RECURSIV_DEI;
uses CRT;
type
vector = array [1..10] of integer;
VAR
x : vector;
MAX, n, i : integer;
function MAXIM ( incep, sf : integer; x : vector ) : integer;
var
m, m1, m2 : integer;
begin
IF sf - incep = 1 then
begin
if x [incep] > x [sf] then
MAXIM := x [incep]
else
MAXIM := x [sf]
end
ELSE
begin
m := (incep + sf) DIV 2;
m1 := MAXIM ( incep, m, x);
m2 := MAXIM ( m, sf, x );
if m1 > m2 then
MAXIM := m1
else
MAXIM := m2
end;
end; { sf. functie }
10
11
12
punct X dat');
13
14
15
{ PROGRAM
CLRSCR;
');
');
PRINCIPAL }
16