Java_计算器001,⽀持加减乘除,括号运算暑假⾃学Java期间,为了练习Java编写的计算器001版本
1import java.util.ArrayList;
2//v1.0⽀持+-*/,负号
3import java.util.Scanner;
4public class Caculator_001
5 {
6public static void main(String[] args)
7    {
8        Scanner input=new Scanner(System.in);
9double result;
10        String strIn;//="1+(2-3*(5+1)/(-4+2*(-6))-3*(+6-(-2)))+6*(5-4)";
11        System.out.println("请输⼊需要计算的式⼦:(不要有空格)");
12        Line();
13        center(strIn);
14
15        input.close();
16    }
17
18private 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);//统计数字
33double result=0;//总计算结果
34int cm=brackets0(sym);//总括号数
35int bra [][]=new int[cm][2];
36        bra=brackets(sym);//括号统计
37
38int m=0;//m 最⼤层数
39for(int i=0;i<bra.length;i++)
40        {
41if(m<bra[i][0])
42            {
43                m=bra[i][0];
44            }
45        }
46int i=0,k,t=0,d,f=1,g=1,n,r1=-1,r2=0,l1=-1,l2=-1;//t,d 相对应的⼀对括号
47for(i=m;i>=0;i--)//层数循环
48        {
49for(t=0;t<bra.length;t++)
50            {
51if(bra[t][0]==i)//每⼀对括号
52                {
53                    d=t;
54                    jiSuan1.clear();//清空
55                    jiSuan2.clear();
56                    re.clear();
57for(;;)//出相对应的另⼀半括号
58                    {
59                        d++;
60if(bra[d][0]==bra[t][0])
61                        {
62break;
63                        }
64                    }
65                    l1=bra[t][1];
66                    r1=bra[d][1];
67for(k=bra[t][1]+2;k<bra[d][1];k+=2)//将需要计算的部分输⼊jiSuan1中
68                    {
69
70                        jiSuan1.(k));
71/*if(g1==1)
72                        {
73                            k1=k;
74                            g1=0;
75                        }*/
76                    }
77//    sym.add(bra[t][0],"0");
80                        (k);
81if(n>bra[t][1]&&n<bra[d][1])
82                        {
83                            jiSuan2.(k));
84                            r2++;
85if(g==1)
86                            {
87                                l2=k;
88                                g=0;
89                            }
90                        }
91                    }
92for(int x=l1;x<=r1&&l1>=0&&r1>=0;x++)
93                    {
94                        sym.set(x, "@");
95                    }
96//调⽤函数计算
97                    result=caculate(jiSuan1,jiSuan2);
98//删除
99int z=l1;
100while(z>=0)
101                    {
102                        ve(z);
103                        z=sym.indexOf("@");
104
105                    }
106                    sym.add(l1,"0");
107for(z=0;z<r2;z++)
108                    {
109                        ve(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
124private static ArrayList<String> sToA(String s)  //将 String 转化为 ArrayList 125    {
126        ArrayList<String> a=new ArrayList<String>();
127for(int i=0;i<s.length();i++)
128        {
129            a.add(s.substring(i, i+1));
130        }
131return a;
132
133    }
134private static String aToS(ArrayList<String> a)  //将 String 转化为 ArrayList 135    {
136        String s="";
137for(int i=0;i<a.size();i++)
用java编写一个简单的计算器138        {
139            s=(i);
140        }
141return s;
142    }
143
144private static String minus(String s)//对负数进⾏处理:前⾯加0
145    {
146        String a,b;
147int i=1;
148if(s.charAt(0)=='-')
149          {
150              s="0"+s;
151          }
152while(i!=-1)
153        {
154            i=s.indexOf('-', i);
155if(i>=0)
156            {
157
158if(i>0&&s.charAt(i-1)=='(')
159                {
160                a=s.substring(0, i);
161                b=s.substring(i);
164                }
165else
166                {
167                    i++;
168                }
169
170            }
171else
172break;
173//System.out.println(s);
174        }
175return s;
176    }
177private static String plus(String s)//对显式写出的正数进⾏处理:前⾯加0
178    {
179        String a,b;
180int i=1;
181if(s.charAt(0)=='+')
182          {
183              s="0"+s;
184          }
185while(i!=-1)
186        {
187            i=s.indexOf('+', i);
188if(i>=0)
189            {
190
191if(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                }
198else
199                {
200                    i++;
201                }
202
203            }
204else
205break;
206//System.out.println(s);
207        }
208return s;
209    }
210private static String addBrackets(String s)
211    {
212if(!(s.charAt(0)=='('&&s.charAt(s.length()-1)==')'))
213        {
214            s="("+s+")";
215        }
216return s;
217    }
218private static int brackets0(ArrayList<String> str)  //实现括号的粗略统计
219    {
220        ArrayList<String> s=new ArrayList<String>(str);
221int c=0,i=0;
222for(;;)
223        {
224if((i=s.indexOf("("))<0)
225            {
226break;
227            }
228            s.remove(i);
229                c++;
230        }
231for(;;)
232        {
233if((i=s.indexOf(")"))<0)
234            {
235break;
236            }
237            s.remove(i);
238                c++;
239        }
240return c;
241    }
242
243private static ArrayList<Integer> serialNumber(ArrayList<String> s) //实现数字的统计244    {
245        ArrayList<Integer> a=new ArrayList<Integer>();
247        String str;
248char c;
249for(i=0;i<s.size();i++)
250        {
251            (i);
252            c=str.charAt(0);
253if(c>='0'&&c<='9')
254            {
255                a.add(i);
256            }
257
258        }
259return a;
260    }
261private static int[][] brackets( ArrayList<String> sym) //实现括号的统计
262    {
263//                  +(-*(+)/(-+*(-))-*(+-(-)))+*(-)
264        ArrayList<Integer> b1=new ArrayList<Integer>();//层数
265        ArrayList<Integer> b2=new ArrayList<Integer>();//位置
266int c=-1;//层数
267int cm=0;//最⼤层数
268int i,f=1;
269      String s=aToS(sym);
270for( i=0;i<s.length();i++)
271        {
272
273if(s.charAt(i)=='(')
274            {
275if(f==1)
276                {
277                c++;
278                }
279                f=1;
280                b1.add(c);
281            b2.add(i);
282            }
283if(s.charAt(i)==')')
284            {
285if(f==0)
286                {
287                c--;
288                }
289                f=0;
290                b1.add(c);
291            b2.add(i);
292            }
293if(cm<c)
294            {
295                cm=c;
296            }
297
298        }
299
300
301int bra[][]=new int[b1.size()][2];//第⼀维序号,第⼆维层数、位置
302for(i=0;i<b1.size();i++)
303              {
304                  bra[i][0]=b1.get(i);
305                  bra[i][1]=b2.get(i);
306              }
307
308return bra;
309
310    }
311
312private static double caculate(ArrayList<String> s,ArrayList<Double> a) //计算313
314    {
315double result=0,left,right;
316int i=0;
317while(i>=0)
318        {
319                i=s.indexOf("/");
320if(i<0)break;
321                ve(i);
322                ve(i);
323try
324                {
325if(Math.abs(right)<10e-8)
326                    {
327throw new Exception("除数不能为零!");
328                    }
329                    a.add(i, left/right);
331catch(Exception e)
332                {System.out.Message());
333                }
334                s.remove(i);
335        }
336        i=0;
337while(i>=0)
338          {
339              i=s.indexOf("*");
340if(i<0)break;
341              ve(i);
342              ve(i);
343              a.add(i, left*right);
344              s.remove(i);
345          }
346          i=0;
347while(i>=0)
348          {
349              i=s.indexOf("-");
350if(i<0)break;
351              ve(i);
352              ve(i);
353              a.add(i, left-right);
354              s.remove(i);
355          }
356          i=0;
357while(i>=0)
358          {
359              i=s.indexOf("+");
360if(i<0)break;
361              ve(i);
362              ve(i);
363              a.add(i, left+right);
364              s.remove(i);
365          }
366
367//end
368            (0);
369return result;
370    }
371
372
373private static ArrayList<Double> separateNum(String s) 374    {
375        ArrayList<Double> num=new ArrayList<Double>(); 376        String c="";
377int i=0,t=0,f=0,l;
378double d=0,a;
379for(i=0;i<s.length();i++)
380        {
381if(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            }
387else if(f==1)
388            {
389//字符转数字
390                l=c.length();
391for(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
405return num;
406    }
407private static ArrayList<String> separateSym(String s) 408    {
409        ArrayList<String> sym=new ArrayList<String>(); 410int f=1;
411if(s.charAt(0)<'0'||s.charAt(0)>'9')
412        {
413            s="0+"+s;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。