Github项目地址:
1.题目要求
2.PSP表格
(在开始实现程序之前,在下述PSP表格记录估计将在程序的各个模块的开发上耗费的时间。)
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
10 |
15 |
Estimate |
估计这个任务需要多少时间 |
120 |
180 |
Development |
开发 |
40 |
60 |
Analysis |
需求分析 (包括学习新技术) |
15 |
20 |
Design Spec |
生成设计文档 |
10 |
15 |
Design Review |
设计复审 (和同事审核设计文档) |
10 |
15 |
Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
5 |
10 |
Design |
具体设计 |
15 |
20 |
Coding |
具体编码 |
30 |
40 |
Code Review |
代码复审 |
5 |
10 |
Test |
测试(自我测试,修改代码,提交修改) |
10 |
25 |
Reporting |
报告 |
20 |
30 |
Test Report |
测试报告 |
10 |
15 |
Size Measurement |
计算工作量 |
5 |
10 |
Postmortem & Process Improvement Plan |
事后总结, 并提出过程改进计划 |
10 |
15 |
合计 |
|
310 |
480 |
3.解题思路
刚开始拿到题目后,如何思考,如何找资料的心路历程。
首先想到的是该软件给小学生使用的,所以答案不应该出现负数,即自动生成的两个随机数在进行减法运算时需比较大小;而在除法运算时,除数不能为0;还要实现支持真分数的四则运算,避免假分数自动生成,所以自动生成的数若为分数则需小于1;若回答错误需要给出正确答案。
4.设计实现
定义函数:用def szys()实现随机生成整数的四则运算最后输出算式并返回正确答案。
用def c1()和def c2()实现随机生成整数或分数的四则运算最后输出算式并返回正确答案。
通过random模块生成一定区间里的随机数,分数也可以通过随机生成分子和分母的形式随机生成。同时分数可以使用Fraction模块,可以实现分数与整数的运算以及分子和分母的约分。
5.代码说明
1 import random 2 #四则运算 3 def szys(): 4 sym = [‘+‘, ‘-‘, ‘ב, ‘÷‘] 5 f= random.randint(0, 3) 6 n1 = random.randint(1, 99) 7 n2 = random.randint(1, 99) 8 result = 0 9 if f== 0:#加法 10 result = n1 + n2 11 elif f == 1:#减法,要先比较大小,防止输出负数 12 n1, n2 = max(n1, n2), min(n1, n2) 13 result = n1 - n2 14 elif f== 2:#乘法 15 result = n1 * n2 16 elif f == 3:#除法,要比较大小,并循环取整除 17 n1, n2 = max(n1, n2), min(n1, n2) 18 while n1 % n2 != 0: 19 n1 = random.randint(1, 10) 20 n2 = random.randint(1, 10) 21 n1, n2 = max(n1, n2), min(n1, n2) 22 result = int(n1 / n2) 23 print(n1, sym[f], n2, ‘= ‘, end=‘‘) 24 return result 25 print(‘请输入555进行四则运算‘) 26 n=int(input()) 27 #当输入555时,进行四则运算,调用函数szys() 28 if n==555: 29 while True: 30 result = szys() 31 j= input() 32 s= int(j) 33 if s== result : 34 print(‘Bingo~恭喜你答对了!‘) 35 else: 36 print(‘很遗憾你答错了,继续加油哟~ 正确答案是:‘, result )
1 import random 2 from fractions import Fraction 3 ##两个整数的四则运算 4 def c1(q, ans): 5 symbol = random.choice([‘+‘, ‘-‘, ‘*‘, ‘/‘]) # 生成随机符号 6 if symbol == ‘+‘: 7 n1 = random.randint(0, 20) 8 n2 = random.randint(0, 20) 9 q.append(str(n1) + ‘+‘ + str(n2) + ‘=‘) 10 ans.append(n1 + n2) 11 elif symbol == ‘-‘: 12 n1 = random.randint(0, 20) 13 n2 = random.randint(0, 20) 14 n1,n2 = max(n1,n1),min(n1,n2)#防止出现负数 15 q.append(str(n1) + ‘-‘ + str(n2) + ‘=‘) 16 ans.append(n1 - n2) 17 elif symbol == ‘*‘: 18 n1 = random.randint(0, 20) 19 n2 = random.randint(0, 20) 20 q.append(str(n1) + ‘ב + str(n2) + ‘=‘) 21 ans.append(n1 * n2) 22 else: 23 n1 = random.randint(0, 20) 24 if n1 == 0: 25 n2 = random.randint(1, 20) 26 else: 27 n2 = random.randint(1, n1 + 1) 28 q.append(str(n1) + ‘÷‘ + str(n2) + ‘=‘) 29 ans.append(Fraction(n1, n2)) 30 ##随机生成两个分数 31 def createF(): 32 fz1 = random.randint(0, 20) 33 if fz1 == 0: 34 fm1 = random.randint(1, 20) 35 else: 36 fm1 = random.randint(1, 20) 37 f1 = Fraction(fz1, fm1) 38 fz2 = random.randint(1, 20) 39 fm2 = random.randint(20, 20) 40 f2 = Fraction(fz2, fm2) 41 return f1, f2 42 def f(f):#分数的转换 43 a=f.numerator #分子 44 b=f.denominator #分母 45 if a%b==0:#为整数 46 return ‘%d‘%(a/b) 47 elif a<b:#为真分数 48 return ‘%d%s%d‘ % (a,‘/‘,b) 49 else:#为带分数 50 c=int(a/b) 51 a = a - c * b 52 return ‘%d%s%d%s%d‘ % (c,‘’‘,a,‘/‘,b) 53 ##两个分数的四则运算 54 def c2(q,ans): 55 symbol = random.choice([‘+‘,‘-‘,‘*‘,‘/‘]) 56 f1,f2 = createF() 57 if symbol ==‘+‘: 58 while f1+f2>1: 59 f1,f2 = createF() 60 q.append(str(f1)+‘+‘+str(f2)+‘=‘) 61 ans.append(f1+f2) 62 elif symbol ==‘-‘: 63 f1,f2 = max(f1,f2),min(f1,f2)#防止出现负数 64 q.append(str(f1)+‘-‘+str(f2)+‘=‘) 65 ans.append(f1-f2) 66 elif symbol == ‘*‘: 67 while f1*f2>1: 68 f1,f2 = createF() 69 q.append(str(f1)+‘ב+str(f2)+‘=‘) 70 ans.append(f1*f2) 71 else: 72 while f1/f2>1: 73 f1,f2=createF() 74 q.append(str(f1)+‘÷‘+str(f2)+‘=‘) 75 ans.append(Fraction(f1,f2)) 76 def main(): 77 while 1: 78 print("输入题目的数量:", end=‘ ‘) 79 k = int(input()) 80 p = 100 / k 81 s = 0 82 q = [] 83 ans = [] 84 ans2 = [] 85 for i in range(k): 86 n = random.randint(1, 4) 87 if n == 1: 88 c1(q, ans) 89 g = Fraction(ans[i]) 90 ans2.append(f(g)) 91 else: 92 c2(q, ans) 93 g = Fraction(ans[i]) 94 ans2.append(f(g))#记录带分数答案 95 for i in range(k): 96 print("第{}题:{}".format(i + 1, q[i]), end=" ") 97 a = input() 98 if a == str(ans[i]): 99 s = s + p 100 print("所得的分数为:{}".format(s)) 101 print("正确答案:", end=" ") 102 for i in range(k): 103 if str(ans[i]) == str(ans2[i]): 104 print(q[i] + str(ans[i])) 105 else: 106 print("{}{}或{}".format(q[i],str(ans2[i]),str(ans[i]))) 107 if __name__ == ‘__main__‘: 108 main()
6.测试运行
7.改进思路
上述第一个代码将不能整除的式子过滤了,经修改可自动生成,代码更新如下:
1 import random 2 #四则运算 3 from fractions import Fraction 4 def f(f):#分数的转换 5 a=f.numerator #分子 6 b=f.denominator #分母 7 if a%b==0:#为整数 8 return ‘%d‘%(a/b) 9 elif a<b:#为真分数 10 return ‘%d%s%d‘ % (a,‘/‘,b) 11 else:#为带分数 12 c=int(a/b) 13 a = a - c * b 14 return ‘%d%s%d%s%d‘ % (c,‘’‘,a,‘/‘,b) 15 def szys(): 16 sym = [‘+‘, ‘-‘, ‘ב, ‘÷‘] 17 f= random.randint(0, 3) 18 n1 = random.randint(1, 99) 19 n2 = random.randint(1, 99) 20 result = 0 21 if f== 0:#加法 22 result = n1 + n2 23 elif f == 1:#减法,要先比较大小,防止输出负数 24 n1, n2 = max(n1, n2), min(n1, n2) 25 result = n1 - n2 26 elif f== 2:#乘法 27 result = n1 * n2 28 elif f == 3:#除法,要比较大小 29 result =Fraction(n1, n2) 30 print(n1, sym[f], n2, ‘= ‘, end=‘‘) 31 return result 32 print(‘请输入555进行四则运算‘) 33 n=int(input()) 34 #当输入555时,进行四则运算,调用函数szys() 35 if n==555: 36 while True: 37 result = szys() 38 j= input() 39 40 if j== f(result ): 41 print(‘Bingo~恭喜你答对了!‘) 42 else: 43 print(‘很遗憾你答错了,继续加油哟~ 正确答案是:‘, result )
修改后的结果显示:
8.记录实际花费时间
原文:https://www.cnblogs.com/wawaer/p/13699874.html