Github项目地址:
https://github.com/123diandian/sizeyunsuan
PSP:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 10 | 20 |
Estimate | 估计这个任务需要多少时间 | 1440 | 2200 |
Development | 开发 | 700 | 200 |
Analysis | 需求分析 (包括学习新技术) | 180 | 100 |
Design Spec | 生成设计文档 | 5 | 5 |
Design Review | 设计复审 (和同事审核设计文档) | 10 | 15 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 5 | 10 |
Design | 具体设计 | 40 | 30 |
Coding | 具体编码 | 300 | 400 |
Code Review | 代码复审 | 30 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 20 |
Reporting | 报告 | 120 | 100 |
Test Report | 测试报告+博客 | 120 | 120 |
Size Measurement | 计算工作量 | 10 | 15 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 40 | 60 |
合计 | | 3040 | 3335 |
题目要求:
能自动生成小学生四则运算题目(注意是给小学生用的,要是结果出现负数的话他们会迷茫的!)
除了整数外,还支持真分数的四则运算
解题思路:
- 定义一个函数随机生成两个整数,并进行四则运算
- 定义一个函数随机生成两个真分数,再定义一个函数对两个真分数进行四则运算(调用Fraction函数进行分数运算)
- 用户输入自己的要求
- 计算结果与用户的输入进行对比
设计函数:
- 定义一个函数随机生成两个正整数并进行四则运算(减数要比被减数小;除数不能等于0且当被减数大于一时,除数要能整除被除数)
- 定义一个函数随机生成两个真分数,再定义一个函数对两个真分数进行四则运算(调用Fraction函数进行分数运算;分母不能为0,且除数即生成的第二个分数不能等于0)
具体程序设计:
成员变量
成员名 | 类型 | 功能 |
t | int | 输入测试类别,1.测试 2.练习 3.退出 |
n | int | 输入运算类别,1.整数 2.真分数 3.混合 4.退出 |
k | int | 输入题目的数量 |
p | float | 每道题的分数 |
s | float | 总的得分 |
q | 列表 | 存储表达式 |
ans | 列表 | 存储计算结果 |
da | int | 是否查看答案,1.是 2.否 |
a | 字符串 | 用户计算的答案 |
成员函数
函数名 | 功能 |
c1(q, ans) | 两个整数的四则运算 |
creatF() | 随机生成两个真分数 |
c2(q, ans) | 两个真分数的四则运算 |
main() | 主函数 |
核心代码:
1 ##两个整数的四则运算
2 def c1(q, ans):
3 symbol = random.choice(['+', '-', '*', '/']) # 生成随机符号
4 if symbol == '+':
5 n1 = random.randint(0, 100)
6 n2 = random.randint(0, 100)
7 q.append(str(n1) + '+' + str(n2) + '=')
8 ans.append(n1 + n2)
9 elif symbol == '-':
10 n1 = random.randint(0, 100)
11 n2 = random.randint(0, n1 + 1)
12 q.append(str(n1) + '-' + str(n2) + '=')
13 ans.append(n1 - n2)
14 elif symbol == '*':
15 n1 = random.randint(0, 100)
16 n2 = random.randint(0, 100)
17 q.append(str(n1) + '×' + str(n2) + '=')
18 ans.append(n1 * n2)
19 else:
20 n1 = random.randint(0, 100)
21 if n1 == 0:
22 n2 = random.randint(1, 100)
23 else:
24 n2 = random.randint(1, n1 + 1)
25 while n1 % n2:
26 n1 = random.randint(1, 100)
27 n2 = random.randint(1, n1 + 1)
28 q.append(str(n1) + '÷' + str(n2) + '=')
29 ans.append(Fraction(n1, n2))
1 ##随机生成两个真分数
2 def createF():
3 fz1 = random.randint(0, 100)
4 if fz1 == 0:
5 fm1 = random.randint(1, 100)
6 else:
7
8 fm1 = random.randint(fz1, 100)
9 f1 = Fraction(fz1, fm1)
10 fz2 = random.randint(1, 100)
11 fm2 = random.randint(fz2, 100)
12 f2 = Fraction(fz2, fm2)
13 return f1, f2
1 ##两个真分数的四则运算
2 def c2(q,ans):
3 symbol = random.choice(['+','-','*','/'])
4 f1,f2 = createF()
5 if symbol =='+':
6 while f1+f2>1:
7 f1,f2 = createF()
8 q.append(str(f1)+'+'+str(f2)+'=')
9 ans.append(f1+f2)
10 elif symbol =='-':
11 f1,f2 = max(f1,f2),min(f1,f2)
12 q.append(str(f1)+'-'+str(f2)+'=')
13 ans.append(f1-f2)
14 elif symbol == '*':
15 while f1*f2>1:
16 f1,f2 = createF()
17 q.append(str(f1)+'×'+str(f2)+'=')
18 ans.append(f1*f2)
19 else:
20 while f1/f2>1:
21 f1,f2=createF()
22 q.append(str(f1)+'÷'+str(f2)+'=')
23 ans.append(Fraction(f1,f2))
1 def main():
2 while 1:
3 print("输入类型序号: 1.测试 2.练习 3.退出")
4 t = int(input())
5 if t == 3:
6 break
7 elif t == 1: ##测试
8 print("输入想要的四则运算序号: 1.整数 2.真分数 3.混合 4.退出")
9 n = int(input())
10 while n > 4:
11 print("输入有误,重新输入")
12 n = int(input())
13 if n == 4:
14 break
15 print("输入题目的数量", end=' ')
16 k = int(input())
17 p = 100 / k
18 s = 0
19 q = []
20 ans = []
21 if n == 1: ##整数测试
22 for i in range(k):
23 c1(q, ans)
24 elif n == 2: ##分数测试
25 for i in range(k):
26 c2(q, ans)
27 elif n == 3: ##混合测试
28 for i in range(k):
29 n = random.randint(1, 3)
30 if n == 1:
31 c1(q, ans)
32 else:
33 c2(q, ans)
34 for i in range(k):
35 print("第{}题:{}".format(i + 1, q[i]), end=' ')
36 a = input()
37 if a == str(ans[i]):
38 s = s + p
39 print("所得的分数为:{}".format(s))
40 print("是否查看正确答案:1.是 2.否", end=' ')
41 da = int(input())
42 if da == 1:
43 for i in range(k):
44 print(q[i] + str(ans[i]))
45
46
47
48 elif t == 2: ##练习
49 print("输入想要的四则运算序号: 1.整数 2.真分数 3.混合 4.退出")
50 n = int(input())
51 while n > 4:
52 print("输入有误,重新输入")
53 n = int(input())
54 if n == 4:
55 break
56 print("输入题目的数量", end=' ')
57 k = int(input())
58 q = []
59 ans = []
60 if n == 1:
61 for i in range(k):
62 c1(q, ans)
63 elif n == 2:
64 for i in range(k):
65 c2(q, ans)
66 elif n == 3:
67 for i in range(k):
68 n = random.randint(1, 3)
69 if n == 1:
70 c1(q, ans)
71 else:
72 c2(q, ans)
73 else:
74 print("输入有误!请重新输入")
75
76 for i in range(k):
77 print("第{}题:{}".format(i + 1, q[i]), end=' ')
78 a = input()
79 if a == str(ans[i]):
80 print("回答正确")
81 else:
82 print("回答错误,正确答案是:{}".format(ans[i]))
83 else:
84 print("输入有误!请重新输入")
85
86 profile.run('main()')
运行效果:
测试真分数的四则运算
练习混合型的四则运算:
效能分析:
可以看到所用时间为0.047s。