Найдите ошибку в программе вычисления определителя матрицы - 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.
Объяснение кода листинга программы
- В функции
wwodпеременнаяiиjинициализируются как 0. Но в циклеforони начинаются с 1, поэтому их нужно инициализировать как 1. - В функции
Gaussпеременнаяpинициализируется как 1. Но в циклеforона умножается на элемент матрицыa[k,k], поэтому ее нужно инициализировать как 0. - В цикле
forв функцииGaussперед проверкой условияif abs(m) > abs(s)нужно добавить переменнуюjкак счетчик для перебора строк матрицы. - В цикле
forв функцииGaussпосле проверки условияif abs(m) > abs(s)нужно обновить значения переменныхsиjдля следующей итерации. - В цикле
forв функцииGaussпосле обновления значенияsиjнужно добавить переменнуюiкак счетчик для перебора столбцов матрицы. - В цикле
forв функцииGaussперед обновлением значенияa[i, j]нужно добавить переменнуюmкак временное значение для вычисления нового значения. - В цикле
forв функцииGaussпосле обновления значенияa[i, j]нужно добавить переменнуюcкак временное значение для вычисления нового значения. - В цикле
forв функцииGaussпосле вычисления значенияcнужно обновить значениеa[i, j]для следующей итерации. - В основной программе после ввода размера матрицы
nнужно инициализировать переменныеa,nиdetкак 0. - В основной программе после вычисления значения
detнужно вывести его на экран с точностью до 4 знаков после запятой.