四则运算试题生成,结对
作业要求参见 https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11245
结对对象:李惠璨(吉利虾)
功能1. 四则运算 + 功能2. 支持括号
难点:中缀后缀的计算,也是请教了学长才完成,随机数用的random函数 括号的部分李惠璨问了学姐,她知指导我们在生成运算式的类中,生成了不带括号的运算式后,随机生成0或1,0就表示不插入括号,1表示插入括号,此时调用生成括号的函数,在该函数中,用枚举法确定括号的位置,然后根据随机数选择其中一种,将括号插入,最后返回带括号的表达式。
代码:
def change(s): result = '' suanfa={'+':1,'-':1,'*':2,'/':2,'(':0,')':3} arr = [] for i in s: if i in ['+','-','*','/','(',')']:#括号功能 if i=='(': arr.append(i) elif i==')': while (len(arr)>0 and arr[-1]!='(' ): p=arr.pop() result+=p arr.pop() elif len(arr)==0: arr.append(i) elif suanfa[arr[-1]]>=suanfa[i]:#判断操作符优先级 while len(arr)>0 and suanfa[arr[-1]]>=suanfa[i]: p=arr.pop() result+=p arr.append(i) else: arr.append(i) else: result+=i while len(arr)>0: p=arr.pop() result+=p return result#返回后缀表达式
def last(s): str=[] for i in s: if i in ['+','-','*','/']: b=float(str.pop()) a=float(str.pop()) c=0 if i=='+': c=a+b elif i=='-': c=a-b elif i=='*': c=a*b else: c=a/b str.append(c)#结果输入进去 else: str.append(i) return str[0]
功能3. 限定题目数量,"精美"打印输出,避免重复+功能四 带分数
难点:分数的制造,我将得到的浮点数整数部分拿出来 小数部分用Fraction(result2).limit_denominator()生成分数
代码:
#随机生成运算式 from random import randint class Expression: def expre(self): exp = [] for j in range(0,7): if j % 2 != 0: #生成带3个运算符和4个10以内数字的表达式 operators = ['+', '-', '*', '/'] exp.append(operators[randint(0, len(operators) - 1)]) #随机生成运算符 else: exp.append(str(randint(1, 9))) is_need_brackets = randint(0, 1) # 判断是否要括号 if is_need_brackets:#添加括号 expression = ''.join(self.make_brackets(exp)) else: expression = ''.join(exp) return expression # 生成括号表达式 def make_brackets(self,exp):#传入由运算符和数字组成的列表 str = [] # 0表示直接将运算符或数字传入生成式,1表示在生成式加入左括号,2表示在生成式加入右括号,-1表示不作任何处理 kuohao= [ [1, 0, 0, 0, 2, 0, 0, 0, 0, -1, -1], [1, 0, 0, 0, 0, 0, 2, 0, 0, -1, -1], [0, 0, 1, 0, 0, 0, 2, 0, 0, -1, -1], [0, 0, 1, 0, 0, 0, 0, 0, 2, -1, -1], [0, 0, 0, 0, 1, 0, 0, 0, 2, -1, -1], [1, 0, 0, 0, 2, 0, 1, 0, 0, 0, 2], [1, 1, 0, 0, 0, 2, 0, 0, 2, 0, 0], [1, 0, 0, 1, 0, 0, 0, 2, 2, 0, 0], [0, 0, 1, 1, 0, 0, 0, 2, 0, 0, 2], [0, 0, 1, 0, 0, 1, 0, 0, 0, 2, 2] ] pos = randint(0,9) if exp: i = 0 for j in kuohao[pos]: if j ==0: str.append(exp[i]) if i < len(exp): i += 1 elif j ==1: str.append('(') elif j ==2: str.append(')') return str
def fun(num): num=int(num) i = 0 while i < num: g = Expression() e = g.expre() e1 = change(e) #result = float(last(e1)) result=int(eval(e)) result2=abs(eval(e)-int(eval(e))) result1=Fraction(result2).limit_denominator() if result==0: fresult = str(e) + "=" +" " +"\t"+ str(result1) elif result2==0: fresult = str(e) + "=" +" " + "\t"+ str(result) else: fresult = str(e) + "=" +" " + "\t"+ str(result)+" "+ str(result1) write(fresult) #print('%-15s %-15s' % (e, result)) i += 1
要求1:
(1) 编程收获:
让自己更加了解和实践了python中关于数学的函数,细节决定成败,
(2)体会:
结对编程确实能让我们学到很多知识,让我们进行一次互补,效率也提升很大,让我们在遇到不同问题的时候,有不同的出发点。
(3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。 (10分)
1.最开始选择语言的时候,我用java比较多,他用python比较多,后来想到我们的方向以后肯定是用python,就决定用python写,顺便提升一下我的python的基础
2.在最初写完功能一的时候,表达式下一行没有“ ?”,我就提示他这个地方,后来又看了一下python中printf()函数的细节,才将它填上。
3.在写分数的时候,他说要单独拿出一个函数写,我说可以直接在打印之前处理一下结果就行,最后听了我的,直接对浮点数进行了处理得到分数。
4.最初得到的分数是假分数,他说要进行约分,把结果的整数部分拿出来,小数部分换成分数,我心中想:真是个好主意!
5.他编码的时候先把框架搭起来,然后先写上pathon中的pass语句,然后框架搭好了再讨论pass中应该写什么逻辑。这个是我应该学习的编程序思想。
要求2 .
地点1:李惠璨寝室 (白天)
地点2:视频通话(晚上)
要求三:
coding地址:https://e.coding.net/wowcy/f8/f8.git