2007
Se citesc:
ari
Calculator
mari
lat
Rezolvare: Aplicm funcia POS pentru a determina dac un subir aparine unui ir
dat.
Program ATESTAT_2007_1_SUBSECVENTA_SIRURI;
uses CRT;
VAR
vectorsiruri : array [1..4] of STRING;
n, i, j, k, nrperechi : integer;
sir, linie, x, y : STRING;
BAC : text;
Begin { PROGRAM PRINCIPAL }
clrscr;
ASSIGN (BAC, 'C:\BAC.TXT');
REWRITE (BAC);
write ('Dati numarul de siruri (in cazul nostru n =
4), n = ');
readln (n);
for i := 1 to n do
begin
write ('Dati sirul ', i,' = ');
readln (sir);
vectorsiruri [i] := sir;
end;
nrperechi := 0; {contor care numara perechile x, y ce
satisfac cerintele}
for i := 1 to n - 1 do
begin
for j := i + 1 to n do
begin
if POS (vectorsiruri [i], vectorsiruri [j]) <>
0 then
begin
nrperechi := nrperechi + 1;
write (BAC, vectorsiruri [i], ' ,
',vectorsiruri [j] );
writeln (BAC);
end;
if POS (vectorsiruri [j], vectorsiruri [i]) <>
0 then
begin
nrperechi := nrperechi + 1;
write (BAC, vectorsiruri [j], ' ,
',vectorsiruri [i] );
writeln (BAC);
end;
end;
end;
RESET (BAC);
IF nrperechi = 0 then
begin
writeln;
writeln ('FARA SOLUTIE')
end
ELSE
begin
while not EOF (BAC) DO
begin
readln (BAC, linie);
writeln (linie)
end;
end;
readln
end.
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;
{ PROGRAM
clrscr;
PRINCIPAL }
n := 7;
ASSIGN (X, 'C:\X.txt');
ASSIGN (Y, 'C:\Y.txt');
ASSIGN (Z, 'C:\Z.txt'); {Z = fisierul care va rezulta
prin INTERCLASARE}
rewrite (X);
rewrite (y);
A
A
A
A
A
A
A
[1]
[2]
[3]
[4]
[5]
[6]
[7]
:=
:=
:=
:=
:=
:=
:=
'Ana';
'Dana';
'Daniel';
'Ene';
'Mara';
'Nae';
'Paul';
B
B
B
B
B
B
B
[1]
[2]
[3]
[4]
[5]
[6]
[7]
:=
:=
:=
:=
:=
:=
:=
'Angie';
'Cora';
'Dora';
'Horia';
'Oana';
'Paul';
'Tibi';
for i := 1 to n do
begin
write (X, A[i] );
writeln (X);
write (Y, B [i] );
writeln (Y);
end;
writeln;
{OPTIONAL, afisam continuturile celor doua fisiere}
writeln ('Fisierul X este:');
RESET (X);
while not EOF (X) do
begin
READLN (X, linie);
writeln (linie);
end;
writeln;
writeln ('Fisierul Y este:');
RESET (Y);
while not EOF (Y) do
begin
READLN (Y, linie);
writeln (linie);
end;
{CITIREA DIN FISIERELE TEXT }
RESET (X);
i:=1;
While NOT EOF (X) do
begin
READLN (X, linie);
A [i] := linie;
i := i + 1
end;
RESET (Y);
j:=1;
While NOT EOF (Y) do
9
begin
READLN (Y, linie);
B [j] := linie;
j := j + 1
end;
k := 0;
{index in vectorul rezultant C}
i := 1;
j := 1;
WHILE (i <= n) AND (j <= n) do
begin
if A [i] <= B [j] then
begin
k := k + 1;
C [k] := A [i];
i := i + 1;
end
10
else
begin
k := k + 1;
C [k] := B [j];
j := j + 1;
end;
end;
WHILE i <= n do
begin
k := k + 1;
C [k] := A [i];
i := i + 1
end;
WHILE j <= n do
begin
k := k + 1;
C [k] := B [j];
j := j + 1
end;
writeln;
writeln ('Vectorul rezultat in urma interclasarii
este:');
writeln;
for k := 1 to n + n do
begin
writeln ('C [',k,'] = ', C [k] );
end;
REWRITE (Z); {Generare fisier rezultant}
for k := 1 to n + n DO
begin
WRITE (Z, C[k], ' ' );
end;
writeln;
writeln ('Continutul fisierul rezultant este:');
writeln;
RESET (Z); {Pregatire fisier pentru citire}
While not EOF (Z) do
begin
READ ( Z, linie);
write ( linie);
end;
readln
end.
11
12
Program ATESTAT_2007_4_INVERSAREA_ELEMENTELOR_UNUI_SIR ;
VAR
n, i : integer;
sir, inv : string;
Y : array [1..100] of string;
function INVERS ( s : string ) : string;
begin
if s = '' then
INVERS := ''
else
INVERS := s [ LENGTH (s) ] + INVERS ( Copy (s, 1,
LENGTH (s) - 1 ));
end; { sfarsit functie }
Begin { PROGRAM PRINCIPAL }
write ('Dati numarul de numere, n = ');
readln (n);
for i := 1 to n do
begin
write ('Dati un nou numar cuprins intre 100
si 999, x = ');
readln (sir);
Y [i] := INVERS (sir);
writeln (sir,'
', INVERS (sir));
end;
writeln;
for i:= 1 to n do
write ( Y[i],' ');
readln
end.
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
n, i : integer;
A, B : vector;
k : BOOLEAN;
procedure CITESTEVECTOR (VAR X:vector; m : integer);
begin
for i:= 1 to m do
begin
write ('Dati elementul [ ',i,' ] = ');
readln ( X [i])
end;
end;
14
16
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.
18
Program ATESTAT_2007_7_ORDONARE_VECTOR ;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
x : vector;
n, i : integer;
procedure ORDONEAZACRESCATOR (VAR v : vector; m :
integer);
VAR
j, aux, test : integer;
begin
repeat
test := 0;
j := 1;
repeat
if v [j] > v [j + 1] then
begin
aux := v[j];
v [j] := v [j+1];
v [j + 1] := aux;
test := 1;
end;
j := j + 1
until j > m - 1
until test = 0
end;
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati n = ');
readln (n)
until (n>=1) and (n <=nmax);
writeln;
writeln ('Dati vectorul X');
writeln;
for i:= 1 to n do
begin
write ('Dati X[', i, '] = ');
readln (x[i])
end;
writeln;
ORDONEAZACRESCATOR (X, n);
writeln (Rezultatul sortarii este:);
for i := 1 to n do
begin
19
write (X[i],'
')
end;
readln
end.
20
Program ATESTAT_2007_8_DISTANTA_DINTRE_DOUA_PUNCTE ;
CONST
nmax = 24;
TYPE
vector = array [1..nmax] of integer;
VAR
n, i : integer;
x1,x2,y1,y2 : integer;
d : real;
f : vector;
procedure FIBO (VAR f : vector; m : integer) ;
{ procedura FIBO genereaza termenii sirului lui Fibonacci
}
{ si-i depune in vectorul f }
begin
f [1] := 1;
f [2] := 1;
for i := 3 to m do
begin
f [i] := f [i-1] + f [i-2]
end;
end;
Begin { PROGRAM PRINCIPAL }
write ('Dati n = ');
readln (n);
writeln ;
FIBO (f, n + 3);
x1 := f [n];
x2 := f [n+1];
y1 := f [n+2];
y2 := f [n+3];
{Distanta dintre punctele A si B se calculeaza cu
relatia}
d := SQRT ( SQR (ABS (x1 - x2)) + SQR ( ABS (y1 y2))) ;
writeln ('Distanta dintre A si B este = ', d:10:3 );
readln
end.
ATESTAT - 2007 - 9 ntr-o list simplu nlnuit alocat dinamic, fiecare nod
(element al listei) reine n cmpul DATA un numr natural cu cel mult nou cifre
i n cmpul URM, adresa elementului urmtor din list. Scriei subprogramul
DIVIZOR care, prin parametrul p, primete adresa primului element al listei
21
descrise mai sus, prin parametrul x, primete un numr natural cu cel mult nou
cifre i care afieaz pe ecran, cte unul pe linie, numerele din list care au exact un
divizor comun cu x. Dac n list nu exist un astfel de element atunci se va afia
mesajul problema nu are soluie.
Rezolvare:
1 - Se determin numrul de elemente din list, prin TRAVERSAREA listei.
2 - Construim un tablou A, n care memorm toi divizorii lui X.
3 - Construim un tablou B, n care memorm toi divizorii unui numr Y din list.
4 - Numrm divizorii comuni din tablourile A i B.
5 - Numrm i numerele din list care au doar un divizor comun cu X, n afar de 1.
5 - Dac exist doar un singur divizor comun, n afar de 1, afim numrul curent Y
din list.
6 - Dac nu gsim nici un numr n list, n conditiile problemei, afim mesajul: NU
EXIST SOLUIE.
22
Program
ATESTAT_2007_9_DIVIZORI_IN_LISTA_SIMPLU_INLANTUITA_ALOCATA
_DINAMIC ;
uses CRT;
label
10,500;
TYPE
lista = ^nod;
nod = record
cheie:integer;
data: LONGINT;
urm:lista
end;
VECTOR = array [1..1000] of LONGINT;
VAR
q, r, baza, p : lista;
nrdivizori, nrnoduri, n, i, j, k : integer;
X, Y, Z : LONGINT;
data: LONGINT;
c : char;
A, B, V : VECTOR; {vector in care se retin divizorii
gasiti}
procedure CITDATA; { introducere date utile }
begin
readln (data);
end;
procedure TRAVLISTA (VAR nrnoduri : integer);
{ traversare lista in ordinea introducerii }
begin
nrnoduri := 0;
p:=baza;
while p<>nil do
begin
writeln(' Nodul ',p^.cheie,' contine nr. =
',p^.data);
p:=p^.urm;
nrnoduri := nrnoduri + 1;
writeln
end;
end;
procedure DETDIVIZORI (Z : LONGINT; VAR nrdivizori:
integer; VAR V : vector);
{ determina divizorii unui nr Z din lista si-i scrie in
vectorul V }
VAR
nrdiv, diviz : LONGINT;
23
begin
k := 0; {index in vectorul V - vector cu divizorii
nr. Z }
nrdiv := 0;
for diviz := 2 to Z do
begin
if Z MOD diviz = 0 then
begin
nrdiv := nrdiv + 1;
k := k + 1;
V [ k ] := diviz;
end;
end;
writeln;
nrdivizori := nrdiv;
writeln ('Divizorii lui ', Z, ', in afara de 1,
sunt:');
for i := 1 to k do
begin
writeln ('Divizorul [ ', i, ' ] = ', V [i]
)
end;
writeln;
end;
24
end
end;
end;
procedure DIVIZOR (P : LISTA; X : LONGINT; VAR V : vector
);
VAR
divizoricomuni, numere, diviz, nrdiv : integer;
nrdivX, nrdivY : integer; {nr. de divizori ai lui X,
respectiv Y }
begin
writeln(' LISTA ESTE : ');
TRAVLISTA (nrnoduri);
writeln ('Lista are ', nrnoduri,' noduri');
writeln;
write ('Dati numarul X = ');
readln (x);
writeln;
DETDIVIZORI (X, nrdivizori, A);
nrdivX := nrdivizori;
writeln;
26
writeln
end; {sfarsit While - traversare lista si
verificare}
writeln;
writeln ('Apasati ENTER');
readln;
if numere = 0 then
writeln ('NU EXISTA SOLUTIE')
else
begin
CLRSCR;
for k := 1 to numere do
writeln ('Numarul ', V [k], ' are un
singur divizor comun
cu ', X,', in afara de
1');
end;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
writeln;
writeln ('SUGESTIE : ');
writeln;
writeln ('Pentru simplitate, rulati programul cu
valorile urmatoare:');
writeln;
writeln ('Lista va avea un numar de noduri, n = 3');
writeln;
28
ATESTAT - 2007 - 10 Fiierele text F1.txt i F2.txt conin, fiecare, elementele ale
cte unui ir de numere reale A, respective B. Fiierele conin numere distincte scrise
pe o linie i separate printr-un singur spaiu. Scriei un program care citete cele 2
iruri de numere din fiierele F1.txt i F2.txt i care scrie n fiierul F3.txt toate
elementele comune irurilor A i B, pe o linie i separate printr-un spaiu.
Exemplu : Dac fiierele F1.txt i F2.txt au coninuturile :
F1.txt :
10.3, 2.05, 5,
7.12, respectiv
F2.txt :
67, 7.12, 5,
3,
7.33, 9, atunci
F3.txt va conine: 7.12, 5.
Rezolvare: Se aplic procedurile specifice prelucrrii datelor de tip fiier.
Program ATESTAT_2007_10_FISIERE_TEXT_CU_ELEMENTE_COMUNE;
uses CRT;
CONST
29
nmax = 50;
TYPE
vector = array [1..nmax] of real;
VAR
f1, f2, f3 : TEXT;
ch : CHAR;
poz, k, m, n, i, j, ER : integer; {ER = variabila
EROARE in procedura VAL}
sir, linie1, linie2, linie3 : STRING;
A, B, C : vector;
nr : real;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
ASSIGN (f1, 'C:\f1.txt');
ASSIGN (f2, 'C:\f2.txt');
ASSIGN (f3, 'C:\f3.txt');
30
rewrite (f1);
rewrite (f2);
rewrite (f3);
linie1 := '10.3 2.05 5 7.12';
linie2 := '67 7.12 5 3 7.33 9';
write (f1, linie1);
write (f2, linie2);
RESET (f1);
RESET (f2);
READ (f1, linie1);
READ (f2, linie2);
i := 0; {index in vectorul A }
sir := '' ; {initializare cu sir vid }
poz := 1;
while poz < LENGTH (linie1) do
begin
IF linie1 [poz] <> ' ' then
sir := sir + linie1 [poz]
ELSE
begin
i := i + 1;
VAL (sir, nr, ER);
A [i] := nr;
sir := '' ;
writeln ('A [ ', i, ' ] = ', A [i]
: 10 : 2 );
end;
poz := poz + 1
end;
sir := sir + linie1 [poz];
i := i + 1;
VAL (sir, nr, ER);
A [i] := nr;
m := i;
writeln ('A [ ', i, ' ] = ', A [i] : 10 : 2 );
writeln;
writeln ('Vectorul A are m = ', m,' elemente');
writeln;
j := 0; {index in vectorul B }
sir := '' ; {initializare cu sir vid }
poz := 1;
while poz < LENGTH (linie2) do
begin
IF linie2 [poz] <> ' ' then
sir := sir + linie2 [poz]
31
ELSE
begin
j := j + 1;
VAL (sir, nr, ER);
B [j] := nr;
sir := '' ;
writeln ('B [ ', j, ' ] = ', B [j]
: 10 : 2 );
end;
poz := poz + 1
end;
sir := sir + linie2 [poz];
j := j + 1;
VAL (sir, nr, ER);
B [j] := nr;
n := j;
writeln ('B [ ', j, ' ] = ', B [j] : 10 : 2 );
writeln;
32
Program
ATESTAT_2007_11_NUMERE_NATURALE_FORMATE_DIN_CIFRE_IDENTICE
;
uses CRT;
VAR
n : LONGINT;
procedure ZECI (nr : LONGINT);
begin
nr := 11;
while (nr <= n) AND (nr <= 100)
begin
write (nr, ' ');
nr:= nr + 11;
end;
end;
34
do
begin
nr := 11111111;
while (nr <= n) AND (nr <= 100000000) do
begin
write (nr, ' ');
nr:= nr + 11111111;
end;
end;
procedure SUTEDEMILIOANE (nr : LONGINT);
begin
nr := 111111111;
while (nr <= n) AND (nr <= 1000000000) do
begin
write (nr, ' ');
nr:= nr + 111111111;
end;
end;
36
writeln;
MII (n);
writeln;
ZECIDEMII (n);
writeln;
SUTEDEMII (n);
end;
if (n > 1000000) and (n <= 10000000) then
begin
ZECI (n);
writeln;
SUTE (n);
writeln;
MII (n);
writeln;
ZECIDEMII (n);
writeln;
38
SUTEDEMII (n);
writeln;
MILIOANE (n);
end;
if (n > 10000000) and (n <= 100000000) then
begin
ZECI (n);
writeln;
SUTE (n);
writeln;
MII (n);
writeln;
ZECIDEMII (n);
writeln;
SUTEDEMII (n);
writeln;
MILIOANE (n);
writeln;
ZECIDEMILIOANE (n);
end;
if (n > 100000000) and (n <= 1000000000) then
begin
ZECI (n);
writeln;
SUTE (n);
writeln;
MII (n);
writeln;
ZECIDEMII (n);
writeln;
SUTEDEMII (n);
writeln;
MILIOANE (n);
writeln;
ZECIDEMILIOANE (n);
writeln;
SUTEDEMILIOANE (n);
end;
if (n > 1000000000) and (n <= 2000000000) then
begin
ZECI (n);
writeln;
SUTE (n);
writeln;
MII (n);
writeln;
39
ZECIDEMII (n);
writeln;
SUTEDEMII (n);
writeln;
MILIOANE (n);
writeln;
ZECIDEMILIOANE (n);
writeln;
SUTEDEMILIOANE (n);
writeln;
MILIARDE (n);
end;
readln
end.
40
ATESTAT - 2007 - 12 Prin asocierea fiecrei litere mici din alfabetul englez
cu un numr egal cu poziia cifrei n alfabet, se poate codifica orice secven de litere
mici cu o secven de numere. Scriei un program care citete din fiierul text
COD.TXT un numr "n" (0 < n < 30000) i, de pe rndul urmtor, o secven de n
litere mici. Folosind un algoritm eficient din punctul de vedere al gestionrii
memoriei, programul va codifica secvena de caractere citit i va scrie pe ecran
numerele asociate, separate prin spaii.
Exemplu : pentru fiierul COD.TXT:
7
bacinfo
se vor afia pe ecran, n ordine, numerele :
2 1 3 9 14 6 15
Rezolvare:
Stiind c literele mici au codurile ASCII ncepnd cu 97,
a = 97, b = 98, c = 99 ...
vom asocia noi coduri literelor mici astfel:
codul lui a = 97 - 96, adic ORD ('a') - 96
codul lui b = 98 - 96, adic ORD ('b') - 96
..............................................
codul lui z = ORD ('z') - 96
Program ATESTAT_2007_12_CODURI_ASCII ;
uses CRT;
CONST
nmax = 100;
VAR
c, literamica : CHAR;
n, ER, nr, i : integer;
COD : array ['a'..'z'] of 1..30;
f : text;
linie1, linie2, sir, sircitit : STRING;
Begin { PROGRAM PRINCIPAL }
ASSIGN ( f, 'C:\COD.txt');
REWRITE (f);
{----------------------------------------------}
{CODIFICARE LITERE MICI}
i := 0;
for literamica := 'a' to 'z' do
begin
i := i + 1;
COD [ literamica ] := ORD (literamica) - 96;
end;
{-----------------------------------------------}
CLRSCR;
41
42
RESET (f);
readln (f, linie1); {linie1 contine doar caractere
numerice }
VAL (linie1, nr, ER); { transform linie1 in numar }
writeln;
sircitit := '' ; {initializare sir citit din fisier
cu sirul vid}
for i := 1 to nr do
begin
read (f, c);
sircitit := sircitit + c;
end;
writeln ('sircitit = ', sircitit);
writeln;
writeln ('Sirul citit codificat numeric este:');
for i := 1 to LENGTH (sircitit) do
begin
write ( COD [sircitit [i] ] , ' ')
end;
readln
end.
44
ATESTAT - 2007 - 14 Scriei un program care citete un numr natural nenul par,
"n", n < 100 i apoi "n" numere naturale de cel mult 4 cifre fiecare i determin cea
mai mare sum care poate fi obinut adunnd numai o jumtate din toate numerele
naturale citite. Rezultatul se va afiat pe ecran.
Exemplu : Pentru n = 6 i numerele 728, 10, 103, 44, 1000, 94 se va afia : 1731
(reprezentnd suma : 728 + 103 + 1000).
Rezolvare:
1 - Introducem cele n numere, pe care le reinem n vectorul X.
2 - Ordonm descresctor vectorul X.
3 - Facem suma primelor n / 2 numere X [i].
46
Program ATESTAT_2007_14_SUMA_NUMERE;
uses CRT;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
n, i, j : integer;
SUMA : integer;
X : vector;
procedure ORDONEAZA (VAR X : vector); {ordonare dupa
algoritmul bubble sort}
VAR
aux, k : integer;
begin
REPEAT
k := 0;
i := 1;
REPEAT
if X [i] < X [i + 1] then
begin
aux := X [i];
X [i] := X [i+1];
X [i+1] := aux;
k := 1
end;
i := i + 1
until (i > n-1)
until (k = 0);
end;
Begin
{ PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati numarul de numere, n = ');
readln (n);
writeln;
writeln ('Introduceti numerele intregi mai mici ca
30.000');
writeln;
for i := 1 to n do
begin
write ('Dati X [ ', i, ' ] = ');
readln ( X [ i ]);
end;
47
ORDONEAZA ( X );
SUMA := 0;
for i := 1 to n DIV 2 do {se aduna doar jumatate
din numere}
begin
SUMA := SUMA + X [i];
end;
writeln;
writeln ('Suma maxima ce se poate obtine din
numerele citite = ', SUMA);
writeln;
writeln ('Ea rezulta din insumarea numerelor');
for i := 1 to n DIV 2 do
begin
writeln (X [i]);
end;
readln;
end.
48
ATESTAT - 2007 - 15 Scriei un program care citete din fiierul text BAC.TXT
cel mult 100 de numere naturale, aflate pe o singur linie, formate din cel mult 9 cifre
fiecare, separate prin spaii i, dintre acestea, le afieaz pe ecran doar pe acelea care
au proprietatea de a fi palindrom. Dac nu se citesc numere palindrom, se va afia pe
ecran valoarea 1. Un numr are proprietatea de a fi palindrom dac citit de la dreapta
la stnga sau de la stnga la dreapta are aceeai valoare. (1221 este palindrom, n timp
ce 1210 nu este palindrom).
Exemplu : dac din fiierul BAC.TXT se citesc numerele : 7341, 8228, 660, 2, 80,
131, atunci pe ecran se vor afia : 8228, 2, 131.
Rezolvare: Pentru a verifica simetria unui numr, trebuie s tim cte cifre are
numrul. Vom defini, deci, funcia NRCIFRE.
De asemenea, definim i procedura EXTRAGENUMEREDINFISIERTEXT, n care
apelm procedura VAL pentru transformarea unui ir ntr-un mumr.
Program ATESTAT_2007_15_PALINDROAME_IN_FISIER_TEXT;
uses CRT;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of LONGINT;
VAR
nr, n, i, t : LONGINT;
f : text;
sir, linie : STRING;
EROARE : integer; {variabila EROARE din apelul
procedurii VAL}
A : vector;
palindroame : integer; {contor care numara
palindroamele gasite}
function NRCIFRE ( nr : LONGINT) : integer;
VAR
m : integer; {contor pt. nr. cifre}
begin
if nr = 0 then
m := 1
else
begin
m := 0;
while nr <> 0 do
begin
nr := nr DIV 10;
m := m + 1
end
end;
49
NRCIFRE := m
end;
function PALINDROM (nr : LONGINT) : BOOLEAN;
VAR
nrcif : integer;
x1 : LONGINT;
k : BOOLEAN;
y : vector; {y = vector in care scriem cifrele
numarului nr}
begin
nrcif := NRCIFRE ( nr );
x1 := nr;
for i := 1 to nrcif do
begin
y [ i ] := x1 MOD 10;
x1 := x1 DIV 10;
end;
50
K := TRUE;
for i := 1 to nrcif DIV 2 do
begin
if y[i] <> y [nrcif - i + 1] then {verificam
SIMETRIA}
k := FALSE
end;
PALINDROM := K;
end;
procedure EXTRAGENUMEREDINFISIERTEXT (VAR f: text; VAR A :
vector);
VAR
poz, k : integer;
numar : LONGINT;
begin
RESET ( f );
read (f, linie);
i := 0; { i = index vector A }
sir := ''; {initializare cu sirul vid}
{ In "sir" se citeste cate un numar
din linie}
poz := 1;
while poz <
begin
LENGTH (linie) do
k:= poz;
while linie [ k ] <> ' ' do
begin
sir := sir + linie [ k ];
{concatenare}
k := k + 1;
end;
poz := k;
i := i + 1;
VAL (sir, numar, EROARE); {transforma
sir
in
numar }
A [i ] := numar;
sir :='' ;
poz := poz + 1;
end; {sfarsit WHILE exterior}
end; {sfarsit procedura}
51
Begin
{ PROGRAM PRINCIPAL }
CLRSCR;
ASSIGN (f, 'C:\BAC.txt');
rewrite (f); {generam fisierul text}
writeln ('Scrieti, in BAC.TXT, n numere naturale cu
cel mult 9 cifre');
writeln;
write ('Cate numere doriti sa introduceti, n = ');
readln (n);
writeln;
linie := ''; {initializare variabila "linie" cu sirul
vid}
{"linie" = un STRING care se va
introduce in fisierul text}
{"linie" va contine cele n numere
separate de spatii}
for i:= 1 to n do
begin
write ('Dati un numar natural, nr = ');
readln ( nr );
STR (nr, sir); {transforma nr in sir, pentru al memora in fisier}
linie := linie + sir + ' '; {construim "linie"
prin concatenare,}
end;
{scriind un
"spatiu" dupa fiecare sir }
writeln (f, linie); {scriem "linie" in fisierul text}
writeln;
52
for t := 1 to n do
begin
if PALINDROM ( A [t] ) = TRUE then
begin
writeln ('A [ ',t,' ] = ', A
[t],' este PALINDROM')
end
end;
end;
readln
end.
ATESTAT - 2007 - 16 Scriei un program care citete un numr natural nenul "n" (n
< 100) i un ir de n numere naturale nenule, de cel mult 4 cifre fiecare, i care
afieaz pe ecran irul ordonat cresctor, n funcie de suma cifrelor corespunztoare
fiecrui termen al su. Dac dou numere au aceeai sum a cifrelor, se va afia cel
mai mic dintre ele.
Exemplu :
Pentru n = 5 i numerele 701, 1000, 49, 99, 143, se va afia irul 1000 44 143
701 99.
54
Rezolvare:
1 - Introducem cele n numere, pe care le reinem n vectorul X.
2 - Pentru fiecare numr X [i], determinm numrul de cifre.
3 - Pentru fiecare numr calculm suma cifrelor i o depunem n vectorul S.
Evident, unui numr X[i] i corespunde un S[i].
4 - Ordonm vectorul S descresctor i, simultan, rearanjm numerele X[i], astfel ca
unui S [i] s-i
corespund acelai X [i].
5 - Facem suma primelor n / 2 numere X [i].
Program ATESTAT_2007_16_SUMA_CIFRE;
uses CRT;
LABEL
100;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
aux1, aux2, t, n, nr, i, j : integer;
SUMA, nrcifre : integer;
S, X, A : vector; {X = vectorul cu toate numerele}
{A = vectorul cu jumatate din numerele
lui X }
{care satisfac conditiile problemei }
CIFRA : vector; {vector care retine cifrele unui numar}
EGALE : BOOLEAN;
function MIN (nr1, nr2 : integer) : integer;
begin
if nr1 < nr2 then
MIN := nr1
else
MIN := nr2
end;
procedure ORDONEAZA (VAR S, X : vector);
VAR
aux1, aux2, k : integer;
begin
REPEAT
k := 0;
i := 1;
REPEAT
if S [i] > S [i + 1] then
begin
aux1 := S [i];
S [i] := S [i+1];
55
S [i+1] := aux1;
aux2 := X [i];
X [i] := X [i+1];
X [i+1] := aux2;
k := 1
end;
i := i + 1
until (i > n-1)
until (k = 0);
end;
function NRCIF (y : integer) : integer;
VAR
nr : integer;
begin
if y = 0 then
nr := 1
56
else
begin
nr := 0;
while y <> 0 do
begin
nr := nr + 1;
y := y DIV 10
end;
end;
NRCIF := nr
end;
procedure DETCIFRE (VAR nr : integer; VAR CIFRA : vector);
VAR
numar : integer;
begin
numar := nr;
for j := 1 to NRCIF (numar) do
begin
CIFRA [j] := numar MOD 10;
numar := numar DIV 10;
end;
{
write ('Cifrele lui ', nr, ' sunt ');
for j := NRCIF (nr) DOWNTO 1 do
write ( CIFRA [j], ' ');
}
writeln;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati numarul de numere, n = ');
readln (n);
writeln;
writeln ('Introduceti numerele intregi mai mici ca
30.000');
writeln;
for i := 1 to n do
begin
write ('Dati X [ ', i, ' ] = ');
readln ( X [ i ]);
{ writeln ('X [ ', i, ' ] are ', NRCIF (x [i]
),' cifre'); }
DETCIFRE ( X [i], CIFRA ); {determinam
cifrele lui X [i] }
S [i] := 0;
for j:= 1 to NRCIF ( X[i] ) do
begin
S [i] := S [i] + CIFRA [j];
57
end;
end;
ORDONEAZA ( S, X);
writeln;
100:
writeln ('Numerele ordonate crescator dupa suma
cifrelor sunt:');
for i := 1 to n do
begin
writeln (' X [ ', i, ' ] = ', X[i],'
S [
', i, ' ] = ', S[i] );
end;
writeln;
EGALE := FALSE;
for i := 1 to n-1 do
begin
if S[i] = S[i+1] then
begin
EGALE := TRUE;
end;
end;
58
ATESTAT - 2007 - 17 Pentru orice numr natural nenul "n" definim n factorial
(notat n !) ca fiind produsul tuturor numerelor naturale nenule mai mici sau egale cu n
(n ! = 1*2*3**n). De exemplu : 3 ! = 1*2*3 = 6 ;
5 ! = 1*2*3*4*5 = 120.
Descriei n limbaj natural o metod eficient de determinare a numrului de cifre nule
aflate pe ultimele poziii consecutive ale valorii obinute n urma evalurii lui n !, n
fiind un numr natural de cel mult 4 cifre.
Exemplu: dac n = 10, n ! =3.628.800 rezultatul va fi 2, deoarece 3.628.800 are doi de
0 la sfrit.
Rezolvare:
1 - Calculm n FACTORIAL i memorm rezultatul n variabila F.
2 - Determinm numrul de cifre pentru F.
3 - Determinm cifrele lui F i le memorm ntr-un vector.
4 - Numrm cifrele nule consecutive de la sfritul lui F.
Program ATESTAT_2007_17_NR_CIFRE_NULE_LA_FACTORIAL;
uses CRT;
LABEL
100;
CONST
nmax = 100;
TYPE
59
60
{ PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati numarul n = ');
readln (n);
writeln;
F := FACTORIAL (n);
nrcifre := NRCIF (F);
DETCIFRE ( F, CIFRA ); { determinam cifrele lui F si
}
{ le memoram in vectorul CIFRA
}
NULE := 0; {contor care numara cifrele nule}
61
62
begin
nr := nr + 1;
y := y DIV 10
end;
end;
NRCIF := nr
end;
procedure DETCIFRE (VAR nr : LONGINT; VAR CIFRA : vector);
VAR
numar : LONGINT;
begin
numar := nr;
for j := NRCIF (numar) DOWNTO 1 do
begin
CIFRA [j] := numar MOD 10;
numar := numar DIV 10;
end;
64
ATESTAT - 2007 - 19 Scriei un program care citete din fiierul text DATE.IN cel
mult 100 de numere naturale nenule aflate pe o singur linie, formate din cel mult 4
cifre fiecare, separate prin spaii i le scrie n fiierul DATE.OUT, n ordine invers
fa de cea n care au fost citite, pe o singur linie, separate prin spaii. De exemplu,
dac din fiierul DATE.IN se citesc numerele
93 207 15 1982 3762, atunci
coninutul fiierului DATE.OUT va fi : 3762 1982 15 207 93.
Rezolvare: Pentru a extrage numerele din fiierul text DATE.IN, definim procedura
EXTRAGENUMEREDINFISIERTEXT.
Program ATESTAT_2007_19_INVERSAREA_ELEMENTELOR_UNUI_SIR;
uses CRT;
CONST
65
nmax = 100;
TYPE
vector = array [1..nmax] of LONGINT;
VAR
nr, n, i, t : LONGINT;
sir, linie : STRING;
EROARE : integer; {variabila EROARE din apelul
procedurii VAL}
A : vector;
f1, f2 : TEXT;
linie1, linie2 : STRING; {linii din cele doua fisiere
text}
procedure EXTRAGENUMEREDINFISIERTEXT (VAR f: text; VAR A :
vector);
VAR
poz, k : integer;
numar : LONGINT;
begin
RESET ( f );
read (f, linie);
i := 0; { i = index vector A }
sir := ''; {initializare cu sirul vid}
{ Cu variabila "sir" se citeste cate
un numar din linie}
66
poz := 1;
while poz <
begin
LENGTH (linie) do
k:= poz;
while linie [ k ] <> ' ' do
begin
sir := sir + linie [ k ];
{concatenare}
k := k + 1;
end;
poz := k;
i := i + 1;
VAL (sir, numar, EROARE); {transf. sir
-> in numar }
A [i ] := numar;
sir :='' ;
poz := poz + 1;
end;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
ASSIGN (f1, 'C:\DATE.IN');
ASSIGN (f2, 'C:\DATE.OUT');
REWRITE (f1); {Generare (initializare) fisiere}
REWRITE (f2);
writeln ('Introduceti, in fisierul DATE.IN, n numere
naturale cu cel mult 4 cifre');
writeln;
write ('Cate numere doriti sa introduceti, n = ');
readln (n);
writeln;
linie1 := ''; {initializare variabila "linie1" cu
sirul vid}
{"linie1" va contine cele n numere separate
de spatii}
{"linie1" = un STRING care se va
introduce in fisierul text}
for i:= 1 to n do
begin
write ('Dati un numar natural, nr = ');
readln ( nr );
STR (nr, sir); {transformam numarul in sir,
pentru a-l memora in
fisierul text}
linie1 := linie1 + sir + ' '; {construim
"linie1" prin concatenare,}
67
end;
{scriind un
"spatiu" dupa fiecare sir }
writeln (f1, linie1); {scriem "linie1" in fisierul
text DATE.IN}
writeln;
writeln ('Fisierul text DATE.IN are continutul:');
RESET (f1);
READLN (f1, linie1);
writeln ('Linie 1 = ', linie1);
writeln;
{Din STRING-ul "linie1" trebuie sa extragem numerele
}
EXTRAGENUMEREDINFISIERTEXT ( f1, A );
writeln;
{
writeln ('Vectorul A, rezultat dupa extragere numere
din fisierul DATE.IN este:');
for i := 1 to n do
begin
writeln ('A [ ',i,' ] = ', A[i] );
end;
}
writeln;
{Construim linie2 pe care o vom scrie in fisierul
DATE.OUT}
linie2 := ''; {initializare variabila "linie2" cu
sirul vid}
{"linie2" va contine cele n numere separate
de spatii}
{"linie2" = un STRING care se va
introduce in fisierul text}
68
Program
ATESTAT_2007_20_FRECVENTA_APARITIE_CIFRE_IN_FISIER_TEXT;
uses CRT;
TYPE
vectorCIFRE = array ['0'..'9'] of integer;
vector1 = array [0..9] of integer; {tip pt. vector
FRECVENTA aparitii }
vector2 = array [0..9] of '0'..'9';
VAR
cifra : char;
sir, linie : string;
nrmax : integer; {numarul maxim de aparitii ale unei
cifre }
NRCIFRE : vectorCIFRE;
FRECVENTA : vector1;
CIFRE : vector2;
{ vector auxiliar folosit la ordonarea
vectorului FRECVENTA }
nr, n, i : Integer;
f : text;
70
CLRSCR;
ASSIGN (f, 'C:\BAC.txt');
rewrite (f); {generam fisierul text}
writeln ('Introduceti, in fisierul BAC.TXT, n numere
naturale NENULE, de cel
mult 4 cifre');
write ('Cate numere doriti sa introduceti, n = ');
readln (n);
linie := ''; {initializare variabila "linie" cu sirul
vid}
{"linie" = un STRING care se va
introduce in fisierul text}
{"linie" va contine cele n numere
separate de spatii}
for i:= 1 to n do
begin
write ('Dati un numar natural, nr = ');
readln ( nr );
STR (nr, sir); {transformam numarul in sir,
pentru a-l memora in
fisierul text}
linie := linie + sir + ' '; {construim "linie"
prin concatenare}
end;
{scriind un
"spatiu" dupa fiecare sir }
72
74
76
for i:= 1 to n do
begin
write ('Dati un numar natural, nr = ');
readln ( nr );
STR (nr, sir); {transformam numarul in sir,
pentru a-l memora in fisierul text}
linie := linie + sir + ' '; {construim "linie"
prin concatenare}
end;
{scriind un
"spatiu" dupa fiecare sir }
writeln (f, linie); {scriem "linie" in fisierul text}
writeln ('Fisierul text are continutul:');
RESET (f);
READLN (f, linie);
writeln (linie);
writeln;
{ Din STRING-ul "linie" trebuie sa extragem numerele
}
EXTRAGENUMEREDINFISIERTEXT ( f, A );
{
writeln ('Vectorul A, rezultat dupa extragere
este:');
for i := 1 to n do
begin
writeln ('A [ ',i,' ] = ', A[i] );
end;
}
writeln;
C := DIVCOM (1, n);
writeln ('CMMDC al celor ', n, ' numere este = ', C);
readln
end.
78
{ PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati n = ');
readln (n);
writeln;
writeln ('Varianta 1 - Cu REPEAT');
writeln ('==========');
REPEAT
n := n DIV 10
UNTIL n < 10;
writeln ('Dupa rulare, n = ', n);
writeln;
writeln ('Varianta 2 - Cu WHILE');
writeln ('==========');
WHILE n >= 10 do
begin
n := n DIV 10
end;
writeln ('Dupa rulare, n = ', n);
readln
end.
79
80
Rezolvare:
Pentru ciclul cu test final "REPET", n program folosim REPEAT.
Folosim un contor "i" care numr repetiiile.
Program ATESTAT_2007_23_PSEUDOCOD;
uses CRT;
VAR
n, i : integer;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati n = ');
readln (n);
writeln;
i := 0;
REPEAT
n := n DIV 10;
i := i + 1
UNTIL n < 10;
writeln ('Dupa rulare, n = ', n);
writeln;
writeln ('Numarul de repetitii, i = ', i);
readln
end.
nrdiv := nrdiv + 1;
end;
NRDIVIZORI := nrdiv;
end;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati un numar natural format din cel mult 4
cifre, x = ');
readln (x);
if NRDIVIZORI (x) <= 2 then
writeln ('Numarul ', x,' este PRIM')
else
writeln ('Numarul ', x,' NU este PRIM');
readln
end.
82
83
84
86
else
writeln (A,' NU apartine sirului lui Fibonacci');
if VERIFICA (B) = TRUE then
writeln (B,' apartine sirului lui Fibonacci')
else
writeln (B,' NU apartine sirului lui Fibonacci');
writeln;
if SUCCESIVE (A, B) = TRUE then
writeln ('Da, ', A,' si ', B,' sunt termeni
SUCCESIVI ai sirului Finonacci')
else
writeln ('Nu, ', A,' si ', B,' NU sunt termeni
SUCCESIVI ai sirului Finonacci');
readln
end.
ATESTAT - 2007 - 27 Se consider fiierul text DATE.IN care conine exact 899
numere distincte formate fiecare din cte 3 cifre. S se afieze i s se scrie n fiierul
text DATE.OUT numrul format din 3 cifre care lipsete din fiierul DATE.IN.
Rezolvare:
TOATE numerele de 3 cifre sunt cuprinse ntre 100 i 999.
n total sunt 900 de numere, adic 999 - 100 + 1.
Dac n fiierul DATE.IN sunt exact 899 numere DISTINCTE formate din 3 cifre,
rezult c, ntr-adevr, lipsete doar un singur numr.
Prelum toate numerele din fiierul DATE.IN ntr-un vector X.
Ordonm vectorul i cutm numrul care lipsete, tiind c, dup ordonare,
vectorul va conine doar numere consecutive, cu excepia locului unde lipsete
numrul cutat.
Atunci cnd diferena dintre dou numere succesive din vector este > 1, rezult c
n acel loc lipsete nu numr, care nu poate fi dect media aritmetic a celor dou
numere succesive.
Program ATESTAT_2007_27_NUMERE_CONSECUTIVE ;
uses CRT;
CONST
nmax = 1000;
TYPE
vector = array [1..nmax] of integer;
VAR
x, y, i, j, t : integer;
f1, f2 : text;
sir, linie1, linie2 : STRING;
87
88
writeln;
writeln ('Fisierul DATE.IN are ', nrcaractere,'
caractere');
writeln;
RESET (f);
poz := 1;
sir := ''; {initializare cu sirul vid}
{ In "sir" se citeste cate un numar
din fisier}
while not EOF (f) do
{ while poz < nrcaractere do }
begin
READ (f, c);
k:= poz;
while c <> ' ' do
begin
sir := sir + c ; {concatenare}
READ (f, c);
end;
poz := k;
i := i + 1;
VAL (sir, numar, EROARE); {transf. sir
-> in numar }
A [i ] := numar;
sir :='' ;
poz := poz + 1;
end;
end;
procedure AFISAREVECTOR ;
begin
for i := 1 to 200 do
begin
write ( A[i],'
' );
end;
writeln;
writeln ('Apasati ENTER');
readln;
for i := 201 to 400 do
begin
write ( A[i],'
' );
end;
writeln;
writeln ('Apasati ENTER');
readln;
for i := 401 to 600 do
begin
89
write ( A[i],'
' );
end;
writeln;
writeln ('Apasati ENTER');
readln;
for i := 601 to 800 do
begin
write ( A[i],'
' );
end;
writeln ('Apasati ENTER');
readln;
for i := 801 to 899 do
begin
write ( A[i],'
' );
end;
writeln ('Apasati ENTER');
readln;
end;
90
Begin
{ PROGRAM PRINCIPAL }
CLRSCR;
ASSIGN (f1, 'C:\DATE.IN');
ASSIGN (f2, 'C:\DATE.OUT');
rewrite (f1); {generam fisierul text f1}
rewrite (f2); {generam fisierul text f2}
{ Introducem cele 899 numere din 3 cifre in fisierul
DATE.IN }
{ mai putin un numar, de exemplu x = 456 }
write ('Ce numar de 3 cifer doriti sa lipseasca ?
Dati numarul x = ');
readln (x);
sir := ''; {initializare cu sirul vid}
for i := 100 to x -1 do
begin
STR (i, sir);
{transformam numarul "i" in sir, pentru a-l
memora in fisierul text}
sir := sir + ' '; {construim "sir" prin
concatenare}
{scriind un "spatiu" dupa
fiecare sir }
write (f1, sir);
end;
for i := x + 1 to 999 do
begin
STR (i, sir);
{transformam numarul "i" in sir, pentru a-l
memora in fisierul text}
sir := sir + ' '; {construim "sir" prin
concatenare}
{scriind un "spatiu" dupa
fiecare sir }
write (f1, sir);
end;
EXTRAGENUMEREDINFISIERTEXT ( f1, A );
writeln ('Vectorul A, rezultat dupa extragere
este:');
AFISAREVECTOR
for i := 1 to
begin
if A
y
end;
;
898 do
[i + 1] - A [i] > 1 then
:= ( A[i] + A [i+1] ) DIV 2
91
92
VAR
A : matrice;
m, n, i, j : 1..20;
function CMMDC ( X, Y : integer) : integer;
VAR
aux, R : integer;
begin
if X < Y then
begin
aux := X;
X := Y;
Y := aux
end;
R := X MOD Y;
while R <> 0 do
begin
X := Y;
Y := R;
R := X MOD Y
end;
CMMDC := Y
end; { sf. fct. CMMDC }
Begin { PROGRAM PRINCIPAL }
repeat
write ('Dati m = ');
readln (m);
until (m >= 1) and (m <= nmax);
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) and (n<=nmax);
writeln;
{ Generam elementele matricii A }
for i := 1 to m do
begin
for j := 1 to n do
begin
A [ i, j ] := CMMDC (i, j);
end
end;
writeln ('Matricea A este:');
for i := 1 to m do
begin
for j := 1 to n do
begin
write ( A [ i, j ] , ' ');
93
end ;
writeln;
end;
readln
end.
94
Program
ATESTAT_2007_29_DIVIZORII_UNUI_NUMAR_IN_ORDINE_DESCRESCATO
ARE ;
uses CRT;
CONST
nmax = 100;
TYPE
vector = array [1..nmax] of integer;
VAR
n, nr, i, j, s1 : integer;
divizor, nrdiv, EROARE : integer;
x, A : vector;
f : text;
sir, linie : STRING;
procedure ORDONEAZADESCRESCATOR (VAR v : vector; m :
integer);
VAR
j, aux, test : integer;
begin
repeat
test := 0;
j := 1;
repeat
if v [j] < v [j + 1] then
begin
aux := v[j];
v [j] := v [j+1];
v [j + 1] := aux;
test := 1;
end;
j := j + 1
until j > m - 1
until test = 0
end;
procedure EXTRAGENUMEREDINFISIERTEXT (VAR f: text; VAR A :
vector);
VAR
poz, k : integer;
numar : LONGINT;
begin
RESET ( f );
read (f, linie);
i := 0; { i = index vector A }
sir := ''; {initializare cu sirul vid}
95
LENGTH (linie) do
k:= poz;
while linie [ k ] <> ' ' do
begin
sir := sir + linie [ k ];
{concatenare}
k := k + 1;
end;
poz := k;
i := i + 1;
VAL (sir, numar, EROARE); {transf. sir
-> in numar }
A [i ] := numar;
sir :='' ;
poz := poz + 1;
end; {END While }
end; {END Procedura }
96
Begin
{ PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati numarul n = ');
readln (n);
i := 0 ; {index pt. vectorul X in care scriu
divizorii lui n }
nrdiv := 0 ; {contor care numara divizorii lui n }
for divizor := 1 to n do
begin
if n MOD divizor = 0 then
begin
nrdiv := nrdiv + 1;
i := i + 1;
X [i] := divizor
end;
end;
ORDONEAZADESCRESCATOR ( X , nrdiv);
writeln ('Divizorii lui ', n,', ordonati
descrescator, sunt:');
writeln;
for i:= 1 to nrdiv do
begin
write ( x [i],' ' );
end;
writeln;
ASSIGN (f, 'C:\BAC.txt');
rewrite (f); {generam fisierul text}
linie := ''; {initializare variabila "linie" cu sirul
vid}
{"linie" = un STRING care se va
introduce in fisierul text}
{"linie" va contine cele n numere
separate de spatii}
for i:= 1 to nrdiv do
begin
STR ( X [i], sir);
{transforma numarul X [i] in sir, pentru a-l
memora in fisierul text}
linie := linie + sir + ' '; {construim "linie"
prin concatenare}
end;
{scriind un
"spatiu" dupa fiecare sir }
writeln (f, linie); {scriem "linie" in fisierul text}
writeln;
writeln ('Fisierul text are continutul:');
RESET (f);
97
98
100
Program ATESTAT_2007_31_SUMA_DIVIZORILOR_UNUI_NUMAR ;
uses CRT;
VAR
n, K : LONGINT;
procedure SUMADIVIZORI (nr : LONGINT ; VAR S : LONGINT );
VAR
divizor : LONGINT;
nrdiv : integer;
begin
S := 0;
nrdiv := 0;
for divizor := 1 to nr do
begin
if nr MOD divizor = 0 then
begin
nrdiv := nrdiv + 1;
S := S + divizor
end;
end;
end;
102
Begin
{ PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati numarul n = ');
readln (n);
SUMADIVIZORI (n, k); {apelul procedurii, in urma
caruia obtin k }
writeln ('Suma divizorilor lui ', n,' = ', k );
readln
end.
104
Begin
{ PROGRAM PRINCIPAL }
CLRSCR;
write ('Dati numarul de perechi cautate (p < 8), p =
');
readln (p);
per := 0;
for A:= 220 to 10000 do {sau for A:= 1 to 10000
dureaza mai mult}
begin
for B := 280 to 10000 do {sau for B:= 1 to
10000 }
begin
if PRIETENE (A, B) then
begin
writeln (A,' si ', B,' sunt
prietene ');
writeln;
per := per + 1;
PERECHE [per, 1] := A;
PERECHE [per, 2] := B;
if per = p then
GOTO afisare;
end
else
{ writeln (A,' si ', B,' NU sunt
prietene '); }
writeln;
end;
end;
afisare:
writeln;
for i := 1 to p do
writeln ('Perechea ', i,' este: ', PERECHE [i,
1],' ', PERECHE [i, 2] );
readln
end.
106
end.
ATESTAT - 2007 - 34 Pentru o valoare "n" (numr natural, 1 <= n <= 100) citit
de la tastatur, concepei un program care scrie n fiierul BAC.TXT un tablou
bidimensional cu n linii i n coloane cu formatul de jos. Elementele de pe fiecare linie
sunt separate prin spaiu.
1
0 0
0...0
2
1 0
0...0
3
2 1
0...0
...............
n
n-1 n-2 n-3 ...1
Exemplu: pentru n = 4, coninutul fiierului BAC.TXT este:
1
0 0
0
2
1 0
0
3
2 1
0
4
3 2
1
Rezolvare: Observm c diagonala principal este format din cifre de 1, iar deasupra
diagonalei principale toate elementele sunt 0. Pe fiecare coloan, elementele se afl n
ordine cresctoare.
Program
ATESTAT_2007_34_ELEMENTE_NULE_DEASUPRA_DIAGONALEI_PRINCIPA
LE ;
uses CRT;
CONST
nmax = 100;
TYPE
MATRICE = array [1..nmax, 1..nmax] of integer;
VAR
n, i, j, k : integer;
A : matrice;
f : TEXT;
linie, sir : STRING;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
ASSIGN (f,'C:\BAC.TXT');
REWRITE (f); {generare-initializare fisier}
repeat
write ('Dati n = ');
readln (n)
108
end.
110
begin
max := p;
{ writeln ('Divizorul ', d,' apare la
puterea ',max ); }
diviz := d;
end
end
else
begin
d := d + 1; { se trece la urmatorul
divizor }
p := 0 ; {pt. noul divizor, se
reinitializeaza putere }
end;
end;
writeln ('Divizorul ', diviz,' apare la puterea
maxima, Pmax = ',max );
if PRIM (diviz) then
writeln (diviz,' este numar prim')
else
writeln (diviz,' NU este numar prim');
readln
end.
112
Rezolvare:
ATENIE ! NU introducei un n > 73.
Pentru n = 73, se obine numrul 1.111.111.111.
Pentru n = 74, ar trebui s se afieze 2.222.222.222, dar se stie c,
pentru tipul LONGINT, numrul ntreg maxim este MAXLONGINT =
2.147.483.647.
Deci, pentru orice n > 74, vom obine rezultate eronate.
Program ATESTAT_2007_37_SIR_DE_NUMERE_CU_CIFRE_IDENTICE ;
uses CRT;
VAR
n : integer;
function ZECI (m:integer) : LONGINT ;
begin
if m = 1 then
ZECI := 11
else
ZECI := 11 + ZECI (m-1)
end;
114
116
a acesteia, s fie egale cu n - 2 etc. Matricea se va afia pe ecran, cte o linie a matricei
pe cte o linie a ecranului, cu spaii ntre elementele fiecrei linii (ca n Exemplu).
Exemplu: pentru n = 5, se construiete n memorie i se afieaz matricea :
a11
a21
a31
a41
a51
a12
a22
a32
a42
a52
a13
a23
a33
a43
a53
a14
a24
a34
a44
a54
a15
a25
a35
a45
a55
1
2
3
4
5
2
3
4
5
4
3
4
5
4
3
4
5
4
3
2
5
4
3
2
1
Rezolvare:
Elementele de pe diagonala secundar sunt: a15 a24 a33 a42 a51.
Observm c i = 1 . . 5, iar j = 5 . . 1.
k=0
La aceste elemente, indicii i i j satisfac relaia i + j = 6 = n - k + 1.
118
Observm c i = 5, iar j = 5.
k=5
La aceste elemente, indicii i i j satisfac relaia i + j = 10 = n + k.
--------------------------------------Pentru diagonalele secundar i cele de SUB ea, indecii i i j iau valori n intervalele
i=k..n j=n..k
unde k ia valori de la 2 . . n.
Indecii satisfac relaia
i+j=n+k
Un element
A [i, j] = n - (k - 1).
Program ATESTAT_2007_38_DIAGONALA_SECUNDARA_MATRICE ;
uses CRT;
CONST
nmax = 30;
120
TYPE
MATRICE = array [1..nmax, 1..nmax] of integer;
VAR
n, i, j, k : integer;
A : matrice;
Begin { PROGRAM PRINCIPAL }
CLRSCR;
repeat
write ('Dati n = ');
readln (n)
until (n >= 1) AND (n <= nmax);
{ Generam elementele matricii}
{ Elementele de DEASUPRA diagonalei secundare}
{--------------------------------------------}
k := 0;
while k <= n - 1 do
begin
i := 1;
while i <= n - k do
begin
j := n - k;
while j >= 1 do
begin
if i + j = n - k + 1 then
begin
A [i, j] := n - k;
{
write ('A [ ',i,',',j,' ]
= ', A[i,j]);
readln;
}
end;
j := j - 1
end;
i := i + 1
end;
k := k + 1
end;
{ Elementele de SUB diagonala secundare}
{--------------------------------------------}
k := 2;
while k <= n do
begin
i := k;
while i <= n do
121
begin
j := n;
while j >= k do
begin
if i + j = n + k then
begin
A [i, j] := n - (k - 1);
{
write ('A [ ',i,',',j,' ]
= ', A[i,j]);
readln;
}
end;
j := j - 1
end;
i := i + 1
end;
k := k + 1
end;
122
');
{
[poz] );
begin
poz := poz + 1;
SirNou [poz] := c;
writeln ('SirNou [ ', poz,' ] = ', SirNou
}
end;
end;
writeln;
writeln ('Noul sir este :');
for i := 1 to poz do
write (SirNou [i] );
readln
end.
124
begin
litera := sir2 [i];
cuvant2 := cuvant2 + [litera]
{ construim multimea cuvant2 prin reuniune (
operatorul " + " ) }
end;
writeln;
writeln ('Sirul 2 contine literele :');
for litera := 'a' to 'z' do
begin
if litera IN cuvant2 then
write (litera,' ')
end;
writeln;
if cuvant1 <= cuvant2 then { testarea INCLUZIUNII
celor doua multimi }
writeln ('TOATE literele din primul sir se regasesc
si in al doilea sir')
else
writeln ('NU toate literele din primul sir se
regasesc si in al doilea');
readln
end.
126
128
Begin
{ PROGRAM PRINCIPAL }
CLRSCR;
ASSIGN (f, 'C:\BAC.txt');
rewrite (f); {generam fisierul text}
writeln ('Introduceti, in fisierul BAC.TXT, n numere
INTREGI cu cel mult 9 cifre');
writeln;
write ('Cate numere doriti sa introduceti, n = ');
readln (n);
writeln;
writeln (f, n); {Se scrie n pe prima linie din
fisierul text}
linie := ''; {initializare variabila "linie" cu sirul
vid}
{"linie" va contine cele n numere separate de
spatii}
{"linie" = un STRING care se va
introduce in fisierul text}
for i:= 1 to n do
begin
write ('Dati un numar INTREG, nr = ');
readln ( nr );
STR (nr, sir); {transformam numarul nr in
sir, pentru a-l memora
in fisierul text}
linie := linie + sir + ' '; {construim "linie"
prin concatenare}
end;
{scriind un
"spatiu" dupa fiecare sir }
writeln (f, linie); {scriem "linie" in fisierul text}
writeln;
writeln ('Fisierul text are continutul:');
RESET (f);
while not EOF (f) do
begin
READLN (f, linie);
writeln (linie);
end;
writeln;
{ Din STRING-ul "linie" trebuie sa extragem numerele
}
EXTRAGENUMEREDINFISIERTEXT ( f, A, n );
writeln;
writeln ('Numarul n citit de pe prima linie este n =
', n);
writeln;
129
130