Subiectul 3
Se citeşte de la tastatură o matrice pătratică A cu n linii și n coloane conținȃnd
numere naturale (3 ≤ n ≤ 50, 1 ≤ ai,j ≤ 20000). Scrieţi un program care
determină și apoi tipărește şirul X, conținȃnd ȋn ordine descrescătoare,
numerele „superprime” distincte, care apar ȋn triunghiul stȃng sau cel drept al
matricei A. Șirul X se va construi direct ordonat, fără a face ordonarea
ulterioară. Ȋn cazul ȋn care șirul X este vid, se va tipări mesajul „Șirul este vid”.
Un număr se numește „superprim” dacă toate prefixele sale sunt numere prime
(de ex. 239 este „superprim” deoarece 2, 23 și 239 sunt prime, dar numărul 241
nu este „superprim” deoarece 24 nu este prim).
Se vor scrie subprograme pentru:
a). citirea unei matrici pătratice
b). tipărirea unui şir
c). verificarea dacă un număr este prim
d). verificarea dacă un număr este „superprim”
e). inserarea unei valori ȋntr-un șir ordonat descrescător
f). construirea șirului X.
Nu imi afiseaza rezultatul, nu imi pot da seama unde se blocheaza.
program testare;
uses crt;
type mat=array[1..50,1..50] of integer;
type vect=array[1..200] of integer;
var a:mat;
x:vect;
n,k:integer;
procedure citire(a:mat;n:integer);
var i,j:integer;
begin
for i:=1 to n do
for j:=1 to n do
begin
write('a[',i,',',j,']= '); readln(a[i,j]);
end;end;
procedure tiparire(x:vect;n:integer);
var i:integer;
begin
if n=0 then writeln ('Sirul este vid')
else
for i:=1 to n do
write(x, ',');
writeln;
end;
function test_nr_prim(n:integer):boolean;
var d:integer;
e_prim:boolean;
begin
e_prim:=true;
if (n=1) then e_prim:=false;
for d:=2 to n-1 do
if n mod d=0 then
e_prim:=false;
test_nr_prim:=e_prim;
end;
function esuperprim(n:integer):boolean;
var super:boolean;
begin
super:=true;
while (n<>0) do begin
if (test_nr_prim(n)=false) then super:=false;
n:=n div 10;
end;
esuperprim:=super;
end;
procedure inserare_ordonata(x:vect;n:integer;v:integer);
var i,pozitie:integer;
begin
pozitie:=1;
while (x[pozitie]>v) and (pozitie<=n) do
pozitie:=pozitie+1;
for i:=pozitie to n do
x[i+1]:=x;
x[pozitie]:=v;
n:=n+1;
end;
function apartine(x:vect;n:integer;v:integer):boolean;
var gasit:boolean;
i:integer;
begin
gasit:=false;
while i<=n do
if x=v then gasit:=true;
apartine:=gasit;
end;
procedure construire_sir(a:mat;n:integer;x:vect;var k:integer);
var i,j:integer;
begin
k:=0;
for i:=1 to n do
for j:=1 to n do
if ((i>j) and (i+j<n+1)) or ((i<j) and (i+j>n+1)) then
if ((esuperprim(a[i,j])=true) and apartine(x,k,a[i,j])=false)
then begin
k:=k+1;
inserare_ordonata(x,k,a[i,j]);
end;
end;
begin
write ('Numarul de linii si coloane = ');readln(n);
citire(a,n);
construire_sir(a,n,x,k);
tiparire(x,k);
readln;
end.