Hey,
Ich programmiere derzeit einen Taschenrechner.
Grafische Oberfläche etc. ist inzwischen alles vorhanden, jedoch habe ich Probleme bei den Berechnungen.
Ich habe aus diesem Forum folgenden Quellcode genommen:
(von java-forum.org-Benutzer meez)
Hat jemand eine Idee, wie ich diesem Taschenrechner Klammerberechnungen "beibringen" könnte?
Ich programmiere derzeit einen Taschenrechner.
Grafische Oberfläche etc. ist inzwischen alles vorhanden, jedoch habe ich Probleme bei den Berechnungen.
Ich habe aus diesem Forum folgenden Quellcode genommen:
Java:
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class SimpleCalculator {
public SimpleCalculator() {}
/**
* + = addition
* - = subtraction * = multiplication
* / = division ^ = power (pow)
* % = square-root e.g 2%4 = 2
*
*/
public double calculate(String expression) {
if (expression == null) return Double.MIN_VALUE;
expression = expression.trim();
if (expression.equals("")) return Double.MIN_VALUE;
StringTokenizer str = new StringTokenizer(expression, "+-*/^%", true);
List tokens = new ArrayList(str.countTokens());
w : while (str.hasMoreTokens())
tokens.add(str.nextToken().trim());
w : while (tokens.indexOf("%") > -1) {
f : for (int n = 0; n < tokens.size(); n++)
calculate("%", tokens, n);
}
w : while (tokens.indexOf("^") > -1) {
f : for (int n = 0; n < tokens.size(); n++)
calculate("^", tokens, n);
}
w : while (tokens.indexOf("*") > -1) {
f : for (int n = 0; n < tokens.size(); n++)
calculate("*", tokens, n);
}
w : while (tokens.indexOf("/") > -1) {
f : for (int n = 0; n < tokens.size(); n++)
calculate("/", tokens, n);
}
w : while (tokens.indexOf("-") > -1) {
f : for (int n = 0; n < tokens.size(); n++)
calculate("-", tokens, n);
}
w : while (tokens.indexOf("+") > -1) {
f : for (int n = 0; n < tokens.size(); n++)
calculate("+", tokens, n);
}
if (tokens.size() != 1) return Double.MIN_VALUE;
return toDouble((String) tokens.get(0), Double.MIN_VALUE);
}
private void calculate(String calcType, List tokens, int n) {
String token = (String) tokens.get(n);
if (!token.equals(calcType)) return;
double l, r, res;
int s, e;
if (n - 1 == -1) {
s = 0;
l = 1;
} else {
s = n - 1;
l = toDouble((String) tokens.get(n - 1), 1);
}
if (n + 1 == tokens.size()) {
e = tokens.size() - 1;
r = 1;
} else {
e = n + 1;
r = toDouble((String) tokens.get(n + 1), 1);
}
if (calcType.equals("%"))
res = Math.sqrt(r);
else if (calcType.equals("^"))
res = Math.pow(l, r);
else if (calcType.equals("*"))
res = l * r;
else if (calcType.equals("/"))
res = l / r;
else if (calcType.equals("-"))
res = l - r;
else if (calcType.equals("+"))
res = l + r;
else
res = 0;
tokens.add(e + 1, String.valueOf(res));
f : for (int i = e; i >= s; i--)
tokens.remove(i);
n = n + (e - s);
}
private double toDouble(String number, double defaultNumber) {
try {
return Double.parseDouble(number);
} catch (NumberFormatException e) {}
return defaultNumber;
}
}
Hat jemand eine Idee, wie ich diesem Taschenrechner Klammerberechnungen "beibringen" könnte?
Zuletzt bearbeitet: