结对作业
这个作业属于哪个课程 | 班级的链接 |
---|---|
这个作业要求在哪里 | 作业要求的链接 |
这个作业的目标 | 实现算式生成,计算,校验 |
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

Answers.txt

Exercises.txt

Grade.txt

代码覆盖率

使用帮助

项目小结
-
结对经验
在结对编程的过程中,充分感受到了沟通的重要性,有的时候没有沟通好就会导致做一些无用功,我们在写子函数的过程中因为没有沟通好所以有些功能写重复了,浪费了很多时间。此外,在这次结对编程的过程中还体会到了代码规范的重要性,两个人的编程风格不一,在整合的时候就会遇到很多困难。
-
结对感受
虽然结对编程有时候没有一个人编程那么方便,但是在结对编程的过程中就不再是孤军奋战了,能够有一个人一起讨论题目,对于自己解决不了的问题可以通过伙伴的帮助一起解决。只要充分进行沟通,结对编程也没有原先想象中的那么麻烦,在与工作伙伴的磨合之下,工作效率会越来越高。