java加减乘除括号运算_Java_计算器001,支持加减乘除,括号运算

这个Java程序实现了简单的计算器功能,能够处理加减乘除以及括号运算。程序通过读取用户输入的数学表达式,进行预处理(处理负号、正号和括号),然后通过递归方式处理括号内的运算,最终得出计算结果。代码中包含了对输入的合法性验证,以及错误处理机制。
摘要由CSDN通过智能技术生成

1 importjava.util.ArrayList;2 //v1.0支持+-*/,负号

3 importjava.util.Scanner;4 public classCaculator_0015 {6 public static voidmain(String[] args)7 {8 Scanner input=newScanner(System.in);9 doubleresult;10 String strIn;//="1+(2-3*(5+1)/(-4+2*(-6))-3*(+6-(-2)))+6*(5-4)";

11 System.out.println("请输入需要计算的式子:(不要有空格)");12 strIn=input.nextLine();13 center(strIn);14

15 input.close();16 }17

18 private static void center(String strIn)//计算器主体

19 {20 //计算前进行验证处理

21 judge(strIn);22 String str0=strIn;//留存备份

23 strIn=minus(strIn);//负号

24 strIn=plus(strIn);//正号

25 strIn=addBrackets(strIn);//保持最外围有括号

26 ArrayList jiSuan1=new ArrayList();27 ArrayList jiSuan2=new ArrayList();28 ArrayList re=new ArrayList();29 ArrayList num=separateNum(strIn);//分离数字

30 ArrayList serNum=new ArrayList();31 ArrayList sym=separateSym(strIn);//分离运算符

32 serNum=serialNumber(sym);//统计数字

33 double result=0;//总计算结果

34 int cm=brackets0(sym);//总括号数

35 int bra [][]=new int[cm][2];36 bra=brackets(sym);//括号统计

37

38 int m=0;//m 最大层数

39 for(int i=0;i

47 for(i=m;i>=0;i--)//层数循环

48 {49 for(t=0;t

52 {53 d=t;54 jiSuan1.clear();//清空

55 jiSuan2.clear();56 re.clear();57 for(;;)//找出相对应的另一半括号

58 {59 d++;60 if(bra[d][0]==bra[t][0])61 {62 break;63 }64 }65 l1=bra[t][1];66 r1=bra[d][1];67 for(k=bra[t][1]+2;k

68 {69

70 jiSuan1.add(sym.get(k));71 /*if(g1==1)72 {73 k1=k;74 g1=0;75 }*/

76 }77 //sym.add(bra[t][0],"0");

78 for(k=0,g=1,l2=0,r2=0;k

79 {80 n=serNum.get(k);81 if(n>bra[t][1]&&n=0&&r1>=0;x++)93 {94 sym.set(x, "@");95 }96 //调用函数计算

97 result=caculate(jiSuan1,jiSuan2);98 //删除

99 int z=l1;100 while(z>=0)101 {102 sym.remove(z);103 z=sym.indexOf("@");104

105 }106 sym.add(l1,"0");107 for(z=0;z

113 bra=brackets(sym);114 serNum=serialNumber(sym);115 //System.out.println(d);

116 t=0;117 }118 }119 }120 output(str0,result);121

122 }123

124 private static ArrayList sToA(String s) //将 String 转化为 ArrayList

125 {126 ArrayList a=new ArrayList();127 for(int i=0;i

133 }134 private static String aToS(ArrayList a) //将 String 转化为 ArrayList

135 {136 String s="";137 for(int i=0;i

144 private static String minus(String s)//对负数进行处理:前面加0

145 {146 String a,b;147 int i=1;148 if(s.charAt(0)=='-')149 {150 s="0"+s;151 }152 while(i!=-1)153 {154 i=s.indexOf('-', i);155 if(i>=0)156 {157

158 if(i>0&&s.charAt(i-1)=='(')159 {160 a=s.substring(0, i);161 b=s.substring(i);162 s=a+"0"+b;163 i+=2;164 }165 else

166 {167 i++;168 }169

170 }171 else

172 break;173 //System.out.println(s);

174 }175 returns;176 }177 private static String plus(String s)//对显式写出的正数进行处理:前面加0

178 {179 String a,b;180 int i=1;181 if(s.charAt(0)=='+')182 {183 s="0"+s;184 }185 while(i!=-1)186 {187 i=s.indexOf('+', i);188 if(i>=0)189 {190

191 if(i>0&&s.charAt(i-1)=='(')192 {193 a=s.substring(0, i);194 b=s.substring(i);195 s=a+"0"+b;196 i+=2;197 }198 else

199 {200 i++;201 }202

203 }204 else

205 break;206 //System.out.println(s);

207 }208 returns;209 }210 private staticString addBrackets(String s)211 {212 if(!(s.charAt(0)=='('&&s.charAt(s.length()-1)==')'))213 {214 s="("+s+")";215 }216 returns;217 }218 private static int brackets0(ArrayList str) //实现括号的粗略统计

219 {220 ArrayList s=new ArrayList(str);221 int c=0,i=0;222 for(;;)223 {224 if((i=s.indexOf("("))<0)225 {226 break;227 }228 s.remove(i);229 c++;230 }231 for(;;)232 {233 if((i=s.indexOf(")"))<0)234 {235 break;236 }237 s.remove(i);238 c++;239 }240 returnc;241 }242

243 private static ArrayList serialNumber(ArrayList s) //实现数字的统计

244 {245 ArrayList a=new ArrayList();246 int i=0;247 String str;248 charc;249 for(i=0;i='0'&&c<='9')254 {255 a.add(i);256 }257

258 }259 returna;260 }261 private static int[][] brackets( ArrayList sym) //实现括号的统计

262 {263 //+(-*(+)/(-+*(-))-*(+-(-)))+*(-)

264 ArrayList b1=new ArrayList();//层数

265 ArrayList b2=new ArrayList();//位置

266 int c=-1;//层数

267 int cm=0;//最大层数

268 int i,f=1;269 String s=aToS(sym);270 for( i=0;i

273 if(s.charAt(i)=='(')274 {275 if(f==1)276 {277 c++;278 }279 f=1;280 b1.add(c);281 b2.add(i);282 }283 if(s.charAt(i)==')')284 {285 if(f==0)286 {287 c--;288 }289 f=0;290 b1.add(c);291 b2.add(i);292 }293 if(cm

298 }299

300

301 int bra[][]=new int[b1.size()][2];//第一 维序号,第二维层数、位置

302 for(i=0;i

308 returnbra;309

310 }311

312 private static double caculate(ArrayList s,ArrayList a) //计算

313

314 {315 double result=0,left,right;316 int i=0;317 while(i>=0)318 {319 i=s.indexOf("/");320 if(i<0)break;321 left=a.remove(i);322 right=a.remove(i);323 try

324 {325 if(Math.abs(right)<10e-8)326 {327 throw new Exception("除数不能为零!");328 }329 a.add(i, left/right);330 }331 catch(Exception e)332 {System.out.println(e.getMessage());333 }334 s.remove(i);335 }336 i=0;337 while(i>=0)338 {339 i=s.indexOf("*");340 if(i<0)break;341 left=a.remove(i);342 right=a.remove(i);343 a.add(i, left*right);344 s.remove(i);345 }346 i=0;347 while(i>=0)348 {349 i=s.indexOf("-");350 if(i<0)break;351 left=a.remove(i);352 right=a.remove(i);353 a.add(i, left-right);354 s.remove(i);355 }356 i=0;357 while(i>=0)358 {359 i=s.indexOf("+");360 if(i<0)break;361 left=a.remove(i);362 right=a.remove(i);363 a.add(i, left+right);364 s.remove(i);365 }366

367 //end

368 result=a.get(0);369 returnresult;370 }371

372

373 private static ArrayListseparateNum(String s)374 {375 ArrayList num=new ArrayList();376 String c="";377 int i=0,t=0,f=0,l;378 double d=0,a;379 for(i=0;i='0'&&s.charAt(i)<='9')382 {383 c=c+s.charAt(i);384 f=1;385 //System.out.println("add"+c);

386 }387 else if(f==1)388 {389 //字符转数字

390 l=c.length();391 for(t=0,d=0;t

395 d=d+a*Math.pow(10,l-1-t);396

397 }398

399 num.add(d);400 f=0;401 c="";402 }403 }404

405 returnnum;406 }407 private static ArrayListseparateSym(String s)408 {409 ArrayList sym=new ArrayList();410 int f=1;411 if(s.charAt(0)'9')412 {413 s="0+"+s;414 }415 for(int i=0;i='0'&&s.charAt(i)<='9')418 {419 f=1;420 }421 else if(f==1)422 {423 sym.add("0");424 f=0;425 }426 if(s.charAt(i)=='+'||s.charAt(i)=='-'||s.charAt(i)=='*'||s.charAt(i)=='/'||s.charAt(i)=='('||s.charAt(i)==')')427 {428 sym.add(s.substring(i,i+1));429 }430

431 }432 //System.out.println(sym);

433 sym.remove(0);434 sym.remove(0);435 returnsym;436 }437 private static void judge(String s)//验证式子是否正确

438 {439 try

440 {441 //字符是否正确

442 for(int i=0,f=0;i='a'&&s.charAt(i)<='z'||s.charAt(i)>='A'&&s.charAt(i)<='Z')450 {451 f=1;452 }453 if(s.charAt(i)>='0'&&s.charAt(i)<='9')454 {455 f=1;456 }457 if(f==0)throw new Exception("未识别的符号\" "+s.charAt(i)+" \",位置:"+(i+1));458 }459 //括号是否匹配

460 int left=0,right=0;461 for(int i=0;i

472 }473 if(left!=right)throw new Exception("括号不匹配");474 //符号是否正确

475 int f=1;476 if(s.charAt(0)=='-')477 {478 s="0"+s;479 f=0;480 }481 for(int i=0;i

520 private static void output(String s,doubleb)521 {522 System.out.println(s+" = "+b);523 }524 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java编写的计算器,能实现加减乘除。 //***该梦幻计算器与Windows附件自带计算器的标准版功能、界面相仿***// //******但还不支持键盘操作,如有需要,下一次等级将满足你**********// import java.awt.*; import java.lang.*; import javax.swing.*; import javax.swing.event.*; import java.awt.event.*; import java.awt.Component.*; import java.awt.color.*; import java.text.DecimalFormat; //*****************************************************************************// //*****************************************************************************// public class Calculator implements ActionListener //导入动作监听接口 { //******************************// //*****设计计算器界面的单位*****// JFrame frame; //定义框架 JTextField textAnswer; //定义输出显示框 JPanel panel, panel1, panel2, panel3;//定义面板作为子容器,从而达到要求的界面效果 JMenuBar mainMenu; JTextField textMemory; JLabel labelMemSpace; //labelMemSpace单纯做摆设,控制面板的形状 JButton buttonBk, buttonCe, buttonC; JButton button[]; JButton buttonMC, buttonMR, buttonMS, buttonMAdd; JButton buttonDot, buttonAddAndSub, buttonAdd, buttonSub, buttonMul,buttonDiv, buttonMod; JButton buttonSqrt, buttonDao, buttonEqual; JMenu editMenu, viewMenu, helpMenu; JMenuItem copyItem, pasteItem, tItem, sItem, numberGroup, topHelp, aboutCal,myCollege; DecimalFormat df; //设置数据输出精度 boolean clickable; //控制当前能否按键 double memoryd; //使用内存存储的数字 int memoryi; double vard, answerd; //用来保存double型数据的间值(vard)和最后结果(answerd) short key = -1, prekey = -1; //key用来保存当前进行何种运算,prekey用来保存前次进行何种运算 boolean clear = false; String copy; //做复制用 JTextArea help; //帮助 JScrollPane scrollHelp; static boolean One =true; //******************// //*****构造函数开始*****// public Calculator() { clickable = true; answerd = 0; frame = new JFrame("梦幻计算器--SWE08008"); frame.setResizable(false);//不允许改变计算器的大小 frame.setLocation(250,150);//设置计算器的起始位置 frame.setBackground(Color.YELLOW); df = new DecimalFormat("0.##############"); //设置数据输出精度(对于double型值)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值