myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » Quadsoft.ExpressionParser - Ein Parser für mathematische Ausdrücke
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Quadsoft
myCSharp.de-Mitglied

Dabei seit: 09.05.2010
Beiträge: 49
Entwicklungsumgebung: Visual Studio 2010 Express
Herkunft: Flensburg


Quadsoft ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo!

Ich stelle hiermit meinen mathematischen Parser vor. Er dient dazu, komplexe mathematische Ausdrücke mit Klammern und Verschachtelungen wie z.B. "11*2(3-435+435)*3435*sin(43/(34-4))" berechnen zu können.

Der Parser unterstützt folgende 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 als griechischer B.)
- Unterstützung einer Laufvariablen "x" im Term (z.B. für Funktionenplotter)
- Unterstützung von "ans"

Weitere Funktionen kann ich gerne hinzufügen. Bitte daher um Feedback. So plane ich noch numerische Berechnungen von Differenzialquotienten und Integralen.

Geeignet ab .NET Framework Version 2.0 SP1
Version: 1.0.1


Klassendiagramm



Eigenschaften

System.String Expression

Der auszuwertende mathematische Ausdruck. Eventuelle Leerzeichen müssen vorher eliminiert
werden.

Quadsoft.TrigonometricMode Mode

Legt den Modus für die Rechnung mit Trigonometrischen Funktionen fest. (DEG = Gradmaß; RAD =
Bogenmaß)

System.Double XValue

Wert der Laufvariablen „x“, sofern sie im Ausdruck vorkommt.

Methoden

System.Double GetResult()

Gibt den berechneten Wert des mathematischen Ausdrucks zurück.

System.String GetResultAsString()

Wie GetResult(), aber als String.

Lizenz

Sie dürfen diese Bibliothek für Ihre (auch kommerziellen) Projekte unter der Bedingung der Namens
und Websitenennung des Herstellers verwenden, um die Funktionalität eines mathematischen Parsers
nutzen zu können. Dabei ist es untersagt, die Datei in eine andere einzukompilieren (Merging), sie zu
dekompilieren, oder sie ohne diese Lizenz zu vertreiben.
Beispiel für korrekte Namensnennung in den Credits:
Dieses Programm verwendet die Quadsoft.ExpressionParser Bibliothek von Adrian
Jablonski ( http://www.quadsoft.org)


Haftungsausschluss

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.

Programmierbeispiel

C#-Code:
// Neue Instanz des Parsers erstellen
Quadsoft.ExpressionParser parser = new Quadsoft.ExpressionParser();
// Den Ausdruck festlegen
parser.Expression = "11*2(3-435+435)*3435*sin(43/34-4)";
// Modus für trigonometrische Funktionen
parser.Mode = Quadsoft.TrigonometricMode.Degrees;
// Ergebnis berechnen und anzeigen
Console.WriteLine(parser.GetResultAsString());
Console.ReadLine();

Mit freundlichen Grüßen

Adrian Jablonski


Dateianhang:
unknown Quadsoft.ExpressionParser.zip (221 KB, 279 mal heruntergeladen)

Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von Quadsoft am 10.09.2011 13:08.

10.09.2011 13:02 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Aratar
myCSharp.de-Mitglied

Dabei seit: 28.10.2009
Beiträge: 118


Aratar ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Es gibt hier im Forum ja doch schon einige andere Parser, hast du irgendwelche Vergleiche angestellt? Zum Beispiel was die Geschwindigkeit anbelangt?

Mfg
Aratar
10.09.2011 19:57 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
gfoidl gfoidl ist männlich
myCSharp.de-Team

avatar-2894.jpg


Dabei seit: 07.06.2009
Beiträge: 6.648
Entwicklungsumgebung: VS 2019
Herkunft: Waidring


gfoidl ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Quadsoft,

Zitat:
Enthaltene Konstanten: e

Verträgt sich das mit der wissenschaftlichen Darstellung von Gleitkommazahlen? Oder wie können letztere eingegeben werden? Per E od. mit 10^?


mfG Gü
10.09.2011 20:48 Beiträge des Benutzers | zu Buddylist hinzufügen
Quadsoft
myCSharp.de-Mitglied

Dabei seit: 09.05.2010
Beiträge: 49
Entwicklungsumgebung: Visual Studio 2010 Express
Herkunft: Flensburg

Themenstarter Thema begonnen von Quadsoft

Quadsoft ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Nein, nein, e ist hier die eulersche Zahl. Die Exponentialschreibweise ist noch nicht implementiert, aber das wäre auch nur ein erstezen aller großen (!) E's durch "*10^".

Zur Performance:

Der Parser verwendet ausschließlich String-Operationen, keine regulären Ausdrücke. Momentan ist er etwa 25 % langsamer als der von Th69 und 30 mal schneller als der von zoomi (der ist ja auch rein RegEx). Getestet wurden mehrere Durchläufe eienr komplexen Formel mit einer Laufvariablen "x".

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Quadsoft am 11.09.2011 14:34.

11.09.2011 14:27 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.576
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Quadsoft,

das Ersetzen mittels "*10^" solltest du auf keinen Fall tun, sondern wirklich den gesamten Literal-Ausdruck mittels Double.Parse() einlesen.

Und das dein Parser langsamer ist, wundert mich bei einem auf String-Operationen basierenden auch nicht (daher habe ich ja extra meinen Parser veröffentlicht, damit im Internet nicht immer wieder diese String/RegEx-(Frickel-)Parser veröffentlicht und benutzt werden - nur ein sauber auf EBNF basierender Parser läßt sich auch eindeutig verifizieren. Du schreibst ja in deiner Lizenz selber, daß du die korrekte Funktionalität nicht gewährleisten kannst).

Sofern es bei dir nur um eine Übung zum Schreiben eines Parsers ging, ist das aber in Ordnung so. ;-)

Und an die Geschwindigkeit von meinem auf "Vorkompilierung" (Syntax-Baum) beruhenden Ansatz (z.B. zum Zeichnen eines Graphen, wo sich nur der x-Wert ändert), wirst du erst recht nicht so schnell herankommen.
11.09.2011 14:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Quadsoft
myCSharp.de-Mitglied

Dabei seit: 09.05.2010
Beiträge: 49
Entwicklungsumgebung: Visual Studio 2010 Express
Herkunft: Flensburg

Themenstarter Thema begonnen von Quadsoft

Quadsoft ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich benutze zum Scannen aber kein RegEx, sondern nur den String, den ich per Indexer anspreche. Dann sind das nur noch String - und Char-Vergleiche. Es ist für mein Gefühl aber wirklich nicht langsam, immerhin sind es zu deiner zugegebenermaßen viel bessern methode nur 25 %. Bei einem einfachen TR würde man das nicht mal merken.

BTW zu dieser Lizenz: Das ist ein Standaradgelaber. Wenn das Programm wider erwarten abstützt, war das halt keine korrekte Funktionalität. Das heißt aber nicht, dass er nicht rechnen kann.

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Quadsoft am 11.09.2011 15:40.

11.09.2011 15:38 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 8 Jahre.
Der letzte Beitrag ist älter als 8 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 27.05.2020 09:02