Найдите ошибку в программе вычисления определителя матрицы - Pascal

Узнай цену своей работы

Формулировка задачи:

Программа считает определитель матрицы, но делает это не правильно, найдите пожалуйста ошибку в программе...
Program Gaus;
Uses Crt;
Type mat=array[1..20,1..20] of real;
Var a:mat; n:integer; det:real;
Procedure wwod(n:integer; Var a:mat);
Var i,j:integer;
Begin
Writeln('Введите элементы матрицы(по строкам)');
For i:=1 to n do
For j:=1 to n do
Read(a[i,j]);
End;
Function Gauss(n:integer; a:mat):Real;
Var i,j,k:integer;
c,p,m,s:Real;
Begin 
p:=1;
For k:=1 to n-1 do Begin
s:=a[k,k];
j:=k;
For i:=1 to n do 
Begin
m:=a[i,k];
if abs(m)>abs(s) then 
Begin 
s:=m; j:=i; 
end;
end;
if j<>k then 
Begin 
p:=p-1;
For i:=k to n do 
Begin
m:=a[k,i]; 
a[k,i]:=a[j,i]; 
a[j,i]:=m;
End;
End;
For i:=k+1 to n do Begin
c:=a[i,k]/a[k,k];
For j:=k+1 to n do
a[i,j]:=a[i,j]-c*a[k,j];
end;
p:=p*s; end;
Gauss:=p*a[n,n];
end;
Begin(*Основная программа*)
Clrscr;
Write('Введите размер матрицы n=');
Readln(n);
Wwod(n,a); det:=Gauss(n,a);
Writeln('Определитель равен',det:8:4);
End.

Решение задачи: «Найдите ошибку в программе вычисления определителя матрицы»

textual
Листинг программы
Uses Crt;
type
  mat = array[1..20, 1..20] of real;
 
var
  a: mat;
  n: integer;
  det: real;
 
procedure wwod(n: integer; var a: mat);
var
  i, j: integer;
begin
  Writeln('Введите элементы матрицы(по строкам)');
  for i := 1 to n do
    for j := 1 to n do
      Read(a[i, j]);
end;
 
function Gauss(n: integer; a: mat): Real;
var
  i, j, k: integer;
  c, p, m, s: Real;
begin
  p := 1;
{  for k := 1 to n - 1 do
  begin
    s := a[k, k];
    j := k;
    for i := 1 to n do
    begin
      m := a[i, k];
      if abs(m) > abs(s) then
      begin
        s := m;j := i;
      end;
    end;
    if j <> k then
    begin
      p := p - 1;
      for i := k to n do
      begin
        m := a[k, i];
        a[k, i] := a[j, i];
        a[j, i] := m;
      end;
    end;     }
    for k:=1 to n do
    begin
      p:=p*a[k,k];
      for i := k + 1 to n do
      begin
         c := a[i, k] / a[k, k];
         for j := k to n do
             a[i, j] := a[i, j] - c * a[k, j];
         end;
      end;
    {p := p * s;}
  Gauss := p;
end;
 
begin(*Основная программа*)
  Clrscr;
  Write('Введите размер матрицы n=');
  Readln(n);
  Wwod(n, a);det := Gauss(n, a);
  Writeln('Определитель равен', det:8:4);
  readln; readln;
end.

Объяснение кода листинга программы

  1. В функции wwod переменная i и j инициализируются как 0. Но в цикле for они начинаются с 1, поэтому их нужно инициализировать как 1.
  2. В функции Gauss переменная p инициализируется как 1. Но в цикле for она умножается на элемент матрицы a[k,k], поэтому ее нужно инициализировать как 0.
  3. В цикле for в функции Gauss перед проверкой условия if abs(m) > abs(s) нужно добавить переменную j как счетчик для перебора строк матрицы.
  4. В цикле for в функции Gauss после проверки условия if abs(m) > abs(s) нужно обновить значения переменных s и j для следующей итерации.
  5. В цикле for в функции Gauss после обновления значения s и j нужно добавить переменную i как счетчик для перебора столбцов матрицы.
  6. В цикле for в функции Gauss перед обновлением значения a[i, j] нужно добавить переменную m как временное значение для вычисления нового значения.
  7. В цикле for в функции Gauss после обновления значения a[i, j] нужно добавить переменную c как временное значение для вычисления нового значения.
  8. В цикле for в функции Gauss после вычисления значения c нужно обновить значение a[i, j] для следующей итерации.
  9. В основной программе после ввода размера матрицы n нужно инициализировать переменные a, n и det как 0.
  10. В основной программе после вычисления значения det нужно вывести его на экран с точностью до 4 знаков после запятой.

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы