结对作业

这个作业属于哪个课程 班级的链接
这个作业要求在哪里 作业要求的链接
这个作业的目标 实现算式生成,计算,校验

github链接:https://github.com/hanayakozomi/hanayakozomi/tree/main/结对作业/结对作业

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时 实际耗时(分钟)
·Planning · 计划 36 40
· Estimate · 估计这个任务需要多少时间 25 40
·Development 开发 260 350
· Analysis · 需求分析 (包括学习新技术) 35 60
· Design Spec · 生成设计文档 35 55
· Design Review · 设计复审 60 120
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 15 30
· Design · 具体设计 45 60
· Coding · 具体编码 120 250
· Code Review · 代码复审 40 50
· Test · 测试(自我测试,修改代码,提交修改) 30 125
· Reporting · 报告 60 80
· Test Repor · 测试报告 25 20
· Size Measurement · 计算工作量 15 15
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 80
· 合计 861 1375

结对项目成员

姓名 学号
谭清允 3119005433
马悦 3219005493

项目总览

main.py(主类)

def filePutContent(expr_set, ans_set, exp_file, ans_file):

main():

cal.py(计算类)

def formatString(formula):

class Cal:

​ def Calculate(op, left, right):

​ def getAnswer(self):

​ def judgeAnswer(ans, lists):

​ def transToProperFraction(self):

class Node:

​ def getAnswer(self):

​ def getFoumula(self):

class Tree:

​ def generateFoumula(self, num_range, number):

check.py(查重)

def getNumAndOp(formula):

def check(formula, form):

代码说明

算式生成

因为每个运算符左右都各有一个运算数,所以我们可以想到二叉树的每个结点都可以有至多两个子结点,我们可以类比根节点为运算符,两个子结点可以为运算数也可以继续嵌套运算符,嵌套的运算符继续来两个子结点生成运算数。

二叉树生成:

        while i < number:
            nodeList = [self.root]
            for _ in range(degree):
                node = random.choice(nodeList)
                nodeList.remove(node)
                node.op = random.choice(self.op_list)[0]
                node.type = 2

                node.left = Node()
                nodeList.append(node.left)
                node.right = Node()
                nodeList.append(node.right)

随机数生成:

            try:
                for node in nodeList:
                    node.type = 1
                    num_type = random.choices(self.type_list)[0]
                    if num_type == 1:
                        node.number = random.randint(1, num_range)
                    else:
                        node.number = Fraction(random.randint(1, num_range), random.randint(1, num_range))

计算流程

计算实现:

class Cal:
    def Calculate(op, left, right):
        if op == "+":
            answer = left + right
        elif op == "-":
            answer = left - right
        elif op == "*":
            answer = left * right
        elif op == "/":
            answer = left / right
            # 浮点数转换为分数形式
            if isinstance(answer, float):
                answer = Fraction(left) / Fraction(right)
        return answer

得到结果,左右子树递归得到最终结果:

def getAnswer(self):
    if self.type == 2:
        self.left.getAnswer()
        self.right.getAnswer()
        self.number = Cal.Calculate(self.op, self.left.number, self.right.number)
    else:
        return

查重设计

查重比较复杂,直接用最流氓的方法。先比较结果是否一样,如果一样再比较+和*的数量是否相同

比较结果:

num = 0
self.root.getAnswer()
for num in range(0, i):
    if Cal.transToProperFraction(self.root.number) == self.answerList[num]:
        if check.check(formatString(self.root.getFoumula()), self.formList[num]): #存在返回T
            num = -1
            break

比较+和*的数量:

def check(formula, form):
    formulaNewList, formulaOldList = getNumAndOp(formula)
    if ' + ' in formulaOldList or ' × ' in formulaOldList:
        newList, oldList = getNumAndOp(form)
        if formulaNewList.sort() == newList.sort():
            return True
    else:
        return False

测试运行

命令行运行结果,做了前5题,均能检测到正确。不做后5题,均能回显错误,且答案存在Answer.txt

image-20211025224248860

Answers.txt

image-20211025224929190

Exercises.txt

image-20211025224557524

Grade.txt

image-20211025224800702

代码覆盖率

image-20211026002546671

使用帮助

image-20211025231025332

项目小结

  1. 结对经验

    ​ 在结对编程的过程中,充分感受到了沟通的重要性,有的时候没有沟通好就会导致做一些无用功,我们在写子函数的过程中因为没有沟通好所以有些功能写重复了,浪费了很多时间。此外,在这次结对编程的过程中还体会到了代码规范的重要性,两个人的编程风格不一,在整合的时候就会遇到很多困难。

  2. 结对感受

    ​ 虽然结对编程有时候没有一个人编程那么方便,但是在结对编程的过程中就不再是孤军奋战了,能够有一个人一起讨论题目,对于自己解决不了的问题可以通过伙伴的帮助一起解决。只要充分进行沟通,结对编程也没有原先想象中的那么麻烦,在与工作伙伴的磨合之下,工作效率会越来越高。

posted @ 2021-10-26 01:03  Altriaaaa  阅读(55)  评论(0编辑  收藏  举报