个人项目
GitHub项目地址
https://github.com/hfruhf/software1/blob/master/psp
PSP
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
10 | 8 |
· Estimate |
· 估计这个任务需要多少时间 |
10 | 8 |
Development |
开发 |
600 | 650 |
· Analysis |
· 需求分析 (包括学习新技术) |
30 | 40 |
· Design Spec |
· 生成设计文档 |
30 | 40 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 | 30 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
5 | 5 |
· Design |
· 具体设计 |
40 | 60 |
· Coding |
· 具体编码 |
300 | 350 |
· Code Review |
· 代码复审 |
40 | 70 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
150 | 130 |
Reporting |
报告 |
250 | 270 |
· Test Report |
· 测试报告+博客 |
150 | 200 |
· Size Measurement |
· 计算工作量 |
15 | 15 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
40 | 50 |
合计 |
项目要求:
-能自动生成小学四则运算题目(注意是给小学生用的,要是结果出现负数的话他们会迷茫的!)
- 除了整数外,还要支持真分数的四则运算
解题思路:
1、 随机生成数字,随机产生运算符
2、 考虑表达式不成立的情况(不出现负数)
3、 接收用户输入的答案,判断答案与准确答案是否相等并给出正确答案
问题1:
-运用Python随机函数产生随机数字及符号
问题2:
-考虑当分母为0时,此时表达式不成立
-防止出现负数
n1,n2 = max(n1,n1),min(n1,n2)#防止出现负数 f1,f2 = max(f1,f2),min(f1,f2)#防止出现负数
问题3:
相关资料参考Allinone99的博客
python中有一个函数eval能计算表达式的结果,但结果可能会为分数,要利用库fractons中的一个函数Fraction,把输出的结果全转成分数,所以整数的不变,小数的变分数.为了防止当小学生输入带分数时识别错误,所以将大于0的分数转化为假分数或者带分数。利用input()函数输入答案,再用eval和Fraction转成数字。
通过判断输入的每个答案是否与ans中的结果一一对应,判断其对错
代码说明
核心函数为生成整数表达式和分数表达式以及比较结果
#c1函数(生成整数表达式)
def c1(q, ans): symbol = random.choice(['+', '-', '*', '/']) # 生成随机符号 if symbol == '+': n1 = random.randint(0, 20) n2 = random.randint(0, 20) q.append(str(n1) + '+' + str(n2) + '=') ans.append(n1 + n2) elif symbol == '-': n1 = random.randint(0, 20) n2 = random.randint(0, 20) n1, n2 = max(n1, n1), min(n1, n2) # 防止出现负数 q.append(str(n1) + '-' + str(n2) + '=') ans.append(n1 - n2) elif symbol == '*': n1 = random.randint(0, 20) n2 = random.randint(0, 20) q.append(str(n1) + '×' + str(n2) + '=') ans.append(n1 * n2) else: n1 = random.randint(0, 20) if n1 == 0: n2 = random.randint(1, 20) else: n2 = random.randint(1, n1 + 1) q.append(str(n1) + '÷' + str(n2) + '=') ans.append(Fraction(n1, n2))
#c2函数(生成分数表达式)
def c2(q, ans): symbol = random.choice(['+', '-', '*', '/']) f1, f2 = createF() if symbol == '+': while f1 + f2 > 1: f1, f2 = createF() q.append(str(f1) + '+' + str(f2) + '=') ans.append(f1 + f2) elif symbol == '-': f1, f2 = max(f1, f2), min(f1, f2) # 防止出现负数 q.append(str(f1) + '-' + str(f2) + '=') ans.append(f1 - f2) elif symbol == '*': while f1 * f2 > 1: f1, f2 = createF() q.append(str(f1) + '×' + str(f2) + '=') ans.append(f1 * f2) else: while f1 / f2 > 1: f1, f2 = createF() q.append(str(f1) + '÷' + str(f2) + '=') ans.append(Fraction(f1, f2))
#main函数判断结果对错
def main(): print("输入题目的数量", end=' ') k= int(input()) print("-------------------------------") p = 100 / k s = 0 q = [] ans = [] ans2 = [] count = 0 for i in range(k): n = random.randint(1, 4) if n == 1: c1(q, ans) g = Fraction(ans[i]) ans2.append(f(g)) else: c2(q, ans) g = Fraction(ans[i]) ans2.append(f(g)) # 记录带分数答案 for i in range(k): print("第{}题:{}".format(i + 1, q[i]), end=" ") count = count + 1 a = input() if count == k: break if a == str(ans[i]): print('{}:√'.format(i + 1)) s = s + p else: print('{}:×'.format(i + 1)) print('正确的答案为:', ans[i]) print("最终得分:{}".format(s)) if __name__ == '__main__': main()
运行结果:
效能分析与分析:
由数据可知,用户的输入是影响效能分析中的时间的主要因素
改进:
python中random.randint是一个产生随机数的高效方法,本身没有多少能够替换的函数。由于我们只需要random中的randint函数,于是考虑替换import方式:
import random -> from random import randint
多方法嵌套本身需要完成的任务较多,实际上对效率并没有太大影响。
包括括号的三个数运算:
# -*- coding: utf-8 -*- """ Created on Tue Mar 12 18:48:47 2019 @author: Alin """ # 导入random模块 import random # 定义产生真分数的函数 def fraction(): while (True): a = random.randint(1, 100) b = random.randint(1, 100) if a / b < 1: return str(a) + "/" + str(b) break # 定义产生带括号运算函数 def brackets(): a = "(" e = ")" b = str(random.randint(1, 100)) c = random.choice('+-*/') d = fraction() if eval(b + c + d) > 0: return a + b + c + d + e # 生成并打印四则运算表达式 def main(): print("请输入题目数量:") k = int(input()) for i in range(k): a = brackets() b = str(random.choice('+-*/')) c = fraction() print("第{}题:".format(i + 1), a, b, c, "=") # pr int(a,b,c,"=") if eval(a + b + c) >= 0: shuzi = input() if shuzi == eval(a + b + c): # print(a,b,c,"=",shuzi) print('{}:√'.format(i + 1)) else: print('{}:×'.format(i + 1)) print('正确的答案为:', eval(a + b + c)) if __name__ == '__main__': main() # print("最终得分:{}".format(s))
结果显示:
性能分析:
由图可知在main函数里面以及等待输入的耗时最长;
总结及收获:
第一次做软件工程的相关项目,对于一些相关的具体操作不太熟悉,也让我明白软件工程的作业的意义,不仅仅是程序,而是要加入软件工程的要素(复杂性、易变性和其他),有价值的软件工程的作业必须要触及这两个基本要素!
通过实践操作让我了解了代码存在的相关瓶颈以及如何优化自己的程序,虽然最终得出的结果不太理想,所以这个项目还存在着很多的改进空间。通过在这次软件工程的作业中发现了提升一个软件的性能可以通过性能分析的出来,所以一定要进行测试以及性能分析。