zoukankan      html  css  js  c++  java
  • 20200924-5 四则运算试题生成,结对

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

    结对伙伴:杜志峰

    功能1. 四则运算

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

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

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

    重点难点:控制题目个数,随机生成运算符和运算数,并且当含有分数(不能转化成有限小数的)时,该如何计算?由于是随机生成数,那么当做分数运算时如何确保分母不为零。因为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)对代码规范的要求:代码规范是我们一同商量之后所决定的,所以会有很多地方不是太习惯,比如习惯用tab键作为缩进、类与类之间的空行等等,规范代码所花费时间也较长。

    3))完善功能:大致框架出来之后,在输入输出格式还有随机数生成范围的限定上面进行了多次调试

    4)特殊情况:在做除法运算的时候,刚开始没有考虑到随机数0的情况,一直运行不通过,后来发现用random限定随机数范围之后才解决这个问题。

    5)函数调用:对于函数调用,我俩也是费了很多精力上网查询调用函数该如何用,有什么功能。

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

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

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

  • 相关阅读:
    python递归函数
    python全局替换文件内容脚本第1版
    python的if判断补充
    python装饰器
    python函数作用域
    python函数基础
    python文件操作
    ASCII、Unicode和UTF-8编码的区别
    python基础(二)----数据类型
    python基础第一章
  • 原文地址:https://www.cnblogs.com/weichenaa/p/13765930.html
Copyright © 2011-2022 走看看