Определитель матрицы - Pascal (3971)
Формулировка задачи:
Народ помогите,не пойму почему прога не работает:
program fav; const n=3; var i,j,k:integer; A:array [1..n,1..n] of real; detA:real; pr:real; begin writeln('Westi a[i,j]'); for i:=1 to n do begin for j:=1 to n do readln(a[i,j]); end; detA:=1; for k:=1 to n-1 do begin if a[k,k]=0 then begin i:=k+1; if a[i,k]=0 then begin i:=i+1; if i>n then begin detA:=0; writeln('Opredelitel raven nylyu');exit; end; end; end else for j:=k to n do begin pr:=a[i,j]; a[i,j]:=a[k,j]; a[k,j]:=pr; detA:=-detA; end; detA:=a[k,k]*detA; for j:=k+1 to n do a[k,j]:=a[k,j]/a[k,k]; a[k,k]:=1; for i:=k+1 to n do begin for j:=k+1 to n do a[i,j]:=a[i,j]-a[i,k]*a[k,j]; a[i,k]:=0; end; if a[n,n]=0 then detA:=0 else detA:=a[n,n]*detA; end; writeln('detA=',detA:8:6); end.
Решение задачи: «Определитель матрицы»
textual
Листинг программы
program opred; uses crt; const n=3; type Tmatr=array [1..n,1..n] of real; var a:Tmatr; det:real;//определитель //процедура перестановки строк, чтобы главный элемент не оказался //нолем или близким к нулю значением procedure Per(k,n:integer;var a:Tmatr; var p:integer); var i,j:integer;z:real; begin z:=a[k,k];i:=k;p:=0; //после каждого преобразования for j:=k+1 to n do //ищем по оставшимся строкам begin if abs(a[j,k])>z then //максимальный по модулю элемент begin z:=abs(a[j,k]);i:=j; //запоминаем номер строки p:=p+1;//считаем количество перестановок, т.к. при каждой //перестановке меняется знак определителя end; end; if i>k then //если эта строка ниже данной for j:=k to n do begin z:=a[i,j];a[i,j]:=a[k,j];a[k,j]:=z;//перестановка end; end; function znak(p:integer):integer;//ф-я определения знака определителя begin if p mod 2=0 then //если четное количество перестановок, "+" , если нет "-" znak:=1 else znak:=-1; end; procedure opr(n:integer;var a:Tmatr;var det:real);//собственно определитель var k,i,j,p:integer; r:real; begin det:=1; for k:=1 to n do //считаем по алгоритму, который во всех учебниках begin if a[k,k]=0 then per(k,n,a,p);//если главный элемент=0, делаем перестановку det:=znak(p)*det*a[k,k]; //меняем знак определителя for j:=k+1 to n do //делаем преобразования begin r:=a[j,k]/a[k,k]; for i:=k to n do begin a[j,i]:=a[j,i]-r*a[k,i]; end; end; end; end; begin //основная программа clrscr; //здесь напишете ввод как Вам больше нравится opr(n,a,det); write('opr=',det:4:0); readln end.
Объяснение кода листинга программы
- Переменная
a
объявлена как массив типаTmatr
, который представляет собой матрицу размеромn x n
. - Переменная
det
объявлена как переменная типаreal
, которая будет хранить значение определителя. - В функции
opr
используется циклfor
, который выполняетсяn
раз, гдеn
- это размер матрицы. - Внутри цикла
for
вызывается рекурсивная функцияper
, которая выполняет перестановку строк матрицы. - Функция
znak
определяет знак определителя, основываясь на количестве перестановок, выполненных в процессе вычисления определителя. - В конце основной программы выводится значение переменной
det
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д