Есть файл, в нем матрица, посчитать её определитель

code: #delphi
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;
 
const
  Rang = 5;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Button2: TButton;
    StringGrid2: TStringGrid;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  AMatrica = array[1..Rang,1..Rang] of Integer;
var
  Form1: TForm1;
 
 Matrica : AMatrica;
{Массив ActiveCols будем использовать для обозначения "вычеркнутых" колонок}
  ActiveCols : array[1..Rang] of Boolean = (true,true,true,true,true);
 
  function Determinant(FirstRow : Integer ) : Integer;
implementation
 
{$R *.dfm}
 
 
 
{FirstRow указывает на первую строку массива, с которой начинается
матрица, рассматриваемая на текущем шаге. Строки вычеркиваем последовательно}
function Determinant(FirstRow : Integer) : Integer;
var
  i : Integer;
  Odd : Boolean;
begin
  Result:=0;
  Odd:=true;
  for i:=1 to Rang do // пробегаем по всем элементам текущей строки
    begin
    if NOT ActiveCols[i] then Continue; // если колонка вычеркнута, то пропускаем
    if FirstRow = Rang
    then
      begin
      Result:=Matrica[FirstRow,i];
      Exit;
      end;
    ActiveCols[i]:=false;
    if Odd
    then
      Result:=Result+Matrica[FirstRow,i]*Determinant(FirstRow+1)
    else
      Result:=Result-Matrica[FirstRow,i]*Determinant(FirstRow+1);
    ActiveCols[i]:=true;  // восстанавливаем вычеркнутый стобец
    Odd:=NOT Odd; // меняем четность
    end;
end;
 
 
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   Label1.Caption:= IntToStr(Determinant(1));
end;
 
 
procedure TForm1.Button2Click(Sender: TObject);
var
   s :TStringlist;
   i, posy, posx: Integer;
   Str:String;
     nxn: array of array of integer;
begin
  with TOpenDialog.Create(Owner) do
    begin
       DefaultExt:='.txt';
       Filter:= 'файлы проекта|*.txt';
       if not Execute then exit;
       s:=TStringList.Create;
       S.LoadFromFile(FileName);
       For posy := 1 to S.Count do
       begin
           posx := 0;
           Str := '';
           For i := 1 to Length(S.Strings[posy-1]) do
           begin
              if S.Strings[posy-1][i] <> ' ' then
                  Str := Str + S.Strings[posy-1][i]
              else
              begin
                  StringGrid2.Cells[posx, posy-1] := Str;
                  Matrica[posx+1,posy]:= StrToInt(Str);
                  Str := '';
                  inc(posx);
              end;
            end;
 
       end;
       S.Free;
    end;
    With StringGrid2 do begin
        colCount:=posx;
        RowCount:=posy;
        For i:=0 to posx-1 do
           ColWidths[i]:=Trunc(Width/posx);
    end;
    SetLength(nxn,Rang,Rang);
end;
 
end.

автор: MegaPiha

Поделиться:

Похожие статьи: