Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Heron Verfahren optimieren (https://www.delphipraxis.net/89792-heron-verfahren-optimieren.html)

rawsoul 5. Apr 2007 18:18


Heron Verfahren optimieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo liebe Community,

Musste für die Schule über die Osterferien ein Programm schreiben, welches die Wurzel einer Zahl nach beliebiger Genauigkeit (Angabe in Nachkommastellen) berechnet und jeden Schritt in ein Stringgrid ausgibt.

Funktioniert soweit eigentlich auch ganz gut.

Aber aus eigener Erfahrung habe ich mit Sicherheit viele überflüssige Dinge in den Code reingedrexelt. Würde aus diesem Grund gerne mal wissen, wie ich die Procedure vereinfachen oder verkürzen kann.

Zur Info: Dies ist KEIN Teil der Hausaufgabe, ich frage aus reinem Interesse und möchte nicht die Aufgaben von euch gelöst bekommen...

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, Grids, StdCtrls, math;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    StringGrid1: TStringGrid;
    Label3: TLabel;
    Edit3: TEdit;
    procedure Edit2Change(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  //startdarstellung
  stringgrid1.Cells[0,0]:='Schritt';
  stringgrid1.cells[1,0]:='Näherungswert';
  edit3.text:=floattostr(sqrt(strtoint(edit1.text)));

  //edit1 ereignis simulieren
  edit1.OnChange(nil);
end;

procedure TForm1.Edit1Change(Sender: TObject);
var
  wurzel,r:double;
  st,i:integer;
begin
  try
    //stringgrid leeren
    stringgrid1.RowCount:=2;
    stringgrid1.Cells[0,1]:='';
    stringgrid1.Cells[1,1]:='';


    //predeklination
    i:=0;
    wurzel:=1;
    st:=strtoint(edit2.text);
    //if st>10 then st:=10;
    r:=strtofloat(edit1.text);

    //ausgabe
    edit3.text:=floattostr(sqrt(r));

    //heron
    repeat
      i:=i+1;
      wurzel:=0.5*(wurzel+r/wurzel);
      stringgrid1.RowCount:=i+1;
      stringgrid1.cells[0,i]:=inttostr(i);
      stringgrid1.Cells[1,i]:=floattostr(wurzel);
    until copy(floattostr(wurzel),1,pos(',',floattostr(wurzel))+st) = copy(edit3.text,1,pos(',',edit3.text)+st)
  except beep
  end;

  //stringgrid ausrichten
  if i>7 then stringgrid1.TopRow:=i-6;
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
  //edit1 ereignis simulieren
  edit1.OnChange(nil);
end;

end.
Vielen Dank schonmal im Voraus fürs Lesen :P

LG und frohe Ostertage,
Frank.

//Edit: Habe noch ein Screenshot zur Verständlichkeit angehängt. Oberstes Edit (Edit1) ist für den Radikand, zweites (Edit2) für die Genauigkeit und unterstes (Edit3) für die mit sqrt() berechnete Ausgabe. Arbeiten tut das ganze Programm, sobald sich in einem der ersten beiden Edits etwas tut ;)

//Edit2: Hab ich doch glatt das Screenshot vergessen :oops:

gsh 5. Apr 2007 18:29

Re: Heron Verfahren optimieren
 
du könntest mit Hier im Forum suchenBeginUpdate und Hier im Forum suchenEndUpdate beim stringgrid arbeitet ... des steigert die leistung oft ganz nett

Nuclear-Ping 5. Apr 2007 18:33

Re: Heron Verfahren optimieren
 
Entweder das oder die Ausgabe generell von der Berechnung trennen. Also erst berechnen und dann ausgeben.

rawsoul 5. Apr 2007 18:47

Re: Heron Verfahren optimieren
 
An der Geschwindigkeit gibt es eigentlich nix zu meckern, eher möchte ich die Prozedur eleganter, beziehungsweise einfacher schreiben.

Trotzdem Danke für die Antworten, ich werd mir das mal anschauen :)

Zacherl 5. Apr 2007 19:49

Re: Heron Verfahren optimieren
 
Delphi-Quellcode:
edit1.OnChange(nil);
das ist etwas unelegant .. deklariere dir besser eine procedure, die du statt diesem Code immer aufrufst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz