此作业的要求参见[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