20190919-6 四则运算试题生成,结对

此作业要求:https://edu.cnblogs.com/campus/nenu/2019fall/homework/7631

git 地址:https://e.coding.net/wangzw877/sizeyunsuan.git

结对队友:王志文

功能1. 四则运算

支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答 (提示:1/3 != 0.33333333333333333333333333333333,而是无限长)。

为了快出成果,你快速造个控制台的版本,包括以后改版成更优秀界面的核心功能,并考虑到扩展。

你在老师面前作如下表演 (数字你用excel验算过了,UI的卖萌部分你还没有想好) 。

重难点:如何运用随机数以及运算符的生成以及如何运算

收获:在完成这个功能时我收获了很多,学会了如何生成随机数,面对如何生成运算符的问题,我将加减乘除定义成了四个随机数,根据生成的随机数来转换成相应的运算符。在运算问题上,我学着运用了逆波兰表达式来完成,尽管困难很多。

代码片段:

def function1():        # 功能1
    right = 0
    i = 0

    while i in range(20):
        i = i + 1
        equation = create_equation()  # 生成表达式
        re_equation = reverse_polish(equation)  # 转为逆波兰表达式
        result = calculate(re_equation)  # 计算表达式的结果
        answer0 = result
        if result is False or result is None or len(str(result)) > 12:
            i = i - 1
            continue
        str_equation = " ".join('%s' % id for id in equation)
        print(str_equation+ "=")
        print("?",end="")
        answer = float(input()) 
        if abs(result - int(result)) < 1.0e-16:
            result = int(result)
        if answer == answer0:
            print("答对啦!你真是个天才!")
            right = right + 1
        else :
            print("再想想吧,答案似乎是" + repr(result) + "喔!")
    print("你一共答对" + repr(right) + "道题,共20道题。")

 

功能2. 支持括号

老师看了你的表演,大大赞赏了你。然后她说,"你的题库里怎么都是没有括号的题呢,我记得你当初括号就掌握得不好啊。"你的脸红了,对老师说,"给我2个小时时间,我给你一个新版本,有括号的。"

你拿出笔记本,偷偷微信你们《构建之法》班的学霸,她说肯定能行,但是细节信号不好你听不清,只捕捉到隐约几个词"逆波兰""后缀表达式""堆栈""我看好你""数据结构"。

两小时后,在老师面前你在控制台下输入f4,然后回车。

重难点:逆波兰表达式的应用

收获:在做这个功能的过程中,我收获了很多,首先我从对逆波兰表达式是什么都不知道的状态到了能够成功应用逆波兰表达式,其实逆波兰表达式就是我们在数据结构中学习的后缀表达式,我才用建栈,入栈和出站完成了表达式的运算。

代码片段:

def calculate(re_equation):         # 计算逆波兰表达式
    stack = PyStack()
    sumEnd = 0

    if len(re_equation) is 0:
        return sumEnd
    for i in re_equation:
        if i in range(0, 100):
            stack.push(float(i))
        elif '+' is i:
            a = stack.pop()
            b = stack.pop()
            stack.push(b + a)
        elif '-' is i:
            a = stack.pop()
            b = stack.pop()
            stack.push(b - a)
        elif '×' is i:
            a = stack.pop()
            b = stack.pop()
            stack.push(b * a)
        elif '÷' is i:
            a = stack.pop()
            b = stack.pop()
            if a == 0:
                return False             #print('%d/%d分子不能为0' % (b, a))
            else:
                stack.push(b / a)
    return stack.pop()

功能3. 限定题目数量,"精美"打印输出,避免重复

"就这点儿题,像你当年做得那么快,一会儿就完成啦!"老师说,"另外,我想打印出来,上课也不能带台机器。又另外,你把答案也打出来呗,我把答案剪掉,题目给学生做。"

一看需求这么多,你生怕她会说,"这都是很简单的功能,你一定能完成吧"。你知道如果承诺今晚,明早交工的时候她一定想出了更多可怕的需求,你赶紧说,"老师我现在就做。"

你忘记怎么调用打印机了,就把答案与题目横向对齐,输出在文件的右边。告诉老师txt文件可以用WORD打开,也能打印。她满意而意味深长地笑了,表示同意。

你输入命令执行的时候,脑袋比手指头还疼。

重难点:对前面函数进行调用,根据读入的参数需要生成的表达式个数生成表达式,写入文本。

收获:这个功能的主要收获就是如何写入文本。

代码片段:

def function3(n):
    n = int(n)
    i = 0

    while i in range(n):
        i = i+1
        equation = create_equation()  # 生成表达式
        re_equation = reverse_polish(equation)  # 转为逆波兰表达式
        result = calculate(re_equation)  # 计算表达式的结果
        if result is False or result is None or len(str(result)) > 12:
            i = i-1
            continue
        if i is 1:
            if os.path.exists('题目打印.txt'):
                os.remove('题目打印.txt')
        write_file(equation, result)  # 将表达式及结果写入文件

功能4. 支持分数出题和运算

国庆节后,你终于又回到美丽优雅并且正常的东北师范大学净月校区,在去食堂的路上偶遇你心目中的女神 (或男神,请自行替换)。她说,"哎呀,这跟我们《构建之法》课上的题目要求一样啊,真是巧合。"

"不要客气,代码拿去!反正我也没用。"你说,"如果有需求变更或扩展,尽管找我。"

你伏笔埋得不错。女神马上说,"对啊,有一点儿点儿不一样,你午饭时间加加班帮我改出来吧。"

她的题目还要求支持分数运算,你不禁想到了功能1中你特意规避了一些题目不出。她想要的是下面的样子:

 重难点:这个功能的完成是借鉴了学长代码的经验,

收获:从

代码片段:

while i < n:

    first_num=random.randint(1,10)
    second_num=random.randint(1,100)
    third_num=random.randint(1,100)
    fourth_num=random.randint(1,100)
    a = random.choice("+-*/")
    if second_num==1:
        x=first_num
    else:
        x=fractions.Fraction(first_num,second_num)  #第一个数是分子、第二个是分母
    if fourth_num==1:
        y=second_num
    else:
        assert isinstance(fourth_num, object)
        y=fractions.Fraction(second_num,fourth_num)
    if a=="+":
        result=x+y
        faker=str(result)
        print(x,a,y,"=")
    elif a=="-":
        result=x-y
        faker=str(result) #生成字符型
        print(x,a,y,"=")
    elif a=="*":
        result=x*y
        faker=str(result)
        print(x,"x",y,"=")
    elif a=="/":
        result=x/y
        faker=str(result)
        print(x,"÷",y,"=")
    answer=input()

编程体会:

  在这次作业的完成过程中,我学得了很多,也收获了很多,首先我发现在开始着手一个程序的编写时一定要读明白项目的需求,否则在编程过程中发现某些方面不符合项目需求,去改代码是比较困难的,需要考虑每一个方面;另外这是个合作完成的项目,在和队友的交流中也发现了一个人的想法是单一的,交流可以帮助更好的完成项目需求,在讨论采用什么方法,如何写这个功能都可以比较全面的分析。总之,团队队友之间多交流多探讨有利于项目的更好完成。

花费时间比较长的事件:

(1)在如何随机生成运算符花费了比较长的时间,只会生成随机数,如何生成运算符讨论了很久。

(2)逆波兰表达式的运用花费了很长的事件,首先网上查找逆波兰数的定义,用法,如何运用在这个项目中经过了很长时间的查找资料和与队友商量。

(3)随机数在python中怎么运用以及完成这个项目该怎么使用这个函数。

(4)修改代码中不规范的命名

(5)功能三中如何将生成的批量文件写入文本。

(6)如何添加括号。

工作地点:冬华公寓b608

计算机:贺敬文同学计算机

照片:

原文地址:https://www.cnblogs.com/hejw031/p/11574747.html