实验内容
1、 学习图形界面的设计,利用 MFC 应用程序(Java swing 或 QT 框架,或 C#)创建基于对话框的应用程序,添加按钮、编辑框等控件; 2、 能通过设计的按钮控件输入并实现简单算术运算,要求表达式在编辑框中显示,能将运算结果,输出在编辑框内显示;并保存历史的表达式运算记录。 3、也能够实现混合运算的算术表达式求解,算术表达式中包括加、减、乘、除、括号等运算符;并且能够识别括号,优先级正确。
项目目标 1、能通过设计的按钮控件输入并实现简单算术运算,要求表达式在编辑框中显示,能将运算结果,输出在编辑框内显示; 2、能够实现混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符;并且能够识别括号,优先级正确。 3、并保存历史的表达式运算记录。
技术准备:图形界面的开发; 难点:中缀表达式->后缀表达式,后缀表达式的计算。
编程语言以及开发环境的选择 由于对IntelliJ IDEA Community Edition 较为熟悉,所以开发环境选用IntelliJ IDEA Community Edition ,编程语言选用JAVA。
实现方法 1、中缀转后缀,后缀表达式求解 2、双栈算符优先级法 3、二叉树方法
这里我选择的是方法1。
实验思路 1、中缀表达式到后缀表达式的转换 理论准备 中缀表达式 中缀表达式是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。在中缀表达式中,运算符具有不同的优先级,并且还可以使用括号改变运算的次序,因此运算规律比较复杂,不适于计算机求解表达式。
后缀表达式 后缀表达式,即逆波兰式。 我们平时写的a+b是中缀表达式,写成后缀表达式就是:ab+ 特点: 1)后缀表达式的操作数与中缀表达式的操作数先后次序相同,而运算符的先后次序不同; 2)后缀表达式中没有括号,而且运算符没有优先级; 3)后缀表达式计算过程严格按照从左到右的顺序进行。
算法思路 1、设置一个运算符栈,用来存放运算符。 2、定义一个字典,保存优先级。
priority = {"#": 0, "+": 1, "-": 1, "*": 2, "/": 2, "(": 3} 3、从左向右扫描表达式:
若是操作数:直接输出到后缀表达式中。 若是运算符: ① 栈为空:直接入栈。 ② 运算符为“)”:依次出栈,直到遇到“(”,“(”出栈并舍弃。 ③ 优先级低于或等于栈顶运算符:在遇到“(”和比自己优先级小的运算符之前,将栈顶依次出栈,并输出到后缀表达式中,最后再将该运算符压入栈。 ④ 优先级高于栈顶运算符:直接入栈。 4、表达式遍历结束,栈中剩余字符依次出栈,并输出到后缀表达式