四则运算试题生成,结对
作业要求参见 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
浙公网安备 33010602011771号