uses crt;
const max=20;
type mas=array[1..max] of integer;{строка матрицы}
matr=array[1..max] of mas;{масив строк - матрица}
procedure Vvod(var mt:matr;var x:byte);{ввод данных в матрицу и вывод ее на экран}
var i,j:byte;
begin
write('Размер матрицы = ');
readln(x);
writeln('Матрица:');
for i:=1 to x do
begin
for j:=1 to x do
begin
mt[i,j]:=random(20)-2;
write(mt[i,j]:5);
end;
writeln;
end;
writeln;
end;
function NoOtr(v:mas;x:byte):boolean;{определяем есть ли отрицательные в строке}
var i:byte;
begin
NoOtr:=true;{нет}
for i:=1 to x do
if v[i]<0 then
begin
NoOtr:=false;{есть}
break;
end;
end;
function SumStr(v:mas;x:byte):integer;{сумма в строке}
var i:byte;
s:integer;
begin
s:=0;
for i:=1 to x do
s:=s+v[i];
SumStr:=s;
end;
procedure VyvSumm(mt:matr;x:byte);{вывод сумм в строках без отрицательных}
var i:byte;
begin
writeln('Суммы в строках, где нет отрицатедьных элементов:');
for i:=1 to x do
if NoOtr(mt[i],x) then{если нет отрицательных}
writeln('Сумма в строке ',i,'=',SumStr(mt[i],x));{выводим сумму}
writeln;
write('Press Enter...');
readln;
end;
Function SumDg(mt:matr;x,k:integer):integer;{подсчет сумм в диагоналях, параллельных главным}
var i,j,sum:integer;
begin
sum:=0;
if k<=x then{выше главной и на ней}
begin
for i:=x-k+1 to x do
for j:=1 to k do
if j=i-x+k then sum:=sum+mt[i,j];
end
else{ниже главной}
begin
for i:=1 to 2*x-k do
for j:=k-x+1 to x do
if j=i+k-x then sum:=sum+mt[i,j];
end;
SumDg:=sum;
end;
function Min(mt:matr;x:byte):integer;{нахождение мимальной суммы}
var i,j,k:byte;
mn:integer;
begin
mn:=maxint;
for k:=1 to 2*x-1 do{смотрим все диагонали}
if SumDg(mt,x,k)<mn then mn:=SumDg(mt,x,k);{ищем минимальную сумму}
Min:=mn;
end;
procedure VyvDg(mt:matr;x:byte);{вывод сумм по диагоналям и минимальной суммы}
var k:byte;
begin
writeln('Суммы по диагоналям, параллельных главным:');
for k:=1 to 2*x-1 do
writeln('Сумма диагонали ',k,'=',SumDg(mt,x,k));
writeln('Минимальная сумма=',Min(mt,x));
end;
var n:byte;
a:matr;
v:mas;
begin
clrscr;
randomize;
Vvod(a,n);
VyvSumm(a,n);
VyvDg(a,n);
readln;
end.