Formel in einem String während Laufzeit berechnen.

Status
Nicht offen für weitere Antworten.

Murgelmann

Neues Mitglied
Hi,

ich habe das Problem, daß mein Programm beim starten Formeln als Strings übergeben bekommt.
Nichts kompliziertes, z.B.
"N+1"
im Programm ist nun eine Variable N mit dem Wert 1 definiert.
Wie bringe ich nun das Programm dazu während der Laufzeit den Wert von N
durch obige Formel zu verändern, also rechnet:
N = N + 1

Ich brauche eigentlich keinen Formelinterpreter, mein grundliegendes Problem ist eigentlich
- ich habe 2 Integer N, X mit beliebigen Werten und einen String Y = "X"
- wie kann ich das Programm dazubringen dem Integer N den Wert von X zuzuweisen nur durch den String Y; das also der Wert von Y "X" zu der Variable X wird

Tausend Dank im Voraus
 

schalentier

Gesperrter Benutzer
Also du hast mehrere Möglichkeiten:

  • 1. eigener Formelinterpreter (is gar nicht so kompliziert)
    2. Java Reflection. Probier irgendeineInstanzIrgendeinerKlasse.getClass().getXXX(). Da findest du ne Menge Methoden, um auf Felder/Methoden/etc einer Klasse zuzugreifen. Damit müsste dein Problem lösbar sein
    3. DynamicJava ist ein Java Interpreter in Java geschrieben. Damit kannst du Java Code aus Strings heraus ausführen.
Viel spass
 

Nobody

Top Contributor
@schalentier kannst du mal kurz anreisen wie der formel interpreter angefangen wird, hab mir sowas auchmal überlegt, jedoch bin ich immer am zerlegen des strings gescheitert (schon in der planungsphase).
 

schalentier

Gesperrter Benutzer
hmm naja also ich kann erklären, wie ich es mal gemacht hab:

1. Es gibt ne klasse StreamTokenizer, der bekommt einen Stream als input und liefert per nextToken()-methode das nächste token. (ein token ist ein atom des streams, also z.b. eine zahl, ein operator (+-*/) eine funktion oder klammern). StreamTokenizer ist nich besonders schön, also empfehle ich dir einen besseren Tokenizer zu schreiben, der das nächste Token ließt und klassifiziert. Außerdem nützlich ist es, wenn man das gerade gelesene Token wieder zurückschreiben kann (push).

2. Sagt dir EBNF was? Steht für Extended Bakus Naur Form (oder so ähnlich) und damit kann man Sprachen beschreiben. Eine math. Formel ist auch eine Sprache. Das würde dann so oder ähnlich aussehen:

EXPR := (TERM "+"|"-" EXPR) | TERM | "(" EXPR ")"
TERM := (FAKTOR "*"|"/" TERM ) | FAKTOR
FAKTOR := ZAHL | VARIABLE

3. Daraus baust du dir eine Klassenhierarchie auf:
Code:
abstract class EBNFRule
{
   public abstract void parse( Tokenizer tok );
}
class EXPR extends EBNFRule
{
   public void parse( Tokenizer tok )
  {
     Token t = tok.nextToken();
     if( t==Token.KLAMMER_AUF ) 
     {
       new EXPR().parse( tok );
       t = tok.nextToken();
       if( t!=Token.KLAMMER_ZU ) throw Exception();
     } else
     {
        tok.push(t); // t war keine klammer, also irgendwas anderes für TERM
        do {
           new TERM().parse( tok );
           t = tok.nextToken();
           if( t==Token.PLUS_MINUS )
           {
              new EXPR().parse(tok);
           }
        } while( t==Token.PLUS_MINUS );
        tok.push( t ); // letztes  zeichen zurückschreiben
     }
  }
}

natürlich musst du jetzt die instanzen wie EXPR, TERM, FAKTOR, etc irgendwie mitspeichern. da entsteht dann ein baum:
Code:
(1+2)*3

--*
   |- 3
   |- +
       |- 2
       |- 1

ausserdem sollte es neben parse(...) noch evaluate(...) geben, die dann alles zusammenrechnet.

is natürlich nich vollständig, falls du fragen hast, meld dich :p

viel spass
 

gustav

Aktives Mitglied
Wenn es Dir wirklich nur um den Formelinterpreter geht dann brauchst Du nicht den gesamten Aufwand betreiben und einen eigenen Parser schreiben. Für Java gibt es eine Vielzahl von solchen Parsergeneratoren, z.B. javacc (java compiler compiler)
Diese Dinger generieren Programmcode der genau solche Token liefert wie schalentier beschrieben hat. Mehr sogar noch, es wird gleich auf die richtige Syntax geachtet. Du brauchst eigentlich nichts weiter machen als Dir eine solche Grammatik zu definieren :
Code:
EXPR := (TERM "+"|"-" EXPR) | TERM | "(" EXPR ")"
TERM := (FAKTOR "*"|"/" TERM ) | FAKTOR
FAKTOR := ZAHL | VARIABLE
dann den Parser genieren und mit den gelieferten Token losrechnen.... (theoretisch kannst Du dann auch einen Java Interpreter schreiben)

@Murgelmann
Es kommt immer darauf an, wie komplex Deine Formeln sind. Vielleicht lohnt es sich ja jetzt ein wenig mehr arbeit in diese Sache zu investieren. Dann kannst Du später relativ einfach erweitern.
Auf jeden Fall mußt Du Deinem Programm eine Logik einhauchen, damit es "versteht" was der String bedeutet. Wenn Du jetzt schnell was haben willst, dann hilft Dir vielleicht noch eine Heuristik weiter aber irgendwann ist damit Schluss.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Formel Bubble Sort Allgemeine Java-Themen 1
S Formel für Sonnenwinkel in ein Programm überführen Allgemeine Java-Themen 11
Zrebna Random Number - Generische Formel zwischen zwei INKLUSIVEN Werten Allgemeine Java-Themen 16
X Template Matching (subimage recognition via Formel) vs KNN Allgemeine Java-Themen 36
G Umsetzen einer Formel in Java Allgemeine Java-Themen 10
L SWT Mathematische Formel mit SWT Textfield auswerten? Allgemeine Java-Themen 3
M Excel Formel in Java Allgemeine Java-Themen 7
E Falsche Ergebnisse bei PQ-Formel Berechnung Allgemeine Java-Themen 12
N Applet Apache Poi Wert einer Formel ausgeben Allgemeine Java-Themen 5
A JExcel Formel einlesen Allgemeine Java-Themen 2
Landei Design-Problem Formel-Parser Allgemeine Java-Themen 10
W Formel in Java Allgemeine Java-Themen 9
S reelle Funktionen Formel Allgemeine Java-Themen 13
B Formel Interpreter gesucht Allgemeine Java-Themen 7
M Math-String-Formel berechnen lassen Allgemeine Java-Themen 4
Ernesto95 HTTP Mit JavaScript erzeugte dynamische Webseite auslesen und nach einem Schlüsselwort durchsuchen Allgemeine Java-Themen 6
P Feststellen, Welche Classes ich aus einem JAR nutze? Allgemeine Java-Themen 6
Jose05 mit 2 - 3 Personen an einem Projekt coden Allgemeine Java-Themen 2
M Queue mit einem Array implemetieren Allgemeine Java-Themen 16
8u3631984 Prüfen ob min. ein Element eines Sets in einem anderen Set enh Allgemeine Java-Themen 4
L 2 Dimensionale ListArray Abfrage nach einem Wert suchen Allgemeine Java-Themen 5
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
Jose05 Speicherung auf einem Server Allgemeine Java-Themen 1
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
M Mehrere Ressourcen in einem package ablegen Allgemeine Java-Themen 1
Tobero .jar Dateine aus einem Ordner laden (Java 16) Allgemeine Java-Themen 5
alinakeineAhnungv Hilfe bei einem Straßenbahn-Projekt von mir Allgemeine Java-Themen 18
SaftigMelo In einem Winkel Objekt bewegen Allgemeine Java-Themen 2
Thallius Zeitzone zu einem LocalDate hinzufügen aber ohne es zu ändern... Allgemeine Java-Themen 2
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
Tobero Wie bekomme ich in welchem Quadrat sich eine Position in einem Grid befindet Allgemeine Java-Themen 11
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
Kingamadeus2000 Alle mehrfach vorkommenden Buchstaben rekursiv aus einem String entfernen. Allgemeine Java-Themen 6
F Junit Test + Cucumber - JSON auslesen und in einem weiteren Schritt nutzen Allgemeine Java-Themen 0
Zrebna DeleteNode-Funktionalität in einem AVL-Tree Allgemeine Java-Themen 5
pkm Warnungen in einem Drools-Projekt unterdrücken? Allgemeine Java-Themen 1
D Arbeiten mit einem Bitarray Allgemeine Java-Themen 13
D Union in einem Struct in JNA Allgemeine Java-Themen 5
N Apache POI/ neue Reihe in Excel mit einem Button Allgemeine Java-Themen 2
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
R Zoom In einem grid Allgemeine Java-Themen 0
M java.io.EOFException bei einem DataoutputStream ?! Allgemeine Java-Themen 2
D Kgv aller Paare aus einem Array mit n integer berechnen Allgemeine Java-Themen 5
D Verkauf von einem Programm welches ich in Java geschrieben habe Allgemeine Java-Themen 4
M Fahrtsimulation von einem Zug Allgemeine Java-Themen 0
A 2D-Grafik Einfachster Ansatz, um sich wiederholende Figur in einem 2D-Image zu erkennen Allgemeine Java-Themen 1
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
Drachenbauer Wie kann ich das Wort "concrete" in einem String durch ein anderes Wort ersetzen lassen? Allgemeine Java-Themen 5
J Suchen von einer Scannereingabe in einem HashSet Allgemeine Java-Themen 1
L Input/Output Kassenzettel lesen aus einem Bild Allgemeine Java-Themen 2
G JTextField Inhalt in einem Long einfügen Allgemeine Java-Themen 2
M Bei String.format ein Komma statt einem Punkt ausgeben lassen Allgemeine Java-Themen 1
K Bild in einem anderen Bild suchen Allgemeine Java-Themen 12
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
ralfb1105 Starten Java App(s) (.jar) aus einem Java Programm Allgemeine Java-Themen 18
B Suche nach einem Testprogramm für meine BA Allgemeine Java-Themen 0
B Maven Zugriff auf files aus einem kompilierten jar Allgemeine Java-Themen 15
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
R Farbe zu einem Eckpunkt generieren Allgemeine Java-Themen 0
C Logfile upload zu einem externen filezilla sftp server Allgemeine Java-Themen 6
X Punkte in einem Feld bestimmen Allgemeine Java-Themen 22
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
J In einem Set doppelte Elemente erzeugen Allgemeine Java-Themen 4
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
S Kann man mit Java auf einem lokalen PC/Mac Benutzergruppen auslesen und Rechte ändern? Allgemeine Java-Themen 11
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
R Index in einem Array löschen Allgemeine Java-Themen 10
R Index in einem Array löschen Allgemeine Java-Themen 2
4 Swing Durch klicken auf Button Labels einem Panel hinzufügen Allgemeine Java-Themen 4
The Pi Wie oft wird ein Buchstabe in einem Wort wiederholt? Allgemeine Java-Themen 16
D Kopieren von Dateien aus einem Ordner in einen anderen Allgemeine Java-Themen 6
K Classpath Alle Classen aus einem Package lesen Allgemeine Java-Themen 7
K Auf einer Website nach einem String suchen Allgemeine Java-Themen 5
P Zwei Applikationen mit einem Job Allgemeine Java-Themen 0
Sin137 OOP Auf JPanel zugreifen, das einem JTabbePane hinzugefügt worden ist Allgemeine Java-Themen 10
E Die if-Anweisung in einer Java Bean bzw. in einem Servlet? Allgemeine Java-Themen 8
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
F Wie kann ich auf einem System prüfen, ob eine lib verfügbar ist? Allgemeine Java-Themen 2
M Ein Programm das nur von einem bestimmten Programm geöffnet werden kann Allgemeine Java-Themen 7
H Klammerberechnungen bei einem Taschenrechner Allgemeine Java-Themen 2
S Kann man mit einem GeneralPath.curveTo ein GeneralPath.quadTo ersetzen..? Allgemeine Java-Themen 2
Seikuassi Alle Escape-Sequenzen in einem String ersetzen Allgemeine Java-Themen 4
S Rekursive Suche in einem Netz Allgemeine Java-Themen 5
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
M Zeilen zu einem DefaultTableModel hinzufügen Allgemeine Java-Themen 1
M Dateien aus einem Verzeichnis auf einem Server auflisten Allgemeine Java-Themen 5
Thallius PDF von einem BufferedImage erstellen Allgemeine Java-Themen 1
M Abonnentenzahl, Aufrufe, etc. von einem YouTube-Kanal anzeigen Allgemeine Java-Themen 7
B Fehler bei einem Programm Allgemeine Java-Themen 10
E am häufigsten vorkommenden Farben aus einem Bild Allgemeine Java-Themen 5
C Threads Variablen in einem Thread Aktualisieren Allgemeine Java-Themen 17
F Punkte in einem Bild finden Allgemeine Java-Themen 10
M Eclipse Eine xhtml aus einem JSF Projekt starten Allgemeine Java-Themen 2
M String an einem abschnitt ändern Allgemeine Java-Themen 14
I Zu zweit an einem Projekt? Allgemeine Java-Themen 1
S Methoden Stunden seit einem bestimmten Zeitpunkt Allgemeine Java-Themen 3
D Problem mit Login in einem Dynamischen Webprojekt Allgemeine Java-Themen 1
D Grafisches Frontend zu einem Java Prozess erstellen Allgemeine Java-Themen 0

Ähnliche Java Themen

Neue Themen


Oben