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

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

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

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

结对伙伴:李虎

项目说明,本次项目使用了Python作为开发语言,该语言灵活易懂便于快速开发。

开发环境是 Windows10

开发工具是 Visual Studio 2019

Python语言版本为 3.8

版本控制选用 Git

GIT地址:https://e.coding.net/thinkget/wf/f4.git

功能一、二合并进行编程,同时为功能四预留接口

功能一重难点:实现对生成的等式进行计算(采用暴力穷举法,一边进行式子变换,一边计算)

功能二重难点:多余括号的处理方法,将生成好的式子进行人工检查,将不合理的地方在程序内写入判断加入括号。

功能四重难点:分数计算,这里采用Fraction进行分数化简和计算。如果不采用Fraction,可以通过两个int进行计算,最后再化简即可。

突出点:由于题目要求很简单,没有使用往届学长学姐们使用的逆波兰表达式、堆栈等。直接使用暴力穷举法,列出所有可能为式子的等式。通过分析,得出9种不同的方式,和两种大模式,并对此特点进行编写程序。

def random_yunsuan(a, b, t, side=0):#进行运算和位置关系处理
    if side==0:
        if t==1:
            return a+b
        elif t==2:
            return a-b
        elif t==3:
            return a*b
        elif t==4:
            return a/b
    elif side==1:
        if t==1:
            return b+a
        elif t==2:
            return b-a
        elif t==3:
            return b*a
        elif t==4:
            return b/a

def random_yunsuanfu(a, b, side=0):#随机运算符并处理除数为0的情况
    if side==0:
        if b==0:
            return random.randint(1, 3)
    elif side==1:
        if a==0:
            return random.randint(1, 3)
    return random.randint(1, 4)

def yunsuanfu(t):#将运算符以正常符号表示
    if t==1:
        return " + "
    elif t==2:
        return " - "
    elif t==3:
        return " * "
    elif t==4:
        return " / "

def build_question(a, b, c, d):
    #进行第一层运算
    fh1=random_yunsuanfu(a, b)
    sum1=random_yunsuan(a, b, fh1)
    string1=""
    string2=""
    mode=random.randint(0, 9)
    if mode<3:#判断括号模式
        #双括号在同一层
        fh2=random_yunsuanfu(c, d)
        sum2=random_yunsuan(c, d, fh2)#进行另一边运算
        fh3=random_yunsuanfu(sum1, sum2)
        sum3=random_yunsuan(sum1, sum2, fh3)#两边合并运算
        string1=""
        string2=""
        if fh3==3 or fh3==4:#处理括号情况
            if fh1==1 or fh1==2:
                string1="("+str(a)+yunsuanfu(fh1)+str(b)+")"
            if fh2==1 or fh2==2:
                string2="("+str(c)+yunsuanfu(fh2)+str(d)+")"
            if c==0 and fh2==4:
                string2="("+str(c)+yunsuanfu(fh2)+str(d)+")"
            if fh3==4 and fh2==4:
                string2="("+str(c)+yunsuanfu(fh2)+str(d)+")"
        if fh3==2:#修复处理括号情况
            if fh2==1 or fh2==2:
                string2="("+str(c)+yunsuanfu(fh2)+str(d)+")"
        if string1=="":
           string1=str(a)+yunsuanfu(fh1)+str(b)
        if string2=="":
           string2=str(c)+yunsuanfu(fh2)+str(d)
        string3=string1+yunsuanfu(fh3)+string2
    else:
        #三层运算模式
        side1=random.randint(0, 1)#随机位置
        fh2=random_yunsuanfu(sum1, c, side1)
        sum2=random_yunsuan(sum1, c, fh2, side1)#运算第二层
        side2=random.randint(0, 1)
        fh3=random_yunsuanfu(sum2, d, side2)
        sum3=random_yunsuan(sum2, d, fh3, side2)#运算第三层
        flag1=0
        flag2=0
        if fh2==3 or fh2==4:#处理括号模式
            if fh1==1 or fh1==2:
                flag1=1
            if fh1==4 and side1==1:
                flag1=1
        if fh1==4 and a==0 and side1==1:
            flag1=1
        if fh2==2 and side1==1:
            flag1=1
        if fh3==3 or fh3==4:
            if fh2==1 or fh2==2:
                flag2=1
            if fh2==4 and side2==1:
                flag2=1
        if fh2==4 and sum1==0 and side2==1:
            flag2=1
        if fh3==2 and side2==1:
            flag2=1
        string1=str(a)+yunsuanfu(fh1)+str(b)
        if flag1==1:#判断是否添加括号
            string1="("+string1+")"
        if side1==0:
            string2=string1+yunsuanfu(fh2)+str(c)
        elif side1==1:
            string2=str(c)+yunsuanfu(fh2)+string1
        if flag2==1:#判断是否添加括号
            string2="("+string2+")"
        if side2==0:
            string3=string2+yunsuanfu(fh3)+str(d)
        elif side2==1:
            string3=str(d)+yunsuanfu(fh3)+string2
    return string3, sum3

  

功能一二测试截图

 

 

  功能三、四合并进行编程

功能三难点:从控制台取参数(采用argparse包进行管理),格式对齐(使用py自带的格式化文本功能),输出到txt文件,不出现重复(将每一个结果写入数组判断最后数值是否与之前的相等)

功能四难点:前面功能中预留接口直接换成分数即可。

def output(x):
    integer = "题目数量必须是 正整数。"
    try:
        x = int(x)
        if x >= 0:
            data=open("data.txt",'w+') 
            for i in range(x):
                #随机生成四个分数
                a = Fraction(random.randint(0, 9), random.randint(1, 9))
                b = Fraction(random.randint(0, 9), random.randint(1, 9))
                c = Fraction(random.randint(0, 9), random.randint(1, 9))
                d = Fraction(random.randint(0, 9), random.randint(1, 9))
                suan_shi, sum=build_question(a, b, c, d)
                suan_shi =suan_shi + "="
                zs=(int)(sum.numerator/sum.denominator)
                fs=sum-zs
                if fs==Fraction(0, 1):
                    #print(suan_shi.ljust(40), str(zs))
                    print ('{:<30}{:<20}' .format(suan_shi,str(zs)),file=data) 
                elif zs==0 and fs!=Fraction(0, 1):
                    #print(suan_shi.ljust(40), str(fs))
                    print ('{:<30}{:<20}' .format(suan_shi,str(fs)),file=data) 
                else:
                    if fs<Fraction(0, 1):
                        fs=-fs
                    #print(suan_shi.ljust(40), str(zs)+" "+str(fs))
                    print ('{:<30}{:<20}' .format(suan_shi,str(zs)+" "+str(fs)),file=data) 
            data.close()
        else:
            print(integer)
    except:
        print(integer)
    return(0)

  

  

 

 功能5 未来

已经设计成函数模式,直接复制调用即可

 (2)结对编程的体会

通过结对编程,我有了更深的认识,两个人总比一个人编程要强很多,以前做项目包括本科课程设计都是一个人孤军奋战,代码写的手忙脚乱,有时候逻辑不严谨就会出现一连串的BUG,一个人编程有时候也会很懒惰,之前写了项目几个月还没写完。现在有了一位朋友帮忙监督,随时提醒编程上的错误,使得开发过程比较顺利,开发速度也快了很多,还可以一起讨论一下程序的逻辑如何编写,不必因为一点错误而反复改写程序代码,遇到不同想法也可以分别编程比对不同想法的优缺点。两人还可以交流一些代码编程技巧,方便更深的了解编程语言。

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

①一开始语言的选择方面,李虎同学擅长使用Python语言,而我擅长C#,于是产生了一点点分歧,不过以后也要用到python,于是选择使用Python语言进行编程。

②程序逻辑方面,李虎同学要使用往届同学用过的逆波兰表达式方法,而我自己推演出一套暴力穷举法。最后由于逆波兰表达式方法太过于普通,而且需要进行理论学习,最后选择了暴力穷举法。

③在编码的时候,由于没接触过Python,导致我按照普通编程语言去写代码,比如加了一堆分号,逗号后面没有留空格,这些李虎同学都给我指出来了,我说要等最后一块改,他说不行,现在改掉对你以后养成编程习惯有好处,争论半天还是把写了一半的代码重新修改成规范的格式。

④输出文件的时候,分数处理问题

⑤处理括号添加问题,有一些式子算的不对

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

图片已销毁

要求3 使用coding.net做版本控制。

https://e.coding.net/thinkget/wf/f4.git

 

posted @ 2020-09-27 17:05  思得  阅读(230)  评论(2编辑  收藏