Определитель матрицы. Помогите найти в чем ошибка
Надо написать программу в паскале для поиска определителя матрицы по такому алгоритму:
1. В 1-ом столбце ищем максимальный по модулю эл-т и запоминаем номер строки
2. Если этот эл-т равен 0, то и определитель равен нулю
3. Если номер строки не равен 1, то меняем эту строку с 1-ой и умножаем определитель на -1
4. Делим 1 строку на эл-т [1;1] и умножаем определитель на эл-т [1;1]
5. Из j-ого столбца (от 2 до размерности) вычитаем 1-ый столбец, умноженный на [1;j]
Все это делаем (размерность матрицы-1) раз
умножаем определитель на последний эл-т в матрице.
Я составила вот такую программу:
Type mas = array [1..10, 1..10] of real;
Var n: Integer;
d: real;
a: mas;
Procedure vvod (Var A: Integer);
Var rk: Integer;
begin
{$I-}
repeat
Writeln ('Vvedite razmernost matrici');
Readln (a);
rk:=ioresult;
if (rk<>0) or (A<=0) or (A>10) then
Writeln ('error')
until (rk=0) and (A>0) and (A<=10);
{$I+}
end;
Procedure Zap (Var m: mas; n: integer);
Var i, j: Integer;
begin
Writeln('Vvedite elementi matrici postrochno');
For i:=1 to n do
for j:=1 to n do
Read (m[i,j]);
end;
Procedure deter ( var a: mas; n: integer; var det: real);
Var i, k, j, c: integer;
max, b: real;
begin
det:=1;
j:=1;
k:=1;
While (j<=n) do
begin
max:=a[1,j];
for i := (j+1) to n do
if (abs(a[i, j])>abs (max)) then begin
max:=a[i, j];
k:=i
end;
if max=0 then
det:=0
else begin
if (k<>j) then begin
det:=det*(-1);
for i:=j to n do begin
b:=a[j, i];
a[j, i]:=a[k, i];
a[k, i]:=b end;
end;
for i:=j to n do
a[j, i]:= a[j, i]/a[j, j];
det:= det*a[j, j];
for i:=j+1 to n do begin
for c:=1 to n do
a[c, i]:= a[c, i] - a[c, j]*a[i, j];
end;
end;
j:=j+1;
end;
det:=det*a[n, n];
end;
Procedure Vivod (m: mas; n: integer);
Var i, j: Integer;
begin
For i:=1 to n do
begin
for j:=1 to n do
Write (m[i, j]:7:3, ' ');
Writeln;
end;
end;
begin
vvod
;
Zap (a, n);
Vivod (a, n);
Readln;
deter (a, n, d);
Readln;
Writeln ('Opredelitel matrici ', d:5:3);
Readln;
end.
С 5-ым шагом выходит как-то не получается. Помогите найти в чем ошибка
Надо написать программу в паскале для поиска определителя матрицы по такому алгоритму:
1. В 1-ом столбце ищем максимальный по модулю эл-т и запоминаем номер строки
2. Если этот эл-т равен 0, то и определитель равен нулю
3. Если номер строки не равен 1, то меняем эту строку с 1-ой и умножаем определитель на -1
4. Делим 1 строку на эл-т [1;1] и умножаем определитель на эл-т [1;1]
5. Из j-ого столбца (от 2 до размерности) вычитаем 1-ый столбец, умноженный на [1;j]
Все это делаем (размерность матрицы-1) раз
умножаем определитель на последний эл-т в матрице.
Я составила вот такую программу:
Type mas = array [1..10, 1..10] of real;
Var n: Integer;
d: real;
a: mas;
Procedure vvod (Var A: Integer);
Var rk: Integer;
begin
{$I-}
repeat
Writeln ('Vvedite razmernost matrici');
Readln (a);
rk:=ioresult;
if (rk<>0) or (A<=0) or (A>10) then
Writeln ('error')
until (rk=0) and (A>0) and (A<=10);
{$I+}
end;
Procedure Zap (Var m: mas; n: integer);
Var i, j: Integer;
begin
Writeln('Vvedite elementi matrici postrochno');
For i:=1 to n do
for j:=1 to n do
Read (m[i,j]);
end;
Procedure deter ( var a: mas; n: integer; var det: real);
Var i, k, j, c: integer;
max, b: real;
begin
det:=1;
j:=1;
k:=1;
While (j<=n) do
begin
max:=a[1,j];
for i := (j+1) to n do
if (abs(a[i, j])>abs (max)) then begin
max:=a[i, j];
k:=i
end;
if max=0 then
det:=0
else begin
if (k<>j) then begin
det:=det*(-1);
for i:=j to n do begin
b:=a[j, i];
a[j, i]:=a[k, i];
a[k, i]:=b end;
end;
for i:=j to n do
a[j, i]:= a[j, i]/a[j, j];
det:= det*a[j, j];
for i:=j+1 to n do begin
for c:=1 to n do
a[c, i]:= a[c, i] - a[c, j]*a[i, j];
end;
end;
j:=j+1;
end;
det:=det*a[n, n];
end;
Procedure Vivod (m: mas; n: integer);
Var i, j: Integer;
begin
For i:=1 to n do
begin
for j:=1 to n do
Write (m[i, j]:7:3, ' ');
Writeln;
end;
end;
begin
vvod
Zap (a, n);
Vivod (a, n);
Readln;
deter (a, n, d);
Readln;
Writeln ('Opredelitel matrici ', d:5:3);
Readln;
end.
С 5-ым шагом выходит как-то не получается. Помогите найти в чем ошибка