Другие языки программирования и технологии

Нужна помощь с паскалем!

моя программа:
program No4;
uses crt;
type mas=array[1..10,1..10]of real;
var a:mas;
i,j,n,m:integer;
S,l:real;
function sum1(a:mas;n,m:integer):real;
var i:integer;S1,S2:real;
begin
S1:=0; {сумма на главной диагонали}
S2:=0; {сумма наже главной диагонали}
write('введите n=');readln(n);
write('введите m=');readln(m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');
read(a[i,j]);
end;
if j = i then S1:= S1 + a[i,j];
if j < i then S2:= S2 + a[i,j];
sum1:=S1+S2;
end;
function sum2(a:mas;n,m:integer):real;
var i:integer;l:real;
begin
l:=0; {сумма положительных элементов}
write('введите n=');readln(n);
write('введите m=');readln(m);
For i:=1 to n do
For j:=1 to m do
begin
write('a[',i,',',j,']=');
read(a[i,j]);
end;
if a[i,j]>0 then l:=l+a[i,j];
sum2:=l;
end;
begin
S:=sum1(a,n,m);
writeln ('S=',S);
l:=sum2(a,n,m);
writeln ('l=',l);
end.

Вылезает ошибка, как ее исправить? Правильно ли написана сама программа в целом? Если нет, то что поменять?

P.S.: ошибка программы и формулировка задачи на фото внизу.
Про ошибку вам уже сказали. А в целом нет.

Во-первых, понятие диагонали имеет смысл только в квадратных матрицах, поэтому две размерности это явный перебор.

Во-вторых, ваша функция sum1 не верная. Я проставлю комменты

function sum1(a:mas;n,m:integer):real;
var i,j:integer;S1,S2:real; // добавим j
begin
S1:=0; {сумма на главной диагонали}
S2:=0; {сумма наже главной диагонали}
write('введите n=');readln(n);
write('введите m=');readln(m); // это не надо
for i:=1 to n do
for j:=1 to n do // заменил m на n
begin
write('a[',i,',',j,']=');
read(a[i,j]);
end;
// упс. . цикл закончен и дальше нет никаких индексов (вернее они не будут изменяться и, следовательно, результат такого суммирования может спокойно отправляться в корзину)
if j = i then S1:= S1 + a[i,j];
if j < i then S2:= S2 + a[i,j];
sum1:=S1+S2;
end;

После выполнения цикла i=2, а j=3, следовательно, ни одно из условий не выполняется и вы получаете законный ноль в результате.

В-третьих, не понятно, зачем вы считаете сумму на диагонали и ниже ее отдельно, если потом все равно выводите сумму? Не проще так

for i:=1 to n do
for j:= 1 to i do S1 := S1 + A[i,j];
sum1 := S1;

Во второй функции тот же косяк - подсчет суммы вынесен из цикла. Собственно, и подсчета никакого нет, просто выводится последний введенный элемент.
Серик Бекбулатов
Серик Бекбулатов
59 626
Лучший ответ
Там-же на первом скрине где i: integer; замени на i,j: integer;
Другими словами, нужно
function sum2(a:mas;n,m:integer):real;
var i:integer;l:real;
заменить на
function sum2(a:mas;n,m:integer):real;
var i,j:integer;l:real;
АП
Андрей Панов
58 696
Андрей Витальевич ну да, это недопис) ) А программа правильно написана в целом?
Про ошибку - объявляй переменную j в функции, в которой используешь цикл с этой переменной:

function sum1(a:mas;n,m:integer):real;
var i,j:integer;S1,S2:real; <-------ЗДЕСЬ
begin
S1:=0; {сумма на главной диагонали}
S2:=0; {сумма наже главной диагонали}
write('введите n=');readln(n);
write('введите m=');readln(m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']=');
read(a[i,j]);
end;
if j = i then S1:= S1 + a[i,j];
if j < i then S2:= S2 + a[i,j];
sum1:=S1+S2;
end;
Андрей Витальевич ну да, это недопис) ) А программа правильно написана в целом?
Игорь Иваненко Циферки сложи и проверь)
Если не правильно, дебагер в помощь.