Ошибка EInvalidOp : Invalid floating point operation
Когда я ввожу отрицательные значения, то выходит ошибка "EInvalidOp : Invalid floating point operation" Помогите пожалуйста, в чем проблема? Само задание "Все элементы матрицы X (n x n), лежащие выше главной диагонали, заменить средним арифметическим положительных элементов, стоящих в нечетных столбцах. "
program Pr6;
uses crt, sysutils;
{$R-}
type
Tmas=^TTmas;{одна строка матрицы}
TTmas=array[0..0] of double;
Tmatr=^TTmatr;{матрица-массив указателей на строки}
TTmatr=array[0..0] of Tmas;
var
a:Tmatr;
val, avg, sum : double;
i,j, n, m, counter, k :integer;
x:double;{буфер для обмена}
begin
counter := 0;
write('N=');
readln(n);
write('M=');
readln(m);
getmem(a, sizeof(TTmas) * n * m);
for i:=0 to n - 1 do
getmem(a^[i], sizeof(double) * m);
// заполняем матрицу
for i:=0 to n - 1 do
begin
for j:=0 to m - 1 do
begin
write('x(' + IntToStr(i) + ',' + IntToStr(j) + ')=');
readln(val);
a^[i]^[j] := val;
end;
end;
// выводим матрицу
for i := 0 to n - 1 do
begin
for j := 0 to m - 1 do
write(a^[i]^[j]:6:2);
writeln;
end;
// вычисляем среднее арифметическое положительных элементов в нечетных столбцах
i := 0;
sum := 0;
k :=0;
while(i < n) do
begin
j := 1;
while(j < m) do
begin
x := a^[i]^[j];
if x > 0 then
begin
sum := sum + x;
inc(counter);
k := k+1;
end;
j := j + 2;
end;
inc(i);
end;
// вычисляем среднее арифметическое
avg := sum / counter;
// заменяем в матрице ячейки выше главной диагонали
i := 0;
while(i < n) do
begin
j := i + 1;
while(j < m) do
begin
a^[i]^[j] := avg;
inc(j);
end;
inc(i);
end;
if k = 0 then begin
WriteLn('Все элементы отрицательны');
end
else begin
// выводим результат
WriteLn('Пересчитанная матрица');
for i := 0 to n - 1 do
begin
for j := 0 to m - 1 do
write(a^[i]^[j]:6:2);
writeln;
end;
end;
// освобождаем выделенную память
for i:=0 to n - 1 do
freemem(a^[i], sizeof(double) * n);
freemem(a,sizeof(TTmas) * n * m);
end.
Ответы (1 шт):
Автор решения: Igor
→ Ссылка
Делить на ноль нельзя.
avg := 0;
if counter > 0 then
avg := sum / counter;