Определитель матрицы - 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.

Объяснение кода листинга программы

  1. Переменная a объявлена как массив типа Tmatr, который представляет собой матрицу размером n x n.
  2. Переменная det объявлена как переменная типа real, которая будет хранить значение определителя.
  3. В функции opr используется цикл for, который выполняется n раз, где n - это размер матрицы.
  4. Внутри цикла for вызывается рекурсивная функция per, которая выполняет перестановку строк матрицы.
  5. Функция znak определяет знак определителя, основываясь на количестве перестановок, выполненных в процессе вычисления определителя.
  6. В конце основной программы выводится значение переменной det.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5
Похожие ответы