Найдите ошибку в программе вычисления определителя матрицы - 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 знаков после запятой.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д