Github项目地址:
https://github.com/123diandian/sizeyunsuan
PSP:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 5 | 20 |
Estimate | 估计这个任务需要多少时间 | 1275 | 1190 |
Development | 开发 | 400 | 300 |
Analysis | 需求分析 (包括学习新技术) | 120 | 100 |
Design Spec | 生成设计文档 | 5 | 5 |
Design Review | 设计复审 (和同事审核设计文档) | 20 | 15 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 5 | 10 |
Design | 具体设计 | 60 | 40 |
Coding | 具体编码 | 360 | 400 |
Code Review | 代码复审 | 100 | 120 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 20 |
Reporting | 报告 | 60 | 50 |
Test Report | 测试报告+博客 | 60 | 40 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 40 | 60 |
合计 | 2250 | 2380 |
题目要求:
优化四则运算:有三个数的四则运算,包含有括号
解题思路:
- 定义一个函数随机生成两个整数,并进行四则运算,将其结果赋值给一个整数,然后与另外一个整数做四则运算
- 定义一个函数随机生成两个真分数,再定义一个函数对两个真分数进行四则运算(调用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) | 两个整数的四则运算 |
c1_1(q,ans) | 带有括号的三个整数的四则运算 |
creatF() | 随机生成两个真分数 |
c2(q, ans) | 两个真分数的四则运算 |
c2_1(q,ans) | 带有括号的三个分数的四则运算 |
main() | 主函数 |
核心代码:
1 ##两个整数的四则运算 2 def c1(q, ans): 3 symbol = random.choice(['+', '-', '*', '/']) # 生成随机符号 4 if symbol == '+': 5 n1 = random.randint(1, 100) 6 n2 = random.randint(1, 100) 7 q.append(str(n1) + '+' + str(n2) + '=') 8 ans.append(n1 + n2) 9 elif symbol == '-': 10 n1 = random.randint(1, 100) 11 n2 = random.randint(0, n1 ) 12 q.append(str(n1) + '-' + str(n2) + '=') 13 ans.append(n1 - n2) 14 elif symbol == '*': 15 n1 = random.randint(1, 100) 16 n2 = random.randint(1, 100) 17 q.append(str(n1) + '×' + str(n2) + '=') 18 ans.append(n1 * n2) 19 else: 20 n1 = random.randint(1, 100) 21 n2 = random.randint(1, n1 + 1) 22 while n1 % n2: 23 n1 = random.randint(1, 100) 24 n2 = random.randint(1, n1 + 1) 25 q.append(str(n1) + '÷' + str(n2) + '=') 26 ans.append(Fraction(n1, n2)) 27 return q,ans
1 ##有括号的三个数的随机运算 2 def c1_1(q, ans): 3 n1, m1 = c1([], []) 4 m1 = "".join(str(i) for i in m1) 5 n1 = "".join(str(i) for i in n1) 6 n1 = n1[:-1] 7 kuohao = random.randint(2, 4) ##括号在前面还是在后面 8 if kuohao == 2: 9 symbol = random.choice(['+', '-', '*', '/']) 10 if symbol == '+': 11 n2 = random.randint(1, 100) 12 q.append('(' + n1 + ')' + '+' + str(n2) + '=') 13 ans.append(eval(m1) + n2) 14 elif symbol == '-': 15 n2 = random.randint(1, eval(m1)) 16 q.append('(' + n1 + ')' + '-' + str(n2) + '=') 17 ans.append(eval(m1) - n2) 18 elif symbol == '*': 19 n2 = random.randint(1, 100) 20 q.append('(' + n1 + ')' + '×' + str(n2) + '=') 21 ans.append(eval(m1) * n2) 22 else: 23 if eval(m1) == 0: 24 n2 == random.randint(1, 100) 25 else: 26 n2 = random.randint(1, eval(m1) + 1) 27 while eval(m1) % n2: 28 n2 = random.randint(1, eval(m1) + 1) 29 q.append('(' + n1 + ')' + '÷' + str(n2) + '=') 30 ans.append(Fraction(eval(m1), n2)) 31 else: 32 symbol = random.choice(['+', '-', '*', '/']) 33 if symbol == '+': 34 n2 = random.randint(0, 100) 35 q.append(str(n2) + '+' + '(' + n1 + ')' + '=') 36 ans.append(n2 + eval(m1)) 37 elif symbol == '-': 38 n2 = random.randint(eval(m1), 100) 39 q.append(str(n2) + '-' + '(' + n1 + ')' + '=') 40 ans.append(n2 - eval(m1)) 41 elif symbol == '*': 42 n2 = random.randint(0, 100) 43 q.append(str(n2) + '×' + '(' + n1 + ')' + '=') 44 ans.append(n2 * eval(m1)) 45 else: 46 while eval(m1) == 0: 47 n1, m1 = c1([], []) 48 m1 = "".join(str(i) for i in m1) 49 n1 = "".join(str(i) for i in n1) 50 n1 = n1[:-1] 51 n2 = random.randint(eval(m1) + 1, 1000) 52 while n2 % eval(m1): 53 n2 = random.randint(eval(m1) + 1, 1000) 54 q.append(str(n2) + '÷' + '(' + n1 + ')' + '=') 55 ans.append(Fraction(n2, eval(m1))) 56 57 return q, ans
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)) 24 return q,ans,f1,f2
1 def c2_1(q, ans): 2 n1, m1,f1,f2 = c2([], []) 3 m1 = eval("".join(str(i) for i in m1)) 4 n1 = "".join(str(i) for i in n1) 5 n1 = n1[:-1] 6 7 fz = random.randint(1, 10) 8 fm = random.randint(10, 100) 9 n2 = Fraction(fz, fm) 10 11 kuohao = random.randint(2, 4) ##括号在前面还是在后面 12 if kuohao == 2: 13 symbol = random.choice(['+', '-', '*', '/']) 14 if symbol == '+': 15 q.append('(' + n1 + ')' + '+' + str(n2) + '=') 16 ans.append(str(Fraction(f1,f2) + n2)) 17 elif symbol == '-': 18 while m1 < n2: 19 fz = random.randint(0, 10) 20 fm = random.randint(10, 100) 21 n2 = Fraction(fz, fm) 22 q.append('(' + n1 + ')' + '-' + str(n2) + '=') 23 ans.append(str(Fraction(f1,f2) - n2)) 24 elif symbol == '*': 25 q.append('(' + n1 + ')' + '×' + str(n2) + '=') 26 ans.append(str(Fraction(f1,f2) * n2)) 27 else: 28 q.append('(' + n1 + ')' + '÷' + str(n2) + '=') 29 ans.append(str(Fraction(Fraction(f1,f2) ,n2))) 30 31 else: 32 symbol = random.choice(['+', '-', '*', '/']) 33 if symbol == '+': 34 q.append(str(n2) + '+' + '(' + n1 + ')' + '=') 35 ans.append(str(n2 + Fraction(f1,f2) )) 36 elif symbol == '-': 37 while m1 > n2: 38 fz = random.randint(0, 1000) 39 fm = random.randint(1, 10) 40 n2 = Fraction(fz, fm) 41 q.append(str(n2) + '-' + '(' + n1 + ')' + '=') 42 ans.append(str(n2 - Fraction(f1,f2) )) 43 elif symbol == '*': 44 q.append(str(n2) + '×' + '(' + n1 + ')' + '=') 45 ans.append(str(n2 * Fraction(f1,f2) )) 46 elif symbol == '/': 47 q.append(str(n2) + '÷' + '(' + n1 + ')' + '=') 48 ans.append(str(Fraction(n2,Fraction(f1,f2) ))) 49 50 return q, ans
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_1(q,ans) 24 elif n == 2: ##分数测试 25 for i in range(k): 26 c2_1(q,ans) 27 elif n == 3: ##混合测试 28 for i in range(k): 29 n = random.randint(1,3) 30 if n == 1: 31 c1_1(q,ans) 32 else: 33 c2_1(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_1(q, ans) 63 elif n == 2: 64 for i in range(k): 65 c2_1(q, ans) 66 elif n == 3: 67 for i in range(k): 68 n = random.randint(1, 3) 69 if n == 1: 70 c1_1(q, ans) 71 else: 72 c2_1(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("输入有误!请重新输入")
运行效果:
测试真分数的四则运算
练习混合型的四则运算:
效能分析:
profile.run('main()')