作业
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/ |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13326 |
| 这个作业的目标 | 通过结对项目,进一步理解软件开发的过程,同时将人引入团队作业 |
| 姓名 | 学号 |
|---|---|
| 郑深生 | 3123004768 |
没有队友
PSP表格
| Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|
| 计划 | 5 | 5 |
| · 估计这个任务需要多少时间 | 5 | 5 |
| 开发 | 555 | 1171 |
| · 需求分析 (包括学习新技术) | 90 | 80 |
| · 生成设计文档 | 20 | 20 |
| · 设计复审 | 5 | 10 |
| · 代码规范 (为目前的开发制定合适的规范) | 1 | 1 |
| · 具体设计 | 20 | 10 |
| · 具体编码 | 240 | 790 |
| · 代码复审 | 10 | 20 |
| · 测试(自我测试,修改代码,提交修改) | 240 | 240 |
| 报告 | 120 | 145 |
| · 测试报告 | 60 | 120 |
| · 计算工作量 | 10 | 5 |
| · 事后总结, 并提出过程改进计划 | 20 | 20 |
| · 合计 | 721 | 1321 |
实现流程
数据存储:将生成的任意表达式储存为字符串,一个字符串就是一个完整的算式,存放进列表
函数流程:生成算式-->转换成逆波兰式-->计算
文件结构
main.py
calculator.py
check.py
fractioncalculation.py
write.py
othermath.py
diyhash.py
classerror.py
test.py
性能展示
对象:10000式子
测试结果也上传到了仓库
时间消耗
采用python的time库做测试,对n=10000,r=10得到约2.4s的结果
采用line_proliner进行测试,运行时间非常离谱,所以附加了time
采用line_profiler测试

在35s的测试时间中,可以看见上面(对列表的循环)和下面(对重复的检测)占用的时间最多,在35s的测试时间中分别占用14s,40.2%和13s,38.3%
其次分别是计算结果的函数,占10.1%;生成问题5.8%;逆波兰式3.2%。
不重要的改进
对于自己设计的函数,一开始对单个字符到数字的转换采用eval(),后来改用int(),在计算结果的函数中占用时间下降66%
那时还没有哈希函数,占用时间从30%降到了10%
代码覆盖率

内存

关键代码
逆波兰式代码
def ReversePolish(i):
S=[] #存放+-*/(
L=[] #存放数字+-*/,并且是结果
for elem in i:
if(elem==' '):
pass
if(elem=='0' or elem=='1' or elem=='2' or elem=='3' or elem=='4' or elem=='5' or elem=='6' or elem=='7' or elem=='8' or elem=='9'):
L.append(elem)
elif(elem=='('):
S.append('(')
elif(elem==')'): #弹出所有,直到左括号为止,包括'('
t=0
while(t!='('):
t=S.pop()
if(t=='('):
break
L.append(t)
else: #处理+-*/
if S==[]:
S.append(elem)
elif S[-1]=='(':
S.append(elem)
elif(elem=='+'or elem=='-'):
while S and S[-1]!='(' : #此 + or - 必须在下面
t=S.pop()
L.append(t)
S.append(elem)
elif(elem=='*'or elem=='/'): # * or / 可以在 + or - 上面
while S and S[-1]!='(' and S[-1]!='+' and S[-1]!='-':
t=S.pop()
L.append(t)
S.append(elem)
while S!=[]: #弹出剩余
elem=S.pop()
if(elem=='('):
pass
else:
L.append(elem)
string='' #转成字符串
for i in L:
string+=i+' '
return string
分数当成算式处理
测试运行
给出算式和答案


对于10000条式子,你还可以看见如此有趣的结果




查结果

小结
没有勇气主动寻找队友,以及对此事的拖拉是最大的败笔,或许你还能在下次作业看见我
依旧是上次作业的毛病,没能做详细的分析和设计,导致边写边想,所以具体编码790min(合计13h多一点)
哈希函数是一拍脑子想出来的,我觉得对于能不能排除重复的式子有很大问题,因为不知道怎么验算
测试工具仍然是上次使用的,我认为不太好
测的有些草率,就像那张图,精力慢慢燃尽了
我不认为自己生成了小学生能做出来的四则运算题目,尽管它满足作业提出的要求
由于单干,个人认为没能达到作业的目标,但是确实锻炼了自己的能力

浙公网安备 33010602011771号