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 (
U P N=
Umgekehrte
Polnische
Notation) Ausrechnen. Dieser Teil klappt auch ganz gut. Das Programm soll aber weiterhin auch einen sogenannten "Parser" beinhalten. Dieser Soll die Möglichkeit bieten, einen "Normalen" Term einzugeben, welcher per Knopfdruck in einen UPN Term umgewandelt wird.
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:
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;
Code des Auslesens:
Delphi-Quellcode:
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;
Problem:
In der
Unit U_Baum habe ich an folgender Stelle eine Fehlermeldung:
Delphi-Quellcode:
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;
Zwischen den Showmessages stürtzt das Programm leider ab ich weiß allerdings nicht Warum....
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]