题目:增强型计算器
- 1、 题目简介:
项目采用结对编程方式编写,完成一个图形界面的计算器,可以在标准计算器和科学计算器之间切换,标准计算器的基本功能有:加、减、乘、除基本算术运算;科学计算器的基本功能有:三角函数、进制转换、对数、阶乘;在普通科学计算器基础上新增加:求解一元二次方程,求解勾股定理。
- 2、基本功能与要求:
1).标准计算器:加、减、乘、除、求平方根;
2).科学计算器:进制转换、求解三角函数、对数运算、阶乘;
3).一元二次方程:求一元二次方程的解;
4).勾股定理:求直角三角边长。
- 3、设计思路及分工:
对于此计算器程序,首先要设计其GUI界面,总体界面有一个文本框,18个按钮,总体界面用BorderLayout布局。
文本框放置在最NORTH,然后0到9以及+,-,*,/的按钮放置到一个面板Panel中,添加到整体布局的CENTER,界面设计完成。
布局设计好后再添加按钮事件。对于此程序要考虑到点击加、减、乘、除按钮时是否有点击数字按钮,如果是第一次点击数字按钮或者是点击数字按钮前点击了加、减、乘、除按钮则直接把数字按钮的数值设置到文本框中,否则则应把文本框中的内容加上你所点击按钮的数值设置到文本框中。
这是计算器中的一种:简单计算器,本项目用到了Java中的GUI界面和swing组件以及awt布局,所以简单易用,它能完成如下的几个小功能:
点击按钮中的数字键和运算符键就能进行简单的加、乘、乘、除求模四则运算 。
王倩倩负责GUI界面的具体实现,这里不再列述请移至王倩倩博客看具体实现过程。
我负责各个计算功能的具体实现,在此列举一些关键代码,具体内容请到我的GitHub(http://github.com/bbker/Counter)里看看。
- 3.1功能图:
- 3.2流程图:
- 4、结对实践过程(个人部分核心代码)
1)开根号运算,定义jButton2 = new JButton("sqrt");对其设置监控,调用Math.sqrt()方法来实现开根号运算,并在文本框中输出结果:
1 jButton2.addActionListener(new ActionListener() { 2 public void actionPerformed(ActionEvent e) { 3 double a=Double.parseDouble(jTextField.getText());//获取文本框内容 4 double b; 5 if(a<0){jTextField.setText("负数不能开平方");} 6 else{b=Math.sqrt(a);jTextField.setText(Double.toString(b));}//执行开平方操作 7 }});
2)实现求阶乘方法:
1 jButton42.addActionListener(new ActionListener() { 2 public void actionPerformed(ActionEvent e) { 3 double i=Double.parseDouble(jTextField.getText()); 4 if((i%2==0)||(i%2==1)){//判断为整数进行阶乘操作 5 int j=(int)i;//强制类型转换 6 int result=1; for(int k=1;k<=j;k++) result *=k; 7 jTextField.setText(String.valueOf(result));}}});
3)MS是将当前窗口数据写入“寄数器”,M+是将当前窗口数据与“寄数器”内的数据相加后再存入“寄数器”,MR是读出“寄数器”内的数据到窗口,MC是清除“寄数器”内的数据,使其为0。按钮实现方法:
1 public void actionPerformed 2 (ActionEvent e)中实现, 3 public void actionPerformed(ActionEvent e) { 4 Object temp = e.getSource(); 5 if (temp == jButton20) { 6 memoryd = memoryi = 0; 7 textMemory.setText("ZY "); 8 textMemory.setFont(new Font("华文行楷", Font.BOLD, 30));} 9 //‘MS‘的操作,将当前文本框内容保存入内存,显示‘M‘ 10 if (temp == jButton22) { //textMemory显示m的文本框 11 boolean isDot = false; 12 textMemory.setText(" M "); 13 textMemory.setFont(new Font("楷体", Font.BOLD, 30)); 14 for (int i = 0; i < jTextField.getText().length(); i++) 15 if (‘.‘ == jTextField.getText().charAt(i)) { 16 isDot = true; 17 break; } 18 //如果是double,则存入memoryd(double存储器) 19 if (isDot == true) { 20 memoryd = Double.parseDouble(jTextField.getText()); 21 memoryi = 0; //保证存储器中存放最新的值 } 22 //如果是int,则存入memoryi(int存储器) 23 else { 24 memoryi = Integer.parseInt(jTextField.getText()); 25 memoryd = 0; //保证存储器中存放最新的值 }} 26 //‘MR‘的操作,将存储器中的信息输出 27 if (temp == jButton21) { if (memoryd != 0) 28 jTextField.setText(Double.toString(memoryd)); 29 if (memoryi != 0) 30 jTextField.setText(Integer.toString(memoryi)); } 31 //‘M+‘的功能,将当前文本框里的数据和存储器中数据相加后,再存入存储器 32 if (temp == jButton23) { 33 textMemory.setText(" M "); 34 textMemory.setFont(new Font("楷体", Font.BOLD, 30)); 35 boolean isDot = false; 36 for (int i = 0; i < jTextField.getText().length(); i++) 37 if (‘.‘ == jTextField.getText().charAt(i)) { 38 isDot = true; break; } 39 if (memoryi != 0) { //存储中是一个int型数 40 if (isDot == false) //被加数是一个int型数 41 memoryi += Integer.parseInt(jTextField.getText()); 42 else { 43 //被加数是一个double型数,则将int存储器中数传入double存储器与当前数相加,int存储器清零 44 memoryd = memoryi + Double.parseDouble(jTextField.getText()); 45 memoryi = 0; } } 46 else 47 memoryd += Double.parseDouble(jTextField.getText()); }
4)用来求log以10为底的对数值,当对数值i大于0时就调用Math.log10(i)来输出结果,当i小于0时就在文本框中显示负数不能求对数!。
1 jButton45.addActionListener(new ActionListener() {//求负数 2 public void actionPerformed(ActionEvent e) { 3 double i=Double.parseDouble(jTextField.getText()); 4 if(i>0){ 5 jTextField.setText(String.valueOf(df.format(Math.log10(i)))); 6 }else7 { jTextField.setText("负数不能求对数!");}}});
5)定义三角函数sin、cos、tan但是在使用需要先调用弧度按钮,将相应的角度转换成弧度以后在使用三角函数对应的按钮才可以实现求三角函数的值。求弧度方法在定义弧度按钮时实现,string.valueOf(i/180*Math.PI)求对应的弧度sin、cos、tan使用math中的方法。
6)一元二次方程的求解
1 public void actionPerformed(ActionEvent e) { 2 double a=Double.parseDouble(jtf1.getText()); 3 double b=Double.parseDouble(jtf2.getText()); 4 double c=Double.parseDouble(jtf3.getText()); 5 double d,x1,x2; 6 d=b*b-4*a*c; 7 x1=(-1*b+Math.sqrt(d))/(2*a);//计算x1的值 8 x2=(-1*b-Math.sqrt(d))/(2*a); 9 if(e.getSource()==jb1&&d<0){ 10 jtf4.setText("d小于0无解"); 11 jtf5.setText("d小于0无解"); 12 } 13 else if(e.getSource()==jb1&&d>=0){ 14 jtf4.setText(Double.toString(x1));//返回结果 15 jtf5.setText(Double.toString(x2)); 16 } 17 else if(e.getSource()==jb3){ 18 jtf1.setText(""); 19 jtf2.setText(""); 20 jtf3.setText(""); 21 jtf4.setText(""); 22 jtf5.setText(""); 23 } 24 }
7)勾股定理实现过程
1 public void actionPerformed(ActionEvent e) { 2 if (e.getSource()==jb13){ 3 double a=Double.parseDouble(jtf11.getText());//获取文本框内容 4 double b=Double.parseDouble(jtf12.getText()); 5 double d,d2; 6 d=a*a+b*b; 7 d2=Math.sqrt(d);//开方 8 jtf13.setText(String.valueOf(df.format(d2)));}//返回结果 9 if (e.getSource()==jb12){ 10 double a=Double.parseDouble(jtf11.getText()); 11 double b=Double.parseDouble(jtf13.getText()); 12 double d,d2; 13 d=b*b-a*a; 14 d2=Math.sqrt(d); 15 jtf12.setText(String.valueOf(df.format(d2)));} 16 if (e.getSource()==jb11){ 17 double a=Double.parseDouble(jtf12.getText()); 18 double b=Double.parseDouble(jtf13.getText()); 19 double d,d2; 20 d=b*b-a*a; 21 d2=Math.sqrt(d); 22 jtf11.setText(String.valueOf(df.format(d2)));}}}
- 5、测试情况
程序使用的是fest-swing测试工具,进行GUI的测试,具体测试代码请到我的github中下载查看,测试及程序运行结果如下:
运行结果:
测试结果:使用fest-swing测试会出现动画效果强烈建议大家到我的github内下载代码运行看看
- 6、问题及心得
1).设置计算器MR、MC、MS、M+时遇到问题,开始不知道怎么去实现,后来通过上网查找相关代码得以解决,设置double memoryd和int memoryi来使用内存中的数据。
2)进制转换的实现, 通过调用 Integer.toHexString(n)十六进制、Integer.toOctalString(n)八进制、Integer.toBinaryString(n),二进制可以将数字转换成对应的进制类型。
本次项目几乎遇到的所有问题,全部通过谷歌(www.gfsoso.net)找到的,国内搜索网站的信息不是非常多,尤其是在关于GUI测试方面,自己搜索了大量的信息,进行学习虽然掌握的不是很多,但也让我学会了对GUI程序的测试,这是非常不错的一点,在于王倩倩同学合作编程的过程中,我们两个人相互查漏补缺,相互进步,彼此学到了很多关于结对编程方面的经验,并且王倩倩同学特别仔细认真,在我编写的过程中出现的一些问题都能及时的发现,这让我知道有一个好编程的伙伴是非常重要的,总之2个人都学到了很东西,继续努力吧!