1、项目概述
1.1项目目标和主要内容
学习图形界面的设计,利用MFC 应用程序(Java swing 或 QT 框架,或 C#)创建基于对话框的应用程序,添加按钮、编辑框等控件;
能通过设计的按钮控件输入并实现简单算术运算,要求表达式在编辑框中显示,能将运算结果,输出在编辑框内显示;并保存历史的表达式运算记录。
也能够实现混合运算的算术表达式求解,算术表达式中包括加、减、乘、除、括号等运算符;并且能够识别括号,优先级正确。
1.2项目的主要功能
能够识别括号,优先级正确。并保存历史的表达式运算记录。
能通过设计的按钮控件输入并实现简单算术运算,表达式在编辑框中显示,能将运算结果,输出在编辑框内显示。
能够实现混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符。
2、项目设计
2.1项目总体框架
2.2系统详细设计
2.2.1Calculator.java
houzhui(String str):将中缀表达式转为后缀表达式。
·str:为用户输入的原始表达式。
·返回值:后缀表达式字符串数组,将多位数存储为独立的字符串。
2) String Result(String[] str):计算后缀表达式,并返回最终结果。
·str:为转换后的后缀表达式。
·返回值:返回最终结果,为字符串。
String pfys(String str):平方运算方法。
·str:用户输入的数字
·返回值:平方值
Stringkfys(String str):开方运算方法。
·str:用户输入的数字
·返回值:开方值
voidactionPerformed(ActionEvent e): 事件处理.
·e: 事件
2.3关键算法分析
2.3.1中缀表达式转后缀表达式
·具体算法
1)设置一个运算符栈,用来存放运算符。
2)从左向右扫描表达式:
① 若是操作数:直接输出到后缀表达式中。
② 若是运算符:
a. 栈为空:直接入栈。
b. 运算符为“)”:依次出栈,直到遇到“(”,“(”出栈并舍弃。
c. 优先级低于或等于栈顶运算符:在遇到“(”和比自己优先级小的运算符之前,将栈顶依次出栈,并输出到后缀表达式中,最后再将该运算符压入栈。
d. 优先级高于栈顶运算符:直接入栈。
4)表达式遍历结束,栈中剩余字符依次出栈,并输出到后缀表达式。
2.3.2后缀表达式求值
·具体算法
1)设置一个栈来存放操作数。
2)从左向右依次扫描后缀表达式:
① 若是操作数:入栈。
② 若是运算符:将两个操作数出栈,计算它们的值,再把结果入栈。
3)重复上述步骤,直至表达式结束,栈中最后一个元素就是后缀表达式的值。
2.3.3用户界面输入的容错机制
1)开头不允许是"+×÷). ";
2)"."不允许跟在运算符和"."之后;
3)"+×÷)"不能跟在"+×÷("之后;
4)"("不能跟在") ."之后;
3、项目实现及结果分析
计算器界面展示:
2)无法用图片展现的功能:
1. 按下AC按钮可以将计算器清零,但历史记录不清空;
2. 当刚计算完一个算式或正在查看历史记录时,无需清空计算器,直接按下任意数字便可开始下一轮运算。
4、实验总结
为方便小数、多位数、负数的运算,写一个函数将原始中缀表达式中的数字用字母来对应,并存入字符串中,转成后缀表达式开始求值时再取出对应数值进行计算;
此次实验其实还可以有很大的改进,如对按钮点击时如果不符合运算规则的操作将会运行错误,而不是报错之后让用户有改错的机会。