Einzelnen Beitrag anzeigen

Benutzerbild von Coder1990
Coder1990

Registriert seit: 3. Nov 2007
116 Beiträge
 
Delphi 2005 Personal
 
#1

Mathematische Formeln parsen

  Alt 4. Okt 2008, 13:02
Hallo,

ich habe mir vorgenommen meine Facharbeit im Bereich Mathematik-Informatik zu schreiben und habe mich nun dazu entschieden einen Formel Parser zu erstellen. Nun bräuchte ich vll ein paar Tipps wie ich da am besten vorgehen sollte.

Meine momentane Überlegung sieht folgendermaßen aus:
Jede neu eingespeicherte Funktion wird in einer Klasse TFunction abgespeichert, die über benutzte Variablen bescheid weiß und wie die Funktion als String aussieht. Darüber hinaus besitzt die Klasse TFunction nun einen TBlock der wiederum aus mehreren TBlöcken besteht welche die einzelnen Rechenoperationen in sozusagen in Blöcke fassen.
Bsp: (die {} Klammern symbolisieren Blöcke
2x^2 - x^3 + x(x-2)
-> {{2x^2} - {x^3} + {x(x-2}}
-> {{2}*{{x}*{x}}} - {{x}*{x}*{x}} + {{x}*{{x}-{2}}}

Nun genauer am 1. Rechenblock:
1. Stufe {{2}*{{x}*{x}}}
2. Stufe {2}*{{x}*{x}}
3. Stufe {2} // {{x}*{x}} (das '*' muss sepearat in der 2. Stufe gespeichert werden!)
4. Stufe - // {x} * {x}
5. Stufe - // {x} // {x} ('*' in Stufe 4 abgespeichert)

Wenn ich nun für x einen Wert einsetzen will wird rekursiv sozusagen von unten nach oben alles durchgerechnet.

Leider bin ich in Sachen Rekursion nicht sonderlich begabt und bin mir nicht sicher wie ich das am Besten lösen soll.

Meine momentanen Klassen sehen so aus:

Delphi-Quellcode:
  TBlock = class
  private
  FInnerBlocks:array of PBlock;
  FCalcMethod: array of TCalcMethod;
  FSource: PFunction;
  FNegative: boolean;
  // function Calculate:real;
  public

  // property Result: real read Calculate;
  function AddBlock(s:string):integer;
  procedure AddCalc(a:char);
  property Negative: boolean read FNegative write FNegative;
  property Source : PFunction read FSource write FSource;
  constructor Create;
  function Read(f:string):integer;
  end;


  TFunction = class
  private
  FSourceFunction:string;
  FFunction: PBlock;
  FVars: TStringlist;

  public


  procedure ShowVars(l:TListbox);
  constructor Create(f:string);
  end;
Die rekursive Funktion im TBlock ist "Read" und der Rückgabewert soll das Ende des momentan untersuchen Blocks im String ausgeben, also die Stelle im String wo der von der momentanen Read Funktion untersuche Block aufhört damit die aufrufende Read Funktion weitermachen kann.

Leider komme ich mit "Read" auf keinen grünen Zweig.

MfG
  Mit Zitat antworten Zitat