⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 haupt.pas

📁 用高斯方法计算线性方程组的值
💻 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 + -