Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Therm aus String ausrechnen



M@r$ch
09-12-2001, 12:54
Hoi,

also ich will meinem Programm einen Therm übergeben (z.B. 2+2), was logischerweise ein String sein muss, da ausser Zahlen noch Rechenzeichen vorhanden sind. Wie kann ich jetzt durch möglichst einfache Weise an das Ergebnis dieses Therms kommen?

Ach ja, Sprache C/C++!

mfg,
M@r$ch

anda_skoa
09-12-2001, 15:22
Hi,

Soweit ich weiß gibts keine "Fertige" Methode um sowas zu machen.

Wenn die Ausdrücke nicht allzu komplex sind (Zb nur +,-,*,/ und Klammernt) dann kann man den nötigen Parser noch mit der Hand schreiben.

Wenn die Zahlen auch Fließkomma Zahlen in unterschiedlicher Schreibweise sein könne, wird es ziemlich ecklig.
Da sollte man dann auf flex und bison zurückgreifen, um den Parsercode zu generieren.

Ciao,
_

M@r$ch
09-12-2001, 19:24
Da ich mich mit Bison und Flex nicht auskenne und ich eigentlich nur wenige Zeichen (*,/,+,-,^,(,)) benutzen will, hab ich mich dafür entschieden den Parser selbst zu schreiben. Läuft soweit ganz gut, nur Klammern gehn noch nicht. Ich hab mir eigentlich gedacht, dass dafür nichts Fertiges existiert, war eben nicht ganz sicher, aber wer kennt als Anfänger nicht das Gefühl nach stundelangem Programmieren ein Funktion zu finden, die genau dies erledigt, woran man gerade arbeitet? ;)

anda_skoa
10-12-2001, 19:08
:)

Ich kann mich erinnern, dass es da einen Trick gibt.

Man hat einen Stack für Werte und einen für Operatoren.

Dann liest man den Ausdruck von links nach rechts und je nachdem was man gerade liest reagiert man anders.

Zahlen kommen glaub ich zuerst mal auf den Weret Stack.
( auf den Operatorstack
) alle operatoren bis zur ersten ( am stack werde ausgewertet, die ( entfernt.

Bei den Operatoren bin ich mir jetzt nicht so sicher.

Stack leer bzw ( ganz oben, Operator auf den stack.
Wenn ein Operator gleicher oder höherer Ordnung am stack leigt wird der zuerst ausgewertet.
wiederholen bis einer mit niedrigerer Ordnung oben ist oder Fall 1 eintritt, dann auf den Stack legen.

Ciao,
_

Sion
10-12-2001, 19:54
Was die Klammern angeht:
Der ganze String wird einer Funktion übergeben.
Diese sucht von links->rechts nach Klammern (es ist logischerweise nur eine öffnende erlaubt (->Fehlerchecken!)). Wird eine gefunden, Stelle merken, von rechts->links schließende Klammer suchen, Stelle Merken.
Der String zwischen den Klammern muß zuerst ausgerechnet werden, also ruft sich die Funktion mit diesem Teilstring selbst auf (Rekursiv), diese sucht wieder nach Klammern....usw.
bis irgendwann keine Klammern mehr da sind, dann ganz normal rechnen.
Im Prinzip kannst du das gleiche machen, um Punkt-Vor-Strich zu berücksichtigen!

Achja, die Funktionen, denen immer ein String übergeben wird, geben sinnvollerweise den ausgerechneten Wert zurück, damit dann eine Ebene höher damit weitergearbeitet werden kann!


Gruß & viel Spaß
Sion
PS: Bei Problemen/Unklarheiten nochmal nachfragen!

anda_skoa
11-12-2001, 18:51
Original geschrieben von Sion
Was die Klammern angeht:
Der ganze String wird einer Funktion übergeben.
Diese sucht von links->rechts nach Klammern (es ist logischerweise nur eine öffnende erlaubt (->Fehlerchecken!)). Wird eine gefunden, Stelle merken, von rechts->links schließende Klammer suchen, Stelle Merken.


Diese Methode funktioniert nicht, wenn zB sowas eingegeben wird:
((2 + 1) * 3) * (1 + 2)

Weil die erste ) von rechts nicht mit der ersten ( von link zu tun hat.

Ciao,
_

Sion
11-12-2001, 19:36
Original geschrieben von anda_skoa


Diese Methode funktioniert nicht, wenn zB sowas eingegeben wird:
((2 + 1) * 3) * (1 + 2)

Weil die erste ) von rechts nicht mit der ersten ( von link zu tun hat.

Ciao,
_

Nun, da hast du wohl recht.
Dann muß man eben doch direkt von innen nach außen, d.h. so lange von rechts->links öffnende Klammern zählen, bis eine schließende kommt, dann hat man die innerste.
In deinem Beispiel hätte man dann ((2 + 1) * 3) gelöst. Nun muß halt noch geschaut werden, ob was danach kommt, und damit genauso vorgehen, usw.

anda_skoa
11-12-2001, 20:28
Jupp, so gehts :)

Oder mit meiner Stackmethode, bin mir mittlerweile ziemlich sicher, dass ich das mit den Operatoren richig hatte.

Ciao,
_

TThomas
13-12-2001, 00:41
Kannste den code bitte mal posten?
Würde mich sehr interessieren...


Gruß, Thomas.