Java Swing计算器多运算输出0.0问题及BODMAS规则适配需求
Java Swing计算器多步运算故障修复(支持BODMAS规则)
我用Java Swing开发了一款计算器,已完成窗体创建与按钮布局,采用ActionListener接口实现交互。单步两操作数运算(如5+2)可正常执行,但执行多步多操作数运算(如10+2-5)时,每次输出均为0.0。需要让计算器支持多步运算且遵循BODMAS规则。
现有代码结构
类全局变量
public class Calculator implements ActionListener{ float[] result=new float[10]; char[] operation=new char[10]; int i=0; boolean isOperationClicked=false; // 补全原代码遗漏的变量类型 }
运算按钮(+)的ActionListener实现
else if(e.getSource()==plusbutton) { isOperationClicked=true; String oldValue=displaylabel.getText(); result=new float[10]; result[i]=Float.parseFloat(oldValue); operation=new char[10]; operation[i]= '+'; i++; }
等于按钮的ActionListener实现
else if(e.getSource()==equaltobutton) { int m=0; String finalvalue=displaylabel.getText(); float finalvalueF=Float.parseFloat(finalvalue); result[i]=finalvalueF; while(m<i) { if(operation[m]=='/') { float res=result[m]/result[m+1]; result=removeArrayF(result,m); result[m]=res; operation=removeArrayC(operation,m); i--;m--; } m++; } displaylabel.setText(result[0]+""); }
问题分析与修改方案
1. 运算按钮中重置数组导致历史数据丢失
每次点击运算按钮时,你都执行了result=new float[10];和operation=new char[10];,这会直接清空之前存储的运算数和操作符,导致多步运算时只有最后一次的操作数被保留,最终计算结果出错。
修改方法:删除这两行数组重置代码,仅保留赋值逻辑:
else if(e.getSource()==plusbutton) { isOperationClicked=true; String oldValue=displaylabel.getText(); // 移除数组重置代码 // result=new float[10]; result[i]=Float.parseFloat(oldValue); // operation=new char[10]; operation[i]= '+'; i++; }
其他运算按钮(-、*、/)的逻辑需做同样修改。
2. 等于按钮仅处理除法,未覆盖BODMAS全规则
当前代码只处理了除法,而BODMAS要求先执行乘除(*、/),再执行加减(+、-),需要补充完整的优先级处理逻辑:
修改后的等于按钮代码:
else if(e.getSource()==equaltobutton) { int m=0; String finalvalue=displaylabel.getText(); float finalvalueF=Float.parseFloat(finalvalue); result[i]=finalvalueF; // 第一步:处理乘除(高优先级) m=0; while(m < i) { if(operation[m]=='*') { float res=result[m] * result[m+1]; result=removeArrayF(result,m); result[m]=res; operation=removeArrayC(operation,m); i--;m--; } else if(operation[m]=='/') { // 增加除数为0的错误判断 if(result[m+1] == 0) { displaylabel.setText("Error"); i=0; return; } float res=result[m] / result[m+1]; result=removeArrayF(result,m); result[m]=res; operation=removeArrayC(operation,m); i--;m--; } m++; } // 第二步:处理加减(低优先级) m=0; while(m < i) { if(operation[m]=='+') { float res=result[m] + result[m+1]; result=removeArrayF(result,m); result[m]=res; operation=removeArrayC(operation,m); i--;m--; } else if(operation[m]=='-') { float res=result[m] - result[m+1]; result=removeArrayF(result,m); result[m]=res; operation=removeArrayC(operation,m); i--;m--; } m++; } displaylabel.setText(String.valueOf(result[0])); // 运算完成后重置索引,准备下一次运算 i=0; }
3. 状态重置与变量补全
- 确保
isOperationClicked变量已声明boolean类型; - 点击等于按钮运算完成后,必须重置
i=0,否则下次运算会从旧索引继续,引发数组越界或数据混乱; - 数字按钮的逻辑要配合
isOperationClicked:点击运算按钮后,isOperationClicked设为true,此时点击数字按钮应清空显示屏输入新数字,并将isOperationClicked重置为false。
4. 替换数组为集合避免越界风险
固定长度数组(10个元素)无法支持超过10步的运算,建议用ArrayList替代数组,更灵活且无需手动管理长度:
替换后的全局变量:
public class Calculator implements ActionListener{ ArrayList<Float> resultList = new ArrayList<>(); ArrayList<Character> operationList = new ArrayList<>(); boolean isOperationClicked=false; }
运算按钮修改示例:
else if(e.getSource()==plusbutton) { isOperationClicked=true; String oldValue=displaylabel.getText(); resultList.add(Float.parseFloat(oldValue)); operationList.add('+'); }
等于按钮处理逻辑简化示例:
// 处理乘法时 float res = resultList.get(m) * resultList.get(m+1); resultList.remove(m); resultList.set(m, res); operationList.remove(m); // 无需维护i变量,直接用resultList.size()判断运算进度
内容的提问来源于stack exchange,提问作者Amalshanth
相关产品推荐
相关产品推荐

