[delphi] obracanie macierzy ,sprawdzenie,przeksztalcenie

0

witam wiec musze napisac program w delphi na obracanie macierzy, oto jego kod:

zastosowałem 2x Tedit i 1x Tbutton

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

//globalne deklaracje stałych i zmiennych oraz definicja typu.

Const
Max = 50; { Maksymalny stopien macierzy }
Zero = 1.0E-7; { Umowne zero }

Type
TMacierz= Array[1..Max,1..Max] of Real;

var
Form1: TForm1;

//-------------------------

implementation

{$R *.dfm}

Function OdwracanieMacierzy(Var Macierz: TMacierz;Stopien:Byte): Boolean;
Var
w,k,w1,k1,i, { zmienne wykorzystywane przy iteracji }
p,q : Integer; { wspolrzedne elementu osiowego }
c : Array[1..Max] of Byte;
BylaJuzKolOsiowa: Array[1..Max]of boolean;
Max : Real;
MacPom : TMacierz;
begin
FillChar(BylaJuzKolOsiowa,SizeOf(BylaJuzKolOsiowa) ,False);
for w:=1 to Stopien do
begin
c[w]:=0;
Max:=0.0;
for k:=1 to Stopien do
begin
if not(BylaJuzKolOsiowa[k]) then
if Max < Abs(Macierz[w,k]) then
begin
Max:=Abs(Macierz[w,k]);
p:=w;
q:=k;
end;
end;
if Max<Zero then
begin
OdwracanieMacierzy:= False;
Exit;
end;
for w1:=1 to Stopien do
for k1:=1 to Stopien do
if (w1<>p)and(k1<>q)then
Macierz[w1,k1]:= Macierz[w1,k1]-(Macierz[p,k1]*Macierz[w1,q]/Macierz[p,q]);
for w1:=1 to Stopien do
if w1<>p then Macierz[w1,q]:= -Macierz[w1,q]/Macierz[p,q];
for k1:=1 to Stopien do
if k1<>q then Macierz[p,k1]:= Macierz[p,k1]/Macierz[p,q];
Macierz[p,q]:= 1/Macierz[p,q];

c[w]:= q;
BylaJuzKolOsiowa[q]:= True;
end;

(* Permutowanie macierzy *)
MacPom:=Macierz;
for k:=1 to Stopien do
for i:=1 to Stopien do
Macierz[c[k],i]:= MacPom[k,i];

MacPom:=Macierz;
for k:=1 to Stopien do
for i:=1 to Stopien do
Macierz[i,k]:= MacPom[i,c[k]];

OdwracanieMacierzy:= True;
end;

Procedure Wczytaj(var Macierz:TMacierz;var Stopien:Byte);
Var
f : Text;
i,j : Integer;
Begin
Assign(f,Form1.Edit1.Text);
Reset(f);
ReadLn(f,Stopien);
if Stopien>max then
begin
ShowMessage('Macierz za duża!!!');
Exit;
end;
for i:=1 to Stopien do
begin
for j:=1 to Stopien do
Read(f,Macierz[i,j]);
ReadLn(f);
end;
Close(f);
end;

Procedure Zapisz(Var Macierz:TMacierz; Stopien:Integer; OK:Boolean);
Var
f : Text;
i,j : Integer;
Begin
Assign(f,Form1.Edit2.Text);
Rewrite(f);
if OK then
for i:=1 to Stopien do
begin
for j:=1 to Stopien do
Write(f,Macierz[i,j],' ');
WriteLn(f);
end
else
WriteLn(f,'Macierz osobliwa!!!');
Close(f);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Macierz : TMacierz;
Stopien : Byte;
begin
Wczytaj(Macierz,Stopien);
if OdwracanieMacierzy(Macierz,Stopien) then
Zapisz(Macierz,Stopien,True)
else
Zapisz(Macierz,Stopien,False);
ShowMessage('Skończyłem');
end;

end.

trzeba podac adres plku z macierza napisany w notatniku i adres pliku gdzie ma byc zapisany wynik.

czy umialby by ktos tak zmienic kod by mozna bylo wpisywac macierz w programie wewnatrz i zeby wewnatrz wyswietlał wynik (czyli w okienku programu bez potrzebu posiadania pliku z macierza)?
pozdrawiam

0

temat ma się nijak do rzeczy, z którą masz problem.
Po prostu wrzuć sobie StringGrida (albo 2: jeden na dane, drugi na wyniki) na formatkę. Będziesz mógł łatwo wprowadzać dane do macierzy i prezentować wyniki. Najpierw wpisujesz dane do komponentu, a potem z niego do macierzy. Po wykonaniu obliczeń wczytujesz do Grida wyniki z macierzy.

I jeszcze taka rzecz:

procedure TForm1.Button1Click(Sender: TObject);
var
 Macierz : TMacierz;
 Stopien : Byte;
begin
   (...)
end;

Zmienna TMacierz jako lokalna jest umieszczana na stosie. 50x50x8 B daje nam 20000 B. Należy unikać odkładania na stos dużych porcji danych. Zamiast tego lepiej zastosować wskaźnik, albo tablicę dynamiczną.

0
lamernoide napisał(a)

witam wiec musze napisac program w delphi na obracanie macierzy, oto jego kod:

zastosowałem 2x Tedit i 1x Tbutton

chyba jednak nie ty zastosowałeś http://4programmers.net/Algorytmy/Odwracanie_macierzy.

0
ktos_tamm napisał(a)
lamernoide napisał(a)

witam wiec musze napisac program w delphi na obracanie macierzy, oto jego kod:

zastosowałem 2x Tedit i 1x Tbutton

chyba jednak nie ty zastosowałeś http://4programmers.net/Algorytmy/Odwracanie_macierzy.

to jest w pascalu co ty dales(uzylem tego przyznaje ci)ale ja dalem w delphi i nie wiem jak dalej przerobic to

0

LUC dzieki za pomoc :P ale nie wychodzi mi to:P

1 użytkowników online, w tym zalogowanych: 0, gości: 1