第三次作业--结对作业

一、作业地址

https://edu.cnblogs.com/campus/nenu/2016CS/homework/2266

二、git仓库地址 

https://coding.net/u/yu_mai/p/f4/git

三、  结对的伙

陈俊宇:

四、重点和难点

编程思路:我们先对题目进行全面的分析,理清3个功能之间的联系,随后开始逐一完成,功能一是奠基,完成功能一后,在它的基础上添加判断条件,python对处理字符串很友好,能够利用已有的函数库,参考地址:https://www.cnblogs.com/qiwsir/p/4209492.html

1)随机算式的生成(随机函数的应用):功能一的实现,进行整数的运算。运用运算符优先级 ,学习字典的使用方法,同时建立运算符栈和表达式栈,进行算符的输入输出;对输入的字符串实现比较大小,加法,减法,乘法,除法等运算,当算符中有分数存在并用真分数表示

(2)随机算式的运算(中缀表达式转换成后缀表达式,逆波兰表达式的应用):此处对功能二和功能三进行编写。算式的括号成对出现 

(3)基于控制台命令行参数 

(4)按照需求调整输出格式:题目不能出现重复即不能经过有限次交换成为相同题目,实现四则运算题目及答案生成,控制生成题目的个数。

使用类说明:

类1:生成随机数
类2:生成整个表达式
类3:表达式转换成为逆波兰式
类4:树
类5:类中存放一个数的分子与分母,同时toString方法输出真分数形式
类6:计算结果

五、主要代码片段

算式生成(此处很最难的过程)

 def generatePostfixEpression(self, expression):
        # 去除表达式空格
        expression = expression.replace(' ', '')

        # 创建运算符栈和表达式栈
        operatorStack = list()
        expressionStack = list()

        for element in expression:
            if element in self.operators:
                if not operatorStack:
                    operatorStack.append(element)
                else:
                    if element == ')':
                        for top in operatorStack[::-1]:
                            if top != '(':
                                expressionStack.append(top)
                                operatorStack.pop()
                            else:
                                operatorStack.pop()
                                break
                    else:
                        for top in operatorStack[::-1]:
                            # 左括号只有遇到右括号才出栈
                            if self.priority[top] >= self.priority[element] and top != '(':
                                expressionStack.append(top)
                                operatorStack.pop()
                            else:
                                operatorStack.append(element)
                                break

                        if not operatorStack:
                            operatorStack.append(element)

            else:
                expressionStack.append(element)

        # 将操作符栈中的操作符入到表达式栈中
        for i in range(len(operatorStack)):
            expressionStack.append(operatorStack.pop())

        return expressionStack

createProblem.py(我主要编写算式括号成对出现)

def createArithmetic(self, needBrackets):
        arithList = []
        for i in range(7):
            if i % 2 == 0:
                arithNum = random.randint(0, 9)
                while (arithNum == 0 and len(arithList) > 1 and list[ len - 1] == '/'):
                    arithNum += random.randint(1,9)
                arithList.append(arithNum)
            else:
                arithList.append(create.createOperator(self))

        if needBrackets :
            expression = " ".join("%s"%id for id in self.createBrackets(arithList, 4))
        else:
            expression = " ".join("%s"%id for id in arithList)
        #print(expression)
        return expression 

主函数

 if len(arg) == 3:
        if(arg[1] == '-n'):
            flag = 1
        elif(arg[1] == '-c'):
            flag = 2
    elif arg[1] == '-c' and arg[3] == '-f':
        flag = 3
    cl = calculator()
    if flag == 1:
        ca1 = create()

        expList1 = []
        try:
            num1 = int(arg[2])
            rightAnswer = 0
            wrongAnswer = 0
            if isinstance(num1, int):
                if num1 <= 0:
                    print("题目数量必须是 正整数。")
                else:
                    for i in range(num1):
                        expList = ca1.createArithmetic(0)
                        print(expList)
                        print('?', end='')
                        ansR = cl.calcaulate(expList)
                        #print(ansR)
                        ans1 = input()
                        if len((str)(ansR)) > 20 :
                            if (float(ans1) == round((float)(ansR), 3)):
                                print("回答正确。")
                                rightAnswer += 1
                            else:
                                print("回答错误,正确答案是", round(ansR, 3))
                                wrongAnswer += 1
                        else:
                            if (float(ans1) == float(ansR)):
                                print("回答正确。")
                                rightAnswer += 1
                            else:
                                print("回答错误,正确答案是", ansR)
                                wrongAnswer += 1
                    print("总共" , num1 , "道题,你答对" , rightAnswer , "道题。")
            else:
                print("题目数量必须是 正整数。")
        except:
            print("题目数量必须是 正整数。")

 

 运行截图

 

六、 个人总结

此次作业对我而言难度很大,我和小伙伴起初用c++编程,但是后来发现不懂的知识点太多,而且时间不足以让我们去钻研,所以后来我们选择使用python。总之,这次作业让我学到很多新知识,比如逆波兰表达式的使用,算符串的输入输出。以后会继续努力,不断提升自己的能力。

我在结对编程之前读了《构建之法》第四章两人合作这一部分知识,共同完成提高工作效率。

在大的项目中,团队合作极其重要,每人负责一部分功能,最后会形成完整的项目。在编程过程中陈俊宇同学提供很多的帮助,她很耐性,为我讲解部分代码,解决我的疑问。由于我的代码功底薄弱,我负责进行辅助她完成主要代码,同时搜素相关材料。





posted @ 2018-11-09 12:15  红红红火  阅读(222)  评论(3编辑  收藏  举报