《Java计算器》
Java课程设计报告
姓    名: ******** 
学    号: ******** 
专    业: ************ 
         
一.程序要实现的功能:
基础功能:类似windows计算器-普通计算器所具有的,数的输入、加、减、乘、除、开根号、求倒数、退格、清空,以及数字储存器中的MR(显示)、MC(清空)、M+(相加)、MS(储存)
    扩展功能: 类似windows计算器-科学计算器所具有的,各种函数(包括正三角反三角函数)计算,不同进制转换,逻辑与或非等操作。
二.程序算法&功能实现(大概)
以下为运算功能简易示意图:
不同进制转换:
此功能独立于计算器其他功能,计算器运行过程中设定一个变量carry储存当前进制转态,每次运算时先将屏幕显示的数字转化成十进制然后带入运算,对于要显示在计算器屏幕的结果也要先进行十进制转换为当前进制然后显示。
三.遇到问题及解决方案
1.普通计算器到科学计算器的界面转换:
科学计算器的界面显然比普通计算器界面要复杂,按钮要多,而无论怎样修改布局都无法完整得在科学计算器和普通计算器之间切换。
解决方案:
将计算器的界面布局的类设为扩展JPanel的类CreateButton,该类中设置两个方法,一个方法进行科学计算器的界面布局,一个方法进行普通计算器的界面布局,两个方法依靠CreateButton类构造函数种的参数决定调用哪个方法,在主的类里面若要在科学计算器和普通计算器之间切换,只要为当前面板new一个CreateButton,并设置好参数,就可以换一个界面。
2.不同进制输入输出与运算问题:
由于科学型计算器涉及不同进制的输入输出与运算,而不同的进制运算规则稍有不同,因此不同进制输入输出与运算就成了一个问题。
解决方案:
设置一个全局变量表示当前进制状态,而程序运行过程处理数据都以十进制形式,也就是仅在显示时,按照当前进制状态,将十进制转化为相应进制。
3.JAVA已有的函数计算精度不够:
例如sin函数计算,java对sin函数计算的参数是弧度制,但是如果用Math.sin()计算Pi/6(即sin30度),那么结果是0.4999999999999999而不是0.5。同样,cos,tan也都出现这种情况。
查出原因:Java中对PI的计算只是估算,精度不够。
解决方案:
如果要计算 sin x ,(x是角度),那么先用Math.sin(x/180*Math.PI) 得到不精确的值sinx,再将用Math.rint(sinx*100000000)/100000000.0进行舍入处理。便得到想要的结果。
4.运算符重复输入:
正常情况下是输入一个数值,然后按下运算符按钮,数值,和运算符先后进栈,然后再按一次同样的按钮时,运算符再次进栈,造成栈内运算符错位。
解决方案:
设置一个转态检查机制,也就是设置一个变量储存之前输入一个数字,那么下一次就只能是运算符,如果之前输入的是运算符,那么下一步只能输入数字。
运用同样的方法解决了小数点重复,括号重复问题。
除以上问题以外,这次程序遇到最多的问题就在使用 用于处理运算的类里,因为该类涉及堆栈操作,如果外部传入参数不符合一般算式的罗列规则,很容易引起空操作,数据丢失,数字重复计算,无限循环等各种错误。这一点上,虽然Java没有指针,但似乎在这里碰到的问题,必须得以指针的方式来思考。
五.资源列表及说明
本次课程设计代码包括4个java文件:
EvaluateExpression.java
ExpressStack.java
2进制转十进制在线计算器CreateButton.java
Calcuate.java
其中:
ExpressStack.java  
是新建的堆栈类,用于创建和处理堆栈数据
EvaluateExpression.java
是计算表达式类,通过创建堆栈,将传入的数字或运算符储存并做相应的运算然后返回运算结果
CreateButton.java
计算器界面按钮布局及其功能方法的类,该类扩展JPanel类,布局计算器界面,并实现了各个按钮的功能。
Calcuate.java
主类,创建菜单栏,并new 出相应的布局界面CreateButton ()然后在窗口中显示。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。