个人作业1——四则运算题目生成程序(基于控制台)python
代码仓库地址:四则运算
a.需求分析
- 教师通过软件随机生成自然数,真分数,假分数,且带有括号的,少于3个运算符的四则运算式,以文件形式发布给学生
- 学生们做完后将文件提交给教师,教师通过软件执行批改
- 批改结果以文件形式返回
- 要有万题级的出题解题能力
b.功能设计
基本功能:
运行程序后,通过选择题数和难度进行出题,题目文件和答案文件会生成在文件夹中,另会同时生成存放提交该次题目答案的文件夹,及存放批改结果的文件夹
c.设计实现
- 题目生成源码文件:
createProblem.py
- 运算结果源码文件:
caculation.py
- 批改源代码文件:
Main.py
- 树源代码文件:
binaryTree.py
d.代码说明
四则算式判重
将随机生成的中缀表达式转换成后缀表达式,然后再将后缀表达式按照一定规则建树:
若生成节点的对象是*
或者+
- 左右子树的值不同,则数值大的作为左子树.
- 左右子树的值相同时,判断子树的运算符优先级大小,优先级大的作为左子树.
- 运算符优先级相同,判断子树下的左子树值得大小,数值大的作为左子树.
- 若为子树为一个为数字,一个为运算符,则运算符作为左子树.
- 若左右子树都为数字,则数值大的作为左子树.
根据这个规则,基本上包含了交换律可能出现的情况,将可以有交换律变换得到的表达式都转为一个统一的表达式。接着将该后缀表示式的HASH存入列表中,根据二分查找大幅度缩短判重时间。
def createProblem(self, problemNumber):
createPro = createProblem.create()
file = open("Exercises.txt", "w")
file2 = open("Answer.txt","w")
hashList = []
count = 0
while count < problemNumber:
problemList = []
formula = createPro.createArithmetic()
k = judgeEqual.judge()
tree = k.createTree(k.translateSuffix(formula))
btree = binaryTree.binaryTree()
problemList = btree.outPutTree(tree, problemList)
newproblem = ''
for st in problemList:
if st in ['`', '/', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '+', '-', '×', '÷']:
newproblem += st
m = hash(newproblem)
if m not in hashList:
hashList.append(m)
count += 1
file.write(createPro.toString(formula) + '\n')
file2.write(str(tree.value.toString())+'\n')
else:
continue
file.close()
file2.close()
e.测试运行
PSP2.1 | Personal Software Process Stages | Time Senior Student | Time |
---|---|---|---|
Planning | 计划 | 30 | 15 |
Estimate | 估计这个任务需要多少时间 | 40 | 46 |
Development | 开发 | 35 | 80 |
Analysis | 需求分析 (包括学习新技术) | 4 | 7 |
Design Spec | 生成设计文档 | 4 | 6 |
Design Review | 设计复审 | 4 | 6 |
Coding Standard | 代码规范 | 3 | 3 |
Design | 具体设计 | 10 | 12 |
Coding | 具体编码 | 80 | 80 |
Code Review | 代码复审 | 3 | 10 |
Test | 测试(自我测试,修改代码,提交修改) | 3 | 15 |
Reporting | 报告 | 9 | 10 |
测试报告 | 2 | 1 | |
计算工作量 | 4 | 6 | |
并提出过程改进计划 | 3 | 3 |