zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【前缀和】【枚举倍数】 Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) D. Arpa and a list of numbers
    【推导】【暴力】Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) C. Five Dimensional Points
    【推导】Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) B. Arpa and an exam about geometry
    【推导】【模拟】AtCoder Regular Contest 082 F
    【计算几何】【推导】【补集转化】AtCoder Regular Contest 082 E
    【推导】AtCoder Regular Contest 082 D
    【推导】【分类讨论】Codeforces Round #431 (Div. 1) B. Rooter's Song
    【推导】【贪心】Codeforces Round #431 (Div. 1) A. From Y to Y
    【贪心】hdu6180 Schedule
    【启发式搜索】【A*算法】hdu6171 Admiral
  • 原文地址:https://www.cnblogs.com/thinkget/p/13740288.html
Copyright © 2011-2022 走看看