eval

CP

Mitglied
Hallo Forum,

bin Anfänger. Folgendes Problem: Zwei Zahlen sollen addiert oder subtrahiert werden.
Kann man das Rechenzeichen + bez. - als Variable notieren?
ergebnis = (zahl1 VariableFürRechenzeichen zahl2)? In JavaScript ging das, wenn ich mich recht erinnere
mit eval (Soll angeblich eine Sicherheitslücke darstellen)
Wie geht das bitte mit Java?

Danke
 

VfL_Freak

Top Contributor
Moin,

bin Anfänger. Folgendes Problem: Zwei Zahlen sollen addiert oder subtrahiert werden.
Kann man das Rechenzeichen + bez. - als Variable notieren?
ergebnis = (zahl1 VariableFürRechenzeichen zahl2)? In JavaScript ging das, wenn ich mich recht erinnere
mit eval (Soll angeblich eine Sicherheitslücke darstellen)
Wie geht das bitte mit Java?
Wozu denn bitte eine Variable ???:L
Java:
int zahl1 = 5;
int zahl2 = 2;
int ergebnis_add = zahl1 + zahl2;
int ergebnis_sub = zahl1 - zahl2;
Oder verstehe ich Dich völlig falsch?

Gruß
Klaus
 

rme

Top Contributor
Er wollte vermutlich erreichen, dass der Operator in einer Benutzereingabe sein kann.

eval gibt es nur in Scriptsprachen, in Java wirst du das anders lösen müssen :)

Die Sicherheitslücke bei eval resultiert daraus, dass der Benutzer statt "+" auch "+3; tueSchlimmeDinge(); 2+" eingeben könnte. Dann wäre der Ausdruck gültig, hätte aber böse Seiteneffekte. Deshalb sollte man eval in allen Sprachen vermeiden.
 
Zuletzt bearbeitet:

CP

Mitglied
Hallo VfL_Freak , hallo rme

danke für eure Antworten.
Ich benötige, wie rme geschrieben hat
die Variable als userInput.
rme, an deinem Smilie kann ich wohl erkennen,
dass du die Antwort weisst.
Ich poste mal den Code, die 4 voids
für die 4 Rechenarten sollten durch
ein void mit Variable erstetzt werden.
(Kleine Frage am Rande, wieso muss ich

import javax.swing.JOptionPane;

zweimal notieren?)

Danke



import javax.swing.JOptionPane;

public class Verstaendnistest2 {

public static void main(String[] args) {

String eingabe1, eingabe2, operator;
double c, d;
char e;

eingabe1 = JOptionPane.showInputDialog("Geben Sie die erste Zahl ein ");
c = Double.parseDouble(eingabe1);
operator = JOptionPane.showInputDialog("Geben Sie den Operatror ein ");
e = operator.charAt(0);
eingabe2 = JOptionPane.showInputDialog("Geben Sie die zweite Zahl ein ");
d = Double.parseDouble(eingabe2);

switch(e) {
case '+':

Rechenwerk a = new Rechenwerk();
a.zahl1 = c;
a.zahl2 = d;
a.addieren(a);
a.ausgabe();
break;

case '*':


Rechenwerk b = new Rechenwerk();
b.zahl1 = c;
b.zahl2 = d;
b.multiplizieren(b);
b.ausgabe();
break;

case '-':

Rechenwerk f = new Rechenwerk();
f.zahl1 = c;
f.zahl2 = d;
f.subtrahieren(f);
f.ausgabe();
break;

case '/':

Rechenwerk g = new Rechenwerk();
g.zahl1 = c;
g.zahl2 = d;
g.subtrahieren(g);
g.ausgabe();
break;

default:
JOptionPane.showMessageDialog(null, "Kein gültiger Operator!");

}
}
}

___________________________________________________________

import javax.swing.JOptionPane;

public class Rechenwerk {
double zahl1;
double zahl2;
double ergebnis;


void ausgabe() {
JOptionPane.showMessageDialog(null, ergebnis);

}

void addieren(Rechenwerk r) {
ergebnis = (zahl1 + zahl2);


}
void multiplizieren(Rechenwerk r) {
ergebnis = (zahl1 * zahl2);


}
void subtrahieren(Rechenwerk r) {
ergebnis = (zahl1 - zahl2);
}

void dividieren(Rechenwerk r) {
ergebnis = (zahl1 / zahl2);
}
}
 

rme

Top Contributor
Hallo,

dazu müsstest du den Operator, der in Variable e gespeichert ist, an diese eine Methode übergeben und darin das switch-case machen. Also speicher e mit in der Instanz von Rechenwerk, so wie du auch die beiden Zahlen speicherst - und dann pack das switch-case, das momentan in deiner Main-Methode ist, in diese Methode.

Das Import muss zweimal, weil die Klassen in Java unabhängig kompiliert werden - da beide Klassen die JOptionPane benutzen, müssen auch beide diese Klasse importieren.
 

CP

Mitglied
Danke für deine Hilfe, meinst du in etwa so? Läuft mit Fehlermeldung, muss mich
noch mit dem Debugger beschäftigen.

Das verschlankt die Sache schon ganz erheblich, die Sache mit
der Rechenzeichenvariable würde mich aber dennoch interessieren.


import javax.swing.JOptionPane;

public class Verstaendnistest2 {

public static void main(String[] args) {

String eingabe1, eingabe2, operator;
double c, d;
char e;

eingabe1 = JOptionPane.showInputDialog("Geben Sie die erste Zahl ein ");
c = Double.parseDouble(eingabe1);
operator = JOptionPane.showInputDialog("Geben Sie den Operatror ein ");
e = operator.charAt(0);
eingabe2 = JOptionPane.showInputDialog("Geben Sie die zweite Zahl ein ");
d = Double.parseDouble(eingabe2);

Rechenwerk a = new Rechenwerk();

a.zahl1 = c;
a.zahl2 = d;
a.operator = e;
a.rechnen(a);
a.ausgabe();
}

}
_____________________________________________________________________

import javax.swing.JOptionPane;

public class Rechenwerk {
double zahl1;
double zahl2;
char operator;
double ergebnis;

void rechnen(Rechenwerk r) {

switch (operator){

case '+':
ergebnis = (zahl1 + zahl2);
break;
case '-':
ergebnis = (zahl1 - zahl2);
break;
case '*':
ergebnis = (zahl1 * zahl2);
break;
case '/':
if (zahl2 != 0){
ergebnis = (zahl1 / zahl2);
break;
}

default:
JOptionPane.showMessageDialog(null, "Keine Divisoin durch 0!");

}
}

void ausgabe() {
JOptionPane.showMessageDialog(null, ergebnis);
}
}
 

NoXiD

Bekanntes Mitglied
Java:
Javacode in Java braces schreiben!

und als Antwort auf deine Frage: Meines Wissens ist es nicht möglich den Operator (außer natürl. mit Abfragen) variabel zu setzen.
 

rme

Top Contributor
Richtig, mir fällt auch keine schönere Lösung ein. Man könnte ein Array mit den möglichen Operatoren erstellen und das dann ungefähr so machen:

Java:
res = operators[operator].asFunction(op1, op1);

Aber das Anlegen dieses Arrays würde in Java keinen Spaß machen, da müsste man ein Interface erzeugen, anonyme Instanzen für jeden Operator anlegen etc. In Java 8 wird das ein bisschen schöner.

Irgendwas ist an dem Code noch merkwürdig: Warum bekommt rechnen einen Parameter r, den es nicht benutzt? Warum sind alle Instanzvariablen package-private?
 

CP

Mitglied
Danke für eure Antworten, muss mich wohl noch reinarbeiten in Java.

"Irgendwas ist an dem Code noch merkwürdig: Warum bekommt rechnen einen Parameter r, den es nicht benutzt? Warum sind alle Instanzvariablen package-private?"

Stimmt r ist überflüssig. a.rechnen(); void rechnen() tuts auch. Mit package-private habe ich mich gar
nicht beschäftigt, in meinem Lehrbuch wird das in dieser Art notiert.

nochmal danke für eurer Interesse.
 

Ähnliche Java Themen

Neue Themen


Oben