zoukankan      html  css  js  c++  java
  • 第三次作业--结对作业

    一、作业地址

    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。总之,这次作业让我学到很多新知识,比如逆波兰表达式的使用,算符串的输入输出。以后会继续努力,不断提升自己的能力。

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

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





  • 相关阅读:
    恭介的法则
    229. Majority Element II
    169. Majority Element
    233. Number of Digit One
    172. Factorial Trailing Zeroes
    852. Peak Index in a Mountain Array
    162. Find Peak Element
    34. Find First and Last Position of Element in Sorted Array
    81. Search in Rotated Sorted Array II
    33. Search in Rotated Sorted Array
  • 原文地址:https://www.cnblogs.com/maiqyBlog/p/9929657.html
Copyright © 2011-2022 走看看