Quadsoft.ExpressionParser - Ein Parser für mathematische Ausdrücke

    • Release

    Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von backtothetoast.

      Quadsoft.ExpressionParser - Ein Parser für mathematische Ausdrücke

      Hallo!

      Hiermit stellt ich meinen Parser für mathematische Ausdrücke wie

      VB.NET-Quellcode

      1. "11*2(3-435+435)*3435*sin(43/34-4)"
      vor.

      Er bietet die folgenden Funktionen:

      - Korrekte Auswertung von Klammern, Verschachtelungen und hintereinander vorkommenden Operatoren
      - Enthaltene Funktionen: Sin, Cos, Tan, Asin, Acos, Atan, Sqrt, Ln, Log, Exp
      - Modi für trigonometrische Funktionen: DEG, RAD
      - Unterstützte Operatoren: +, -, *, /, Mod, ^ (binär), ! (unär)
      - Enthaltene Konstanten: e, pi (oder π)
      - Unterstützung einer Laufvariablen "x" im Term (z.B. für Funktionenplotter)
      - Unterstützung von "ans"

      Weitere Funktionen kann ich gerne hinzufügen. Bitte um Feedback.

      Verwendung:

      VB.NET-Quellcode

      1. Sub Main()
      2. ' Neue Instanz des Parsers erstellen
      3. Dim parser As New Quadsoft.ExpressionParser()
      4. ' Den Ausdruck festlegen
      5. parser.Expression = "11*2(3-435+435)*3435*sin(43/34-4)"
      6. ' Modus für trigonometrische Funktionen
      7. parser.Mode = Quadsoft.TrigonometricMode.Degrees
      8. ' Ergebnis berechnen und anzeigen
      9. Console.WriteLine(parser.GetResultAsString())
      10. Console.ReadLine()
      11. End Sub



      Klassendiagramm:




      Programmiersprache: Visual Basic 2010 (.NET 2.0)
      Größe: 12 KB, 5 KB gepackt
      Lizenz: Verwendung in eigenen Projekten nur mit Namenserwähnung, Einkompilieren verboten, keine kommerzielle Nutzung ohne meine Erlaubnis

      Haftungausschluss:

      Dieses Werk wird bereitgestellt "wie es ist", ohne jegliche Garantien, Haftungsansprüchen oder sonstigen Bedingungen. Die Nutzung erfolgt auf dem alleinigen Risiko des Benutzers. Ferner kann der Autor nicht die Fehlerfreiheit des Werkes, ja nicht einmal die korrekte Funktionalität gewährleisten. Jeder, der dieses Werk verwendet, muss diese Bedingungen akzeptieren.
      Dateien

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Quadsoft“ ()

      Also da steckt sicher viel Arbeit dahinter und sowas ist immer Top, aber eine solche Lib braucht keine Instanz, da sie lediglich ein Funktions Wrapper ist, also in hier werden keine Variablen aufgehoben die zum späterne Zeitpunkt benötigt werden, also sie Transportiert nicht, somit mache die Funktionen als Shared.

      Zu dem Result, was wohlmöglich als Double oder ähnliches zurück kommt, wozu 2 Routinen für Double und String? Hierzu gibt es doch die schöne ToString() funktion, was wiederum etwas einspart.
      @Dodo :P :
      hier werden keine Variablen aufgehoben die zum späterne Zeitpunkt benötigt werden

      - Unterstützung von "ans"


      Aber würde doch auch mit einer Shared Variablen gehen, hat man halt nur einen Parser und ein Zwischenergebnis(wenn man kein Array macht^^)
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      Das ahbe ich berücksichtig, wie beim Taschenrechner, es wird halt das LETZTE Ergebnis nur gespeichert, dazu braucht man trotzdem keine Instanz. Selbst eine Memory Funktion würde damit gehen, wenn man einfach eine List(Of Ans) mit einbaut worin man Ergebnisse abspeichenr kann um sie in einer anderen Formel wieder abzurufen.
      OK, erstmal danke für das Feedback. Ich kann es gerne als statische Methode machen, aber bei der ToImage-Funktion würde das dann nicht mehr so gehen. (wäre intransparent).

      Eine solche ToImage Funktion wäre auch nicht soo einfach zu implementieren. Weiß da einer einen Ansatz? Der Standardzeichensatz ist jedenfalls völlig ungeeignet.
      kenn mich da nich so aus, aber kann man nich selber einen eigenen Zeichensatz erstellen?
      und im internet gibts doch sicher ein zeichensatz für mathematische zeichen.
      :P Mfg Aligator :P
      Also meine Idee wäre eigt. GDI+ gewesen, bzw. so hätte ichs gemacht, Normale Buchstaben einfach per DrawString und den Rest zusammensetzen, die Griechischen Buchstaben, könntest du z.B. als GraphicsPaths speichern, so machens Fonts vom Prinzip her ja auch ;)
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      Wie wäre es mit so etwas?

      VB.NET-Quellcode

      1. Sub Main()
      2. ' Neue Instanz des Parsers erstellen
      3. Dim parser As New Quadsoft.ExpressionParser()
      4. ' Den Ausdruck festlegen
      5. parser.Expression = "11*2(x-435+435)*3435*sin(43/y-4)"
      6. ' Modus für trigonometrische Funktionen
      7. parser.Mode = Quadsoft.TrigonometricMode.Degrees
      8. ' Setzen von Variablen
      9. parser.SetVariable("x", 500)
      10. parser.SetVariable("y", 2)
      11. ' Ergebnis berechnen und anzeigen
      12. Console.WriteLine(parser.GetResultAsString())
      13. Console.ReadLine()
      14. End Sub
      To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

      At some point in time, you recognize that knowing more does not necessarily make you more happy.
      Das finde ich richtig richtig toll. Etwas, was mich noch stört ist:
      "48/2*(3+9)"
      Ergebnis: 288
      Es ist umstritten, ob zuerst multipliziert werden soll, oder dividiert.

      Ansonsten Top!
      Bilder
      • Unbenannt.png

        31,96 kB, 1.021×133, 375 mal angesehen
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils
      Vielen Dank für die Mühen, die du dir damit gemacht hattest.

      Ich hatte heute gerade einen Parser benötigt und habe deinen Parser getestet.
      Folgendes ist mir aufgefallen:

      Man muss Leerzeichen in der Fomel vorher eliminieren.
      Ich habe ihn mit der EVAL Funktion des MSScriptControl verglichen
      EVAL benötigt beispielsweise 1.5sec dein Parser benötigt 1.9sec. (Sin & Cos in Radiant)

      Das ist nicht schlecht, aber wäre da noch etwas zu optimieren?
      @Lightsource

      Das mit den Leerzeichen hatte ich gar nicht bemerkt. Und bezüglich der Performance: ich habe es so gut wie möglich optimiert, weiß jedoch nicht, wie sich die .NET-Trigonometriefunktionen auf sowas auswirken.