第四次课程作业

•采取面向对象的方法,四则运算自动出题软件,根据需求可以划分为几个类?每个类具有什么属性?每个类具有什么行为?

可以划分为两个类,一个是计算类,一个是生成类。

生成类:

image

计算类:

image

•类与类之间是如何进行协作的?谁给谁发送消息?谁持有谁的引用?

生成类生成算式传递给计算类计算。生成类中的classone以及classtwo给计算类发送消息。生成类持有计算类的引用。

•该自动出题软件采取何种算法或者是如何实现的?可以采用流程图描述的方法。

之前的算法很暴力,就是已经知道算式的类型就直接计算了,前几天乐忠豪同学跟我提及了后缀表达式计算算式,搜索了下,获益良多,我用了新的算法。
我建立两个栈 一个放数字 numstack,一个放字符 operatorstack.首先扫描字符串,如果是数字,则放入numstack中,如果是+或者-放入operatorstack中,如果是*或者/,读取numstack栈顶的数值以及*或/后面的数值相乘或除放入numstack栈顶。例如
3+5*6-7处理完后的栈
image
声明一result=0,
operatorstack栈顶为-,那么numstack栈顶的值为负,result-7,然后operatorstack为+ ,result+30,然后operatorstack没有值了 numstack还有值,就result+3,最终的result的值为26,既正确答案。

再来一个例子 (4+2)*(5-3)
若是有括号,左括号入栈,按照以上步骤直到右括号,右括号不入栈,遇到右括号,返回查找operatorstack,直到遇到左括号,计算括号内的值,放入numstack中(此题*后面是括号不是数字,应把*放入栈中,当处理栈时遇到*时提取numstack中的两个值进行计算,/同理,但要注意次序,栈顶为除数,栈顶下一个为被除数)

处理括号

image
处理*号

image
处理结果

image

每个formula扫描完后处理两个栈中的剩余的值,结果既算式的值。用栈计算很方便,不再只局限于某种类型的算式,这种方法可以应用于各类型的算式,而且还可以在原来的基础上计算多位数的算式,甚至小数的算式。

代码地址

posted on 2017-05-14 21:16  caiziyang  阅读(178)  评论(2编辑  收藏  举报