• 20180925-6 四则运算试题生成


    此作业的要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2148 

    具体实现功能如下

    功能1:支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答。(+10)

    功能2:在功能1的基础上,支持括号。(+15)

    功能3:限定题目数量,“精美”打印输出,且要避免重复,最好能输出到.txt文件中。且对输入题目数进行限定,题目数量必须是正整数。(+10)

    功能4:支持分数出题和运算。(不完成此题不倒扣分数)

    功能5:可把程序改成GUI版/web版/移植为android,ios版。

    此次作业完成是以“结对编程”的形式完成,我的伙伴是刘欣,她的博客地址为:http://www.cnblogs.com/liu-xin1995/ 

    本次编程采用面向过程的方法,先生成算式,然后将算式转为逆波兰表达式,再计算逆波兰表达式的值即为生成的算式的值。

    功能1、2运行截图

    ……

    功能3运行截图:

    最后一条命令在根目录下生成文件result.txt,文件内容截图如下:

    功能4对分数进行计算暂未能实现。

    代码分析:

    功能实现过程中,重要的是利用栈实现逆波兰和计算逆波兰的过程,重要代码片段如下:

     1 class PyStack(object):      #自定义栈
     2 
     3     def __init__(self, initSize = 20, incSize = 10):
     4         self.initSize = incSize
     5         self.incSize = incSize
     6         self.stackList = []
     7         self.top = self.bottom = 0
     8 
     9     def push(self, ele):
    10         if self.top-self.bottom >= self.initSize:
    11             self.incSize += self.initSize
    12         self.stackList.append(ele)
    13         self.top += 1
    14 
    15     def pop(self):
    16         if self.top-self.bottom > 0:
    17             self.top -= 1
    18             ret = self.stackList.pop()
    19             return ret
    20         else:
    21             return None
    22 
    23     def len(self):
    24         return self.top-self.bottom
    stack
     1 def reverse_polish(equation):
     2     result = []
     3     c = []
     4     slist = [i for i in equation]
     5 
     6     for item in slist:
     7         if item in range(0, 100):
     8             result.append(item)
     9         elif not c and item in cal.keys():
    10             c.append(item)
    11             continue
    12         elif c and item in cal.keys():
    13             for x in range(c.__len__()):
    14                 z = c[-1]
    15                 temp = cal[z] if z in cal else cal1[z]
    16                 if temp >= cal[item]:
    17                     result.append(c.pop())
    18                 else:
    19                     c.append(item)
    20                     break
    21             if not c:
    22                 c.append(item)
    23         elif item is ")":
    24             for x in range(c.__len__()):
    25                 if c[-1] == "(":
    26                     c.pop()
    27                     break
    28                 else:
    29                     result.append(c.pop())
    30         elif item is "(":
    31             c.append(item)
    32         # print(result,c)
    33     for x in range(c.__len__()):
    34         result.append(c.pop())
    35     return result
    RPN
     1 def calculate(re_equation):
     2     stack = PyStack()
     3     sumEnd = 0
     4 
     5     if len(re_equation) is 0:
     6         return sumEnd
     7     for i in re_equation:
     8         if i in range(0, 100):
     9             stack.push(float(i))
    10         elif '+' is i:
    11             a = stack.pop()
    12             b = stack.pop()
    13             stack.push(b + a)
    14         elif '-' is i:
    15             a = stack.pop()
    16             b = stack.pop()
    17             stack.push(b - a)
    18         elif '*' is i:
    19             a = stack.pop()
    20             b = stack.pop()
    21             stack.push(b * a)
    22         elif '÷' is i:
    23             a = stack.pop()
    24             b = stack.pop()
    25             if a == 0:
    26                 return False             #print('%d/%d分子不能为0' % (b, a))
    27             else:
    28                 stack.push(b / a)
    29     return stack.pop()
    calculate

    结对感想:

     本次结对,整体来说是很和谐的。在函数的数量和设计上有过很深刻的讨论,但总体意见是一致的。

    在制定代码规范时,我们参考了python书写的基本的一些规范,编写代码的过程中相互监督,基本上能做到及时提醒及时改正。

    通过本次编程,更深刻的感受到了python语言的强大。其中栈的实现是借用了别人写的模块,然后处理了一下接口就很顺利的完成了后续对栈的应用。

    对生成的算式处理的过程中,我们又重拾了对逆波兰的认识,忍不住感慨:啊原来逆波兰是后缀表达式来着。

    两个人编程,一个编写代码,一个领航,很好的弥补了自己个人编程时编着编着就迷糊脑子乱掉的弊端,可以相互提醒,弥补对方没想到的东西,两个人考虑问题的完整性总归是比一个人要好的,可以更好地保证代码的质量。而且遇到问题,两个人一起想办法解决的感觉是很好的,可以有更多的思路或更快的找到解决方法。

    照片(地点:宿舍):

     

  • 相关阅读:
    PM对功能模块的说明
    第四个迭代目标
    第三个迭代任务
    第三个迭代目标
    记账本状态图
    记账本数据流图
    记账本ER图
    记账本用例图
    第二个迭代目标
    记账本时序图
  • 原文地址:https://www.cnblogs.com/ruidxr/p/9746141.html
Copyright © 2020-2023  润新知