Einzelnen Beitrag anzeigen

Benutzerbild von rawsoul
rawsoul

Registriert seit: 29. Okt 2006
Ort: Düsseldorf
249 Beiträge
 
Delphi 2005 Personal
 
#1

Heron Verfahren optimieren

  Alt 5. Apr 2007, 19:18
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

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
Miniaturansicht angehängter Grafiken
heron_127.jpg  
Frank Dumont
  Mit Zitat antworten Zitat