加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 计算器不处理两个运算符方程

发布时间:2020-12-15 02:15:02 所属栏目:Java 来源:网络整理
导读:我正在开发一个计算器应用程序,并且所有功能都已关闭.唯一的问题是,当我输入包含两个算术运算符的等式时,它会发生故障.例如,如果输入“2√9”则返回3,如果输入“√92”,则强制关闭并显示“无效双√9”.请帮忙. ScientificCalculator.java String prevAnswer
我正在开发一个计算器应用程序,并且所有功能都已关闭.唯一的问题是,当我输入包含两个算术运算符的等式时,它会发生故障.例如,如果输入“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&lt;Character&gt; stack = new Stack&lt;Character&gt;();
                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&lt;Integer&gt; stack = new Stack&lt;Integer&gt;();
                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) &gt;= getPrecedence(op2);
        }

        private boolean isOperator(char val) {
                return operators.indexOf(val) &gt;= 0;
        }

        private boolean isOperand(char val) {
                return operands.indexOf(val) &gt;= 0;
        }

}

详情请阅读http://willcode4beer.com/design.jsp?set=evalInfix

http://www.java2novice.com/data-structures-in-java/stacks/infix-expression/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读