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