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]

posted @ 2020-10-06 23:09  晦涩2  阅读(120)  评论(0编辑  收藏  举报