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

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

结对伙伴:魏琛

功能1. 四则运算

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

重难点:由于题目的要求,算式是随机生成的,所以要随机生成运算符和数字,又因为是随机生成数字,我们应该保证结果正确性即分母不可以为零。我们可以使用python中的方法,fraction有分数的表达和计算,randint随机生成整数,uniform随机生成浮点数。

功能2. 支持括号

重难点:括号的位置是否正确,如何匹配。

功能一功能二代码:

#by: psy_yp
class f4(object):
    def __init__(self):   #初始化新建对象
        pass
        """
      功能1、2:实现含有括号的四则运算
    """
    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 = ['(', '', ')']  #存储括号,下标为0,1,2
        
        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)

    def _f4_answer(self,eq):
        from fractions import Fraction as f
        answer1 = f(eval(eq)).limit_denominator(1000)
        answer1 = str(answer1)
        return(answer1)
    def _f4_input(self):
        try:
            yes= 0
            no = 0
            for i in range(20):     #输出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. 限定题目数量,"精美"打印输出,避免重复

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

重难点:如何规范输出,避免重复,随机生成题目是重点。

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)

效果截图:

功能5 未来

还有可能把程序改造成GUI版,把程序改造为web版,把程序移植为android/ios版。今天留好接口,明天就不发愁。 (0分)

要求1 参考《构建之法》第4章两人合作,结对编程上述功能,要求每人发布随笔1篇 (代码是共同完成的,随笔有以下两种方式:(①允许两人写一份,得一份分数,二人均分;②如果每人写一份,内容不得抄袭,体会需要是自己的,分别得到自己博客的分数)。 (1) 给出每个功能的重点、难点、编程收获。(2)给出结对编程的体会,以及 (3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。 (10分)


(1)重难点已在各功能前给出

(2)结对编程体会:

       这是第一次结对编程,也是一次尝试,我的编程能力比较弱,很怕拖对方后腿,但实际情况中相处的很融洽,总体的效率也有一些提升,遇到问题也懂得一起解决,也了解了自身的弱点所在,这次经历,也让我们感受到了团队的结合是多么重要,也能从同伴身上学到很多自己没有的点。

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

1)编程语言的选择:我们两人对于python是比较了解的,python用起来也更方便,所以选择了这门语言。

2)代码的规范:这是我们共同商量决定的,刚刚开始还是会犯很多错误。

3)功能的完善:在许多细节方面还是考虑了很久。

4)特殊情况:做除法运算时,最开始情况没考虑完全。

5)函数调用:也看了官方文档,在搜索引擎中查询函数如何使用。

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

截图:

要求3 使用coding.net做版本控制。checkin 前要求清理 临时文件、可执行程序,通常执行 build-clean可以达到效果。(25分)

虽然只有5分,但此题如果做错,因为教师得不到你的代码,所以会导致“功能实现”为负分。
代码要求在 coding.net 做版本控制。要求push&pull时使用git客户端,不允许使用web页面。
要求频繁checkin。要求在PSP中记录的每次离开键盘30分钟以上,需要checkin。如果你持续长达4小时不离开键盘,教师要求展示此项能力。量化的可考核的指标要求: 每个功能,要求有4次以上 checkin,展示(1)逐步实现功能和(2)修复bug时的过程; 每次checkin都要求可以成功编译。
推荐git客户端tortoisgit。
推荐先pull [https://github.com/weijunying2019102969/novelsfortest.git],里面有测试用例。

coding地址:https://e.coding.net/weichenaa/f4/f4.git

posted @ 2020-10-07 14:50  duzf  阅读(120)  评论(0编辑  收藏  举报