Documente Academic
Documente Profesional
Documente Cultură
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: integer;
R : vector;
{vector de resturi}
procedure TRANSFORMA (NRZECIMAL : integer; VAR R : vector;
VAR n : integer);
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}
2;
DIV
2;
contori
care
numara
REPEAT
write ('Dati urmatorul numarul zecimal = ');
readln (NRZECIMAL);
TRANSFORMA (NRZECIMAL, R, n);
writeln;
write
('Numarul
binar
NRZECIMAL,' este
');
for i := n DOWNTO 1 do
write (R[i]);
echivalent
lui
',
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:
5
begin
{ PROGRAM PRINCIPAL }
clrscr;
zero := 0;
{initializare
cifrele de zero si de unu}
unu := 0;
writeln;
contori
care
FOR NRZECIMAL := 1 to 55 do
begin
TRANSFORMA (NRZECIMAL, R, n);
writeln;
write
('Numarul
binar
echivalent
NRZECIMAL,' este
');
for i := n DOWNTO 1 do
write (R[i]);
writeln;
writeln;
numara
lui
',
for i := 1 to n do
begin
if R [i] = 0 then
zero := zero + 1
else
unu := unu + 1
end;
end;
{sfarsit FOR exterior}
writeln;
writeln;
writeln ('Total cifre de ZERO = ', zero);
writeln;
writeln ('Total cifre de UNU = ', unu);
readln
end.
n momentul apelrii procedurii, este clar c s-a gsit o soluie pe care o numrm
scriind:
Nrsol := Nrsol + 1
i apoi afim Nrsol.
Vom parcurge toate coloanele de la 1 la n. Pentru aceasta avem nevoie de un
contor poziional col care va lua valori de la 1 la n.
n procedur, col este o coloan curent, iar f [lin] este tot o coloan, i anume
coloana pe care se gsete regele de pe linia lin.
Procedura va tipri " * " dac pe coloana curent col exist un rege, adic atunci
cnd
col = f [lin], i va tipri "o" dac aceast condiie nu este satisfcut.
Program ATESTAT_2004_17_ASEZARE_REGI;
uses crt;
const
nrmaxregi = 8;
type
vectorsolutie = array [0..nrmaxregi] of 0..nrmaxregi;
var
f : vectorsolutie;
n, x, i : 0 .. nrmaxregi;
ok : boolean;
nrsol : word;
cond1, cond2, cond3, cond4, COND : boolean;
procedure AFISARE;
var
i, j : 0 ..nrmaxregi; {i = linie,
j = coloana,
f[i] = coloana }
begin
nrsol := nrsol + 1;
writeln;
writeln ('Solutia nr. ',nrsol);
for i := 1 to n do
begin
for j := 1 to n do
begin
if j = f [i] then
write (' * ')
else
write (' o ')
end;
writeln;
end;
writeln;
readln
end; { sfarsit procedura }
Begin { PROGRAM PRINCIPAL }
clrscr;
write ('Introduceti numarul de patratele
readln (n);
n = ');
nrsol:=0;
x := 1;
f [x] := 0;
{ virful stivei } {
9
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
linii
vecine,
coloana, fi=fx}
{dar
pe
adica x-i=1}
{ cond1 := (i > 1) AND (f[i-1] = f[i])
;
}
{Daca
sunt
pe
aceeasi
linii
vecine,
coloana, f[i-1]=f[i]}
{dar
pe
adica pe i si i-1}
cond2 := (ABS (i-x) = ABS (f[i] - f[x]
))
and (ABS (i-x) =1 ) ;
{Daca sunt pe
diagonala,
i-x=fi-fx}
{la distanta de 1 casuta,
i-x=1}
{ cond2 := ABS (f[i] - f[i-1]) = 1 ; }
{Daca sunt pe diagonala, }
{la distanta de 1 casuta }
{ cond3 := ABS (f[x] - f[x-1]) = 1 ; }
{sau
((ABS (f[i]-f[x]) = 1) and
(x=i) ) }
COND := cond1
OR cond2
;
if
COND then
begin
ok := false;
end
end; {for}
10
{ OR cond3 }
if ok = true
valida }
begin
if x = n then
plina }
AFISARE
else
begin
x := x + 1; { PAS INAINTE
}
f [x] := 0
end;
end;
end; { sfarsit WHILE interior }
x := x - 1
{ PAS INAPOI }
end; { sfarsit WHILE exterior }
readln
end.
12
begin
IF linie [poz] <> ' ' then
{daca in pozitia
poz nu este un blank}
sir := sir + linie [poz] {reconstituim un
numar din cifrele sale}
{folosind un sir in care
depunem}
{prin concatenare cifrele
numarului}
else
{daca s-a ajuns la un blank, inseamna ca
s-au parcurs }
{deja cifrele unui numar}
begin
i := i + 1; { numaram sirul care contine
numarul}
VAL (sir, x, ER);
{convertim sirul in
numarul x}
V [i] := x;
{preluam numarul x in
vectorul V}
writeln ('V[',i,'] = ', V[i] ); {optional,
afisam V[i] }
sir := '' ;
{reinitializam sir cu
sirul vid,}
{in eventualitatea}
{ca inca nu s-a epuizat
fisierul si mai sunt }
{numere
de
extras
din
fisier}
end; {sfarsit ELSE}
poz := poz + 1
{trecem la urmatoarea
pozitie din "linie"}
end;
{sfarsit WHILE}
n := i; {retinem in "n" ultima valoare a contorului
"i" }
{deci n = numarul total de numere extrase
din "linie"}
writeln (Fisierul contine n = , n, numere
naturale);
writeln;
writeln ('Vectorul V este: '); {optional, afisam
vectorul}
for i := 1 to n do
begin
writeln ('V[',i,'] = ', v[i]);
end;
14
writeln;
{determinam numarul maxim din vector, deci din
fisier}
max := V[1];
for i:= 2 to n do
begin
if max < v[i] then
max := v[i]
end;
writeln;
writeln ('Numarul maxim din fisier este MAX = ',
max);
readln
end.
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 }
16
begin
i := i - 1;
VALPOL := VALPOL * VALX + POL.COEF [i];
end;{while}
ValPolinom:=VALPOL;
end;{function}
function
RoundR
(NUMAR:real;
ZEC:integer)
{rotunjeste un real}
var
P10 : real;
i : integer;
begin
P10 := 1;
for i := 1 to ZEC do
P10 := P10 * 10; {end for}
RoundR := Round (NUMAR * P10) / P10;
end;{function}
18
real;
if R=15 then
R:=14; {sterge punctul de dupa numerele intregi}
S := Copy (S, L, R-L+1);
if SEMN then
begin
if NUMAR >= 0.0 then
S := '+' + S;
S := copy (S, 1, 1) + ' ' + copy (S, 2,
Length (S) - 1);
end;{if}
NrRealSir:=S;
end;{function}
procedure AfiseazaPol (MESAJ:string; var POL:polinom);
var
i, L, R : integer;
S : string;
begin
WriteLn;
WriteLn (MESAJ,' (de gradul ', POL.GRAD:2,') :');
20
[i]),
CC := ReadKey;
if Ord (CC) = 0 then
CC := ReadKey;
end;{while}
{afiseaza meniul principal}
writeln;
WriteLn ('
PROGRAM TEST');
writeln;
writeln ('
Alegeti una dintre optiunile de mai
jos:');
writeln;
writeln;
writeln;
WriteLn(' 1 - Pentru a calcula valoarea unui polinom
intr-un punct X dat');
WriteLn;
WriteLn(' <Esc> - Pentru Terminarea programului ');
WriteLn;
writeln;
WriteLn;
22
if OK then
begin
WriteLn;
WriteLn;
Write ('Apasati o tasta oarecare ... ');
repeat
until KeyPressed;
Window (1,1,80,25);
end;{if}
until Ord (OPTIUNE) = 27;
end.{program}
24
Program ATESTAT_2004_22_QUICK_SORT;
uses CRT;
CONST
nmax = 50;
TYPE
vector = array [1..50] of real;
VAR
x : vector; {x = variabila globala}
i, n : integer;
procedure QUICK (inf, sup : integer);
VAR
i, j : integer;
aux : real;
b : boolean;
begin
if inf < sup then
begin
i := inf;
j := sup;
b := TRUE;
repeat
if x[i] > x[j] then
begin
aux := x[i];
x[i] := x[j];
x[j] := aux;
b := not b;
end;
if b = TRUE then
j := j - 1
else
i := i + 1;
until i = j;
QUICK ( inf, i - 1);
QUICK ( i + 1, sup);
end;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
repeat
write ('n = '); readln (n)
until (n >= 1) and (n <= nmax);
writeln;
write ('Introduceti elementele vectorului');
writeln;
for i := 1 to n do
25
begin
write ('x[',i,'] = ');
readln ( x[i] );
end;
writeln;
writeln ('Sirul initial :');
writeln;
for i:=1 to n do
write ( x[i],'
');
QUICK (1, n);
writeln;
writeln ('Sirul sortat :');
writeln;
for i:=1 to n do
write (x[i],'
');
readln;
end.
26
care
data
28
{ PROGRAM
CLRSCR;
');
');
');
PRINCIPAL }
30