个人作业1——四则运算题目生成程序(基于控制台)python

代码仓库地址:四则运算

a.需求分析

  1. 教师通过软件随机生成自然数,真分数,假分数,且带有括号的,少于3个运算符的四则运算式,以文件形式发布给学生
  2. 学生们做完后将文件提交给教师,教师通过软件执行批改
  3. 批改结果以文件形式返回
  4. 要有万题级的出题解题能力

b.功能设计

基本功能:

运行程序后,通过选择题数和难度进行出题,题目文件和答案文件会生成在文件夹中,另会同时生成存放提交该次题目答案的文件夹,及存放批改结果的文件夹

c.设计实现

  1. 题目生成源码文件:createProblem.py
  2. 运算结果源码文件:caculation.py
  3. 批改源代码文件:Main.py
  4. 树源代码文件:binaryTree.py

d.代码说明

四则算式判重

将随机生成的中缀表达式转换成后缀表达式,然后再将后缀表达式按照一定规则建树:
若生成节点的对象是*或者+

  1. 左右子树的值不同,则数值大的作为左子树.
  2. 左右子树的值相同时,判断子树的运算符优先级大小,优先级大的作为左子树.
  3. 运算符优先级相同,判断子树下的左子树值得大小,数值大的作为左子树.
  4. 若为子树为一个为数字,一个为运算符,则运算符作为左子树.
  5. 若左右子树都为数字,则数值大的作为左子树.

根据这个规则,基本上包含了交换律可能出现的情况,将可以有交换律变换得到的表达式都转为一个统一的表达式。接着将该后缀表示式的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
posted @ 2018-03-31 19:44  aiwyx  阅读(525)  评论(0编辑  收藏  举报