我正在开发一个计算器应用程序,并且所有功能都已关闭.唯一的问题是,当我输入包含两个算术运算符的等式时,它会发生故障.例如,如果输入“2√9”则返回3,如果输入“√92”,则强制关闭并显示“无效双√9”.请帮忙.
ScIEntificCalculator.java
String prevAnswer = "";TextVIEw formulascreen;TextVIEw resultscreen;String formuladisplay = "";String resultdisplay = "";String result = "";String operator;DecimalFormat res = new DecimalFormat("#,###,###,###.######");@Nullable@OverrIDepublic VIEw onCreateVIEw(LayoutInflater inflater, @Nullable VIEwGroup container, @Nullable Bundle savedInstanceState) { VIEw vIEw = inflater.inflate(R.layout.scIEntific_calculator, container, false); formulascreen = (TextVIEw) vIEw.findVIEwByID(R.ID.formulaTextVIEw); updateformuladisplay(); resultscreen = (TextVIEw) vIEw.findVIEwByID(R.ID.resultTextVIEw); updateresultdisplay(); vIEw.findVIEwByID(R.ID.btn0).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickNumber(v); } }); vIEw.findVIEwByID(R.ID.btn1).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickNumber(v); } }); vIEw.findVIEwByID(R.ID.btn2).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickNumber(v); } }); vIEw.findVIEwByID(R.ID.btn3).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickNumber(v); } }); vIEw.findVIEwByID(R.ID.btn4).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickNumber(v); } }); vIEw.findVIEwByID(R.ID.btn5).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickNumber(v); } }); vIEw.findVIEwByID(R.ID.btn6).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickNumber(v); } }); vIEw.findVIEwByID(R.ID.btn7).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickNumber(v); } }); vIEw.findVIEwByID(R.ID.btn8).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickNumber(v); } }); vIEw.findVIEwByID(R.ID.btn9).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickNumber(v); } }); vIEw.findVIEwByID(R.ID.btnSqrt).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClicksqrt(v); } }); vIEw.findVIEwByID(R.ID.btnClear).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickClear(v); } }); vIEw.findVIEwByID(R.ID.btnDel).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickDel(v); } }); vIEw.findVIEwByID(R.ID.btnAdd).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickOperator(v); } }); vIEw.findVIEwByID(R.ID.btnMinus).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickOperator(v); } }); vIEw.findVIEwByID(R.ID.btndivIDe).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickOperator(v); } }); vIEw.findVIEwByID(R.ID.btnMultiply).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickOperator(v); } }); vIEw.findVIEwByID(R.ID.btnEquals).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickEquals(v); } }); vIEw.findVIEwByID(R.ID.btnPrevAns).setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { onClickAns(v); } }); return vIEw;}public voID onClickEquals(VIEw vIEw) { getResult(); updateresultdisplay();}private boolean getResult() { if (operator.equals("")) return false; String[] operation = formuladisplay.split(Pattern.quote(operator)); if (operation.length < 2) return false; if (operator.equals("√")) { result = String.valueOf(res.format(sqrtop(operator, operation[1]))); resultdisplay = result; prevAnswer = result; result = ""; } else { result = String.valueOf(res.format(simpleOp(operation[0], operation[1], operator))); resultdisplay = result; prevAnswer = result; result = ""; } return true;}public double simpleOp(String a, String b, String op) { switch (op) { case "+": return Double.valueOf(a) + Double.valueOf(b); case "-": return Double.valueOf(a) - Double.valueOf(b); case "x": return Double.valueOf(a) * Double.valueOf(b); case "÷": return Double.valueOf(a) / Double.valueOf(b); default: return -1; }}private voID updateformuladisplay() { formulascreen.setText(formuladisplay);}private voID updateresultdisplay() { resultscreen.setText(resultdisplay);}public voID onClicksqrt(VIEw vIEw) { button b = (button) vIEw; operator = b.getText().toString(); formuladisplay += operator; updateformuladisplay();}public voID onClickDel(VIEw vIEw) { if (formuladisplay.length() >= 1) { formuladisplay = formuladisplay.substring(0, formuladisplay.length() - 1); updateformuladisplay(); }}private voID clear() { formuladisplay = ""; resultdisplay = "";}public voID onClickClear(VIEw vIEw) { clear(); updateformuladisplay(); updateresultdisplay();}public voID onClickNumber(VIEw vIEw) { //if (!(result.equals(""))) { // clear(); //updateformuladisplay(); //} button b = (button) vIEw; if (formuladisplay.length() >= 0 && formuladisplay.length() <= 17) { formuladisplay += b.getText(); updateformuladisplay(); } else { updateformuladisplay(); }}public voID onClickOperator(VIEw vIEw) { button b = (button) vIEw; operator = b.getText().toString(); formuladisplay += operator; updateformuladisplay();}public double sqrtop(String op, String a) { switch (op) { case "√": return Math.sqrt(Double.valueOf(a)); default: return -1; }}public voID onClickAns(VIEw vIEw) { button b = (button) vIEw; if (formuladisplay.length() >= 0 && formuladisplay.length() <= 10) { formuladisplay += prevAnswer; updateformuladisplay(); } else { updateformuladisplay(); }}
}
解决方法:
使用堆栈数据结构来计算表达式.尝试这个简单的类
您可以在正则表达式中添加sqrt *** 作
private static final String operators = “-+/*”;
并在evaluatePostfix方法中添加sqrt *** 作.
public class InfixPostfixEvaluator { /** * Operators in reverse order of precedence. */ private static final String operators = "-+/*"; private static final String operands = "0123456789"; public int evalinfix(String infix) { return evaluatePostfix(convert2Postfix(infix)); } public String convert2Postfix(String infixExpr) { char[] chars = infixExpr.tochararray(); Stack<Character> stack = new Stack<Character>(); StringBuilder out = new StringBuilder(infixExpr.length()); for (char c : chars) { if (isOperator(c)) { while (!stack.isEmpty() && stack.peek() != '(') { if (operatorGreaterOrEqual(stack.peek(), c)) { out.append(stack.pop()); } else { break; } } stack.push(c); } else if (c == '(') { stack.push(c); } else if (c == ')') { while (!stack.isEmpty() && stack.peek() != '(') { out.append(stack.pop()); } if (!stack.isEmpty()) { stack.pop(); } } else if (isOperand(c)) { out.append(c); } } while (!stack.empty()) { out.append(stack.pop()); } return out.toString(); } public int evaluatePostfix(String postfixExpr) { char[] chars = postfixExpr.tochararray(); Stack<Integer> stack = new Stack<Integer>(); for (char c : chars) { if (isOperand(c)) { stack.push(c - '0'); // convert char to int val } else if (isOperator(c)) { int op1 = stack.pop(); int op2 = stack.pop(); int result; switch (c) { case '*': result = op1 * op2; stack.push(result); break; case '/': result = op2 / op1; stack.push(result); break; case '+': result = op1 + op2; stack.push(result); break; case '-': result = op2 - op1; stack.push(result); break; } } } return stack.pop(); } private int getPrecedence(char operator) { int ret = 0; if (operator == '-' || operator == '+') { ret = 1; } else if (operator == '*' || operator == '/') { ret = 2; } return ret; } private boolean operatorGreaterOrEqual(char op1, char op2) { return getPrecedence(op1) >= getPrecedence(op2); } private boolean isOperator(char val) { return operators.indexOf(val) >= 0; } private boolean isOperand(char val) { return operands.indexOf(val) >= 0; }}
详情请阅读http://willcode4beer.com/design.jsp?set=evalInfix
http://www.java2novice.com/data-structures-in-java/stacks/infix-expression/
总结以上是内存溢出为你收集整理的java – 计算器不处理两个运算符方程全部内容,希望文章能够帮你解决java – 计算器不处理两个运算符方程所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)