rezolvari pascal

29
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: PROGRAMARE ATESTAT 2009 - INFORMATICĂ INTENSIV- 1

Upload: ana-maria-manea

Post on 05-Jul-2015

1.253 views

Category:

Documents


12 download

TRANSCRIPT

Page 1: Rezolvari Pascal

Programare(PASCAL)

SUBIECTUL 1Fiş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.out45 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;beginwhile nr>=10 donr:=nr div 10;if nr mod 2=0 then ok:=true else ok:=false;par:=ok;end;

beginassign(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 2Fiş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

5687433

Se afişează: 5 6 87 4 3 318

Rezolvare:var s,k,n:integer;

PROGRAMARE ATESTAT 2009 - INFORMATICĂ INTENSIV-

1

Page 2: Rezolvari Pascal

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;

beginassign(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 thenwriteln;write(s);close(f);end.

SUBIECTUL 3Se 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

3sasCreionIoi

Se afişează: sas

Reolvare:

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

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

PROGRAMARE ATESTAT 2009 - INFORMATICĂ INTENSIV-

2

Page 3: Rezolvari Pascal

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;

beginassign(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 thenwrite('NU');close(f);end.

SUBIECTUL 4Fiş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.txt8376604030

b.txt7975724525

Se afişează: 83 79 76 75 72 60 40 45 30 25

Rezolvare:

procedure interclasare;var f,g:text; x,y:integer;beginassign(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 ATESTAT 2009 - INFORMATICĂ INTENSIV-

3

Page 4: Rezolvari Pascal

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;begininterclasare;writeln;writeln;end.

SUBIECTUL 5Fiş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

5tabaclaureattabacar

Se afişează: 3

PROGRAMARE ATESTAT 2009 - INFORMATICĂ INTENSIV-

4

Page 5: Rezolvari Pascal

bacteriebarca

function numara:integer;var f:text; k,i,n:integer; cuv:string;beginassign(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;beginwrite(numara);end.

SUBIECTUL 6Fiş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

A fost odatăCa niciodată O fata frumoasa de împărat

L = 4cuvinte.out fost fată

var f,g:text; s:string; l:integer;procedure cuvinte(s:string;var l:integer);var cuv:string; i:integer;begini:=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-

5

Page 6: Rezolvari Pascal

end;end;procedure rez;beginwrite('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;beginrez;end.

SUBIECTUL 7Scrieţ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 ATESTAT 2009 - INFORMATICĂ INTENSIV-

6

Page 7: Rezolvari Pascal

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;

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

SUBIECTUL 8Se 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

1 2 3 24 32 4

Matricea de adiacenţă:0 1 0 01 0 1 10 1 0 10 1 1 0

Graf.txt1 12 33 24 2

type matrice-=array [1..50,1..50] of byte;var a:matrice; m,n:integer;

procedure constructie;var i,j:integer;beginwrite(‘m=’);readln(m);write(‘n=’);readln(n);for i:=1 to m dobeginwrite(‘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-

7

Page 8: Rezolvari Pascal

beginfor i:=1 to n dobeginfor j:=1 to m dowrite(a[i,j],’ ‘);writeln;end;

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

beginconstructie;afis1;afis2;end.

SUBIECTUL 9Se 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

1 2 3 24 32 4

Matricea de adiacenţă:0 1 0 01 0 1 10 1 0 10 1 1 0

Graf.txt1 22 1 3 43 2 44 2 3

Rezolvare:

type matrice=array[1..50,1..50] of integer;var n:integer; a:matrice;

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

PROGRAMARE ATESTAT 2009 - INFORMATICĂ INTENSIV-

8

Page 9: Rezolvari Pascal

beginwrite('m=');readln(m);write('n=');readln(n);for i:=1 to m do beginreadln(x,y);a[x,y]:=1;a[y,x]:=1;end;end;

procedure vecini;var f:text; i,j:integer;beginassign(f,'graf.txt');rewrite(f);for i:=1 to n dobeginwrite(g,i);for j:=1 to n doif a[i,j]=1 thenwrite(g,j);end;close(f);end;

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

beginconstr_matr;vecini;afis;end.

SUBIECTUL 10Fiş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:Nr.txt

3Lista conţine 6 5 45 8Se afişează: 6 45

PROGRAMARE ATESTAT 2009 - INFORMATICĂ INTENSIV-

9

Page 10: Rezolvari Pascal

6545865

Rezolvare:

type vector=array[1..50] of integer;var v:vector; k,n:integer;

procedure creare;var i:integer; f:text;beginassign(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;beginfor 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;beginwriteln;write('lista contine: ');for i:=1 to n do write(v[i],' ');end;

procedure multiplii;var i:integer;

PROGRAMARE ATESTAT 2009 - INFORMATICĂ INTENSIV-

10

Page 11: Rezolvari Pascal

beginwriteln;write('multiplii: ');for i:=1 to n do if v[i] mod k=0 then write(v[i],' ');end;

begincreare;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:

41 2 3 45 6 7 89 10 11 1213 14 15 16

Se afişează:a) 1 5 9 13

2 6 10 143 7 11 154 8 12 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;beginwhile 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;

beginassign(f,'date.in');reset(f);readln(f,n);

PROGRAMARE ATESTAT 2009 - INFORMATICĂ INTENSIV-

11

Page 12: Rezolvari Pascal

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: IOANA Marius Ciprian maria Silvia Gabriel Vlad

Se afişează pe ecran:a) Ciprian Gabriel IOANA maria Marius Silvia Vlad b) 3

type vector=[1..100] of string;var v:vector; n:integer;

procedure citire;

PROGRAMARE ATESTAT 2009 - INFORMATICĂ INTENSIV-

12

Page 13: Rezolvari Pascal

var f:text; s,cuv:string; i:integer;beginassign(f,'date.in');reset(f);read(f,s);close(f);i:=1;while i<=length(s) dobeginwhile (s[i]=' ') and (i<length(s)) doi:=i+1;cuv:=";while (s[i]<>' ') and (i<=length(s)) dobegincuv:=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;beginfor i:=1 to n dobeginw[i]:=v[i];for j:=1 to length(w[i]) dow[i][j]:=upcase(w[i][j]);end;for i:=1 to n-1 dofor j:=i+1 to n doif 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;beginfor i:=1 to n dowrite(v[i],' ');

PROGRAMARE ATESTAT 2009 - INFORMATICĂ INTENSIV-

13

Page 14: Rezolvari Pascal

writeln;k:=0;for i:=1 to n doif v[i][length(v[i])] in ['a','A'] then k:=k+1;writeln(k);end;

begincitire;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: 18 20 17 34 15 29 16 14 15 34

Se afişează pe ecran:a) 20 34 29 14 34b) 34 15 14 16 29 15 34 17 20 18

Rezolvare:

type adresa=^nod;nod=recordinfo:integer;urm:adresa;end;var prim,c,d:adresa;f:text; k,n:integer;beginassign(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;while c^.urm<>nil do begin

PROGRAMARE ATESTAT 2009 - INFORMATICĂ INTENSIV-

14

Page 15: Rezolvari Pascal

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: InformatICa eLEV sCOalA CARTE

Se vor afişa pe ecran liniile:eLEV CARTE sCOalA InformatICa(INFORMATICA,5) (ELEV,2) (SCOALA,3) (CARTE,2)

Rezolvare:

type bp=recorda: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;beginassign(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 for j:=i+1 to k do if v[i].a>v[j].a then

PROGRAMARE ATESTAT 2009 - INFORMATICĂ INTENSIV-

15

Page 16: Rezolvari Pascal

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 15Un 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:

5 41 21 42 43 4

a) Se va afişa pe ecran:0 1 0 1 01 0 0 1 00 0 0 1 01 1 1 0 00 0 0 0 0

b) Deoarece d(1)=2, d(2)=2, d(3)=1, d(4)=3 şi d(5)=0, se va afişa: 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; sort; for i:=1 to n do begin for j:=1 to n do

PROGRAMARE ATESTAT 2009 - INFORMATICĂ INTENSIV-

16

Page 17: Rezolvari Pascal

write(g,a[i,j],' '); writeln(g); end; for i:=1 to n do write(g,v1[i],' '); close(f);close(g); end.

SUBIECTUL 16Scrieţ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;beginwrite('n=');readln(n);if n<10 thenwrite('DA') elsebegina:=n mod 10;ok:=true;while (n>0) and (ok=true) dobeginif a=n mod 10 thenn:=n div 10 elseok:=false;end;if ok=true thenwrite('DA') elsewrite('NU');end;end.

SUBIECTUL 17In 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:

233    24    210    6    17    720a) Se va afişa pe ecran:4    3    6720   6   233   24   210   17

type vac=record x:longint; y:integer; end;var v:array[1..30] of vac; i,k:integer; p:longint; f:text; aux:vac;

PROGRAMARE ATESTAT 2009 - INFORMATICĂ INTENSIV-

17

Page 18: Rezolvari Pascal

function cif(n:longint):integer;beginwhile n>9 do n:=n div 10;cif:=n;end;

beginassign(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 18Pe 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:- pe prima linie, elementele determinate la punctul a);- pe a doua linie, răspunsul cerinţei b).

Exemplu:

PROGRAMARE ATESTAT 2009 - INFORMATICĂ INTENSIV-

18

Page 19: Rezolvari Pascal

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;beginassign(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 ATESTAT 2009 - INFORMATICĂ INTENSIV-

19

Page 20: Rezolvari Pascal

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 19Fie 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:

580   64   50   96   45

Se va afişa pe ecran:Elementele din fişier pot forma o mulţime2   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;beginok:=true;k:=0;assign(f,'date.in'); reset(f);readln(f,n);for i:=1 to n do

Page 21: Rezolvari Pascal

read(f,v[i]);for i:=1 to n-1 dofor j:=i+1 to n doif 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;beginmax:=-MAXINT;for i:=1 to n doif v[i]>max then max:=v[i];c:=2;while max<>1 do begink:=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;

beginrezolvare1;rezolvare2;end.

end;

SUBIECTUL 20Se 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.

Page 22: Rezolvari Pascal

Exemplu:Fişierul date.in:

4   3 33  65  10544  32  2262  76  4131   1  12

Se va afişa pe ecran:31  465   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);begink:=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;beginq:=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;

beginassign(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

Page 23: Rezolvari Pascal

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.