第三次作业--结对作业
一、作业地址
【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。总之,这次作业让我学到很多新知识,比如逆波兰表达式的使用,算符串的输入输出。以后会继续努力,不断提升自己的能力。
我在结对编程之前读了《构建之法》第四章两人合作这一部分知识,共同完成提高工作效率。
在大的项目中,团队合作极其重要,每人负责一部分功能,最后会形成完整的项目。在编程过程中陈俊宇同学提供很多的帮助,她很耐性,为我讲解部分代码,解决我的疑问。由于我的代码功底薄弱,我负责进行辅助她完成主要代码,同时搜素相关材料。