一、需求分析:
日常生活中,我们经常会碰到一些计算问题,因计算量大而复杂,是人头痛,所以计算器就诞生了。计算器这一小小的程序机器实际上是从计算机中割裂出来的衍生品,但因其方便快捷的操作模式,已经被广泛应用于商业等日常生活中,极大的方便了人们对于数字的整合运算。
二、程序功法及说明:
1 /*实现基本数学运算、函数等功能:加、减、乘、除、阶乘、正弦、余弦和指数运算。
2 界面将模拟Windows中的计算器程序。*/
3 import javax.swing.*;
4 import java.awt.*;
5 import java.awt.event.*;
6 import java.io.FileInputStream;
7 import java.io.FileOutputStream;
8 import java.io.ObjectInputStream;
9 import java.io.ObjectOutputStream;
10 import java.util.Hashtable;
11
12 public class Calculator extends Frame implements ActionListener{
13
14 Panel txtpanel,btnpanel,southpanel;
15 JTextField txtinput;
16 JButton b1,b2,b3,b4,b5,b6,b7,b8,b9,b0,bdes,bf;
17 JButton chengbtn,chubtn,jiabtn,jianbtn,clearbtn,equalbtn,sinbtn,cosbtn,jiechengbtn,sqrtbtn,zhishubtn,daoshubtn;
18 double sum,result;
19 Menu editM,searchM,helpM;
20 MenuBar bar;
21 String sign;
22 boolean bool=true;
23
24 public Calculator()
25 {
26 super("计算器");
27 txtpanel=new Panel();
28 btnpanel=new Panel();
29 southpanel=new Panel();
30 txtinput=new JTextField(40);
31 txtinput.setEditable(false);
32 txtinput.setText("");
33 bar=new MenuBar();
34
35 helpM=new Menu("帮助");
36 helpM.add(new MenuItem("帮助主题"));
37 helpM.addSeparator();
38 helpM.add(new MenuItem("sin 正弦"));
39 helpM.add(new MenuItem("cos 余弦"));
40 helpM.add(new MenuItem("! 阶乘"));
41 helpM.add(new MenuItem("C 清除"));
42 helpM.add(new MenuItem("÷ 除"));
43 helpM.add(new MenuItem("* 乘"));
44 helpM.add(new MenuItem("+ 加"));
45 helpM.add(new MenuItem("- 减"));
46 helpM.add(new MenuItem("+/- 正负变号"));
47 helpM.add(new MenuItem("√ 开方"));
48 helpM.add(new MenuItem("1/x 倒数x^y"));
49 helpM.add(new MenuItem("x^y 次方"));
50 helpM.add(new MenuItem("1~9 数字键"));
51 helpM.add(new MenuItem("= 等于"));
52 bar.add(helpM);
53
54 setMenuBar(bar);
55 //关联各键与符号并设置键的符号字体大小及颜色
56 b1=new JButton("1");
57 b1.setFont (new Font("1",Font.BOLD,20));
58 b1.setForeground(Color.black);
59
60 b2=new JButton("2");
61 b2.setFont (new Font("2",Font.BOLD,20));
62 b2.setForeground(Color.black);
63
64 b3=new JButton("3");
65 b3.setFont (new Font("3",Font.BOLD,20));
66 b3.setForeground(Color.black);
67
68 b4=new JButton("4");
69 b4.setFont (new Font("4",Font.BOLD,20));
70 b4.setForeground(Color.black);
71
72 b5=new JButton("5");
73 b5.setFont (new Font("5",Font.BOLD,20));
74 b5.setForeground(Color.black);
75
76 b6=new JButton("6");
77 b6.setFont (new Font("6",Font.BOLD,20));
78 b6.setForeground(Color.black);
79
80 b7=new JButton("7");
81 b7.setFont (new Font("7",Font.BOLD,20));
82 b7.setForeground(Color.black);
83
84 b8=new JButton("8");
85 b8.setFont (new Font("8",Font.BOLD,20));
86 b8.setForeground(Color.black);
87
88 b9=new JButton("9");
89 b9.setFont (new Font("9",Font.BOLD,20));
90 b9.setForeground(Color.black);
91
92 b0=new JButton("0");
93 b0.setFont (new Font("0",Font.BOLD,20));
94 b0.setForeground(Color.black);
95
96 bdes=new JButton(".");
97 bdes.setFont (new Font(".",Font.BOLD,20));
98 bdes.setForeground(Color.black);
99
100 bf=new JButton("+/-");
101 bf.setFont (new Font("+/-",Font.BOLD,20));
102 bf.setForeground(Color.red);
103
104 chengbtn=new JButton("*");
105 chengbtn.setFont(new Font("*",Font.BOLD,20));
106 chengbtn.setForeground(Color.red);
107
108 chubtn=new JButton("÷");
109 chubtn.setFont(new Font("÷",Font.BOLD,20));
110 chubtn.setForeground(Color.red);
111
112 jiabtn=new JButton("+");
113 jiabtn.setFont(new Font("+",Font.BOLD,20));
114 jiabtn.setForeground(Color.red);
115
116 jianbtn=new JButton("-");
117 jianbtn.setFont(new Font("-",Font.BOLD,20));
118 jianbtn.setForeground(Color.red);
119
120 clearbtn=new JButton("C");
121 clearbtn.setFont(new Font("C",Font.BOLD,20));
122 clearbtn.setForeground(Color.red);
123 clearbtn.addActionListener(new ActionListener()//创建监听器
124 {
125 public void actionPerformed(ActionEvent e){
126 txtinput.setText("");
127 }
128 });
129
130 sinbtn=new JButton("sin");
131 sinbtn.setFont(new Font("sin",Font.BOLD,15));
132 sinbtn.setForeground(Color.red);
133
134 cosbtn=new JButton("cos");
135 cosbtn.setFont(new Font("cos",Font.BOLD,15));
136 cosbtn.setForeground(Color.red);
137
138 sqrtbtn=new JButton("√");
139 sqrtbtn.setFont(new Font("√",Font.BOLD,15));
140 sqrtbtn.setForeground(Color.red);
141
142 zhishubtn=new JButton("x^y");
143 zhishubtn.setFont(new Font("x^y",Font.BOLD,15));
144 zhishubtn.setForeground(Color.red);
145
146 daoshubtn=new JButton("1/x");
147 daoshubtn.setFont(new Font("1/x",Font.BOLD,15));
148 daoshubtn.setForeground(Color.red);
149
150 jiechengbtn=new JButton("!");
151 jiechengbtn.setFont(new Font("!",Font.BOLD,20));
152 jiechengbtn.setForeground(Color.red);
153
154 equalbtn=new JButton("=");
155 equalbtn.setFont(new Font("=",Font.BOLD,20));
156 equalbtn.setForeground(Color.red);
157 //设置键位分布
158 setLayout(new BorderLayout());
159
160 txtpanel.add(txtinput);
161 add("North",txtpanel);
162
163 btnpanel.setLayout(new GridLayout(5,4,1,3));//五行四列分布
164
165 btnpanel.add(sinbtn);
166 btnpanel.add(cosbtn);
167 btnpanel.add(jiechengbtn);
168 btnpanel.add(clearbtn);
169 btnpanel.add(b1);
170 btnpanel.add(b2);
171 btnpanel.add(b3);
172 btnpanel.add(chubtn);
173 btnpanel.add(b4);
174 btnpanel.add(b5);
175 btnpanel.add(b6);
176 btnpanel.add(chengbtn);
177 btnpanel.add(b7);
178 btnpanel.add(b8);
179 btnpanel.add(b9);
180 btnpanel.add(jianbtn);
181 btnpanel.add(b0);
182 btnpanel.add(bdes);
183 btnpanel.add(bf);
184 btnpanel.add(jiabtn);
185
186 add("Center",btnpanel);
187
188 southpanel.setLayout(new GridLayout(1,4,1,3));//一行四列分布
189 southpanel.add(sqrtbtn);
190 southpanel.add(zhishubtn);
191 southpanel.add(daoshubtn);
192 southpanel.add(equalbtn);
193
194 add("South",southpanel);
195 //监听按键
196 b1.addActionListener(this);
197 b2.addActionListener(this);
198 b3.addActionListener(this);
199 b4.addActionListener(this);
200 b5.addActionListener(this);
201 b6.addActionListener(this);
202 b7.addActionListener(this);
203 b8.addActionListener(this);
204 b9.addActionListener(this);
205 b0.addActionListener(this);
206 bdes.addActionListener(this);
207 bf.addActionListener(this);
208
209 sinbtn.addActionListener(this);
210 cosbtn.addActionListener(this);
211 jiechengbtn.addActionListener(this);
212 sqrtbtn.addActionListener(this);
213 zhishubtn.addActionListener(this);
214 daoshubtn.addActionListener(this);
215 chengbtn.addActionListener(this);
216 chubtn.addActionListener(this);
217 jiabtn.addActionListener(this);
218 jianbtn.addActionListener(this);
219 equalbtn.addActionListener(this);
220
221 setSize(280,290);
222 setVisible(true);
223 setLocation(400,200);
224 addWindowListener(new WindowCloser());
225
226 }
227
228 class WindowCloser extends WindowAdapter{
229 public void windowClosing(WindowEvent e){
230 System.exit(0);
231 }
232 }
233
234 public void actionPerformed(ActionEvent e){
235
236 Object obj=e.getSource();
237 //设置相关计算方法
238 if(obj==b1)
239 txtinput.setText(txtinput.getText()+"1");
240 else if(obj==b2)
241 txtinput.setText(txtinput.getText()+"2");
242 else if(obj==b3)
243 txtinput.setText(txtinput.getText()+"3");
244 else if(obj==b4)
245 txtinput.setText(txtinput.getText()+"4");
246 else if(obj==b5)
247 txtinput.setText(txtinput.getText()+"5");
248 else if(obj==b6)
249 txtinput.setText(txtinput.getText()+"6");
250 else if(obj==b7)
251 txtinput.setText(txtinput.getText()+"7");
252 else if(obj==b8)
253 txtinput.setText(txtinput.getText()+"8");
254 else if(obj==b9)
255 txtinput.setText(txtinput.getText()+"9");
256 else if(obj==b0)
257 txtinput.setText(txtinput.getText()+"0");
258 else if(obj==bdes)
259 txtinput.setText(txtinput.getText()+".");
260
261 else if(obj==bf){
262 sum=Double.valueOf(txtinput.getText()).doubleValue();
263 boolean bool=true;
264 if( bool){
265 result=sum-2*sum;
266 bool=false;
267 }
268 else{
269 result=sum+2*sum;}
270 txtinput.setText(String.valueOf(result));
271 }
272
273 else if(obj==sinbtn){
274 sum=Double.valueOf(txtinput.getText()).doubleValue();
275 result=Math.sin(sum);
276 txtinput.setText(String.valueOf(result));
277 }
278
279 else if(obj==cosbtn){
280 sum=Double.valueOf(txtinput.getText()).doubleValue();
281 result=Math.cos(sum);
282 txtinput.setText(String.valueOf(result));
283 }
284
285 else if(obj==zhishubtn){
286 sum=Double.valueOf(txtinput.getText()).doubleValue();
287 sign="x^y";
288 txtinput.setText("");
289 }
290
291 else if(obj==daoshubtn){
292 sum=Double.valueOf(txtinput.getText()).doubleValue();
293 result=1/sum;
294 txtinput.setText(String.valueOf(result));
295 //sign="1/x";
296 //txtinput.setText("");
297 }
298
299 else if(obj==sqrtbtn){
300 sum=Double.valueOf(txtinput.getText()).doubleValue();
301 result=Math.sqrt(sum);
302 txtinput.setText(String.valueOf(result));
303 //sign="√";
304 //txtinput.setText("");
305 }
306
307 else if(obj==jiechengbtn){
308 int n;
309 n=(int)Double.valueOf(txtinput.getText()).doubleValue();
310 result=fac(n);
311 txtinput.setText(String.valueOf(result));
312 }
313
314 else if(obj==jiabtn)
315 {
316 sum=Double.valueOf(txtinput.getText()).doubleValue();
317 sign="+";
318 txtinput.setText("");
319 }
320
321 else if(obj==jianbtn)
322 {
323 sum=Double.valueOf(txtinput.getText()).doubleValue();
324 sign="-";
325 txtinput.setText("");
326 }
327 else if(obj==chubtn)
328 {
329 sum=Double.valueOf(txtinput.getText()).doubleValue();
330 sign="÷";
331 txtinput.setText("");
332 }
333
334 else if(obj==chengbtn)
335 {
336 sum=Double.valueOf(txtinput.getText()).doubleValue();
337 sign="*";
338 txtinput.setText("");
339 }
340
341 else if(sign=="+")
342 {
343 result=sum+Double.valueOf(txtinput.getText()).doubleValue();
344 txtinput.setText(String.valueOf(result));
345 }
346
347 else if(sign=="-")
348 {
349 result=sum-Double.valueOf(txtinput.getText()).doubleValue();
350 txtinput.setText(String.valueOf(result));
351 }
352
353 else if(sign=="÷")
354 {
355 double n;
356 String m="除零错误!";
357 n=Double.valueOf(txtinput.getText()).doubleValue();
358 if(n==0){
359 JOptionPane.showMessageDialog(this, m, "error", JOptionPane.ERROR_MESSAGE);
360 }
361 else
362 result=sum/n;
363 txtinput.setText(String.valueOf(result));
364 }
365
366 else if(sign=="*")
367 {
368 result=sum*Double.valueOf(txtinput.getText()).doubleValue();
369 txtinput.setText(String.valueOf(result));
370 }
371
372 else if(sign=="x^y"){
373 result=Math.pow(sum,Double.valueOf(txtinput.getText()).doubleValue());
374 txtinput.setText(String.valueOf(result));
375 }
376
377 else if(sign=="sin")
378 {
379 result=Math.sin(sum);
380 txtinput.setText(String.valueOf(result));
381 }
382
383 else if(sign=="cos")
384 {
385 result=Math.cos(sum);
386 txtinput.setText(String.valueOf(result));
387 }
388
389 else if(sign=="!")
390 {
391 int i=(int)Double.valueOf(txtinput.getText()).doubleValue();
392 for(int j=i;j>0;i--){
393 result=j*(j-1);
394 }
395 txtinput.setText(String.valueOf(result));
396 }
397
398 else if(obj=="√"){;
399 result=Math.sqrt(sum);
400 txtinput.setText(String.valueOf(result));
401 }
402
403 else if(obj=="1/x"){
404 result=1/sum;
405 txtinput.setText(String.valueOf(result));
406 }
407 }
408
409 private long fac(int n){
410 long f;
411 if(n==0)
412 f=1;
413 else f=fac(n-1)*n;
414 return f;
415 }
416 public static void main(String args[]){
417 try{
418 UIManager.setLookAndFeel ("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
419 } catch(Exception e) {}
420 new Calculator();//使用windows显示风格
421 }
422
423 }
三.运行结果:
实现加、减、乘、除、阶乘、正弦、余弦和指数运算:
功能说明:
四、总结和体会:
不足:1.各种计算功能有待增加,可参考电脑自带计算机
2.显示界面皮肤单一,可增加多种,以便个人喜好
3.未设置计算值的复制和黏贴功能,单位换算功能等等
收获:对java的应用,有了一定了解和延伸,对于未来设计相关功能程序有较大帮助。