20200924-5 四则运算试题生成,结对
作业要求参见 [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()生成分数
# 功能三
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:
formula = str(e) + "=" + " " + "\t" + str(result1)
elif result2==0:
formula = str(e) + "=" + " " + "\t" + str(result)
else:
formula = str(e) + "=" + " " + "\t" + str(result)+" "+ str(result1)
writeFile(formula)
i += 1
结果:
要求1:
(1) 编程收获:
由于对python了解的还是不够,参考了许多师兄师姐的解决办法,慢慢的和伙伴一起讨论收获很多,一个人的精力是有限的但是两个人有讨论的话效率会高很多。
(2)体会:
疫情的原因有些时候我们是视频讨论的,感觉也还不错,有什么问题互相探讨然后查找资料效率很高。
(3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。 (10分)
1.最开始选择语言的时候,张传玉用java比较多,我希望用python,后来想到我们的方向以后肯定是用python,就决定用python写,顺便提升一下我们的python的基础
2.在最初写完功能一的时候,表达式下一行没有“ ?”,它提示我的这个地方,后来又看了一下python中printf()函数的细节,才将它填上。
3..最初得到的分数是假分数,我说要进行约分,把结果的整数部分拿出来,小数部分换成分数。
4.在写分数的时候,我说要单独拿出一个函数写,他说可以直接在打印之前处理一下结果就行,最后听了他的,直接对浮点数进行了处理得到分数,省去了调用函数。
5.我总是会想实现什么样的功能,就会调用一个新的函数,这也导致有些时候程序会变得繁琐,但是他会先想着在原本的函数中实现,我需要多学习。
要求2:
地点:冬华公寓b613
视频讨论:
要求3:
coding地址:[https://e.coding.net/wowcy/f8/f8.git]