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

题目:增强型计算器

 

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

时间: 2024-10-13 09:35:17

结对项目-增强型科学计算器的相关文章

《团队-科学计算器-项目总结》

团队项目名称:科学计算器 团队名称: 加油啊 团队队长:黄妍 团队成员:鞠艳,李艾哲,吕爽,马璐,陶丽爽 经过了半学期,<现代软件工程-构建之法>这门课程即将接近尾声,在这半学期里,我们从个人组成了一个名为"加油啊"团队,我们从刚开始的手足无措到现在的游刃有余.在这个团队中,我们分工明确,互相合作,共同完成. 目前的计算器有标准型和科学型,我们团队做的项目是科学计算器,它是电子计算器的一种,可进行乘方.开方.指数.对数.三角函数.统计等方面的运算,又称为函数计算器.科学计算

《团队-科学计算器-设计文档》

设计文档: 项目:科学计算器 编辑器:python 所运用知识: 1.字符串的处理 2.正则表达式的运用 3.函数递归 基本思路: 需要优先处理内层括号运算--外层括号运算--先乘除后加减的原则: 1.正则处理用户输入的字符串,然后对其进行判断,判断计算公式是否有括号,有就先将计算公式进行正则处理,先获取最里层的每一个数据,然后一一计算 2.把有括号的计算公式计算出来的结果替换原来初始公式的位置,计算之前分别对重复运算符进行处理需要处理的重复运算 3.然后依次从里到外去除括号并进行计算,和位置替

结对项目3-功能增强型带基本函数计算java计算器

-----------------------------------------------------实验报告-------------------------------------------------------- 一.实验目的 a.项目介绍: 对上个项目所设计的java计算器进行改进,设计一功能增强型计算器.从最基本的加.减.乘.除,到基本数学函数处理,再到数的进制转换处理.较上个实验,就项目而言,属于升级版.正符合软件开发的后期运维精神. b.功能实现: 1. 运用两个面板的叠加

团队-科学计算器-项目总结

一,目的 我们日常生活的开支,大额数字或者多倍小数的计算都需要计算器的帮助,处理数字的开方.正余弦都离不开计算器.虽然现在的计算器价格比较低廉,但是功能过于简单的不能满足个人需求,功能多的价格昂贵,操作不便不说,很多功能根本做不到.所以,我们可以想到设计开发一个属于自己的简单的计算器来完成我们的日常生活需求. 二,设计思路 "科学计算器 "是一个软件.整个软件程序分为三个个功能模块,一个TextView, 一个是BuTTon, 一个是监听 .其中TextView有1个显示框等TextV

【SE】Week3 : 四则运算式生成评分工具Extension&amp;Release Version(结对项目)

Foreword 此次的结对项目终于告一段落,除了本身对软件开发的整体流程有了更深刻的了解外,更深刻的认识应该是结对编程对这一过程的促进作用. 在此想形式性但真心地啰嗦几句,十分感谢能端同学能够不厌其烦地接受我每次对软件的修改提议,并在代码实现过程中为团队贡献了许多人性化的tips: 另外,他积极好学的心态也很让我佩服.从初入面向对象,数据结构的使用,实际工程的开发,他快速地掌握了其中的技巧: 并在过程中不嫌辛苦地和我一起熬夜,才能在短短48h内高效利用时间,开发出这款颇多功能的软件.感谢!=)

高级四则运算器—结对项目总结(193 &amp;105)

高级四则运算器—结对项目总结 为了将感想与项目经验体会分割一下,特在此新开一篇博文. 界面设计 啥都不说,先上图震慑一下... 上面的三个界面是我们本次结对项目的主界面,恩,我也觉得挺漂亮的!你问我界面设计花了多久?其实只有6个小时,然后6个小时中有2个小时都是为了一个bug,这个bug之后我们会提到,也是让我长了一回见识. 关于整个界面的美化 关于整个界面的美化,因为之前做Java的Swing开发,知道有这种控件的皮肤(Swing里是叫LAF=LookAndFeel),所以在一开始我就敲定了要

结对项目——博客记录

结对项目内容:http://www.cnblogs.com/jiel/p/4830912.html 结对成员:康家华,马腾跃(http://www.cnblogs.com/summerMTY) 关于结对编程 “在结对编程模式下,一对程序员肩并肩地.平等地.互补地进行开发工作.两个程序员并排坐在一台电脑前,面对同一个显示器,使用同一个键盘,同一个鼠标一起工作.他们一起分析,一起设计,一起写测试用例,一起编码,一起单元测试,一起集成测试,一起写文档等.”——<构建之法> 通过阅读教科书和网络上的参

团队-科学计算器-设计文档

"科学计算器"是一种操作简单.界面美观.功能较齐全的电子计算器的一种.这个项目的整个程序我们设计主要分为两个功能模块和十个类模块,其中两个功能模块分别是:计算结果显示模块.计算器按键模块,十个类模块分别是:加.减.乘.除.归零.等于.sin.cos.tan.进制转换. 具体设计过程如下: 1)   设计程序主界面 2)   实现监听TextView.button事件. 具体实现的功能如下: 功能○   :加.减.乘.除.归零.等于 功能一   :具有基本三角函数计算功能(sin,tan

html+css+js实现科学计算器

代码地址如下:http://www.demodashi.com/demo/13751.html 项目描述 纯html+css+js实现一个科学计算器,支持平方开方指数对数等基本函数,支持键盘输入,有简单和高级两种模式 文件结构 纯html+css+js实现,文件结构非常简单,就三个文件. 演示效果 实验设计 将按钮的value设置为按钮显示的字符,当点击按钮的时候,输入框增加的字符为按钮的value,其中函数的按钮增加的字符为最后一个x所在的位置前面的字符,即到左括号. <div id="