java计算器课程设计报告
Java 计算器 - 0 - 《Java 计算器》 Java 课程设计报告 姓 名: ******** 学 号: ******** 专 业: ************ Java 计算器 - 1 - 一.程序要实现的功能: 基础功能:类似 windows 计算器-普通计算器所具有的,数的输入、加、 减、乘、除、开根号、求倒数、退格、清空,以及数字储存器中的 MR(显示)、 MC(清空) 、M+(相加) 、MS(储存)扩展功能: 类似 windows 计算器-科学计算器所具有的,各种函数(包括 正三角反三角函数)计算,不同进制转换,逻辑与或非等操作。 二.程序算法&功能实现(大概) 以下为运算功能简易示意图: 否 是 是 将屏幕中的数字 压入运算栈,将 当前运算符压入 运算栈 调用单目运算函 数的方法对当前 数字进行计算, 并将结果覆盖原 数字 是否双目运算符 调用数字按钮事 件监听 是否数字 开始 否 不同进制转换: 此功能独立于计算器其他功能,计算器运行过程中设定一个变量carry储存当 前进制转态,每次运算时先将屏幕显示的数字转化成十进制然后带入运算,对 于要显示在计算器屏幕的结果也要先进行十进制转换为当前进制然后显示。 三.遇到问题及解决方案Java 计算器 - 2 - 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 计算器 - 3 - 然后再按一次同样的按钮时,运算符再次进栈,造成栈内运算符错位。 解决方案: 设置一个转态检查机制,也就是设置一个变量储存之前输入一个数字,那么下 一次就只能是运算符,如果之前输入的是运算符,那么下一步只能输入数字。 运用同样的方法解决了小数点重复,括号重复问题。 除以上问题以外,这次程序遇到最多的问题就在使用 用于处理运算的类里,因 为该类涉及堆栈操作,如果外部传入参数不符合一般算式的罗列规则,很容易 引起空操作,数据丢失,数字重复计算,无限循环等各种错误。这一点上,虽 然Java没有指针,但似乎在这里碰到的问题,必须得以指针的方式来思考。 五.资源列表及说明 本次课程设计代码包括4个java文件: uateExpression.java ExpressStack.java CreateButton.java Calcuate.java 其中: ExpressStack.java 是新建的堆栈类,用于创建和处理堆栈数据 uateExpression.java 是计算表达式类,通过创建堆栈,将传入的数字或运算符储存并做相应的运算 然后返回运算结果 CreateButton.java 计算器界面按钮布局及其功能方法的类,该类扩展JPanel类,布局计算器界面, 并实现了各个按钮的功能。 Calcuate.java 主类,创建菜单栏,并new 出相应的布局界面CreateButton ()然后在窗口 中显示。