Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Formel parsen
T-Man
myCSharp.de - Member



Dabei seit:
Beiträge: 212
Herkunft: Bremen

Themenstarter:

Formel parsen

beantworten | zitieren | melden

Hallo Leute,

ich habe Formeln in strings in folgendem Stil:

f1 = "2a+3b-20";
f2 = "3*(a/10+b/10)";

Meine Klasse hat Werte für a und b (Als Beispiel a=12, b=10). Alles int.
Ich ersetze nun in den Strings (f1 und f2) die Zeichen a und b durch die entsprechenden Werte. (Evtl. fehlende Multiplikationsoperatoren werden natürlich nicht vergessen. Aus 2a wird natürlich 2*12 und nicht 212.)
Was ich dann habe sind strings wie

f1 = "2*12+3*10-20";
f2 = "3*(12/10+10/10)";

Nun will ich das Ergebnis der Formel haben. Gibt es dafür einen fertigen Parser, oder muß ich mir den selber schreiben?

int erg1 = FormelParser(f1);

Gruß,
Tony

P.S.: Habe gesucht und nix gefunden. Falls es die Frage doch schonmal (so ählich) gab, bitte ich mein schwaches Suchvermögen zu entschuldigen.
private Nachricht | Beiträge des Benutzers
der Marcel
myCSharp.de - Member

Avatar #avatar-1860.gif


Dabei seit:
Beiträge: 564
Herkunft: Dresden

beantworten | zitieren | melden

Hi!

Mir wäre jetzt soetwas nicht bekannt.

Habe gerade ein bißchen überlegt, wie du es machen müsstest. Eine zu überlegende Sache ist das Verschachteln der Formelm mit Klammern. Dies könnte man evtl so lösen, dass jede Formelebene (ich hoffe du weißt, was ich meine) mittels einer Klasse repräsentiert wird, welche verschiedene Listen inne hat, wobei jede Liste eine bestimmte Grundrechenart repräsentiert. Diese Listen enthalten entweder Zahlen oder (wenn wieder eine Klammer an der Stelle ist) ein neues Formelobjekt.
Über die genaue Syntax müsste natürlich noch diskutiert werden. Das könnte aber vielleicht ein grober Ansatz für die Herangehensweise sein.

der Marcel
:] :DDer größte Fehler eines modernen Computers sitzt meist davor :]
private Nachricht | Beiträge des Benutzers
Noodles
myCSharp.de - Experte



Dabei seit:
Beiträge: 4802
Herkunft: Leipzig

beantworten | zitieren | melden

Schau mal hier, vielleicht hilft Dir das.
private Nachricht | Beiträge des Benutzers
der Marcel
myCSharp.de - Member

Avatar #avatar-1860.gif


Dabei seit:
Beiträge: 564
Herkunft: Dresden

beantworten | zitieren | melden

Hi Noodles!

Wow...Das werd ich mir auch mal genauer ansehen 8)

der Marcel
:] :DDer größte Fehler eines modernen Computers sitzt meist davor :]
private Nachricht | Beiträge des Benutzers
marsgk
myCSharp.de - Member



Dabei seit:
Beiträge: 1443
Herkunft: Linz, Austria

beantworten | zitieren | melden

Hi,
ich hab mal so was gemacht, kannst es verwenden.

lg
georg
Attachments
private Nachricht | Beiträge des Benutzers
Noodles
myCSharp.de - Experte



Dabei seit:
Beiträge: 4802
Herkunft: Leipzig

beantworten | zitieren | melden

Zitat
Original von der Marcel
Wow...Das werd ich mir auch mal genauer ansehen 8)

Klar. Ich habe aber keine Anteile daran, sondern cdr.
private Nachricht | Beiträge des Benutzers
T-Man
myCSharp.de - Member



Dabei seit:
Beiträge: 212
Herkunft: Bremen

Themenstarter:

beantworten | zitieren | melden

Vielen Dank für die Tips.

Gruß,
T-Man
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8775
Herkunft: Berlin

beantworten | zitieren | melden

Und noch einer:

http://www.codeproject.com/csharp/matheval.asp
private Nachricht | Beiträge des Benutzers
Paratrooper
myCSharp.de - Member

Avatar #avatar-1887.gif


Dabei seit:
Beiträge: 21
Herkunft: LA

beantworten | zitieren | melden

Hallo!

Ein bißchen Eigenwerbung schadet nie:

http://www.codeproject.com/useritems/MathParser.asp

Servus...
Paratrooper.
private Nachricht | Beiträge des Benutzers
Kabelsalat
myCSharp.de - Member

Avatar #avatar-1937.jpg


Dabei seit:
Beiträge: 371
Herkunft: Bodensee

beantworten | zitieren | melden

Vor einiger Zeit habe ich einen Formelparser geschrieben, der beliebige Formeln analysiert und intern als "Umgekehrte Polnische Notation" (UPN) darstellt (Vielleicht besser bekannt als Infix-Notation oder "Reverse Polish Notation" - RPN). Die Speicherung erfolgt natürlich nicht als Abfolge von Zeichen oder Strings, sondern der Term wird in "Tokens" zerlegt. Das sind Klassen bzw. Unterklassen, die etwa bei Operatoren auch gleich deren Implementierung umfassen - verzichtet habe ich allerdings auf die Vereinfachung der Terme.

... herunterladen kannst du die Borland Package Library (BPL) einschließlich Beispielanwendung hier: http://www.epifiles.de/daten/index.php?N=A&dir=epiSource%2FDelphi%2FMathExpression

Wie du vielleicht schon am Begriff BPL gemerkt hast, handelt es sich jedoch nicht um .Net sondern um Delphi (war damals für den Schulunterricht) - vielleicht hilft es dir dennoch weiter.

Die Zip-Datei enthalt drei Ordner:

1) MathExpression: Die BPL ("Klassenbibliothek"), welche die eigentliche Funktion zur Verfügung stellt. Für dich interessant sind vor allem die Quellcode-Dateien MathExpression.pas und Tokens.pas

2) MathExpressionBPLSample: Beispielanwendung, die auf obige BPL aufbaut.

3) MathExpressionSample: Wie MathExpressionBPLSample, allerdings wird die Funktionalität der BPL direkt eingebunden.

Die Dokumentation kann ich leider nicht mehr finden, vielleicht habe ich auch nie eine geschrieben.


PS: Ich halte einen eigenständigen Parser für die bessere Lösung. Der zuvor verlinkte Artikel (http://www.codeproject.com/cs/algorithms/matheval.asp) beschreibt zwar eine sehr simple wie auch elegante Lösung, die bei falscher Umsetzung allerdings schwerwiegende Sicherheitslücken schafft.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 3047
Herkunft: Deutschland

beantworten | zitieren | melden

Es geht auch viel einfacher:

Formeleditor
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers