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小时内删除。
发表评论