Rechnung in einem String

Übersicht BlitzBasic BlitzPlus

Neue Antwort erstellen

 

Satan

Betreff: Rechnung in einem String

BeitragMo, Jul 20, 2009 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein Problem sieht so aus.
Ich habe einen String, in dem steht eine Rechnung, ZB: a$="2+(4*7)".
Ist es irgendwie möglich die Rechnung jetzt zu berechnen, so das hier zB b=30 herauskommen würde?

Hier ist nochmal ein BeispielCode zum Problem:

Code: [AUSKLAPPEN]
Global win = CreateWindow("Taschenrechner 1.0", 0, 0, 300, 400, 0)

canvas = CreateCanvas (0, 0, 300, 400, win)

SetBuffer CanvasBuffer(canvas)

a$="2+(4*7)"

;Hier jetzt etwas, mit dem ich die Rechnung im String a$ berechnen kann


WaitKey()

Nicdel

BeitragMo, Jul 20, 2009 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
https://www.blitzforum.de/foru...ingrechner
-> Forumssuche benutzen!

Edit: Nicht ganz das richtige...
Besser: http://www.shadowturtle.de/sit...howcode=11
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

Satan

BeitragMo, Jul 20, 2009 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohh... das is ja verdammt schwer... gibts da nich villeicht was etwas leichteres?
Trotzdem Danke Wink

Nicdel

BeitragMo, Jul 20, 2009 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich könnte dir meine Rechenfunktion geben, die kann aber weder Klammern noch Punkt-vor-Strich.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

ozzi789

BeitragMo, Jul 20, 2009 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Was du brauchst ist Instr Replace Left Right Mid, kopiere die gepostete Funktion nicht, schreib lieber selber eine da lernst du einiges mehr Smile

mfg ozzi
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

ComNik

BeitragMo, Jul 20, 2009 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde so vor gehen/gehe so vor:

1. Den string anallysieren und Tokens erstellen.
Beispiel: 5 + (10*2+3)

Daraus wird
Code: [AUSKLAPPEN]

       Token 5:digit
       Token +:operator
       Token (:operator
       Token 10:digit
       Token *:operator
       Token 2:digit
       Token +:operator
       Token 3:digit
       Token ):operator
   


Daraus wird ein sytaxbaum erstellt. Hier muss punkt vor strich etc... beachtet werden.
Also zu unserem beispiel: (pseudo...)
Code: [AUSKLAPPEN]

       a
       =
      10
       *
       2
     
       b
       =
       3
     
       c
       =
      a
      +
      b
     
      d
      =
      5
      +
       c     
   


etc...
Diese Form ist warum wichtig? Weil ein Interpreter nun keinerlei probleme hat das zu interpretieren und auszuführen. So einen Lexer zu erstellen ist aber ein bisschen umständlich. (aber nicht unmöglich Wink )

Natürlich gibt es einfache varianten mit hilfe von string befehlen etc... Bei komplizierten Termen wird das aber ein ziemliches rumgehacke.

lg
ComNik
WIP: Vorx.Engine

coolo

BeitragDo, Jul 23, 2009 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Lexer ist der leichteste Part eines solchen Systems Wink. Er ist verantwortlich die Tokens zu erstellen.

Aber ich würde dir ein anderes und leichteres System vorschlagen. Da du hier keine Scriptsprache Programmieren willst sondern einen einfachen Stringrechner. Das Stichwort lautet Rekursion. Das heißt das der lange und komplizierte Term in kleinere "Aufgaben" zerteilt wird.

Beispiel:
8+5*8
* hat eine höhere Priorität als + deswegen wird zuerst 5*8 gerechnet, dann steht dort
8+40
Jetzt wird 8+40 gerechnet
48

(5+5*(4-5))*89-100
Zuerst wird die innerste Klammer gesucht und ausgerechnet das wäre in diesem Fall 4-5
Nun sieht der Term folgends aus:
(5+5*1)*89-100
(5+5)*89-100
10*89-100
890-100
790 ist das Ergebnis

Dieses Verfahren kann man vergleichsweise einfach implementieren. Man muss nur auf den Operator vorang acht geben.
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project!
"Eigenzitate sind nur was für Deppen" -Eigenzitat

ComNik

BeitragDo, Jul 23, 2009 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, ich musste ja irgendwie zeit schinden bis coolo kommt und alle meine fehler beseitigt Very Happy

Wenn es um lexer, parser scriptsprachen geht ist er der richtige mann ähm junge.
WIP: Vorx.Engine
 

Satan

BeitragSo, Jul 26, 2009 10:24
Antworten mit Zitat
Benutzer-Profile anzeigen
coolo hat Folgendes geschrieben:
Der Lexer ist der leichteste Part eines solchen Systems Wink. Er ist verantwortlich die Tokens zu erstellen.

Aber ich würde dir ein anderes und leichteres System vorschlagen. Da du hier keine Scriptsprache Programmieren willst sondern einen einfachen Stringrechner. Das Stichwort lautet Rekursion. Das heißt das der lange und komplizierte Term in kleinere "Aufgaben" zerteilt wird
[...]



Ja, auf diese idee bin ich auch gekommen, aber könntest du mir vllt mal den Anfang dafür aufschreiben? Denn ich habs mal ausprobiert, aber ich schaffs nich... (Bin noch ein Anfänger)

Danke!

Noobody

BeitragSo, Jul 26, 2009 10:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein solcher Stringrechner lässt sich vergleichsweise einfach erstellen. Das einzige, womit du aufpassen musst, sind die einzelnen Datentypen, aber wenn du von vornherein alles mit Floats berechnest, wird der Code nicht übermässig kompliziert.

Der Trick besteht darin, die normale Darstellung von "2*3+5" in die sogenannte Postfixnotation umzuwandeln, welche dann so aussieht: "2 3 * 5 +". Diese Notation ist sehr einfach am Computer zu berechnen, weshalb eigentlich nur das Umwandeln Probleme bereiten dürfte.

Durch eine Google - Suche findest du sicher genug Lektüre dazu - auf die Schnelle habe ich diese Seite gefunden, die das relativ gut erklärt.
Wenn du den Postfixausdruck hast, geht die Berechnung dann wirklich einfach. Diese Seite erklärt die grundlegende Herangehensweise.

@Nicdel: Ich schätze, du meintest das hier Wink
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Neue Antwort erstellen


Übersicht BlitzBasic BlitzPlus

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group