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

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

 

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

(1) 给出每个功能的重点、难点、编程收获。

结对伙伴:韩志超

功能1. 四则运算

重点难点:对于分数和浮点数的处理是该部分的难点,在请教学长和查阅相关资料后了解到了Python里面有专门的模块来进行该部分的处理,fraction模块提供有关有理数的算术表达和计算,

实际上就是分数的表达和计算。同时生成随机数的方法分别是randint随机生成整数和uniform随机生成浮点数。

功能2. 支持括号

重点难点:本功能的重难点在于不同位置括号之间的匹配对齐问题,什么位置出现了左括号对应的右括号什么时候出现不能出现两个左括号或者两个右括号的问题,在经过商量讨论

后在决定在纸上将该部分逻辑表达清楚再写代码,将每个括号出现的位置罗列出来,当某个位置出现括号时其它位置上的括号如何调整。结伴对象先进行改写完了我在进行测试时发现

有小bug有时会出现左括号而没有右括号与之匹配,后进行修改完成功能。

功能一功能二代码:

def expression():#随机生成表达式
    symbol = ['+', '-', '*', '/']
    brackets = ['(', '', ')']
    # 随机产生计算符
    s1 = randint(0, 2)
    s2 = randint(0, 3)
    s3 = randint(0, 3)
    #随机产生括号bt表示左括号,br表示右括号
    bt1 = randint(0, 1)
    bt2 = randint(0, 1)
    bt3 = randint(0, 1)
    br1 = randint(1, 2)
    br2 = randint(1, 2)
    br3 = randint(1, 2)
    if bt1 == 0:
        bt2 = 1
        bt3 = 1
        if br1 == 2:
            br2 = 1
            br3 = 1
        else:
            br2 = 2
            br3 = 1
    else:
        if bt2 == 0:
            bt3 = 1
            br1 = 1
            if (br2 == 2):
                br3 = 1
            else:
                br3 = 2
        else:
            bt3 = 0
            br1 = 1
            br2 = 1
            br3 = 2
    num1 = uf(0, 1)
    # 对随机产生的分子分母做最大限制
    num1 = fr(num1).limit_denominator(10)
    num2 = uf(0, 1)
    num2 = fr(num2).limit_denominator(10)
    num3 = randint(1, 10)
    num4 = randint(1, 10)
    # 产生随机表达式
    ran_exp = brackets[bt1] + str(num1) + symbol[s1] + brackets[bt2] + str(num2) + brackets[br1] + \
              symbol[s2] + brackets[bt3] + str(num3) + brackets[br2] + symbol[s3] + str(num4) + brackets[br3]
    ran_exp = str(ran_exp)
    return ran_exp

 

 

def fixed(): #固定20道题目
    right = 0
    for j in range(20):
        exp = expression()
        print(exp,"=")
        in_answ = input("?")
        re_answ = answer(exp)
        if in_answ == re_answ:
           print("答对了你真是一个天才")
           right = right +1
        else:
            print("你答案错了,再算一算吧,答案是", end= ' ')
            print(dict_split(re_answ))
    print("一共20道题,你一共答正确了", right, "道题

运行结果截图:

 

 

 

 

 

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

重点难点:本部分难点在于实现精美打印时的输出对齐问题从网上查找资料尝试了几种办法最后找到解决方法

 

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

重点难点:这里的难点在于判断输入的题目数量是否是正整数,如果输入的是负数、浮点数、字母之类的都不合格,这里使用了isdigit()函数来进行判断输入题目是否

是整数,以及标准打印时的输出对齐问题耗费时间较久。同时实现了女神要求的答案约分问题处理这里的时候将答案分子分母拆开进行运算后重新输出。

指定输入题目代码如下:

def deft_input(num):#指定输入多少个题目
    right = 0
    data = open("data.txt",'w+')
    if str.isdigit(str(num)):
        num1 = int(num)
        for i in range(num1):
            exp = expression()
            exp1 = exp + '='
            re_answ = answer(exp)
            print('{:<50}{:<25}'.format(exp1, dict_split(re_answ)))
            print('{:<50}{:<25}'.format(exp1, dict_split(re_answ)), file=data)
    else:
        print("题目数量必须是 正整数。")

实现约分代码如下:

def dict_split(str1):#将分子和分母分别存储到不同的两个字典中输出约分
    d1 = {}
    d2 = {}
    count1 = 0
    count2 = 0
    pred = 1
    sign = 0
    for s in str1:
        if s == '-':
            sign = s
            continue
        if s == '/':
            pred = 0
            continue
        if pred == 1:
            d1[count1] = s
            count1 = count1 + 1
        else:
            d2[count2] = s
            count2 = count2 + 1
    numerator = take_integer(d1)
    # 分母
    denominator = take_integer(d2)
    answer1 = -10000
    if denominator == 0:
        return numerator
    else:
        we1 = numerator // denominator
        we2 = numerator % denominator
        if sign == '-':    #判断结果是否为负
            if we1 == 0:
                answer1 = sign + str(we2) +'/' + str(denominator)
                return answer1
            else:
                answer1 = sign + str(we1) + ' ' + str(we2) + '/' + str(denominator)
                return answer1
        else:
            if we1 == 0:
                answer1 = str(we2) + '/' + str(denominator)
                return answer1
            else:
                answer1 = str(we1) + ' ' + str(we2) + '/' + str(denominator)
                return answer1

def take_integer(dicts={}):#将字典存储的数还原为十进制数
    a1 = dicts
    j = len(a1) - 1
    sum1 = 0
    for ss in range(0, len(a1)):
        if j < 0:
            break
        sum1 = int(a1[j]) * int(math.pow(10, ss)) + sum1
        j = j - 1
    return sum1

分别拆开分数的分子和分母进行重新约分计算方法比较笨但是可以实现该功能。

功能四结果截图:

 

 

 

 

功能5 未来

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

(2)给出结对编程的体会

结对编程是和之前自己完成作业完全不一样的体验,由于自己本来是拖延症晚期每次完成作业都在最后一天提交,但是在结对编程过程中由于必须考虑到队友的感受

所以我们很早就开始了这次的作业,结对编程相对于独自编程碰到困难只能自己找资料搜索来说碰到困难更容易解决,可能这个问题是自己的知识盲点但队友就可以帮助到

自己很快的克服难题,结对编程是一个互相帮助不断进步的过程。

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

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],里面有测试用例

地址:https://github.com/suihao228491/homework3.git

 

 

 

 

 

 

 


 

posted @ 2020-10-07 19:00  又是夏了  阅读(142)  评论(0编辑  收藏  举报