Определитель любого порядка
Если порядок определителя выше трех, то определитель преобразовывают к треугольному виду : выше или ниже диагонали стоят нули. А затем перемножают элементы диагонали и в результате получается значение определителя.
uses crt; {label 1,2;} const n=4;{число строк, число столбцов; можно изменить} type vector = array[1..n] of real; matrica= array[1..n] of vector; var a: matrica; i,j : integer; det : real; {определитель матрицы} procedure wywod; {Вывод матрицы} var i,j:integer; begin for i:=1 to n do begin for j:=1 to n do write (a[i,j]:9:2,' '); writeln end; end;{wywod} procedure movestrings(k,l:integer; var a: matrica; n:integer); {Процедура перестановки k-ой и l-ой строк в матрице а порядка n} var j : integer; r : real; begin if (k<=n) and (l<=n)then begin for j := 1 to n do begin r := a[l,j]; a[l,j] :=a[k,j]; a[k,j] := r; end; end end; {movestrings} procedure prhod(var a:matrica; n : integer; var det: real); {Преобразование матрицы а, размерности n и вычисление определителя det - соответствует "прямому ходу" метода Гаусса} var i,j,k,l : integer; b : matrica; k1,k2,d:real; begin d:=1; for k := 1 to n-1 do begin {Если ведущий элемент ненулевой} if a[k,k]<>0 then k1:=a[k,k] else {В противном случае: перестановка строк,...} begin l:=k; repeat l:=l+1 {ищем первый ненулевой элемент данного столбца, стоящий ниже диагонального,...} until (a[l,k]<>0) or (l=n+1); {если такой элемент найден,... } if l<=n then begin {...меняем строки местами,...} movestrings(k,l,a,n); {...определитедь умножается на -1,...} d:=d*(-1); {...определение значения ведущего элемента - k1,...} k1:=a[k,k]; {(для пошаговго вывода преобразований прямого хода снимите комментарий у следующих двух операторов)} write('Преобразование ',k);readln;wywod; end else {В противном случае такой элемент отсутствует, что означает, что определитель системы равен нулю} begin det:=0; {выход из процедуры} exit; end; end; if d<>0 then {Вычитание из каждой i-ой строки, лежащей ниже k-ой,...} for i := k+1 to n do begin k2:=a[i,k]; {...вычитание k-ой строки, умноженной на коэффициент} for j := k to n+1 do a[i,j] := a[i,j]-a[k,j]*k2/k1; end;{цикл по i} d:=d*a[k,k]; readln;wywod; writeln('d=',d:5:2); end;{цикл по k} det:=d*a[n,n]; {Определитель системы равен произведению диагональных элементов} end;{prhod} Begin clrscr; {Исходная матрица - тестовый пример} a[1,1] := 0; a[1,2] :=0; a[1,3] :=0; a[1,4]:=2; a[2,1] := 7; a[2,2] :=2; a[2,3] :=0; a[2,4]:=1; a[3,1] := 14; a[3,2] :=14; a[3,3] := 0; a[3,4]:=11; a[4,1] := 0; a[4,2] :=0; a[4,3] :=1; a[4,4]:=1; {Исходная матрица} wywod; {Преобразование матрицы - "прямой ход" метода Гаусса} prhod(a,n,det); {Вывод преобразованной матрицы} writeln('Матрица после преобразований');wywod; write('Определитель равен ',det:7:3); readln; End.