Sunteți pe pagina 1din 23

Programare(PASCAL)

SUBIECTUL 1
Fişierul date.in conţine cel mult 100000 numere naturale separate prin spaţii, fiecare număr
având cel mult nouă cifre. Să se realizeze un program care scrie în fişierul date.out, pe o singură
linie, separate prin câte un spaţiu, toate numerele din date.in care au prima cifra pară.
Exemplu:
date.in date.out
45 123 68 8 134 56 876 45 68 8 876

Rezolvare:
var n:integer;
f,g:text;
function par(nr:integer):boolean;
var ok:boolean;
begin
while nr>=10 do
nr:=nr div 10;
if nr mod 2=0 then
ok:=true
else ok:=false;
par:=ok;
end;

begin
assign(f,'date.in');
reset(f);
assign(g,'date.out');
rewrite(g);
while not eof(f) do
begin
read(f,n);
if par(n)=true then
write(g,n,' ');
end;
close(f);
close(g);
end.

SUBIECTUL 2
Fişierul Atestat.txt conţine cel mult 100 de numere naturale de cel mult 6 cifre fiecare, câte
un număr pe fiecare linie a fişierului. Scrieţi un program care:
a) afişează pe ecran toate numerele din fişier, câte 3 pe fiecare linie, numerele de pe o linie
fiind separate prin câte un spaţiu, ultima linie rămânând eventual incompletă
b) afişează pe ecran, pe următoarea linie, suma numerelor prime din fişier
Exemplu:
Atestat.txt Se afişează: 568
5 743
6 3
8 18
7
4
3
3

Rezolvare:
var s,k,n:integer;

PROGRAMARE 1 ATESTAT 2009


- INFORMATICĂ INTENSIV-
f:text;
function prim(nr:integer):boolean;
var ok:boolean;
begin
j:=2;
ok:=true;
while (j<=trunc(sqrt(nr))) and (ok=true) do
begin
if nr mod j=0 then
ok:=false;
j:=j+1;
end;
prim:=ok;
end;

begin
assign(f,'atestat.txt');
reset(f);
s:=0;
k:=0;
while not eof(f) do
begin
readln(f,n);
k:=k+1;
if prim(n)=true then
s:=s+n;
write(n,' ');
if k mod 3=0 then writeln(f)?
end;
if k mod 3<>0 then
writeln;
write(s);
close(f);
end.

SUBIECTUL 3
Se consideră fişierul cuvinte.txt ce conţine pe prima linie un număr natural n iar pe
următoarele n linii câte un cuvânt cu maxim 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
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:
cuvinte.txt
3 Se afişează: sas
sas
Creion
Ioi

Reolvare:

var f:text;
k:byte; s:string;

function pald(c:string):boolean;
var a,b:string; ok:boolean;
k:integer;
begin
k:=1;

PROGRAMARE 2 ATESTAT 2009


- INFORMATICĂ INTENSIV-
ok:=true;
while (k<=legth(c) div 2) and (ok=true) do
begin
a:=copy(c,k,1);
b:=copy(c,length(c)-k+1,1);
if a<>b then
ok:=false;
k:=k+1;
end;
pald:=ok;
end;

begin
assign(f,'cuvinte.txt');
reset(f);
k:=0;
while not eof(f) do
begin
readln(f,s);
if pald(s)=true then
begin
k:=1;
writeln(s);
end;
end;
if k=0 then
write('NU');
close(f);
end.

SUBIECTUL 4
Fişierele text a.txt şi b.txt conţin numere naturale, câte un număr pe fiecare linie. Ştiind că în
fiecare fişier numerele sunt memorate în ordine descrescătoare, scrieţi un program care să scrie pe
ecran toate numerele din cele două fişiere în ordine descrescătoare, separate printr-un singur spaţiu.
Exemplu:
a.txt b.txt Se afişează: 83 79 76 75 72 60 40 45 30 25
83 79
76 75
60 72
40 45
30 25

Rezolvare:

procedure interclasare;
var f,g:text;
x,y:integer;
begin
assign(f,'A.txt');
reset(f);
assign(g,'B.txt');
reset(g);
read(f,x);
read(g,y);
while ((not seekeof(f))and(not seekeof(g))) do
if x>y then
begin
write(x,' ');
read(f,x);
end

PROGRAMARE 3 ATESTAT 2009


- INFORMATICĂ INTENSIV-
else
if y>x then
begin
write(y,' ');
read(g,y);
end
else
begin
write(x,' ');
write(y,' ');
read(f,x);
read(g,y);
end;
if x>y then write(x,' ')
else write(y,' ');
if ((not seekeof(f))and(seekeof(g))) then
begin
read(f,x);
if x>y then write(x,' ',y,' ')
else write(y,' ',x,' ');
end;
if ((not seekeof(g))and(seekeof(f))) then
begin
read(g,y);
if x>y then write(x,' ',y,' ')
else write(y,' ',x,' ');
end;
while not seekeof(f) do
begin
read(f,x);
write(x,' ');
end;

while not seekeof(g) do


begin
write(y,' ');
read(g,y);
end;
close(f);
close(g);
end;
begin
interclasare;
writeln;
writeln;
end.

SUBIECTUL 5
Fişierul atestat.txt conţine pe prima linie un număr natural n şi pe fiecare linie dintre
următoarele n linii câte un cuvânt format din cel mult 20 de litere mici ale alfabetului englez. Să se
scrie un program care citeşte valoarea n şi apoi determină câte dintre cele n cuvinte memorate în
fişier conţin secvenţa bac. Programul va afişa pe ecran numărul de cuvinte determinat (0 în cazul că
nu există niciunul).
Exemplu:
atestat.txt Se afişează: 3
5
tabac
laureat
tabacar

PROGRAMARE 4 ATESTAT 2009


- INFORMATICĂ INTENSIV-
bacterie
barca

function numara:integer;
var f:text;
k,i,n:integer;
cuv:string;
begin
assign(f,'atestat.txt');
reset(f);
readln(f,n);
k:=0;
for i:=1 to n do
begin
readln(f,cuv);
if pos('bac',cuv)>0 then k:=k+1;
end;
numara:=k;
close(f);
end;
begin
write(numara);
end.

SUBIECTUL 6
Fişierul text cuvinte.txt conţine mai multe linii nevide de text, fiecare linie de cel mult 255 de
caractere. Orice linie este compusă din unul sau mai multe cuvinte separate prin câte un spaţiu. Să
se scrie un program care citeşte de la tastatură un număr natural L şi scrie in fişierul cuvinte.out
toate cuvintele de lungime L din fişierul de intrare, în ordinea în care apar ele în text.
Exemplu:
cuvinte.txt L=4
A fost odată cuvinte.out
Ca niciodată fost fată
O fata frumoasa de împărat

var f,g:text;
s:string;
l:integer;
procedure cuvinte(s:string;var l:integer);
var cuv:string;
i:integer;
begin
i:=1;
while s[i]=' ' do i:=i+1;
cuv:='';
while i<=length(s) do
begin
cuv:='';
while s[i]<>' ' do
begin
cuv:=cuv+s[i];
i:=i+1;
end;
while s[i]=' ' do i:=i+1;
if length(cuv)=l then
write(g,cuv,' ');

PROGRAMARE 5 ATESTAT 2009


- INFORMATICĂ INTENSIV-
end;
end;
procedure rez;
begin
write('l=');
readln(l);
assign(f,'cuvinte.txt');
reset(f);
assign(g,'cuvinte.out');
rewrite(g);
while not seekeof(f) do
begin
readln(f,s);
cuvinte(s,l);
end;
close(f);
close(g);
end;
begin
rez;
end.

SUBIECTUL 7
Scrieţi un program care citeşte de la tastatură un şir cu maxim 255 de caractere format numai din litere
mici şi mari ale alfabetului englez şi îl scrie în fişierul atestat.out codificat conform următoarei reguli:
dacă numărul de vocale din şir este mai mare sau egal cu numărul de consoane din şir, fiecare vocală se
va înlocui cu caracterul următor din alfabetul englez, altfel, fiecare consoană se va înlocui cu caracterul
precedent din alfabetul englez.
Exemplu:
Pentru şirul de intrare: ’Bacalaureat’ se scrie în fişierul atestat.out ’Bbcblbvrfbt’.
Pentru şirul de intrare: ’Basca’ se scrie în fişierul atestat.out ’ aarba’.

Rezolvare:

var s:string;
f:text;

procedure rezolva;
var i,v,c:integer;
begin
assign(f,’atestat.out’);rewrite(f);
c:=0;
v:=0;
i:=1;
while i<=length(s) do
if (pos(s[i],’aeiou’)>0) or (pos(s[i],’AEIOU’)>0) then
v:=v+1
else
c:=c+1;
if v>c then
begin
if (s[1]>=’A’) and (s[1]<=’Z’) and (pos(s[i],’AEIOU’)>0) then
s[1]:=chr(ord(s[1]+32));
for i:=1 to length(s) do
if pos(s[i],’aeiou’)>0 then

PROGRAMARE 6 ATESTAT 2009


- INFORMATICĂ INTENSIV-
s[i]:=chr(ord(s[i]+1));
end;
if v<= c then
begin
if (s[1]>=’A’) and (s[1]<=’Z’) and (pos(s[i],’AEIOU’)=0) then
s[1]:=chr(ord(s[i]+32));
for i:=1 to length(s) do
if pos(s[i],’aeiou)=0 then
s[i]:=chr(ord(s[i]-1));
end;
end;

begin
write(‘s=’);readln(s);
rezolva;
write(f,s);
close(f);
end.

SUBIECTUL 8
Se citesc de la tastatură două numere întregi m şi n, apoi m perechi de numere întregi
reprezentând extremităţile muchiilor unui graf neorientat cu m muchii şi n vârfuri. Să se
construiască şi să se afişeze pe ecran matricea de adiacentă, apoi să se scrie gradele în fişierul
Graf.txt (pe fiecare rând se vor scrie vârful şi gradul său, separate prin spaţii).
Exemplu:
m=4 n=4 Matricea de adiacenţă: Graf.txt
12 0100 11
32 1011 23
43 0101 32
24 0110 42

type matrice-=array [1..50,1..50] of byte;


var a:matrice;
m,n:integer;

procedure constructie;
var i,j:integer;
begin
write(‘m=’);readln(m);
write(‘n=’);readln(n);
for i:=1 to m do
begin
write(‘x=’);readln(x);
write(‘y=’);readln(y);
a[x,y]:=1;
a[y,x]:=1;
end;
end;

procedure afis1;
var i,j:integer;

PROGRAMARE 7 ATESTAT 2009


- INFORMATICĂ INTENSIV-
begin
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j],’ ‘);
writeln;
end;

procedure afis2;
var s,i,j:integer;
f:text;
begin
assign(f,’grade.txt’);rewrite(f);
for i:=1 to n do
begin
s:=0;
for j:=1 to n do
s:=s+a[i,j];
writeln(f,i,s);
end;
close(f);
end;

begin
constructie;
afis1;
afis2;
end.

SUBIECTUL 9
Se citesc de la tastatură două numere întregi m şi n , apoi m perechi de numere întregi
reprezentând extremităţile muchilor unui graf neorientat cu m muchii şi n vârfuri. Să se
construiască şi să se afişeze pe ecran matricea de adiacentă, apoi să se scrie pentru fiecare vârf lista
veciniilor în fişierul Graf.txt (pe fiecare rând se vor scrie vârful şi lista veciniilor, separate prin
spaţii).
Exemplu:
m=4 n=4 Matricea de adiacenţă: Graf.txt
12 0100 12
32 1011 2134
43 0101 324
24 0110 423

Rezolvare:

type matrice=array[1..50,1..50] of integer;


var n:integer;
a:matrice;

procedure constr_matr;
var i,x,y,m:integer;
begin

PROGRAMARE 8 ATESTAT 2009


- INFORMATICĂ INTENSIV-
write('m=');readln(m);
write('n=');readln(n);
for i:=1 to m do
begin
readln(x,y);
a[x,y]:=1;
a[y,x]:=1;
end;
end;

procedure vecini;
var f:text;
i,j:integer;
begin
assign(f,'graf.txt');rewrite(f);
for i:=1 to n do
begin
write(g,i);
for j:=1 to n do
if a[i,j]=1 then
write(g,j);
end;
close(f);
end;

procedure afis;
var i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j],' ');
writeln;
end;
end;

begin
constr_matr;
vecini;
afis;
end.

SUBIECTUL 10
Fişierul nr.txt conţine pe prima linie un număr natural k şi, pe următoarele linii, câte un
număr întreg. Să se memoreze într-o structură de tip listă liniară simplu înlănţuită numerele întregi
distincte din fişier şi apoi să se afişeze elementele acestei liste care sunt multipli de k.
Exemplu:

PROGRAMARE 9 ATESTAT 2009


- INFORMATICĂ INTENSIV-
Nr.txt Lista conţine 6 5 45 8
3 Se afişează: 6 45
6
5
45
8
6
5

Rezolvare:

type vector=array[1..50] of integer;


var v:vector;
k,n:integer;

procedure creare;
var i:integer;
f:text;
begin
assign(f,'nr.txt');
reset(f);
readln(f,k);
i:=0;
while not seekeof(f) do
begin
i:=i+1;
readln(f,v[i]);
end;
n:=i;
close(f);
end;

procedure elimina;
var i,j,l:integer;
begin
for i:=1 to n do
for j:=i+1 to n do
if v[i]=v[j] then
begin
for l:=j to n-1 do
v[l]:=v[l+1];
n:=n-1;
end;
end;
procedure afiseaza;
var i:integer;
begin
writeln;
write('lista contine: ');
for i:=1 to n do
write(v[i],' ');
end;

PROGRAMARE 10 ATESTAT 2009


- INFORMATICĂ INTENSIV-
procedure multiplii;
var i:integer;
begin
writeln;
write('multiplii: ');
for i:=1 to n do
if v[i] mod k=0 then write(v[i],' ');
end;

begin
creare;
elimina;
afiseaza;
multiplii;
end.

SUBIECTUL 11
Fie un tablou bidimensional (matrice) cu n linii şi n coloane. Se cere:
a) să se afişeze transpusa matricei;
b) să se afişeze câte perechi de numere prime între ele sunt pe diagonala secundară a matricei
iniţiale.
Datele de intrare se vor citi din fişierul date.in astfel:
- pe prima linie se găseşte n
- pe următoarele n linii se găsesc câte n numere ce reprezintă elementele matricei.
Exemplu:
Fişierul de intrare date.in: Se afişează:
4 a) 1 5 9 13
1 2 3 4 2 6 10 14
5 6 7 8 3 7 11 15
9 10 11 12 4 8 12 16
13 14 15 16 b) 5

Rezolvare:

type matrice=array[1..50,1..50] of integer;


var f:text;
m:matrice;
n,i,j,s,k,p:integer;

function prim(a,b:integer):boolean;
begin
while a<>b do
begin
if a>b then
a:=a-b else
if a<b then
b:=b-a;
end;
if a=1 then
prim:=true
else prim:=false;
end;

begin
assign(f,'date.in');

PROGRAMARE 11 ATESTAT 2009


- INFORMATICĂ INTENSIV-
reset(f);
readln(f,n);
for i:=1 to n do
begin
for j:= 1 to n do
read(f,m[i,j]);
readln(f);
end;
for j:= 1 to n do
begin
for i:= 1 to n do
write(m[i,j],' ');
writeln;
end;
s:=0;
for i:= 1 to n-1 do
for j:= 2 to n do
if j=n-i+1 then
begin
k:=i+1;
p:=j-1;
while (k<=n) and (p>=1) do
begin
if prim(m[i,j],m[k,p])=true then
s:=s+1;
k:=k+1;
p:=p-1;
end;
end;
writeln;
write(s);
close(f);
end.

SUBIECTUL 12

În fişierul date.in se găsesc, pe o singură linie, prenumele unor elevi separate prin câte un
spaţiu.
a) Să se ordoneze alfabetic (fără să se facă distincţie între litere mari şi mici) şi să se afişeze
şirul de nume astfel obţinut.
b) Să se afişeze numărul de fete din fişier, ştiind că numai prenumele fetelor se termină cu
litera „a”.

Datele de ieşire se vor scrie pe ecran, astfel:


- pe prima linie, prenumele ordonate
- pe a doua linie, numărul de fete.
Exemplu:
Pentru fişierul de intrare date.in: Se afişează pe ecran:
IOANA Marius Ciprian maria Silvia Gabriel Vlad a) Ciprian Gabriel IOANA maria Marius Silvia Vlad
b) 3

type vector=[1..100] of string;


var v:vector;
n:integer;

PROGRAMARE 12 ATESTAT 2009


- INFORMATICĂ INTENSIV-
procedure citire;
var f:text;
s,cuv:string;
i:integer;
begin
assign(f,'date.in');
reset(f);
read(f,s);
close(f);
i:=1;
while i<=length(s) do
begin
while (s[i]=' ') and (i<length(s)) do
i:=i+1;
cuv:=";
while (s[i]<>' ') and (i<=length(s)) do
begin
cuv:=cuv+s[i];
i:=i+1;
end;
n:=n+1;
v[n]:=cuv;
end;
end;

procedure sortare;
var w:vector;
l,i,j:byte;
aux:string;
begin
for i:=1 to n do
begin
w[i]:=v[i];
for j:=1 to length(w[i]) do
w[i][j]:=upcase(w[i][j]);
end;
for i:=1 to n-1 do
for j:=i+1 to n do
if w[i]>w[j] then begin
aux:=w[i];
w[i]:=w[j];
w[j]:=aux;
aux:=v[i];
v[i]:=v[j];
v[j]:=aux;
end;
end;

procedure afis;
var i,k:byte;
begin

PROGRAMARE 13 ATESTAT 2009


- INFORMATICĂ INTENSIV-
for i:=1 to n do
write(v[i],' ');
writeln;
k:=0;
for i:=1 to n do
if v[i][length(v[i])] in ['a','A'] then k:=k+1;
writeln(k);
end;

begin
citire;
sortare;
afis;
end.

SUBIECTUL 13
În fişierul date.in se găsesc, pe aceeaşi linie, numere întregi separate prin spaţii.
a) Să se afişeze elementele din fişier situate pe poziţii pare (al doilea, al patrulea etc.).
b) Să se construiască o listă simplu înlănţuită care să conţină toate elementele şirului, în
ordine inversă celei în care apar în fişier. Să se afişeze pe ecran conţinutul acestei liste.
Datele de ieşire se vor scrie pe ecran, astfel:
- pe o linie, elementele, din fişier, situate pe poziţiile pare
- pe linia a doua, elementele listei.
Exemplu:
Pentru fişierul de intrare date.in: Se afişează pe ecran:
18 20 17 34 15 29 16 14 15 34 a) 20 34 29 14 34
b) 34 15 14 16 29 15 34 17 20 18

Rezolvare:

type adresa=^nod;
nod=record
info:integer;
urm:adresa;
end;
var prim,c,d:adresa;
f:text; k,n:integer;
begin
assign(f,'date.txt');
reset(f);
k:=0;
new(prim);
prim^.urm:=nil;
prim^.info:=maxint;
while not eof(f) do
begin
read(f,n);
k:=k+1;
if k mod 2=0 then
write(n,' '0;
new(d);
d^.info:=n;
d^.urm:=prim;
prim:=d;
end;
writeln;
c:=prim;

PROGRAMARE 14 ATESTAT 2009


- INFORMATICĂ INTENSIV-
while c^.urm<>nil do
begin
write(c^.info,' ');
c:=c^.urm;
end;
close(f);
end.

SUBIECTUL 14
În fişierul date.in se găsesc cuvinte separate prin câte un spaţiu, cuvinte care sunt scrise cu
litere mari şi mici. Se cere:
a) să se afişeze cuvintele din fişier, în ordinea crescătoare a lungimii fiecărui cuvânt.
b) să se memoreze fiecare cuvânt din fişier transformat în litere mari precum şi numărul de
vocale ce apar în cuvântul respectiv; se vor lua în calcul doar vocalele a e i o şi u;
Datele de ieşire se vor scrie pe ecran astfel:
- pe un rând cuvintele în ordinea cerută la punctul a, separate prin spaţii.
- pe rândul al doilea cuvintele şi numărul de vocale în formatul (cuvânt, nr_de_vocale).
Exemplu:
Pentru fişierul de intrare date.in: Se vor afişa pe ecran liniile:
InformatICa eLEV sCOalA CARTE eLEV CARTE sCOalA InformatICa
(INFORMATICA,5) (ELEV,2) (SCOALA,3) (CARTE,2)

Rezolvare:

type bp=record
a:integer;
b:integer;
end;
var f:text; v:array[1..50]of bp;
s,n:string;
i,k,p,x,j:integer; aux:bp;
z:char;
begin
assign(f,'date.in');
reset(f);
k:=0;
p:=ord('A')-ord('a');
n:='AEIOU';
while not eof(f) do
begin
read(f,s);
k:=k+1;
v[k].a:=length(s);
v[k].b:=s;
x:=0;
for i:=1 to length(s) do
begin
for z:='a' to 'z' do
begin
if s[i]=z then
s[i]:=chr(ord(s[i])+p);
end;
if pos(s[i],n)<>0 then
x:=x+1;
end;
write(s,',',x);
end;
writeln;
for i:=1 to k-1 do

PROGRAMARE 15 ATESTAT 2009


- INFORMATICĂ INTENSIV-
for j:=i+1 to k do
if v[i].a>v[j].a then
begin
aux:=v[i];
v[i]:=v[j];
v[j]:=aux;
end;
for i:=1 to k do
write(v[i].b,' ');
close(f);
end.

SUBIECTUL 15
Un graf neorientat cu n noduri şi m muchii este descris în fişierul graf.in cu următoarea
structură :
- pe prima linie valorile pentru n şi m separate printr-un spaţiu;
- pe următoarele m linii, perechi de numere i,j reprezentând noduri ce formează o muchie.
Să se realizeze un program care să răspundă următoarelor cerinţe:
a) să se afişeze matricea de adiacenţă asociată grafului descris în fişierul graf.in.
b) să se afişeze nodurile grafului în ordinea descrescătoare a gradelor.
Exemplu:
Pentru fişierul graf.in: a) Se va afişa pe ecran: b) Deoarece d(1)=2, d(2)=2, d(3)=1,
54 0 1 0 1 0 d(4)=3 şi d(5)=0, se va afişa: 4 1 2 3 5
12 1 0 0 1 0
14 0 0 0 1 0
24 1 1 1 0 0
34 0 0 0 0 0

var a:array[1..100,1..100]of 0..1;


v,v1:array[1..100]of integer;
f,g:text;n,i,x,y,m,j:integer;
procedure sort;
var i,aux,aux1:integer; ok:boolean;
begin
repeat
ok:=true;
for i:=1 to n-1 do
if v[i]<v[i+1] then begin
aux:=v[i]; aux1:=v1[i];
v[i]:=v[i+1]; v1[i]:=v1[i+1];
v[i+1]:=aux; v1[i+1]:=aux1;
ok:=false;
end;
until ok;
end;
begin
assign(f,'graf.in');reset(f);
assign(g,'graf.out');rewrite(g);
readln(f,n,m);
for i:=1 to m do begin
read(f,x,y);
a[x,y]:=1;
a[y,x]:=1;
inc(v[x]);
inc(v[y]);
end;
for i:=1 to n do v1[i]:=i;

PROGRAMARE 16 ATESTAT 2009


- INFORMATICĂ INTENSIV-
sort;
for i:=1 to n do begin
for j:=1 to n do
write(g,a[i,j],' ');
writeln(g);
end;
for i:=1 to n do write(g,v1[i],' ');
close(f);close(g);
end.
SUBIECTUL 16
Scrieţi un program care rezolvă următoarea problemă: se citeşte un număr întreg format din
cel mult 8 cifre. Să se afişeze mesajul DA dacă toate cifrele numărului citit sunt identice, în caz
contrar, să se afişeze mesajul NU.
Exemplu:
Dacă se citeşte unul dintre numerele 777777 sau -9999 se va afişa mesajul DA, iar dacă se citeşte unul
dintre numerele 777767 sau -9099 se va afişa mesajul NU.

var n,a:integer;
ok:boolean;
begin
write('n=');
readln(n);
if n<10 then
write('DA') else
begin
a:=n mod 10;
ok:=true;
while (n>0) and (ok=true) do
begin
if a=n mod 10 then
n:=n div 10 else
ok:=false;
end;
if ok=true then
write('DA') else
write('NU');
end;
end.

SUBIECTUL 17
In fişierul date.in se găsesc pe o linie, numere naturale de cel mult 9 cifre, separate prin cate
un spaţiu. Se cere:
a) să se determine numerele ce reprezintă un factorial, adică sunt de forma k!, pentru fiecare
astfel de număr afişându-se valoarea lui k.
b) să se scrie, în ordine descrescătoare după prima cifră, toate numerele din fişier.
Datele de ieşire se vor scrie pe ecran, astfel:
- pe prima linie, numerele k determinate, separate prin spaţii;
- pe a doua linie numerele sortate descrescător după prima cifră, separate prin spaţii.
Exemplu:
Fişierul date.in: a) Se va afişa pe ecran:
233 24 210 6 17 720 4 3 6
720 6 233 24 210 17

type vac=record
x:longint;

PROGRAMARE 17 ATESTAT 2009


- INFORMATICĂ INTENSIV-
y:integer;
end;
var v:array[1..30] of vac;
i,k:integer; p:longint; f:text; aux:vac;
function cif(n:longint):integer;
begin
while n>9 do
n:=n div 10;
cif:=n;
end;

begin
assign(f,'date.in');
reset(f);
a:=0;
while not eof(f) do
begin
a:=a+1;
read(f,v[a].x);
v[a].y:=cif(v[a].x);
ok:=true;
k:=2;
p:=2;
while p<=v[a].x do
begin
if p=v[a].x then
begin
write(v[a].x,' ',k);
p:=p+1;
end else
if p<v[a].x then
begin
k:=k+1;
p:=p*k;
end;
if v[a].x mod k<>0 then
p:=v[a].x+1;
end;
end;
for i:=1 to a-1 do
for j:=i+1 to a do
if v[i].y<v[j].y then
begin
aux:=v[i];
v[i]:=v[j];
v[j]:=aux;
end;
for i:=1 to a do
write(v[i].x,' ');
close(f);
end.

SUBIECTUL 18
Pe prima linie a fişierului date.in se găsesc numere naturale nenule. Se cere:
a) pentru fiecare număr impar din fişier să se afişeze cel mai mare număr care se poate forma
din cifrele lui;
b) să se verifice dacă numerele din fişierul de intrare, în ordinea în care se află în fişier,
reprezintă o progresie aritmetică; în caz afirmativ să se afişeze primul element şi raţia, altfel să se
afişeze un mesaj corespunzător.
Datele de ieşire se vor scrie pe ecran, astfel:

PROGRAMARE 18 ATESTAT 2009


- INFORMATICĂ INTENSIV-
- pe prima linie, elementele determinate la punctul a);
- pe a doua linie, răspunsul cerinţei b).
Exemplu:
Fişierul date.in:
31 38 45 52 59 66

Se afişează pe ecran:
31 38 54 52 95 66
Primul termen este: 31 şi raţia: 7

Rezolvare:

type vector=array[1..30]of integer;


var v,x:vector;
i,j,a,b,k,p:integer; ok:boolean;
f:text;
begin
assign(f,'date.in');
reset(f);
a:=0;
while not eof(f) do
begin
a:=a+1;
read(f,v[a]);
if v[a] mod 2<>0 then
begin
k:=v[a];
b:=0;
while k<>0 do
begin
b:=b+1;
x[b]:=k mod 10;
k:=k div 10;
end;
for i:=1 to b-1 do
for j:=i+1 to b do
if x[i]<x[j] then
begin

PROGRAMARE 19 ATESTAT 2009


- INFORMATICĂ INTENSIV-
aux:=x[i];
x[i];=x[j];
x[j]:=aux;
end;
for i:=1 to b do
k:=k*10+x[i];
write(k,' ');
end
else write(v[a],' ');
end;
p:=v[2]-v[1];
ok:=true;
for i:=2 to a-1 do
if v[i]+p<>v[i+1] then
ok:=false;
if ok=true then
write('Primul termen este ',v[1],' si ratia ',p)
else
write('nr nu sunt in progresie aritmetica');
close(f);
end.

SUBIECTUL 19
Fie un şir de n(0<n<1000) numere întregi. Se cere:
a) să se verifice dacă numerele din şirul dat pot forma o mulţime;
b) să se scrie în ordine crescătoare factorii primi din descompunerea elementului
maxim din şirul dat;
Datele de intrare se vor citi din fişierul date.in astfel:
- pe prima linie se găseşte n;
- pe linia a doua se găsesc elementele şirului.
Datele de ieşire se vor scrie pe ecran astfel:
- pe primul rând un mesaj;
- pe rândul următor factorii primi separaţi prin spaţii.

Exemplu:
Fişierul date.in: Se va afişa pe ecran:
5 Elementele din fişier pot forma o mulţime
80 64 50 96 45 2 3

type vector=array[1..100] of integer;


var v:vector;
n:integer;

procedure rezolvare1;
var f:text;
ok:boolean;
i,j,nr,k:integer;
begin
ok:=true;
k:=0;
assign(f,'date.in'); reset(f);
readln(f,n);
for i:=1 to n do
read(f,v[i]);
for i:=1 to n-1 do
for j:=i+1 to n do
if v[i]=v[j] then ok:=false;
if ok=false then writeln('Elementele nu pot forma multime')
else writeln('Elementele pot forma multime');
close(f);
end;

procedure rezolvare2;
var max,i,c,k:integer;
begin
max:=-MAXINT;
for i:=1 to n do
if v[i]>max then max:=v[i];
c:=2;
while max<>1 do begin
k:=0;
while max mod c=0 do begin
k:=k+1;
max:=max div c;
end;
if k>0 then write(c,' ');
c:=c+1;
end;
end;

begin
rezolvare1;
rezolvare2;
end.

end;

SUBIECTUL 20
Se dă un tablou bidimensional cu n linii şi m coloane ce conţine numere naturale
nenule distincte.
a) să se determine, dacă există un număr „superprim” în matrice şi să se afişeze;
dacă există mai multe astfel de numere, afişaţi unul dintre ele, dacă nu există nici unul,
daţi un mesaj (un număr este „superprim” daca atât el cât şi răsturnatul său sunt numere
prime);
b) să se determine şi să se afişeze toate elementele vecine elementului maxim din
matrice.
Datele de intrare se vor citi din fişierul date.in astfel:
- pe prima linie se găsesc n şi m;
- pe următoarele n linii se găsesc câte m numere ce reprezintă elementele matricei.
Datele de ieşire se vor scrie pe ecran astfel:
- pe prima linie, numărul superprim şi indicele de linie sau un mesaj corespunzător,
în cazul în care nu există nici un număr superprim;
- pe linia a doua elementele cerute la punctul b) separate printr-un spaţiu.

Exemplu:
Fişierul date.in: Se va afişa pe ecran:
4 3 31 4
33 65 105 65 32 22
44 32 22
62 76 41
31 1 12

Rezolvari:

type gab=record
s:integer;
t:integer;
u:integer;
end;
matrice=array[1..20,1..20]of integer;
var a:matrice; i,j,b,z,m,n:integer;
f:text; max:gab;

procedure rast(x:integer; var k:integer);


begin
k:=0;
while x<>0 do
begin
k:=k*10 + x mod 10;
x:=x div 10;
end;
end;

function prim(p:integer):boolean;
var q:integer; ok:boolean;
begin
q:=2;
ok:=true;
while (q<=trunc(sqrt(p))) and (ok=true) do
begin
if p mod q=0 then
ok:=false;
q:=q+1;
end;
prim:=ok;
end;

begin
assign(f,'date.in');
reset(f);
read(f,n);
readln(f,m); b:=0;
max.s:=-maxint;
for i:=1 to n do
begin
for j:=1 to m do
begin
read(f,a[i,j]);
if a[i,j]>max.s then
begin
max.s:=a[i,j];
max.t:=i;
max.u:=j;
end;
if b=0 then
begin
rast(a[i,j],z);
if prim(a[i,j])=prim(z)=true then
begin
write(a[i,j],' ',i);
b:=1;
end;
end;
end;
writeln;
end;
if b=0 then
write('nu exista numere superprime in matricea data');
if max.t-1<>0 then
write(a[max.t-1,max.u]);
if max.u+1<=m then
write(a[max.t,max.u+1]);
if max.t+1<=n then
write(a[max.t+1,max.u]);
if max.u-1<>0 then
write(a[max.t,max.u-1]);
close(f);
end.

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