Исправьте пожалуйста на динамический массив. Желательно полный код заново) Спасибо
var n,i,j,k,l,m,max:integer;
a:array[1..20,1..20]of integer;
b,c:array[1..38]of integer;
begin
write('n=');readln(n);
randomize;
Writeln('Ishodnaja matrica:');
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=random(10);
write(a[i,j]:3);
end;
writeln;
end;
readln;
for l:=1 to n-1 do //считаем суммы диагоналей выше главной
begin
for i:=1 to n-1 do
begin
for j:=2 to n do
if j=i+l then
begin
b[l]:=b[l]+a[i,j]; //заносим их в массив
end;
end;
end;
for l:=1 to n-1 do //считаем суммы в диагоналях ниже главной
begin
for i:=2 to n do
begin
for j:=1 to n-1 do
if j=i-l then
begin
c[l]:=c[l]+a[i,j]; //записываем их в массив
end;
end;
end;
for i:=n to 2*n-2 do //собираем два массива в один
b:=c[i-n+1];
max:=b[1];
for i:=2 to n do
if b>max then max:=b; //находим максимум
writeln('max=',max);
readln;
end.
{В приведённом Вами примере динамическим массивом и не пахнет.
Нет выделения и с помощью GetMem и с помощью new.
К сожалению Вы не указали версию Pascal - работа с динамикой отличается в разных реализациях. Н-р в PascalABC не надо в FreeMem передавать размер, в PascalABC.NET память выделяется new или SetLength, что не соответствует "классике", если что - пишите на почту.
Здесь приведён классический Turbo/Borland}
uses crt;
var
byteRow,byteCol,byteI,byteJ :byte;
uintSize :word;
lngSum :longint;
ptrIntMatrix,ptrIntCurrent :^integer;
blnWasNegative :boolean;
begin
repeat
ClrScr;
Write('Кол-во строк: '); ReadLn(byteRow);
Write('Кол-во столбцов: '); ReadLn(byteCol);
until (byteRow<>0) and (byteCol<>0);
uintSize:=sizeof(integer)*byteRow*byteCol;
GetMem(ptrIntMatrix, uintSize);
Randomize;
ptrIntCurrent:=ptrIntMatrix;
for byteI:=1 to byteRow do
begin
for byteJ:=1 to byteCol do
begin
ptrIntCurrent^:=random(30)-10;
Write(ptrIntCurrent^:5);
{Инкремент (inc) с указателем работает не во всех версиях Pascal}
ptrIntCurrent:=ptrIntCurrent+1;
end;
WriteLn;
end;
{По-моему в небольших массивах проще сразу считать сумму
элементов (целочисленные операции выполняются бстро) ,
а потом если что её не выводить, иначе массив надо
пробегать в два прохода, запоминая список строк с <0,
если надо так - переделаю - не проблема - пишите на почту}
ptrIntCurrent:=ptrIntMatrix;
for byteI:=1 to byteRow do
begin
blnWasNegative:=false;
lngSum:=0;
for byteJ:=1 to byteCol do
begin
if (ptrIntCurrent^<0) then blnWasNegative:=true;
Inc(lngSum, ptrIntCurrent^);
ptrIntCurrent:=ptrIntCurrent+1;
end;
if (blnWasNegative) then
WriteLn('Строка ',byteI, ' Сумма :', lngSum);
end;
FreeMem(ptrIntMatrix, uintSize);
ReadKey;
end.
-------
Протокол работы:
Кол-во строк: 3
Кол-во столбцов: 4
12 -7 16 1
4 7 14 11
-3 -1 -7 8
Строка 1 сумма :22
Строка 3 сумма :-3
который не понимает crt, readkey, clrscr и ptrIntCurrent:=ptrIntCurrent+1;
Удалите uses crt; удалите clrscrl, вместо readkey поставьте readln;
а в место ptrIntCurrent:=ptrIntCurrent+1 поставьте Inc(ptrIntCurrent);
Если будет писать в другом Pascal FreeMem ошибку с параметрами - уберите ,uintSize
(бардак с этими стандартами и реализацией паскалей... кто во что горазд...)