AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme Mit Parser für UPN

Ein Thema von Picard95 · begonnen am 2. Mär 2012 · letzter Beitrag vom 7. Mär 2012
Antwort Antwort
Benutzerbild von Picard95
Picard95

Registriert seit: 14. Mai 2011
Ort: Dortmund
32 Beiträge
 
Delphi 4 Standard
 
#1

Probleme Mit Parser für UPN

  Alt 2. Mär 2012, 20:28
Delphi-Version: 5
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]
Angehängte Dateien
Dateityp: pas U_BAUM.pas (2,9 KB, 4x aufgerufen)
Christian
"Der Computer rechnet mit allem - nur nicht mit seinem Besitzer."
Dieter Hildebrandt

Geändert von Picard95 ( 2. Mär 2012 um 21:11 Uhr) Grund: Änderung in meinem Code - Besseres Verständniss
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Probleme Mit Parser für UPN

  Alt 2. Mär 2012, 21:46
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;
  Mit Zitat antworten Zitat
Benutzerbild von Picard95
Picard95

Registriert seit: 14. Mai 2011
Ort: Dortmund
32 Beiträge
 
Delphi 4 Standard
 
#3

AW: Probleme Mit Parser für UPN

  Alt 2. Mär 2012, 21:54
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.
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
Christian
"Der Computer rechnet mit allem - nur nicht mit seinem Besitzer."
Dieter Hildebrandt
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Probleme Mit Parser für UPN

  Alt 3. Mär 2012, 10:32
[EDIT] es ist noch recht früh und da kann ich noch keine vollständigen Sätze LESEN. [/EDIT]

Hier gibt es eine fertige Lösung

Geändert von Furtbichler ( 3. Mär 2012 um 10:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Picard95
Picard95

Registriert seit: 14. Mai 2011
Ort: Dortmund
32 Beiträge
 
Delphi 4 Standard
 
#5

AW: Probleme Mit Parser für UPN

  Alt 7. Mär 2012, 11:09
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.
Christian
"Der Computer rechnet mit allem - nur nicht mit seinem Besitzer."
Dieter Hildebrandt
  Mit Zitat antworten Zitat
Benutzerbild von Picard95
Picard95

Registriert seit: 14. Mai 2011
Ort: Dortmund
32 Beiträge
 
Delphi 4 Standard
 
#6

AW: Probleme Mit Parser für UPN

  Alt 7. Mär 2012, 21:22
ok problem gelöst: Ich muss beim constructor ja nicht
Delphi-Quellcode:
var Baum:TBinBaum;
.
.
.
Baum.create;
sondern:
Delphi-Quellcode:
var Baum:TBinbaum;
.
.
.
Baum:=TBinbaum.create;
War also ein kleiner lang andauernder Denkfehler.
Danke für die Hilfe.
Christian
"Der Computer rechnet mit allem - nur nicht mit seinem Besitzer."
Dieter Hildebrandt
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 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