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

此作业要求参见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分)

git 地址:https://github.com/amancer34/calculate.git

posted @ 2020-10-06 19:31  gongbabybaby23  阅读(140)  评论(0编辑  收藏  举报