此作业要求参见https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11245
结对伙伴:吴艳丽
功能1. 四则运算
支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答 (提示:1/3 != 0.33333333333333333333333333333333,而是无限长)。
重点,难点:对随机生成的数进行运算,在计算结果和接收到的答案之间要用str进行转换,否则匹配不成功
代码:
1 #产生四则运算表达式 2 def ques(): 3 brackets = ['(','',')'] 4 operators = ['+','-','*','/'] 5 #随机产生运算符 6 i1 = random.randint(0,2) 7 i2 = random.randint(0,3) 8 i3 = random.randint(0,3) 9 #随机产生四个数 10 number1 = random.uniform(0,1) 11 number1 = Fraction(number1).limit_denominator(10) 12 number2 = random.uniform(0,1) 13 number2 = Fraction(number2).limit_denominator(10) 14 number3 = random.randint(1,10) 15 number4 = random.randint(1,10) 16 def result(): 17 total = 0 18 for i in range(20): 19 question = ques() 20 print(question) 21 res = eval(question) 22 ans = input("? ") 23 if str(res) == str(ans): 24 print("答对啦,你真是个天才!") 25 total += 1 26 else: 27 print("再想想吧,答案似乎是%f" %res) 28 print("一共答对" + str(total) + "道题," + "共20道题!")
运行效果图:
功能2. 支持括号
重点,难点:括号的几种形式以及如何表达想了好久,后来我们两个参考往届的学姐的程序,最终理解并完成程序,在括号匹配要注意逻辑问题。
代码:
1 #随机产生左括号 2 left1 = random.randint(0,1) 3 left2 = random.randint(0,1) 4 left3 = random.randint(0,1) 5 #随机产生右括号 6 right1 = random.randint(1,2) 7 right2 = random.randint(1,2) 8 right3 = random.randint(1,2) 9 #括号匹配 10 if left1 == 0: 11 left2 = 1 12 left3 = 1 13 if right1 == 2: 14 right2 = 1 15 right3 = 1 16 else: 17 right2 = 2 18 right3 = 1 19 else: 20 if left2 == 0: 21 left3 = 1 22 right1 = 1 23 if right2 == 2: 24 right3 = 1 25 else: 26 right3 = 2 27 else: 28 left3 = 0 29 right1 = 1 30 right2 = 1 31 right3 = 2 32 ques = brackets[left1] + str(number1) + operators[i1] + brackets[left2] + str(number2) 33 ques += brackets[right1] + operators[i2] + brackets[left3] + str(number3) + brackets[right2] 34 ques += operators[i3] + str(number4) + brackets[right3] 35 ques = str(ques) 36 return ques
运行效果图:
功能3. 限定题目数量,"精美"打印输出,避免重复
重点,难点:在格式输出上的表达方式查阅了很多资料,
代码:
1 def command_input(num): 2 data = open('data.txt','w+') 3 if num.isdigit(): 4 for i in range(int(num)): 5 question = ques() 6 question1 = question + '=' 7 res = Fraction(eval(question)).limit_denominator(100000) 8 print('{:<50}{:<25}'.format(question1,traversal_dist(str(res)))) 9 print('{:<50}{:<25}'.format(question1,traversal_dist(str(res))),file = data) 10 else: 11 print("题目数量必须是正整数。")
运行效果图:
功能4. 支持分数出题和运算:
重点,难点:十进制的表示,以及遍历分数的时候判断符号和除号要进行标记。
代码:
1 #将分子分母转换为十进制数 2 def take_decimalism(dicts = {}): 3 j= len(dicts)-1 4 sum1 = 0 5 for i in range(0,len(dicts)): 6 if j < 0: 7 break 8 sum1 = int(dicts[j]) * int(math.pow(10,i)) + sum1 9 j = j-1 10 return sum1 11 12 #遍历结果,将分子、分母存储到两个字典中并约分 13 def traversal_dist(res): 14 d1={} 15 d2={} 16 count1=0 17 count2=0 18 flag=0 19 sign=0 20 for i in res: 21 if i=='-': 22 sign=i 23 continue 24 if i=='/': 25 flag=1 26 continue 27 if flag==0: 28 d1[count1]=i 29 count1=count1+1 30 else: 31 d2[count2]=i 32 count2=count2+1 33 #分子 34 numerator = take_decimalism(d1) 35 #分母 36 denominator = take_decimalism(d2) 37 if denominator == 0: 38 return numerator 39 else: 40 w1=numerator // denominator 41 w2=numerator % denominator 42 answer=0 43 if sign=='-': 44 if w1==0: 45 answer=sign+str(w2)+"/"+str(denominator) 46 else: 47 answer=sign+str(w1)+" " +str(numerator)+"/"+str(denominator) 48 else: 49 if w1==0: 50 answer=str(w2)+"/"+str(denominator) 51 else: 52 answer=str(w1)+" " +str(numerator)+"/"+str(denominator) 53 return answer
运行效果图:
要求1 参考《构建之法》第4章两人合作,结对编程上述功能,要求每人发布随笔1篇 (代码是共同完成的,随笔有以下两种方式:(①允许两人写一份,得一份分数,二人均分;②如果每人写一份,内容不得抄袭,体会需要是自己的,分别得到自己博客的分数)。 (1) 给出每个功能的重点、难点、编程收获。(2)给出结对编程的体会,以及 (3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。 (10分)
1 我觉得结对编程要比单独编程好的多,因为在两个人思考问题的时候,会出现一些互补,而且在编程的过程中,吴艳丽同学很有行动力,会很督促我们的学习。
2 我们在空格这里吃了很大的亏,反复推敲代码都觉得没有问题,但是就是显示无效的输入,后来花了大量的时间去改那个程序,有些甚至怀疑对的编码,得出体会要严格遵守编程规则。
3 在括号匹配的时候,吴艳丽同学理解的比我要透彻,又重新缕了下思路,我们才继续进行。
4 由于python有些语法,函数不是很熟悉,在编写代码的过程在网上查阅了很多。我们一起研究,一起讨论一步一步实现每一个功能。
5 在分子分母转化为十进制我们这里讨论了很久,用math.pow 进行表示,对下标的开始也是有分歧的,最终决定从后往前遍历,这样在表示时更加方便。
要求2 给出结对开发的截图证据,要求截图能够证明你们是在结对编程。 (5分)
要求3 使用coding.net做版本控制。checkin 前要求清理 临时文件、可执行程序,通常执行 build-clean可以达到效果。(25分)