Sunteți pe pagina 1din 23

Programare(PASCAL)

SUBIECTUL 1
Fiierul date.in conine cel mult 100000 numere naturale separate prin spaii, fiecare numr avnd cel mult nou cifre. S se realizeze un program care scrie n fiierul date.out, pe o singur linie, separate prin cte un spaiu, toate numerele din date.in care au prima cifra par. Exemplu:
date.in 45 123 68 8 134 56 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.

date.out 45 68 8 876

SUBIECTUL 2
Fiierul Atestat.txt conine cel mult 100 de numere naturale de cel mult 6 cifre fiecare, cte un numr pe fiecare linie a fiierului. Scriei un program care: a) afieaz pe ecran toate numerele din fiier, cte 3 pe fiecare linie, numerele de pe o linie fiind separate prin cte un spaiu, ultima linie rmnnd eventual incomplet b) afieaz pe ecran, pe urmtoarea linie, suma numerelor prime din fiier Exemplu:
Atestat.txt 5 6 8 7 4 3 3 Se afieaz: 568 743 3 18

var s,k,n:integer; PROGRAMARE

Rezolvare:

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 fiierul cuvinte.txt ce conine pe prima linie un numr natural n iar pe urmtoarele n linii cte un cuvnt cu maxim 10 caractere. S se afieze pe ecran cuvintele din fiierul dat care sunt palindroame. n cazul n care nu exist nici un cuvnt palindrom se va afia NU. Un cuvnt este palindrom dac citindu-l de la dreapta la stnga sau de la stnga la dreapta se obine acelai cuvnt. Exemplu:
cuvinte.txt

3 sas Creion Ioi Reolvare:

Se afieaz:

sas

var f:text; k:byte; s:string; function pald(c:string):boolean; var a,b:string; ok:boolean; k:integer; begin k:=1; PROGRAMARE

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
Fiierele text a.txt i b.txt conin numere naturale, cte un numr pe fiecare linie. tiind c n fiecare fiier numerele sunt memorate n ordine descresctoare, scriei un program care s scrie pe ecran toate numerele din cele dou fiiere n ordine descresctoare, separate printr-un singur spaiu. Exemplu:
a.txt 83 76 60 40 30
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

b.txt 79 75 72 45 25

Se afieaz:

83 79 76 75 72 60 40 45 30 25

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
Fiierul atestat.txt conine pe prima linie un numr natural n i pe fiecare linie dintre urmtoarele n linii cte un cuvnt format din cel mult 20 de litere mici ale alfabetului englez. S se scrie un program care citete valoarea n i apoi determin cte dintre cele n cuvinte memorate n fiier conin secvena bac. Programul va afia pe ecran numrul de cuvinte determinat (0 n cazul c nu exist niciunul). Exemplu:
atestat.txt 5 tabac laureat tabacar
PROGRAMARE

Se afieaz:

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
Fiierul text cuvinte.txt conine 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 cte un spaiu. S se scrie un program care citete de la tastatur un numr natural L i scrie in fiierul cuvinte.out toate cuvintele de lungime L din fiierul de intrare, n ordinea n care apar ele n text. Exemplu:
cuvinte.txt A fost odat Ca niciodat O fata frumoasa de mprat L=4 cuvinte.out fost fat

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

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
Scriei un program care citete de la tastatur un ir cu maxim 255 de caractere format numai din litere mici i mari ale alfabetului englez i l scrie n fiierul atestat.out codificat conform urmtoarei reguli: dac numrul de vocale din ir este mai mare sau egal cu numrul de consoane din ir, fiecare vocal se va nlocui cu caracterul urmtor din alfabetul englez, altfel, fiecare consoan se va nlocui cu caracterul precedent din alfabetul englez. Exemplu:
Pentru irul de intrare: Bacalaureat se scrie n fiierul atestat.out Bbcblbvrfbt. Pentru irul de intrare: Basca se scrie n fiierul 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

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 reprezentnd extremitile muchiilor unui graf neorientat cu m muchii i n vrfuri. S se construiasc i s se afieze pe ecran matricea de adiacent, apoi s se scrie gradele n fiierul Graf.txt (pe fiecare rnd se vor scrie vrful i gradul su, separate prin spaii). Exemplu:
m=4 n=4 12 32 43 24 Matricea de adiacen: 0100 1011 0101 0110 Graf.txt 11 23 32 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

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 reprezentnd extremitile muchilor unui graf neorientat cu m muchii i n vrfuri. S se construiasc i s se afieze pe ecran matricea de adiacent, apoi s se scrie pentru fiecare vrf lista veciniilor n fiierul Graf.txt (pe fiecare rnd se vor scrie vrful i lista veciniilor, separate prin spaii). Exemplu:
m=4 n=4 12 32 43 24 Matricea de adiacen: 0100 1011 0101 0110 Graf.txt 12 2134 324 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

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
Fiierul nr.txt conine pe prima linie un numr natural k i, pe urmtoarele linii, cte un numr ntreg. S se memoreze ntr-o structur de tip list liniar simplu nlnuit numerele ntregi distincte din fiier i apoi s se afieze elementele acestei liste care sunt multipli de k. Exemplu:

PROGRAMARE

ATESTAT 2009 - INFORMATIC INTENSIV-

Nr.txt 3 6 5 45 8 6 5

Lista conine 6 5 45 8 Se afieaz: 6 45

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 afieze transpusa matricei; b) s se afieze cte perechi de numere prime ntre ele sunt pe diagonala secundar a matricei iniiale. Datele de intrare se vor citi din fiierul date.in astfel: - pe prima linie se gsete n - pe urmtoarele n linii se gsesc cte n numere ce reprezint elementele matricei. Exemplu:
Fiierul de intrare date.in: 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Se afieaz: a) 1 5 9 2 6 10 3 7 11 4 8 12 b) 5 13 14 15 16

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 fiierul date.in se gsesc, pe o singur linie, prenumele unor elevi separate prin cte un spaiu. a) S se ordoneze alfabetic (fr s se fac distincie ntre litere mari i mici) i s se afieze irul de nume astfel obinut. b) S se afieze numrul de fete din fiier, tiind c numai prenumele fetelor se termin cu litera a. Datele de ieire se vor scrie pe ecran, astfel: - pe prima linie, prenumele ordonate - pe a doua linie, numrul de fete. Exemplu:
Pentru fiierul de intrare date.in: IOANA Marius Ciprian maria Silvia Gabriel Vlad Se afieaz pe ecran: 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 fiierul date.in se gsesc, pe aceeai linie, numere ntregi separate prin spaii. a) S se afieze elementele din fiier situate pe poziii pare (al doilea, al patrulea etc.). b) S se construiasc o list simplu nlnuit care s conin toate elementele irului, n ordine invers celei n care apar n fiier. S se afieze pe ecran coninutul acestei liste. Datele de ieire se vor scrie pe ecran, astfel: - pe o linie, elementele, din fiier, situate pe poziiile pare - pe linia a doua, elementele listei. Exemplu:
Pentru fiierul de intrare date.in: 18 20 17 34 15 29 16 14 15 34 Se afieaz pe ecran: 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 fiierul date.in se gsesc cuvinte separate prin cte un spaiu, cuvinte care sunt scrise cu litere mari i mici. Se cere: a) s se afieze cuvintele din fiier, n ordinea cresctoare a lungimii fiecrui cuvnt. b) s se memoreze fiecare cuvnt din fiier transformat n litere mari precum i numrul de vocale ce apar n cuvntul respectiv; se vor lua n calcul doar vocalele a e i o i u; Datele de ieire se vor scrie pe ecran astfel: - pe un rnd cuvintele n ordinea cerut la punctul a, separate prin spaii. - pe rndul al doilea cuvintele i numrul de vocale n formatul (cuvnt, nr_de_vocale). Exemplu:
Pentru fiierul de intrare date.in: InformatICa eLEV sCOalA CARTE Se vor afia pe ecran liniile: 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 fiierul graf.in cu urmtoarea structur : - pe prima linie valorile pentru n i m separate printr-un spaiu; - pe urmtoarele m linii, perechi de numere i,j reprezentnd noduri ce formeaz o muchie. S se realizeze un program care s rspund urmtoarelor cerine: a) s se afieze matricea de adiacen asociat grafului descris n fiierul graf.in. b) s se afieze nodurile grafului n ordinea descresctoare a gradelor. Exemplu:
Pentru fiierul graf.in: 54 12 14 24 34 a) Se va afia pe ecran: 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 b) Deoarece d(1)=2, d(2)=2, d(3)=1, d(4)=3 i d(5)=0, se va afia: 4 1 2 3 5

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
Scriei un program care rezolv urmtoarea problem: se citete un numr ntreg format din cel mult 8 cifre. S se afieze mesajul DA dac toate cifrele numrului citit sunt identice, n caz contrar, s se afieze mesajul NU. Exemplu:
Dac se citete unul dintre numerele 777777 sau -9999 se va afia mesajul DA, iar dac se citete unul dintre numerele 777767 sau -9099 se va afia 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 fiierul date.in se gsesc pe o linie, numere naturale de cel mult 9 cifre, separate prin cate un spaiu. Se cere: a) s se determine numerele ce reprezint un factorial, adic sunt de forma k!, pentru fiecare astfel de numr afindu-se valoarea lui k. b) s se scrie, n ordine descresctoare dup prima cifr, toate numerele din fiier. Datele de ieire se vor scrie pe ecran, astfel: - pe prima linie, numerele k determinate, separate prin spaii; - pe a doua linie numerele sortate descresctor dup prima cifr, separate prin spaii. Exemplu:
Fiierul date.in: 233 24 210 6 17 720 a) Se va afia pe ecran: 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 fiierului date.in se gsesc numere naturale nenule. Se cere: a) pentru fiecare numr impar din fiier s se afieze cel mai mare numr care se poate forma din cifrele lui; b) s se verifice dac numerele din fiierul de intrare, n ordinea n care se afl n fiier, reprezint o progresie aritmetic; n caz afirmativ s se afieze primul element i raia, altfel s se afieze un mesaj corespunztor. Datele de ieire se vor scrie pe ecran, astfel:
PROGRAMARE

18

ATESTAT 2009 - INFORMATIC INTENSIV-

- pe prima linie, elementele determinate la punctul a); - pe a doua linie, rspunsul cerinei b). Exemplu:
Fiierul date.in: 31 38 45 52 59 66 Se afieaz pe ecran: 31 38 54 52 95 66 Primul termen este: 31 i raia: 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 mulime; b) s se scrie n ordine cresctoare factorii primi din descompunerea elementului maxim din irul dat; Datele de intrare se vor citi din fiierul date.in astfel: - pe prima linie se gsete n; - pe linia a doua se gsesc elementele irului. Datele de ieire se vor scrie pe ecran astfel: - pe primul rnd un mesaj; - pe rndul urmtor factorii primi separai prin spaii. Exemplu:
Fiierul date.in: 5 80 64 50 96 45
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'); readln(f,n); for i:=1 to n do

Se va afia pe ecran: Elementele din fiier pot forma o mulime 2 3

reset(f);

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 conine numere naturale nenule distincte. a) s se determine, dac exist un numr superprim n matrice i s se afieze; dac exist mai multe astfel de numere, afiai unul dintre ele, dac nu exist nici unul, dai un mesaj (un numr este superprim daca att el ct i rsturnatul su sunt numere prime); b) s se determine i s se afieze toate elementele vecine elementului maxim din matrice. Datele de intrare se vor citi din fiierul date.in astfel: - pe prima linie se gsesc n i m; - pe urmtoarele n linii se gsesc cte m numere ce reprezint elementele matricei. Datele de ieire se vor scrie pe ecran astfel: - pe prima linie, numrul superprim i indicele de linie sau un mesaj corespunztor, n cazul n care nu exist nici un numr superprim;

- pe linia a doua elementele cerute la punctul b) separate printr-un spaiu. Exemplu:


Fiierul date.in: 4 3 33 65 105 44 32 22 62 76 41 31 1 12 Se va afia pe ecran: 31 4 65 32 22

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.