目录
一.预习内容:
项目分析
普通计算器项目的要求较为简单,但是需要有可视化的图像界面,即整体需要有和用户的交互能力。因此,输入输出算式时要有所体现,比如给出文本框进行 显示算式及结果,给出按钮进行点击输入。同时,要求能保存运算的 历史记录,除了求解普通的加减乘除表达式以外,还需要能正确识别 带括号的运算优先级。
实验目标
1.能通过设计的按钮控件输入并实现简单算数运算,要求表达式在编辑框中显示,能运算结果,输出在编辑框内显示;
2.能实现混合运算的求解,算术表达式中包括加,减,乘,除,括号等运算;并能够识别括号;
运算符优先级认知
资料收集
//中缀表达式向后缀表达式转换思路研究
中缀表达式转后缀表达式(Java代码实现) - 听风1108 - 博客园
//队列基本操作讲解
java队列的取出队首_Java队列Queue的使用_Long Yu的博客-CSDN博客
二.算法设计
算法一:中缀表达式转为后缀表达式
算法需求:
①后缀表达式队列:postQueue,用于存储逆波兰表达式(其实不用队列排序直接输出也行)
②操作符栈:opStack,对用户输入的操作符进行处理,用于存储运算符
③字符串:用于输入中缀表达式
算法思路:
从左向右依次读取算术表达式的元素X,分以下情况进行不同的处理:
(1)如果X是操作数,直接入队
(2)如果X是运算符,再分以下情况:
a)如果栈为空,直接入栈。
b)如果X==”(“,直接入栈。
c)如果X==”)“,则将栈里的元素逐个出栈,并入队到后缀表达式队列中,直到第一个配对的”(”出栈。(注:“(”和“)”都不 入队)
d)如果是其他操作符(+ - * /),则和栈顶元素进行比较优先级。 如果栈顶元素的优先级大于等于X,则出栈并把栈中弹出的元素入队,直到栈顶元素的优先级小于X或者栈为空。弹出完这些元素后,才将遇到的操作符压入到栈中。
(3)最后将栈中剩余的操作符全部入队。
算法二:计算后缀表达式
算法需求:
①结果栈Res_Stack
算法思路:
1、从左开始向右遍历后缀表达式的元素,即算法一中的postQueue。
2、如果取到的元素是操作数,直接入栈Res_Stack,如果是运算符,从栈中弹出2个数进行运算,然后把运算结果入栈
3、当遍历完后缀表达式时,计算结果就保存在栈里了。
三.页面设计
页面组成
①字符串输入文本框
②历史记录文本框
③多个提供操作按钮以及数字按钮
页面功能:
基于JTextArea与JTextFiled的文本框设计,加入监听器Actionlisten,对鼠标点击按钮进行响应,当鼠标点击“=”时进行函数调用以及计算,并且在历史记录文本框显示对应的运算记录。
注意事项:
字符串输入的过程中,右括号的个数应该受到左括号的制约,即右括号的个数小于等于左括号的个数。
对于每一个数字,小数点应该只能有一个,而当计算器进行了运算符的点击而开始输入新的数字后,则可以重新输入小数点。
四.成品展示
五.改进措施
1.新增了对运算符的控制功能,即多个连续的运算符不可以连续输入,如++、*-、+*等都是错误的,输入一个运算符后,后面无法继续输入运算符
2.新增了补0功能,即当小数点输入而没有输入数字时,自动在小数点前面补0,而在数字后面输入小数点而没有数字后,自动在小数点后面补0。