formelinterpreter



  • hallo forum

    ich versuche einen formelinterpreter zu programmieren.

    als beispiel: man gibt y=sin(3*x)+2 ein.
    das programm sollte die eingabe als funktionsgleichung "verstehen"
    und dazu beispielsweise den funktionsgraph zeichnen.

    hat jemand erfahrung oder tipps/links zu solchen umsetzungen? in einer
    konkreten programmiersprache oder als allgemeines lösungsvorgehen?

    vielen dank für eure hilfe!





  • Den Ausdruck parsen, überführen in die Postfixnotation und auf dem Stack speichern.
    Den ganzen Kram dann wieder vom Stack runterpoppen und berechnen.

    Stichwörter zum Googeln: Reverse Polish Notation, Umgekehrte Polnische Notation.

    http://www.cz.j.th.schule.de/html_inc/schule/lehrer/privat/mirko_koenig/postfix/postfix.htm
    http://de.wikipedia.org/wiki/Umgekehrte_Polnische_Notation



  • Ja, habe ich, denn ich habe schon selber einen (bzw. mehrere) geschrieben.

    In welcher Sprache möchtest du es denn? Ich habe C, C++ und Pascal zur Auswahl.

    P.S. In einem anderen Thread wollte auch jemand einen solchen Graphen programmieren und ich habe ihn auf meine Homepage weitergeleitet:
    www.bitel.net/dghm1164/downloads.html. Dort einfach "Mathematik.zip" runterladen und du hast schon mal ein paar nette Beispielprogramme (als Windows-Anwendungen), insbesondere "Graph.exe" dürfte dich interessieren 😉



  • Th schrieb:

    ...und ich habe ihn auf meine Homepage weitergeleitet ...
    Dort einfach "Mathematik.zip" runterladen und du hast schon mal ein paar nette ...

    Und wo ist der Quellcode ?



  • Als Ganzes gebe ich den nicht raus, aber du kannst ja sagen, in welcher Sprache du den Parserteil gerne hättest.
    Am besten, du sendest mir eine Mail und ich schicke es dir dann (kann etwas dauern, da ich noch die alten Projekte rauskramen muß).

    Zu welchem Zweck willst du denn das Programm selber schreiben bzw. warum reicht dir meines nicht?

    P.S. Sehe gerade, daß die vorherige Mail ja ein Unreg gepostet hat...



  • Hallo Th,

    wäre es möglich den C++-Code von deinem Parser
    zu bekommen? Ich suche schon länger nach einer
    Lösung, wie ich Terme in einer Matrix verarbeiten
    kann. Habe über den grundsätzliche Aufbau zwar etwas
    bei wikipedia gelesen aber am besten verstehe ich es
    immer noch wenn ich etwas Code sehe. 🙂

    Vielen Dank im Voraus,

    Andreas



  • ääh, also, ein formelparser und matrizenrechnung ist schon ein verschiedenes paar schuhe. logisch ne.



  • Ok, ich habe mal die Sourcen rausgekramt und hochgeladen: www.bitel.net/dghm1164/downloads/FctParser-Sources.zip

    Diese habe ich vor ca. 9 Jahren schon entwickelt, damals mit den BCB 5.
    Um es mit einem Standard-C++ Compiler zu übersetzen, einfach
    - std::string statt AnsiString
    - std::exception statt Exception
    verwenden und die entsprechenden Header <string> + <exception> einbinden und dafür <VCL.h> entfernen.
    Ich hoffe, das reicht....

    Anwendung ist dann ganz einfach:

    FunctionParser fp;
    
    try
    {
      double x = 1.0; // konstant oder in einer Schleife oder wie auch immer...
      double y = fp.Parse("2*x^2-4*sin(PI)*x+42", x); // Formel kann ebenso variabel sein.
    }
    catch(EFctParser &e)
    {
      // ShowMessage(e.Message); // beim BCB 5
      std::cerr << e.what() << std::endl; // bei Umstellung auf std::string + std::exception
    }
    

    Wichtig ist das Abfangen der Exception 'EFctParser' (Klammerfehler, unbekannte Funktion etc.) - wo im Programm (d.h. auf welcher Hierarchy-Ebene), muß jeder selbst entscheiden.

    Der Funktionsparser arbeitet mit mehreren Arrays, welche die festdefinierten Funktionen, Operatoren und Konstanten beinhalten.
    Also bei Bedarf einfach neue Einträge in diese Arrays einfügen und am restlichen Programmcode brauchen keine weiteren Änderungen mehr gemacht werden.
    (Teile des Codes würde ich aus heutiger Sicht auch ein wenig anders programmieren, siehe z.B. boost-spirit, aber trotzdem ist der Code immer noch gut -)



  • @Th: Vielen Dank

    @Mr. Spock: Schön dass du den Unterschied zwischen Matrizenrechnung
    und einem Parser kennst aber nächstes Mal solltest du eh du was schreibst
    meinen Text auch lesen UND verstehen.

    Gruß Andreas



  • @Th: Vielen Dank

    @Mr. Spock: Schön dass du den Unterschied zwischen Matrizenrechnung
    und einem Parser kennst aber nächstes Mal solltest du eh du was schreibst
    meinen Text auch lesen UND verstehen.

    Gruß Andreas


Anmelden zum Antworten