📄 haupt.pas
字号:
unit Haupt;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin;
const
MAX_DIM = 100;
type
THaupt_Form = class(TForm)
LGS_Label: TLabel;
AnzVariablen_Label: TLabel;
AnzVars_SpinEdit: TSpinEdit;
Loesen_Button: TButton;
Laden_Button: TButton;
OpenDialog: TOpenDialog;
procedure AnzVars_SpinEditChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Loesen_ButtonClick(Sender: TObject);
procedure Laden_ButtonClick(Sender: TObject);
private
{ Private-Deklarationen }
VarEdits: Array[1..MAX_DIM] of Array[1..MAX_DIM] of TEdit;
ResEdits: Array[1..MAX_DIM] of TEdit;
VarLabels: Array[1..MAX_DIM] of TLabel;
ResLabels: Array[1..MAX_DIM] of TLabel;
AnzVars: Integer;
LastAnzVars: Integer;
public
{ Public-Deklarationen }
end;
var
Haupt_Form: THaupt_Form;
type
TGaussArray1 = Array[1..MAX_DIM] of Double;
TGaussArray2 = Array[1..MAX_DIM] of TGaussArray1;
function Gauss( a: TGaussArray2; rechts: TGaussArray1; n: Integer ): TGaussArray1;
implementation
uses Ergebnis;
{$R *.DFM}
// CTOR
procedure THaupt_Form.FormCreate(Sender: TObject);
begin
// Anzahl der Variablen vorgeben
LastAnzVars:= 0;
AnzVars:= 2;
AnzVars_SpinEditChange( Self );
end;
// 腘DERN DER ANZAHL
procedure THaupt_Form.AnzVars_SpinEditChange(Sender: TObject);
var
i, j: Integer;
tabord: Integer; // Hilfsvariable f黵 Herstellung der TabOrder
begin
AnzVars:= AnzVars_SpinEdit.Value;
// Alle nicht-benutzten Komponenten l鰏chen
for i:= 1 to LastAnzVars do
begin
// ...Variablen-Edits
for j:= 1 to LastAnzVars do
if ( i>AnzVars ) or ( j>AnzVars ) then
VarEdits[i][j].Free( );
// ...Ergebnis-Edits
ResEdits[i].Free( );
// ...Variablen-Labels
if ( i > AnzVars ) then
VarLabels[i].Free( );
// ...Ergebnis-Label
ResLabels[i].Free( );
end;
// Neue Komponenten anzeigen
for i:= 1 to AnzVars do
begin
// ...Variablen-Felder
for j:= 1 to AnzVars do
if ( i>LastAnzVars ) or ( j>LastAnzVars ) then
begin
VarEdits[i][j]:= TEdit.Create( Self );
VarEdits[i][j].Width:= 50;
VarEdits[i][j].Left:= j*55-40;
VarEdits[i][j].Top:= i*25+60;
VarEdits[i][j].Text:= '0';
VarEdits[i][j].Parent:= Self;
end;
// ...Variablen-Labels
if ( i > LastAnzVars ) then
begin
VarLabels[i]:= TLabel.Create( Self );
VarLabels[i].Left:= i*55-20;
VarLabels[i].Top:= 70;
VarLabels[i].Caption:= Chr(96+i);
VarLabels[i].Parent:= Self;
end;
// ...Ergebnis-Felder
ResEdits[i]:= TEdit.Create( Self );
ResEdits[i].Width:= 50;
ResEdits[i].Left:= AnzVars*55+30;
ResEdits[i].Top:= i*25+60;
ResEdits[i].Text:= '0';
ResEdits[i].Parent:= Self;
// ...Ergebnis-Label
ResLabels[i]:= TLabel.Create( Self );
ResLabels[i].Left:= AnzVars*55+17;
ResLabels[i].Top:= i*25+63;
ResLabels[i].Caption:= '=';
ResLabels[i].Parent:= Self;
end;
// Tabulator-Reihenfolge wieder herstellen
tabord:= 3;
for i:= 1 to AnzVars do
begin
for j:= 1 to AnzVars do
begin
VarEdits[i][j].TabOrder:= tabord;
inc(tabord);
end;
ResEdits[i].TabOrder:= tabord;
inc(tabord);
end;
LastAnzVars:= AnzVars;
end;
// L諷EN
procedure THaupt_Form.Loesen_ButtonClick(Sender: TObject);
var
a: TGaussArray2;
rechts: TGaussArray1;
erg: TGaussArray1;
i, j: Integer;
begin
try
// Linke H鋖fte in Array speichern
for i:= 1 to AnzVars do
for j:= 1 to AnzVars do
try
a[i][j]:= StrToFloat( VarEdits[i][j].Text );
except
ActiveControl:= VarEdits[i][j];
raise Exception.Create('');
end;
// Rechte H鋖fte in Array speichern
for i:= 1 to AnzVars do
try
rechts[i]:= StrToFloat( ResEdits[i].Text );
except
ActiveControl:= ResEdits[i];
raise Exception.Create('');
end;
// LGS l鰏en
try
erg:= Gauss( a, rechts, AnzVars );
// Ergebnis anzeigen
Ergebnis_Form.Ergebnis_ListBox.Clear( );
for i:= 1 to AnzVars do
Ergebnis_Form.Ergebnis_ListBox.Items.Add( chr(96+i) + ' = ' + FloatToStr(erg[i]) );
Ergebnis_Form.ShowModal( );
except
ShowMessage( 'Fehler:'+#13+
'Es gibt keine L鰏ung.'+#13+
'Oder: Mindestens eine Variable hat unendlich viele L鰏ungen.'+#13+
'Oder: Pr黤en Sie, ob die Gleichungen absteigend geordnet sind.' );
end;
except
ShowMessage( 'Bitte Eingaben 黚erpr黤en' );
end;
end;
// GAUSS
function Gauss( a: TGaussArray2; rechts: TGaussarray1; n: Integer ): TGaussArray1;
var
i, j, k: Integer; // Schleifen-Variablen
faktor: Double; // Aufl鰏ungsfaktor
summe: Double; // Summe beim Aufrollen auf der linken Seite
begin
// Dreieck bilden
for i:= 2 to n do // Stufen
for j:= n downto i do // Gleichungen von unten nach oben
begin
// Pr黤en, ob Koeffizent Null ist
if ( a[j][i-1] = 0.0 ) then // Division durch Null vermeiden
Continue; // Gl點k gehabt, Koeffizent ist bereits Null
// Letzt-vorhandene Variable durch Vorg鋘ger aufl鰏en
faktor:= - a[j-1][i-1] / a[j][i-1];
// Gleichungen addieren und in aktueller Gleichung speichern
for k:= i to n do
a[j][k]:= faktor*a[j][k] + a[j-1][k];
rechts[j]:= faktor*rechts[j] + rechts[j-1];
// muss nicht addiert werden, da sowie so Null
a[j][i-1]:= 0.0;
end;
// Aufrollen
for i:= n downto 1 do // von unten nach oben
begin
// Summe der bekannten Gr鲞en auf der linken Seite bilden
summe:= 0.0;
for j:= n downto i+1 do // Variablen einsetzen
summe:= summe + a[i][j]*result[j];
// Summe auf die rechte Seite bringen
summe:= rechts[i] - summe;
// Variable ermitteln
result[i]:= summe / a[i][i];
end;
end;
// LADEN
procedure THaupt_Form.Laden_ButtonClick(Sender: TObject);
var
f: TextFile;
s: String;
i, j: Integer;
begin
if OpenDialog.Execute( ) then
begin
AssignFile( f, OpenDialog.Filename );
Reset( f );
try
ReadLn( f, s );
AnzVars_SpinEdit.Value:= StrToInt( s );
if AnzVars > 26 then raise Exception.Create( '' );
for i:= 1 to AnzVars do
begin
for j:= 1 to AnzVars do
begin
ReadLn( f, s );
VarEdits[i][j].Text:= s;
end;
ReadLn( f, s );
ResEdits[i].Text:= s;
end;
except
ShowMessage('Fehler');
end;
CloseFile( f );
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -