计算器开发问题:如何修改Java代码计算2*5*7+1+4并在TextView显示结果
解决计算器带优先级运算的问题
嘿,我来帮你搞定这个计算器的问题!你的现有代码只是把输入的表达式拆分成了数字和运算符的列表,但还没实现带运算优先级的计算逻辑——这就是你需要补充的核心部分。咱们一步步修改:
问题分析
你的代码已经完成了表达式拆分的工作,比如输入2*5*7+1+4会被拆成["2", "*", "5", "*", "7", "+", "1", "+", "4"]。但如果直接从左到右计算,虽然这个例子结果碰巧正确,但遇到2+5*7这种需要先算乘除的情况就会出错。所以我们必须先处理所有乘除运算,再处理加减运算,才能符合数学运算规则。
修改后的完整代码
s1 = (edt1.getText()+""); ArrayList<String> buffer = new ArrayList<String>(); String temp = ""; // 第一步:拆分表达式为数字和运算符列表(优化原有的拆分逻辑) for (int j = 0; j < s1.length(); j++) { if (Character.isDigit(s1.charAt(j)) || s1.charAt(j) == '.') { char c1 = s1.charAt(j); temp = temp + String.valueOf(c1); } // 改成else if,避免同一个字符触发两个判断逻辑,让代码更严谨 else if (s1.charAt(j) == '+' || s1.charAt(j) == '-' || s1.charAt(j) == '*' || s1.charAt(j) == '/') { buffer.add(temp); temp = ""; buffer.add(String.valueOf(s1.charAt(j))); } } buffer.add(temp); // 第二步:优先处理乘除运算(优先级高于加减) int i = 0; while (i < buffer.size()) { String op = buffer.get(i); if (op.equals("*") || op.equals("/")) { // 获取运算符前后的数字 double num1 = Double.parseDouble(buffer.get(i-1)); double num2 = Double.parseDouble(buffer.get(i+1)); double result = 0; if (op.equals("*")) { result = num1 * num2; } else if (op.equals("/")) { // 增加除数不为0的判断,避免程序崩溃 if (num2 != 0) { result = num1 / num2; } else { // 这里可以换成你需要的错误提示逻辑 textView.setText("错误:除数不能为0"); return; } } // 用计算结果替换掉运算符和前后两个数字 buffer.set(i-1, String.valueOf(result)); buffer.remove(i); buffer.remove(i); // 移除后原i+1位置的元素会前移到i,所以再移除一次 i--; // 回退索引,避免跳过相邻的乘除运算 } i++; } // 第三步:处理剩余的加减运算 double finalResult = Double.parseDouble(buffer.get(0)); i = 1; while (i < buffer.size()) { String op = buffer.get(i); double num = Double.parseDouble(buffer.get(i+1)); if (op.equals("+")) { finalResult += num; } else if (op.equals("-")) { finalResult -= num; } i += 2; // 每次跳过运算符和数字,步进2 } // 将最终结果显示到TextView textView.setText(String.valueOf(finalResult));
关键修改点说明
- 拆分逻辑优化:把第二个
if改为else if,避免运算符字符同时触发数字判断的分支,逻辑更严谨。 - 乘除优先计算:遍历拆分后的列表,遇到
*或/就立即计算前后数字的结果,替换掉这三个元素,直到所有乘除运算处理完毕。 - 加减顺序计算:乘除处理完成后,列表里只剩下加减运算符和数字,直接从左到右依次计算即可。
- 异常处理:增加了除数为0的判断,避免程序崩溃,你可以根据需求调整错误提示的样式。
这样修改后,输入2*5*7+1+4会先算出2*5=10,再算10*7=70,接着70+1=71,最后71+4=75,得到正确结果;如果输入2+5*7,也会先计算5*7=35,再算出2+35=37,完全符合数学运算优先级规则。
内容的提问来源于stack exchange,提问作者shyam
相关产品推荐
相关产品推荐

