20200924-5 四则运算试题生成,结对

 此作业要求参见:https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11245

 

结对对象:张兵杰

要求1 参考《构建之法》第4章两人合作,结对编程上述功能,要求每人发布随笔1篇 (代码是共同完成的,随笔有以下两种方式:(①允许两人写一份,得一份分数,二人均分;②如果每人写一份,内容不得抄袭,体会需要是自己的,分别得到自己博客的分数

功能一. 四则运算

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

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

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

> f4
1+2*3+4=
?11
答对啦,你真是个天才!
1+2*3+5=
?11
再想想吧,答案似乎是12喔!
1+2/4-5=
?-3.5
答对啦,你真是个天才!
...(一共20道题)

你一共答对4道题,共20道题。

完成这个功能,老师对你的信任值+10.

 

答:

重点:除数为零以及分数除不尽问题。

难点:一开始写程序主要考虑除数不能为零,可是题目又要求是生成随机数

编程收获:和队友学习到了新的编程思路

 

功能二. 支持括号

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

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

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

> f4
1+2*(3+4)=
?15
答对啦,你真是个天才!
(1+2)*3+5=
?11
再想想吧,答案似乎是14喔!
((1/2)-4)*5=
?-17.5
答对啦,你真是个天才!
...(一共20道题)

你一共答对4道题,共20道题。

完成这个功能,老师对你的信任值+15.

 

答:

重点:判断括号匹配。

难点:括号匹配好好几种,先一个表达式里可以先有括号,在数字运算符,也可以先有加减乘除,在有括号,括号也可以在中间。

编程收获:括号一共分为三种情况,左括号,右括号,还有就是没有括号。

重要代码:

 

def _f4(self):
        from random import randint as r  #直接导入randint函数,更名为r
        from random import uniform as ru  #直接导入uniform函数,更名为ru,用于生成指定范围内的随机浮点数
        from fractions import Fraction as f  #直接导入fractions函数,更名为f
        ops = ['+', '-', '*', '/']  #存储操作符
        kuohao = ['(', '', ')']  #存储括号
        left1 = r(0, 1)
        left2 = r(0, 1)
        left3 = r(0, 1)
        right1 = r(1, 2)
        right2 = r(1, 2)
        right3 = r(1, 2)
        if left1 == 0:
            left2 = 1
            left3 = 1
            if right1 == 2:
                right2 = 1
                right3 = 1
            else:
                right2 = 2
                right3 = 1
        else:
            if left2 == 0:
                left3 = 1
                right1 = 1
                if right2 == 2:
                    right3 = 1
                else:
                    right3 = 2
            else:
                left3 = 0
                right1 = 1
                right2 = 1
                right3 = 2
        add_1 = ru(0, 1)
        add_1 = f(add_1).limit_denominator(10)#限制最大分母值,小数变分数
        add_2 = ru(0, 1)
        add_2 = f(add_2).limit_denominator(10)
        add_3 = r(1, 10)
        add_4 = r(1, 10)
        ops1 = r(0, 2)
        ops2 = r(0, 3)
        ops3 = r(0, 3)
        eq = kuohao[left1] + str(add_1) + ops[ops1] + kuohao[left2] + str(add_2) +kuohao[right1] + ops[ops2] + kuohao[left3] + str(add_3) + kuohao[right2] +  ops[ops3] + str(add_4) + kuohao[right3]
              
        return (eq)

 

 

    for i in range(20):    
        _eq = f4()._f4()
        print(_eq, "=")
        _ans_right = f4()._f4_answer(eq = _eq)
        _ans = input("?")
        if _ans == _ans_right:
            print("答对啦,你真是个天才!")
            yes = yes+ 1
        else:
            print("再想想吧,答案似乎是", _ans_right, "喔!")
            no= no + 1
    print("你一共答对", yes, "道题,共20道题。")
except:
    print("输入有误")
return (0)

 

 

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

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

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

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

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

>f4 -c 3
1+2*(3+4)=                     15
(1+2)*3+5=                     14
((1/2)-4)*5=                   17.5

你指着屏幕对老师说,">"是提示符,实际运行时可能是"C:\Users\Young>","f4"是程序的名字,它真正的名字是"f4.exe","-c 3"是命令行参数。按下回车,此时程序开始执行。"-c"这个参数后面输入多少,就生成多少题目。老师输入

>f4 -c -200
题目数量必须是 正整数。
>f4 -c 3.5
题目数量必须是 正整数。
>f4 -c test
题目数量必须是 正整数。

老师欣慰的笑了。你怔怔地看着她,心下怀疑她真的是教初中数学的那位么。

老师在你的指导下试用了一下,打印出来的题目堪称精美。老师让你做一次试试看能得多少分。你不敢借口四则运算忘光了,只好提起笑来开始答。刚做一半,你发现有几道题目是相同的,心中暗骂随机数不靠谱。又有几道虽然不完全相同,但是可以通过交换律、结合律、分配律变换为同一道题。比如

1*2+3*2
2*(1+3)+0

你暗叫惭愧,说有个小错误修正一下,调试了半晌,终于解决。

完成此功能,老师对你的信任值+10.

 

答:

重点:输入字符是否合法判断。

难点:输入字符是否合法这分好几种情况,因为情况较多。

编程收获:对输入的字符进行了是否正整数,是否是字符、小数、负数不合法情况进行判断。

def _f4_integer_parser(self,x):
        _p = "题目数量必须是  正整数。"
        try:
            x = int(x)
            if x >= 0:
                for i in range(x):
                    _eq = f4()._f4()
                    _right = f4()._f4_answer(eq = _eq)
                    _eq = _eq + "="
                    print(_eq.ljust(40), _right)
            else:
                print(_p)
        except:
            print(_p)
        return(0) 

 

 

 

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

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

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

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

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

>f4 -c 3
1/3+2/3+1+1=                   3
1/2+2/3+1+2=                   4 1/6
7/5+3/4*2-3                    -1/10

你想到越难的题目就越能表现你的能力,欣然应允了,转身跑向实验室,路上就开始给师兄打电话。背后传来女神的声音,"提示1:别忘了约分。提示2:带分数,即 一又二分之一 表示 1 1/2。"

完成这个功能,女神对你的青睐+200。

这个题目太难了,接电话的师兄说他一点思路也没有。你提出有好酒肉一顿,他幽幽地说,又回忆起点什么,传说去年还是前年有位姓张的大神完成了,如果你求助于他或他的博客 (但不是抄袭,而是学习后独立实现) ,请主动说明,女神的青睐改为+150。他还回忆道,有本神书缩写名为SICP,中文名《计算机程序的构造和解释》第2.1.1节 实例:有理数算术运算,就是以此为例,不过,是scheme语言的,他也没有听说过。参考此书,请主动说明,女神的青睐改为+180。

(在你的心中,女神的要求并不像昔日的老师那么重要。此题选作,不完成此题不倒扣分。)

 

答:

重点:支持分数出题和运算。

难点:支持分数运算。

编程收获:对分数的运算。

 

 

(3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。 (10分)

 

答:

1.编程语言选择:因为队友对java掌握熟练,我不是很熟练,所以对python和java纠结很久。

 

2.代码调整:因为是共同完成,出现bug不好找。

3.代码规范:python中代码要求规范,和我们平时习惯不太一样,需要调整

4.对python语言掌握的不熟练,需要查一些知识点

5.在时间不协调方面,因为国庆假期,两个人有时候联系不上.

 

 

要求2 给出结对开发的截图证据,要求截图能够证明你们是在结对编程。 (5分)

 

 

 

要求3 代码地址:https://e.coding.net/yyy11/f4/f4.git

 

posted @ 2020-10-06 00:28  lucer  阅读(174)  评论(0编辑  收藏  举报