java项目 科学计算器_结对项目-增强型科学计算器

本文介绍了一个Java图形界面的增强型计算器项目,支持标准和科学计算模式,具备加减乘除、平方根、进制转换、三角函数、对数、阶乘、一元二次方程求解和勾股定理等功能。项目采用结对编程完成,详细介绍了设计思路、功能实现和测试情况,并分享了开发过程中遇到的问题与心得。
摘要由CSDN通过智能技术生成

题目:增强型计算器

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功能图:

252e2d7045fc26189e0cf92741d8eb2b.png

3.2流程图:

ddeb085c87282482b9ff6433c5607ad5.png

4、结对实践过程(个人部分核心代码)

1)开根号运算,定义jButton2 = new JButton("sqrt");对其设置监控,调用Math.sqrt()方法来实现开根号运算,并在文本框中输出结果:

1 jButton2.addActionListener(newActionListener() {2 public voidactionPerformed(ActionEvent e) {3 double a=Double.parseDouble(jTextField.getText());//获取文本框内容4 doubleb;5 if(a<0){jTextField.setText("负数不能开平方");}6 else{b=Math.sqrt(a);jTextField.setText(Double.toString(b));}//执行开平方操作7 }});

2)实现求阶乘方法:

1 jButton42.addActionListener(newActionListener() {2 public voidactionPerformed(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 voidactionPerformed2 (ActionEvent e)中实现,3 public voidactionPerformed(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(newActionListener() {//求负数2 public voidactionPerformed(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 voidactionPerformed(ActionEvent e) {2 double a=Double.parseDouble(jtf1.getText());3 double b=Double.parseDouble(jtf2.getText());4 double c=Double.parseDouble(jtf3.getText());5 doubled,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 voidactionPerformed(ActionEvent e) {2 if (e.getSource()==jb13){3 double a=Double.parseDouble(jtf11.getText());//获取文本框内容4 double b=Double.parseDouble(jtf12.getText());5 doubled,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 doubled,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 doubled,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中下载查看,测试及程序运行结果如下:

运行结果:

3b836eb154bafbfe1b38aed5f8b110ef.png

a4ee726a06896cb4d21f1a1e775a5bd1.png

13d1349a2ce25f78ff2d8d498d6de30b.png

9e4ec85e2e17d245239af7099add7de1.png

测试结果:使用fest-swing测试会出现动画效果强烈建议大家到我的github内下载代码运行看看

b6097d6ed3baec98bae4581e869ea6e2.png

01ded91767d150b19895c77761544cbf.png

ac13f5da8a1f9d6e9a2b168580975ac6.png

239c3e887d29da45a3427d5bb85dcf44.png

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个人都学到了很东西,继续努力吧!

63df77db191e7e5b9a3c79bbf84cc0ec.png

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值