作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13326
这个作业的目标 通过结对项目,进一步理解软件开发的过程,同时将人引入团队作业
姓名 学号
郑深生 3123004768

没有队友

作业链接 witch250/studentexercise

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多一点)
哈希函数是一拍脑子想出来的,我觉得对于能不能排除重复的式子有很大问题,因为不知道怎么验算
测试工具仍然是上次使用的,我认为不太好
测的有些草率,就像那张图,精力慢慢燃尽了
我不认为自己生成了小学生能做出来的四则运算题目,尽管它满足作业提出的要求
由于单干,个人认为没能达到作业的目标,但是确实锻炼了自己的能力

posted @ 2025-03-22 00:24  witch250  阅读(73)  评论(0)    收藏  举报