Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich komme von Scheme her, wo sehr einfach einen kleine Rechner implementieren konnte:
Code:
(define (rechner z1 op z2) (op z1 z2))
Gibt es in Java eine übliche Methode, wie man einen Rechner implementiert?
Ich bin bis jetzt so vorgegangen, dass der User ein paar Zahlen + Operatoren eingeben kann, die dann in einem String gespeichert werden. Dieser String wird dann mit einem StringTokenizer aufgespalten und in einer ArrayList gespeichert. an diesem Punkt hab ich dann festgestellt, dass mein Lösungsversuch sehr LISP-orientiert ist, was wahrscheinlich weniger günstig ist, oder?
Deshalb meine Frage, ob es eine übliche Methode gibt, wie man in Java einen Rechner implementiert. Mit einem Stack vielleicht!?
Wenn dir irgendwann langweilig wird, dann kannst du evtl paar minuten zeit nehmen, um genauer zu beschreiben, wie diese definition denn helfen soll, arithmetische ausdrücke auszuwerten. Was soll das großartig bringen, den operator in die mitte zu schieben? gewinnt man dadurch irgendwas?
Landei hat gesagt.:
Prinzipiell ist in Java so etwas viel schwieriger als in funktionalen Sprachen zu lösen
Als ich noch viel mit TurboPascal gemacht habe, war es meine absolute Lieblingsbeschäftigung, Formelparser in verschiedensten Ausprägungen zu schreiben. Mit Java geht es aber ebenso gut. Anbei ein Grundgerüst, welches noch vervollständigt werden müßte, sich aber relativ fix an Anforderungen anpassen lassen müßte. Dabei wird rekursiv in die Formel eingetaucht. Punkt-vor-Strichrechung wird berücksichtigt. Klammerausdrücke, Funktionen und Konstanten auch. Man kann relativ leicht das Gerüst auch so verändern, daß Ausdrücke, wie sie unter Mathematikern eher üblich sind, akzeptiert werden, d.h. z.B., daß als Funktionsargumente nicht unbedingt geklammerte Ausdrücke stehen müssen, sondern auch Produkte (sin 3*5) . Oder daß negativierte Ausdrücke geklammert werden müssen und Formulierungen wie 2 * -5 nicht erlaubt sind (stattdessen 2 * (-5)).
Code:
String holeToken() throws ParseError {
// soll das naechste Token aus dem String, dem Stream oder der Datei holen
}
void expectToken(String arg) throws ParseError {
if (!holeToken.equals(arg)) throw new ParseError();
}
void TokenBack() {
/* soll das zuletzt gelesene Token zurueckstellen,
damit es beim naechsten Aufruf von holeToken erneut gelesen wird
*/
}
double operand() throws ParseError {
double x;
String token = holeToken();
boolean neg = false;
if (token.equals("-")) {
neg = true;
token = holeToken();
}
if (token.equals("(")) {
x = summe();
expectToken(")");
} else if (token.equals("sin")) {
expectToken("(");
x = Math.sin(summe());
expectToken(")");
} else if (token.equals("pi")) {
x = 3.1415926535;
}
else
{
try {
x = Double.parseDouble(token);
} catch (NumberFormatException e) {
throw new ParseError();
}
}
return neg?-x:x;
}
double produkt() throws ParseError {
double x = operand();
String token = holeToken();
while (token.equals("*") || token.equals("/")) {
if (token.equals("*")) {
x *= operand();
} else {
x /= operand();
}
token = holeToken();
}
TokenBack();
return x;
}
double summe() throws ParseError {
double x = produkt();
String token = holeToken();
while (token.equals("+") || token.equals("-")) {
if (token.equals("+")) {
x += produkt();
} else {
x -= produkt();
}
token = holeToken();
}
TokenBack();
return x;
}