![]() |
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:
Vielen Dank schonmal im Voraus fürs Lesen :P
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. 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: |
Re: Heron Verfahren optimieren
du könntest mit
![]() ![]() |
Re: Heron Verfahren optimieren
Entweder das oder die Ausgabe generell von der Berechnung trennen. Also erst berechnen und dann ausgeben.
|
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 :) |
Re: Heron Verfahren optimieren
Delphi-Quellcode:
das ist etwas unelegant .. deklariere dir besser eine procedure, die du statt diesem Code immer aufrufst.
edit1.OnChange(nil);
|
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