1、 自解析计算器课程设计实验报告自解析计算器目录目录 .2一 作品总体性能介绍与使用说明 .3基本介绍: .3基本 功能: .3使用说明: .4二 软件设计概要 .4概述 .4UML 类图 .4三、软件各模块详细设计 .61、Main 类 .72、Calculator 类 .73、Enter 类 .74、ButtonListoner 类 .75、Zuozhe 类 .86、Help 类 .87、StrSwitch 类 .88、Priority 类 .99、Stack 类 .910、Core 类 .9四、运行结果测试样本 .11测试环境: .11测试人员: .11测试时间: .11测试图样: .11
2、五、源代码 .16Main .16Calculator.16Core.26priority.29Stack.30StrSwitch.31Zuozhe.36Help.36自解析计算器摘要:本作品是通过 java 语言编写而成的一个多功能自解析计算器。该程序可以在 NetBeans 平台上运行。支持常用运算符的运算,具有插入括号的功能,支持科学计数法输入与键盘输入,支持解析计算与标准计算,并且具有一定的表达式检错能力。Abstract:This work is made by java language from the resolution of a multi-function calcula
3、tor. The program can be run on the NetBeans platform. This work supports common operations operator has inserted the function in brackets, support scientific notation input and keyboard input, support analytical calculation with the standard calculation, and the expression has a certain error detect
4、ion capabilities.关键字:自解析; 计算器; Java一 作品总体性能介绍与使用说明基本介绍:该作品是基于 NetBeans 平台用 java 语言开发编写的一款界面友好的计算器,核心思想是用两个栈计算中缀表达式值的经典算法。与实际计算器基本保持一致。基本功能:1) 支持基本的四则(+、-、*、/)运算。2) 支持 sin cos tan 等三角函数的运算。3) 支持 log、ln、exp、xy、sqr 等复杂的运算。4) 实现了解析运算(可以输入一个数学表达式,然后正确计算出结果) 。5) 具有清零功能。6) 具有退格与记忆键。7) 支持圆周率一键输入。8) 支持科学计数法输
5、入。9) 具有连续计算的能力,即上一次计算的结果可以直接参与下一次计算(即兼有标准计算器的特点) 。10)输入可以通过界面实现,即用鼠标点击按钮;同时支持完全的键盘输入,方便习惯使用键盘的用户。11)具有一定得检错能力,能够检测出大部分常见的输入错误(包括键盘输入时的输入错误) 。12)能够显示当前的日期和时间。13)具有 2 个菜单选项,通过“关于”菜单可以查看使用说明。14)具有三个快捷键(F1、F2、F3) 。使用说明:本计算器的使用方法如下:1、在“表达式”栏里输入要计算的表达式(输入方式为鼠标或键盘) ,然后点击“=”或按回车键即可在“结果”栏里边看到结果。2、 “CE”可以把两栏里
6、边的内容清零, “”可以撤销上次输入, “M”自动记忆上次计算的结果,点击此按钮等效于输入上次表达式的结果。3、若输入表达式有误,系统会提示出错信息。 4、 “关于”菜单里面有作者信息和使用手册, “编辑”菜单里面有“清零”和“撤销” ,作用等同于“CE”和“” 。5、当用户不知道某个操作符的作用时,把鼠标放在该操作符上,过一会就会系统就会自动提示该操作符的功能。例如,把鼠标放在 “cos”上,系统会提示“余弦” 。 6、日期栏里面显示当前的日期和时间,点击“编辑”菜单里面的“更新时间”或用鼠标任意点击一个按钮(“=”除外) ,就可以刷新时间。 7、输入的负数如果在表达式的中间,则要加括号8、
7、支持完全的键盘操作:快捷键“F1”清零,快捷键“F2”调出手册,“F3 调出作者信息” ,回车相当于等号, “Backspace”作退格。二 软件设计概要概述典型的软件开发流程主要由可行性分析、需求分析、概要设计、详细设计、编码、测试和维护等阶段构成。本程序的开发周期采用的是演化模型:首先实现了一个可运行的初始版本,即原型;然后在此基础上不断增加新的功能,得到功能更强大的新版本;直到实现所有预期的功能。下面重点介绍概要设计中的 UML(统一建模语言)类图。UML 类图由图 1 的 UML 类图可以看出,本系统主要由 11 个类(或接口)组成(不包括字符串和其它一些简单的类) ;其中接口 Act
8、ionListoner(事件监听器)类、KeyLisoner(按键监听器)类和 JFrame(窗口)类是 java 包自身提供的,本系统只负责调用。其它 10 个类是本系统实现的。下面对图 1 作出简要说明。Main: 主类,负责整个计算器的顶层图形界面。Calculator: 负责计算器的界面和按钮的响应。它与主类 Main 存在一对一的关联关系;它是 JFrame 的子类,故两者之间是泛化关系;在它的内部定义了 ButtonListoner(事件监听器)类和 KeyLisoner(按键监听器)类,故它们之间是聚集关系。ButtonListoner:事件监听器,作用是每当按下不同的按键时作出
9、相应的响应。它是接口 ActionListoner 的一个实现;它与类 Core 存在一对多的关联关系。Enter:按键监听器,作用是按下回车键时作出相应的响应。它是接口KeyListoner 的一个实现;它与类 Core 存在一对多的关联关系。Zuozhe: 用于显示作者信息的类。与 ButtonListoner 类存在一对多的关联关系。Help: 用于显示帮助信息的类。与 ButtonListoner 类存在一对多的关联关系。Core:计算中缀表达式值的类,也是整个系统的核心算法,故取名“core”。它与 Stack 类、Priority 类和 StrSwitch 类分别存在一对二、一对一
10、和一对一的关联关系。Stack:栈。在计算表达式值的过程中存放操作符和操作数。里面定义了栈的各种常用操作。Priority:判断两个操作符优先级高低的类(附带有区分操作数和操作符的功能) 。StrSwitch:用于字符串转换和检测的类,将输入的字符转换成 sin、cos等字符并且将字符和数字分开。图 1 系统的 UML 类图三、软件各模块详细设计该部分对各个类的功能和实现方法作出较详细的说明,其中重点类,也是最核心的类是 Calculator 类和 Core 类。1、Main 类功能简介:整个作品的顶层类,负责生成计算器的界面,并设置界面大小、位置、标题和可见性等。2、Calculator 类
11、功能简介:负责整个计算器界面的布局。实现方法:1、定义了一个容器 cp,其它所有的组件都放在容器内,cp 采用 null 布局,即由作者自己决定每个组件的大小和位置,这样能使界面更加美观和友好。2、定义了 3 个单行文本区 displayField、displayField1 和displayField2,分别用来显示输入的表达式、计算结果和当前时间。3、定义了 2 个菜单(JMenu) ,它们是“关于”和“编辑”菜单,并定义了一个 JMenuBar 用来放置这两个菜单。 “关于”里边有“作者信息”和“使用手册”两个菜单项(JMenuItem) ;“编辑”里边有“撤销” 、 “清零”和“刷新日
12、期”两个菜单项。4、定义了 31 个按钮 JButton31,用来实现各自的功能。详细程序见源代码。3、Enter 类功能简介:负责按下回车键和快捷键时时的响应。 本类是在类 Calculator的内部定义的。实现方法是简单的 ifelse 语句:当按下回车键时,计算表达式的值;按下快捷键“F1”时,表达式和结果清零;按下快捷键“F2”时,调出用户手册;按下快捷键“F3”时,调出作者信息。详细程序和注释见源代码。4、ButtonListoner 类功能简介:负责按下不同按键时的响应。本类是在类 Calculator 的内部定义的,用来对每个按钮添加事件处理。在 ButtonListoner 类
13、的内定义了按下每个按钮时的相应操作。可以用图 2 的流程直观的说明。按下一个按钮判断清零退格加到字符串加到输入表达式的末尾调用Core表达式正确计算并返 回结果 显示出错信息clearback其它“=”是 否图 2 按键处理程序的流程图5、Zuozhe 类功能简介:一个简单的图形用户界面,用来显示本计算器的作者信息。通过点击菜单“关于”“作者信息”或按快捷键“F3”可以弹出此窗口。6、Help 类功能简介:一个简单的图形用户界面,用来显示本计算器的简要说明信息。通过点击菜单“关于”“使用手册”或按快捷键“F2”可以弹出此窗口。7、StrSwitch 类功能简介:把输入的字符串转换成字符串数组,
14、同时进行错误检测。即把用户输入表达式(是一个字符串)中的每个操作符或操作数区分出来,输出一个字符串数组(数组中每个元素存放一个操作符或操作数) ;并对输入表达式中的常见错误加以标记。该部分的代码比较冗长,大部分是机械的反复操作;但为了检测出更多的错误而又不得不要。该类中方法 public void SS(String strin) 的作用是对输入的字符串进行转换;方法 public String Getstr(int i) 的作用是返回结果的第 i个字符串(一个操作符或操作数) 。注意:在输出字符串的末尾加了一个“#” ,以便后面处理。本段代码考虑了几乎所有的输入错误,包括键盘上的各种无效字符
15、;并且经过很多次测试,并没有发现未考虑到的输入错误(但这并不能 100%肯定本计算器能检测出所有的输入错误) 。具体程序及注释见源代码。其中,源代码的注释中有本计算器考虑到的各种错误及相应的处理办法。8、Priority 类功能简介:判断两个操作符优先级的高低。只定义了一个方法:public String s1_super_s2(String str1,String str2)。入口参数是两个操作符(也可以是操作数) 。当 str1 的优先级大于 str2 时,返回“high” ;str1 的优先级小于 str2 时,返回“low” ;两者相等时,返回“equal” ;“#”对“#”时,返回“
16、end” ;是操作数,返回“isdigital” ;其他情况返回“error” 。9、Stack 类功能简介:具有一般栈的基本功能,即: public String Pop () (出栈) ; public void Push(String str)(入栈) ; public String GetTop ()(返回栈顶元素) ; public boolean StackEmpty () (判断栈空) 。10、Core 类功能简介:计算中缀表达式的值。算法描述:本算法不采用把中缀表达式变换成后缀表达式,然后再计算后缀表达式值的算法;而是采用利用两个栈(一个操作符栈,一个操作数栈)直接计算中缀表达式值的算法。算法描述如下:(1) 、初始化两个栈。一个是 optr,存放运算符;一个是 opnd,存放操作数或中间结果;(2) 、置操作数栈为空, “#”入操作符栈;(3) 、依次读入每个字符串(stri),若是操作数则进 opnd 栈,若是操作符,则和 optr 栈的栈顶元素比较优先权后执行相应操作,直到整个字符串读取完毕(当前读入的元素和 optr 栈的栈顶元素均为“#” ) 。上述算法可用下面的流程图直观的表示: