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