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

java– 计算器不处理两个运算符方程,第1张

概述我正在开发一个计算器应用程序,并且所有功能都已关闭.唯一的问题是,当我输入包含两个算术运算符的等式时,它会发生故障.例如,如果输入“2√9”则返回3,如果输入“√92”,则强制关闭并显示“无效双√9”.请帮忙.ScientificCalculator.javaStringprevAnswer="";TextViewformu

我正在开发一个计算器应用程序,并且所有功能都已关闭.唯一的问题是,当我输入包含两个算术运算符的等式时,它会发生故障.例如,如果输入“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&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/

总结

以上是内存溢出为你收集整理的java – 计算器不处理两个运算符方程全部内容,希望文章能够帮你解决java – 计算器不处理两个运算符方程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1119852.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存