四则运算试题生成,结对

作业要求参见    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

 

posted on 2020-10-05 22:39  wowzcy  阅读(146)  评论(0编辑  收藏  举报

导航