![]() |
Delphi-Version: 5
Probleme Mit Parser für UPN
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Liebe Netzgemeinde,
Ich sitzte seit längerem an einem Programm für mein Facharbeit im Fach Mathematik. Das Programm soll am Ende einen UPN-Term ( ![]() Ein paar Infos vorweg: Der Term ist als TListe deklariert. Jedes zeichen ist ein eigenes TObject vom typ TZahl oder TOperator Ein Binärer Baum ist ein Baum mit zwei "Ästen" Als Stack ist eine Liste mit zusatzfunktionen deklariert. Will heißen: Push pushbehind und pop Funktionsweise (Im foldenden ist mit Liste der Term gemeint) Es werden zuerst Die klammern um den Term herrum entfernt (sollten welche existieren). Dann werden 2 Listen kreiert (im folgenden RTerm und LTerm). Die liste wird von hinten auf ein +/- durchsucht wird keines gefunden wird nach *// gesucht. Das Programm geht nun zu der Stelle an dem das Rechenzeichen steht. Auf dem weg dorthin werden alle Listenelemente in RTerm kopiert (und zwar so das das Element was in der Liste hinten steht da auch hinten ist) dann wird das Rechenzeichen (dies wird nicht kopiert) in die Wurzel eines Baumes geschrieben . Der parser rückt ein Element in der Liste nach vorne. Solange der Zieger der Liste (bei bedarf erklär ich es) nicht vor dem 1. Element steht werden die übrigen Elemente in LTerm kopiert. Wenn RTerm nicht Leer ist wird das ganze rekursiv für den Rechten Teilbaum aufgerufen. Wenn Lterm nicht Leer ist wird das ganze rekursiv für den Linken Teilbaum aufgerufen. Der baum wird ausgegeben Nun wird der Baum in einer anderen function nach dem Prinzip Links Rechts Wurzel ausgelesen und die Elemente in einen Stack geschrieben. Infos zum Code: Teilweise habe ich Sachen wie das Suchen oder Das Klammerentfernen ausgelagert. Klammern innerhalb eines Term werden übersprungen. Die Showmessages dienen zur Fehlersuche im Betrieb. Code des Baumeintragens:
Delphi-Quellcode:
Code des Auslesens:
function Baumeintragen(Term:TListe):Tbinbaum;
var Baum:Tbinbaum; OB,I:integer; LTerm,RTerm:TListe;Hilf:real; begin LTerm:=TListe.create; RTerm:=TListe.create; Term:=Klammernentfernen(Term); OB:=sucheRE(Term); Term.Tolast; for I:=1 to OB do begin RTerm.toFirst; RTerm.insertBefore(Term.getobject); if Term.getobject is TZahl then begin Hilf:=TZahl(Term.getobject).gibzahl; showmessage('R added'+floattostr(Hilf)); end else showmessage('R added'+TOperator(Term.getobject).giboperator); Term.previous; end; Baum.Erzeuge(Term.getObject); Term.previous; if Term.getobject is TZahl then begin Hilf:=TZahl(Term.getobject).gibzahl; showmessage('WU added'+floattostr(Hilf)); end else showmessage('WU added'+TOperator(Term.getobject).giboperator); while ( NOT Term.isbefore) DO begin LTerm.tofirst; LTerm.insertbefore(Term.getobject); Term.previous; if Term.getobject is TZahl then begin Hilf:=TZahl(Term.getobject).gibzahl; showmessage('L added'+floattostr(Hilf)); end else showmessage('L added'+TOperator(Term.getobject).giboperator); end; if NOT(LTerm.isEmpty) then Baum.haenge_an(Links,Baumeintragen(LTerm)); if NOT (RTerm.isempty) then Baum.haenge_an(rechts,Baumeintragen(RTerm)); end;
Delphi-Quellcode:
Problem:
function Baumauslesen(Baum:TBinbaum):TStack;
var Stack:TStack; begin if NOT (Baum.IstLeer(Links)) then Stack:=Baumauslesen(Baum.Teilbaum(Links)); if NOT (Baum.IstLeer(Rechts)) then Stack:=Baumauslesen(Baum.Teilbaum(Rechts)); Stack.pushbehind(Baum.lies); end; function Termumwandlung(Term:TListe):TStack; var Baum:TBinbaum ; begin Baum:=Baumeintragen(Term); result:=Baumauslesen(Baum); end; In der Unit U_Baum habe ich an folgender Stelle eine Fehlermeldung:
Delphi-Quellcode:
Zwischen den Showmessages stürtzt das Programm leider ab ich weiß allerdings nicht Warum....
constructor TBinBaum.Erzeuge(X:TObject);
var Hilf:TObject; begin Hilf:=X; if X is TOperator then showmessage('OP');//+TOperator(Hilf.getobject).gibOperator); inherited create; showmessage('Noch gehts?!'); inhalt:=X; showmessage('Immernoch???'); left:=Nil; right :=nil; end; Wenn weiteres Material benötigt wird dann werde ich das auch gerne noch Hochladen. Im Anhang befindet sich die U_Baum zum besseren Verständniss. Ich bedanke mich an dieser Stelle schonmal für das Lesen^^ [EDIT]Ich hoffe das das hier im Richtigen Forum ist, wenn nicht bitte ich euch mir das zu sagen, damit ich das Thema verschieben kann, bzw. es selber zu verschieben[/EDIT] |
AW: Probleme Mit Parser für UPN
Schmeiß mal die Lies raus und nenn deine Konstruktoren Create. Private Variablen beginnen per Konvention in Delphi mit einem F (wie Feld).
Delphi-Quellcode:
type
TBinbaum = class private FInhalt: TObject; FLeft, FRight: TBinbaum; public property Inhalt: TObject Read FInhalt; .. constructor Create; overload; constructor Create(const Inhalt: TObject); overload; end;
Delphi-Quellcode:
constructor TBinbaum.Create;
begin inherited Create; FLeft:= Nil; FRight:= Nil; FInhalt:= Nil; end; constructor TBinbaum.Create (const Inhalt: TObject); begin Create; FInhalt:= Inhalt; end; |
AW: Probleme Mit Parser für UPN
Joa umbenennen kann ich gleich mal mit anfange. Was das problem beim construcktor ist, ist das er 2 verschiedene hat. Hat in bestimmten Fällen auch sinn. Die Unit ist auch von meinem Informatik Lehrer genommen, geht einfach schneller sowas schon zu haben.:wink:
EDIT: Ich brauche aber das Lies in dem Auslesen der Bäume (Ich mag es auch lieber ohne im Unterricht sollen/müssen wir es aber immer so machen wegen OOP und so |
AW: Probleme Mit Parser für UPN
[EDIT] es ist noch recht früh und da kann ich noch keine vollständigen Sätze LESEN. [/EDIT]
![]() |
AW: Probleme Mit Parser für UPN
Das Problem ist, dass ich halt nur den Term umwandeln möchte. Wenn ich das Programm im Link richtig verstanden habe dann rechnet es den Term diereckt aus...
Meine Facharbeit behandelt das Thema UPN weswegen ich ein Programm haben möchte was einen UPN Term ausrechnet. Das habe ich auch schon erreicht, es fehlt wie gesagt nur noch die Umwandlung in einen UPN Term.:wink: |
AW: Probleme Mit Parser für UPN
ok problem gelöst: Ich muss beim constructor ja nicht
Delphi-Quellcode:
sondern:
var Baum:TBinBaum;
. . . Baum.create;
Delphi-Quellcode:
War also ein kleiner lang andauernder Denkfehler.
var Baum:TBinbaum;
. . . Baum:=TBinbaum.create; Danke für die Hilfe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 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