Ошибка 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;
→ Ссылка