Есть файл, в нем матрица, посчитать её определитель
Категория: Delphi/Pascal
2012-10-31 16:41:05
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
Поделиться: