java – 计算器不处理两个运算符方程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 计算器不处理两个运算符方程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7925字,纯文字阅读大概需要12分钟。
内容图文
![java – 计算器不处理两个运算符方程](/upload/InfoBanner/zyjiaocheng/767/f857329957434c82bad7566b2a78c81e.jpg)
我正在开发一个计算器应用程序,并且所有功能都已关闭.唯一的问题是,当我输入包含两个算术运算符的等式时,它会发生故障.例如,如果输入“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
@Override
public 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 – 计算器不处理两个运算符方程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。