Mathematischen Ausruck als Binärbaum darstellen
Hallo DP,
Ich beschäftige mich zur Zeit mit einem Funktionsplotter. (bzw. erstmal mit dessen Rechenwerk :roll:) Dazu habe ich mir überlegt, dass ich den Term zunächst als Binärbaum einlese, diesen mittels Postorder umstelle und dann ausrechne. Alles bis auf das einlesen funktioniert soweit richtig :cry: beim "postorder'n" kommt es immer zu einem Stack-Overflow, weshalb es wohl am einlesen liegen muss.
Delphi-Quellcode:
Ich vermute, dass es an
var Baum, tmp: TTree;
procedure TForm1.TermToTree(pTerm: String); begin Baum := TTree.create; repeat case pTerm[1] of '+','-','*','/': begin tmp := TTree.create; tmp := Baum; Baum.setLeftTree(tmp); Baum.setContent(TObject(Char(pTerm[1]))); Baum.setRightTree(TTree.create); Baum := Baum.getRightTree; end; '0'..'9': begin Baum.setContent(TObject(String(Baum.getContent) + Char(pTerm[1]))); end; end; delete(pTerm,1,1); until pTerm = ''; end;
Delphi-Quellcode:
liegt. Erstellt er damit keine neue Struktur, sondern setzt nur den zeiger von 'tmp' auf die Stelle wo 'Baum' liegt :?:
tmp := Baum
Wenn dem so ist, kann man das umgehen ? //Edit: meine Klasse TTree sieht folgendermaßen aus:
Delphi-Quellcode:
TTree = class
private content: TObject; Open: Boolean; root: TTree; leftTree: TTree; rightTree: TTree; public constructor create(); procedure setContent(pContent: TObject); procedure setOpen(pOpen: Boolean); procedure setRoot(pRoot: TTree); procedure setLeftTree(pTree: TTree); procedure setRightTree(pTree: TTree); function getContent: TObject; function getRoot: TTree; function getLeftTree: TTree; function getRightTree: TTree; function haveChilds: Boolean; function isOpen: Boolean; end; |
AW: Mathematischen Ausruck als Binärbaum darstellen
Man kann nicht 2 erzeugte Instanzen gleichsetzen. Um die Felder zu kopieren brauchst du eine Procedere Assign.
Delphi-Quellcode:
procedure Assign(const Value: TTree);
|
AW: Mathematischen Ausruck als Binärbaum darstellen
Guck Dir das mal an.
|
AW: Mathematischen Ausruck als Binärbaum darstellen
Zitat:
Zitat:
|
AW: Mathematischen Ausruck als Binärbaum darstellen
Zitat:
|
AW: Mathematischen Ausruck als Binärbaum darstellen
Zitat:
|
AW: Mathematischen Ausruck als Binärbaum darstellen
da bin ich wieder :-D
Habe sogar von Bäumen heute Nacht geträumt :pale: jedenfalls fiel mir die Lösung Heute Morgen dann plötlich ein :lol: Nach einigen Fehlschlägen und schusseligkeiten habe ich den Code etwas gekürzt und verschönert - aber das wichtigste er funktioniert (zur Zeit nur +,-,*,/ aber immerhin :) ) Falls ich Zeit habe und es irgendwen interessiert, kann ich das fertige Programm kommentieren/ erklären und hier im Software Bereich hochladen. Die fertige TermToTree funktion sieht nun so aus:
Delphi-Quellcode:
Wenn jemand meine Gedanken nachvollziehen kann und optimierungsvorschläge hat - immer her damit :stupid:
function TMath.TermToTree(pTerm: String): TTree;
var Baum, tmp: TTree; begin Baum := TTree.create; tmp := TTree.create; repeat case pTerm[1] of '0'..'9': Baum.setContent(Baum.getContent + pTerm[1]); else begin case pTerm[1] of '+','-' : begin while not (Baum.getRoot = nil) do Baum := Baum.getRoot; tmp := TTree.create; end; '*','/' : begin if not (Baum.getRoot = nil) then begin tmp := Baum.getRoot; tmp.setRightTree(TTree.create); tmp := tmp.getRightTree; end; end else showmessage('Ungültige Eingabe!'); end; tmp.setContent(pTerm[1]); tmp.setLeftTree(Baum); tmp.setRightTree(TTree.create); Baum := tmp.getRightTree; end; end; delete(pTerm,1,1); until pTerm = ''; //hocharbeiten bis zur wurzel und zurückgeben while not (Baum.getRoot = nil) do Baum := Baum.getRoot; result := Baum; end; |
AW: Mathematischen Ausruck als Binärbaum darstellen
Zitat:
Mavarik |
AW: Mathematischen Ausruck als Binärbaum darstellen
Was bei Mathparsern immer vergessen wird, ist das Testen. Informier Dich doch mal über Unittesting z.B. mit DUnit. Damit kannst Du auch noch den Lehrer beeindrucken!:wink:
|
AW: Mathematischen Ausruck als Binärbaum darstellen
Zitat:
Klammern, Functions (sin / cos ect.), Power, Mult / Div, Plus / Minus. Um zwei leidige Themen wirst du dich im weiteren Verlauf auch noch kümmern müssen, Exponentialdarstellung (z.B. 2.1E-8) und unäres Minus z.B. -3^-2. Ist aber alles kein Hexenwerk. Du schaffst das! Gruß Thomas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz