四则运算生成与校检 Python实现

GitHub地址

https://github.com/little-petrol/Arithmetic.git

合作者: 郭旭 和 卢明凯

设计实现过程

代码的组织主要分为两个部分:

  1. 算法与结构体的实现。

  2. 大体结构,各算法的连接与调用。

Generate()类是程序的主题架构类,先通过get_info()函数获取传入参数,再通过NewExpressions()函数将generate()函数生的成算数表达式按算术式和答案分别写入到文件Exercises.txtAnswer.txt中。

在生成函数generate() 中,通过调用built_Tree() 函数生成以class Node() 为节点的二叉树,再通过class BiTree() 对二叉树进行括号和运算顺序规整、计算。再通过fitBiTre() 对二叉树进行纠错。在生成的过程中,采用了check_repeat() 来对生成的表达式进行查重。

代码说明

检查纠错函数

用于检测二叉树中的左右子树是否会出现不符合规格的情况,并进行纠正:

def fitBiTree(root):
    if root.symbol == "/":
        return root.number
    elif root.symbol == "+":
        return fitBiTree(root.ltree) + fitBiTree(root.rtree)
    elif root.symbol == "*":
        return fitBiTree(root.ltree) * fitBiTree(root.rtree)
    elif root.symbol == "-":
        a = fitBiTree(root.ltree) - fitBiTree(root.rtree)
        if a < 0:
            b = root.ltree
            root.ltree = root.rtree
            root.rtree = b
            a = fitBiTree(root.ltree) - fitBiTree(root.rtree)
        return a
    elif root.symbol == "&":
        if fitBiTree(root.ltree) >= fitBiTree(root.rtree):
            b = root.ltree
            root.ltree = root.rtree
            root.rtree = b
​
        a = fitBiTree(root.ltree) / fitBiTree(root.rtree)
        return a

 

输出函数

输出函数,用于将二叉树中的内容输出成公式和结果:

def show(self, root):
    if root.symbol == "/":
        return ShowFraction(root.number)
    elif root.symbol == "+" or root.symbol == "-":
        if root.rtree.symbol == "+" or root.rtree.symbol == "-":
            return self.show(root.ltree) + " " + root.symbol + " ( " + self.show(root.rtree) + " )"
        return self.show(root.ltree) + " " + root.symbol + " " + self.show(root.rtree)
    else:
        if root.ltree.symbol == "+" or root.ltree.symbol == "-":
            i = "( " + self.show(root.ltree) + " )"
        else:
            i = self.show(root.ltree)
        i += " " + root.symbol + " "
        if root.rtree.symbol != "/":
            i += "( " + self.show(root.rtree) + " )"
        else:
            i += self.show(root.rtree)
        return i

 

二叉树生成函数

用于生成随机的二叉树:

def generate(self):
    type_list = ['F', 'I']  # Fraction or Int
    sym_num = random.randint(1, 3)  # 符号数
    type = random.sample(type_list, 1)[0]   # 数类型
    root = self.built_Tree(sym_num, type)
    tree = BiTree(root)
    fitBiTree(root)
    tree_string = str(tree.show(tree.root))
    is_repeat = self.check_repeat(tree_string)
    if  is_repeat == True:
        print(tree.show(tree.root) + " = " + ShowFraction(tree.Count(tree.root)))
        return root
    else:
        while is_repeat == False:
            #print('error')
            root = self.built_Tree(sym_num, type)
            tree = BiTree(root)
            fitBiTree(root)
            tree_string = str(tree.show(tree.root))
            is_repeat = self.check_repeat(tree_string)
        print(tree.show(tree.root) + " = " + ShowFraction(tree.Count(tree.root)))
        #print('mark')
        return root

 

测试运行

题目生成:

 

将题目与答案分别存到不同的文件中

 

题目与答案的校对

 

 

 

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 2h 3h
· Estimate · 估计这个任务需要多少时间 2h 2h
Development 开发 80h 80h
· Analysis · 需求分析 (包括学习新技术) 10h 15h
· Design Spec · 生成设计文档 2h 2h
· Design Review · 设计复审 (和同事审核设计文档) 8h 3h
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 8h 4h
· Design · 具体设计 10h 4h
· Coding · 具体编码 20h 30h
· Code Review · 代码复审 2h 2h
· Test · 测试(自我测试,修改代码,提交修改) 12h 12h
Reporting 报告 4h 3h
· Test Report · 测试报告 3h 3h
· Size Measurement · 计算工作量 2h 1h
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 4h 3h
合计  169h 167h

项目小结

在项目开始的初期,是异常艰难的。结对编程的难点在于两人的进度和想法很难进行同步,导致编程的进程节奏难以把握。经常出现等待的情况。到后来加强了双方的交流以后,节奏有了明显的提升,配合也渐渐得熟悉了起来。

这次结对编程的经历让我懂得了编程不是埋头苦干就能成事的,特别是多人配合的时候,交流就显得十分的重要了。多交流想法和进度才能更好地推进进度。

转载于:https://www.cnblogs.com/nxnx/p/Arithmetic.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值