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

暑假自学Java期间,为了练习Java编写的计算器001版本

  1 import java.util.ArrayList;
  2 //v1.0支持+-*/,负号
  3 import java.util.Scanner;
  4 public class Caculator_001
  5 {
  6     public static void main(String[] args)
  7     {
  8         Scanner input=new Scanner(System.in);
  9         double result;
 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<String> jiSuan1=new ArrayList<String>();
 27         ArrayList<Double> jiSuan2=new ArrayList<Double>();
 28         ArrayList<Double> re=new ArrayList<Double>();
 29         ArrayList<Double> num=separateNum(strIn);//分离数字
 30         ArrayList<Integer> serNum=new ArrayList<Integer>();
 31         ArrayList<String>  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<bra.length;i++)
 40         {
 41             if(m<bra[i][0])
 42             {
 43                 m=bra[i][0];
 44             }
 45         }
 46         int i=0,k,t=0,d,f=1,g=1,n,r1=-1,r2=0,l1=-1,l2=-1;//t,d 相对应的一对括号
 47         for(i=m;i>=0;i--)//层数循环
 48         {
 49             for(t=0;t<bra.length;t++)
 50             {
 51                 if(bra[t][0]==i)//每一对括号
 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<bra[d][1];k+=2)//将需要计算的部分输入jiSuan1中
 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<serNum.size();k++)//将需要计算的部分输入jiSuan2中serNum.get(k)
 79                     {
 80                         n=serNum.get(k);
 81                         if(n>bra[t][1]&&n<bra[d][1])
 82                         {
 83                             jiSuan2.add(num.get(k));
 84                             r2++;
 85                         if(g==1)
 86                             {
 87                                 l2=k;
 88                                 g=0;
 89                             }
 90                         }
 91                     }
 92                     for(int x=l1;x<=r1&&l1>=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<r2;z++)
108                     {
109                         num.remove(l2);
110                     }
111                     num.add(l2, result);
112                     //计算
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<String> sToA(String s)  //将 String 转化为 ArrayList
125     {
126        ArrayList<String> a=new ArrayList<String>();
127        for(int i=0;i<s.length();i++)
128        {
129            a.add(s.substring(i, i+1));
130        }
131        return a;
132
133     }
134     private static String aToS(ArrayList<String> a)  //将 String 转化为 ArrayList
135     {
136        String s="";
137        for(int i=0;i<a.size();i++)
138        {
139            s=s+a.get(i);
140        }
141       return s;
142     }
143
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         return s;
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         return s;
209     }
210     private static String addBrackets(String s)
211     {
212         if(!(s.charAt(0)==‘(‘&&s.charAt(s.length()-1)==‘)‘))
213         {
214             s="("+s+")";
215         }
216         return s;
217     }
218     private static int brackets0(ArrayList<String> str)   //实现括号的粗略统计
219     {
220         ArrayList<String> s=new ArrayList<String>(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             return c;
241     }
242
243     private static ArrayList<Integer> serialNumber(ArrayList<String> s) //实现数字的统计
244     {
245         ArrayList<Integer> a=new ArrayList<Integer>();
246         int i=0;
247         String str;
248         char c;
249         for(i=0;i<s.size();i++)
250         {
251             str=s.get(i);
252             c=str.charAt(0);
253             if(c>=‘0‘&&c<=‘9‘)
254             {
255                 a.add(i);
256             }
257
258         }
259         return a;
260     }
261     private static int[][] brackets( ArrayList<String> sym) //实现括号的统计
262     {
263        //                   +(-*(+)/(-+*(-))-*(+-(-)))+*(-)
264        ArrayList<Integer> b1=new ArrayList<Integer>();//层数
265        ArrayList<Integer> b2=new ArrayList<Integer>();//位置
266        int c=-1;//层数
267        int cm=0;//最大层数
268        int i,f=1;
269       String s=aToS(sym);
270        for( i=0;i<s.length();i++)
271        {
272
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<c)
294            {
295                cm=c;
296            }
297
298        }
299
300
301              int bra[][]=new int[b1.size()][2];//第一 维序号,第二维层数、位置
302              for(i=0;i<b1.size();i++)
303              {
304                  bra[i][0]=b1.get(i);
305                  bra[i][1]=b2.get(i);
306              }
307
308         return bra;
309
310     }
311
312    private static double caculate(ArrayList<String> s,ArrayList<Double> 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         return result;
370     }
371
372
373     private static ArrayList<Double> separateNum(String s)
374     {
375         ArrayList<Double> num=new ArrayList<Double>();
376         String c="";
377         int i=0,t=0,f=0,l;
378         double d=0,a;
379         for(i=0;i<s.length();i++)
380         {
381             if(s.charAt(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<l;t++)
392                 {
393                     a=c.charAt(t)-‘0‘;
394
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         return num;
406     }
407     private static ArrayList<String> separateSym(String s)
408     {
409         ArrayList<String> sym=new ArrayList<String>();
410         int f=1;
411         if(s.charAt(0)<‘0‘||s.charAt(0)>‘9‘)
412         {
413             s="0+"+s;
414         }
415             for(int i=0;i<s.length();i++)
416             {
417                 if(s.charAt(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         return sym;
436     }
437     private static void judge(String s)//验证式子是否正确
438     {
439         try
440         {
441             //字符是否正确
442             for(int i=0,f=0;i<s.length();i++)
443             {
444                 f=0;
445                 if(s.charAt(i)==‘+‘||s.charAt(i)==‘-‘||s.charAt(i)==‘*‘||s.charAt(i)==‘/‘||s.charAt(i)==‘(‘||s.charAt(i)==‘)‘)
446                 {
447                     f=1;
448                 }
449                 if(s.charAt(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<s.length();i++)
462         {
463             if(s.charAt(i)==‘(‘)
464             {
465                 left++;
466             }
467             if(s.charAt(i)==‘)‘)
468             {
469                 right++;
470             }
471
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<s.length();i++)
482         {
483             if(s.charAt(i)==‘+‘||s.charAt(i)==‘-‘)
484             {
485                 if(s.charAt(i-1)==‘+‘||s.charAt(i-1)==‘-‘||s.charAt(i-1)==‘*‘||s.charAt(i-1)==‘/‘)
486                 {
487                     throw  new Exception("运算符"+s.charAt(i)+"左边没有数字,位置:"+(i+f));
488                 }
489                 if(s.charAt(i+1)==‘+‘||s.charAt(i+1)==‘-‘||s.charAt(i+1)==‘*‘||s.charAt(i+1)==‘/‘||s.charAt(i+1)==‘)‘)
490                 {
491                     throw  new Exception("运算符"+s.charAt(i)+"右边没有数字,位置:"+(i+f));
492                 }
493                 if(s.charAt(s.length()-1)==‘+‘||s.charAt(s.length()-1)==‘-‘||s.charAt(s.length()-1)==‘*‘||s.charAt(s.length()-1)==‘/‘)
494                 {
495                     throw  new Exception("运算符"+s.charAt(s.length()-1)+"右边没有数字,位置:"+(s.length()-1+f));
496                 }
497             }
498             if(s.charAt(i)==‘*‘||s.charAt(i)==‘/‘)
499             {
500                 if(s.charAt(i-1)==‘+‘||s.charAt(i-1)==‘-‘||s.charAt(i-1)==‘*‘||s.charAt(i-1)==‘/‘||s.charAt(i-1)==‘(‘)
501                 {
502                     throw  new Exception("运算符"+s.charAt(i)+"左边没有数字,位置:"+(i+f));
503                 }
504                 if(s.charAt(i+1)==‘+‘||s.charAt(i+1)==‘-‘||s.charAt(i+1)==‘*‘||s.charAt(i+1)==‘/‘||s.charAt(i+1)==‘)‘)
505                 {
506                     throw  new Exception("运算符"+s.charAt(i)+"右边没有数字,位置:"+(i+f));
507                 }
508                 if(s.charAt(s.length()-1)==‘+‘||s.charAt(s.length()-1)==‘-‘||s.charAt(s.length()-1)==‘*‘||s.charAt(s.length()-1)==‘/‘)
509                 {
510                     throw  new Exception("运算符"+s.charAt(s.length()-1)+"右边没有数字,位置:"+(s.length()-1+f));
511                 }
512             }
513         }
514         }catch(Exception e)
515         {
516             System.out.println(e.getMessage());
517         }
518     }
519
520     private static void output(String s,double b)
521     {
522         System.out.println(s+" = "+b);
523     }
524 }

原文地址:https://www.cnblogs.com/26never/p/9576473.html

时间: 2024-10-15 10:13:43

Java_计算器001,支持加减乘除,括号运算的相关文章

Java_计算器001,支持加减乘除,括号,小数点,√,^ 运算

对于001版本变更了对于负数的处理方式,增加了小数.√.^ 1 package caculator_002; 2 import java.util.ArrayList; 3 //001支持+-*/,负号 4 //002预期 支持小数点 开n次幂 求n次幂 5 6 import java.util.Scanner; 7 public class Caculator_002 8 { 9 public static void main(String[] args) 10 { 11 Scanner in

完美的js实现的计算器,带加减乘除号

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>计算器</title> <style> /*Basic reset*/ *{ margin:0; padding:0; box-sizing: border-box; font: 14px Arial,sans-serif; } html{ he

数据结构实验:栈实现计算器(表达式计算)

原创作品转载请注明出处 欢迎抄袭,造福各位伸手党 /************************************************************************* > File Name: evaluator.cpp > Author: acvcla > version 1.01 > QQ:[email protected] > Mail: [email protected] > Created Time: 2014年11月17日 星

计算器(console version)

题目描述 请用python编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 输入描述 数字包括"0123456789",小数点为".",运算符包括:加("+"),减("-"),乘("*"),除("/"),乘方("^"),括号("()") 需要从命

Python 迭代器&amp;生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

程序员修仙之路- CXO让我做一个计算器!!

菜菜呀,个税最近改革了,我得重新计算你的工资呀,我需要个计算器,你开发一个吧 CEO,CTO,CFO于一身的CXO X总,咱不会买一个吗? 菜菜 那不得花钱吗,一块钱也是钱呀··这个计算器支持加减乘除运算就行,很简单 CEO,CTO,CFO于一身的CXO (尼玛)那能不能给我涨点工资呀? 菜菜 公司现在很困难,你这个计算器关系到公司的存亡,你要注意呀!! CEO,CTO,CFO于一身的CXO (关于撇开话题佩服的五体投地)好吧X总,我尽快做 菜菜 给你一天时间,我这里着急要用 CEO,CTO,C

Python 70行代码实现简单算式计算器

描述:用户输入一系列算式字符串,程序返回计算结果. 要求:不使用eval.exec函数. 实现思路:找到当前字符串优先级最高的表达式,在算术运算中,()优先级最高,则取出算式最底层的(),再进行加减乘除运算.对于加减乘除,也要确立一个优先级,可以使用一个运算符列表,用for循环逐个处理运算符,并且要考虑同级情况(如for遍历至*时,也要考虑同级别的\是否要提前运算).不断循环上述过程,直到最终得到一个结果. 关键点:使用re模块匹配出当前状态下优先级最高的算式. result = re.sear

Python开发桌面微型计算器

开发Windows窗口需要用到tkinter库 所以上来的第一件事就是: import tkinter as t window = t.Tk()#创建了一个窗口 window.title('微型计算器')#这个窗口的名字叫‘微型计算器’ window.geometry('250x150')#这个窗口的大小为250*150.Warning:两个数字之间的符号不是*,而是小写字母x! 这样一来我们便完成了第一件事把一个“空桶”创建好了,接下来往其中加入新的元素. def hit_me():#这个函数

C语言实现“计算器”

支持 加减乘除 混合运算.具体设计见代码. #include <assert.h> #include <stdio.h> /////////////////////////////////////////////////////////////////////////////// typedef char bool; #define true 1 #define false 0 typedef struct { const char *szExp; int nPos; } Cont