博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第一次软件工程作业(改进版)
阅读量:4636 次
发布时间:2019-06-09

本文共 3769 字,大约阅读时间需要 12 分钟。

1Github项目地址:https://github.com/HardenMVB/3.28

2PSP

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

60

90

· Estimate

· 估计这个任务需要多少时间

60

90

Development

开发

1650

2050

· Analysis

· 需求分析 (包括学习新技术)

200

300

· Design Spec

· 生成设计文档

50

60

· Design Review

· 设计复审 (和同事审核设计文档)

20

30

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

20

30

· Design

· 具体设计

60

50

· Coding

· 具体编码

1200

1500

· Code Review

· 代码复审

60

50

· Test

· 测试(自我测试,修改代码,提交修改)

40

30

Reporting

报告

90

60

· Test Report

· 测试报告

50

10

· Size Measurement

· 计算工作量

20

20

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

20

30

合计

 

1800

2200

 

3、解题思路

   拿到题目后,先想它能实现哪些功能,再想代码能分成几个部分实现,分层次处理。本题中基础功能就是整数的四则运算,非负数,接着就是加入真分数的部分。

   这两个功能完成后就可以考虑一些其他功能,比如如果出现假分数,如何转化成真分数,如何约分,以及判断题目有无重复等等。

4、设计实现

   先建立命令控制模块,可以控制输入的题目数量以及数值范围。再创建一个函数,用来生成随机数与运算符(+ , - , × , ÷ ),再设计一个函数用来将假分数转换为真分数。接着生成表达式,进而生成题目和对应的答案,以及查找有无重复。

   最后将题目及答案写入文件中,结果会在文件中显示出来。

5代码说明

1、命令行控制模块

def get_Parameter():#命令行控制模块    parser = argparse.ArgumentParser()    parser.add_argument('-n', help='设定题目数量',type=int)    parser.add_argument('-r', help='设定数值范围',type=int)    return parser.parse_args()

 

2、生成随机数和运算符

def get_num_sym(i,r):#获取数值列表和符号列表    nlist=[]            #数值列表    slist=[]            #符号列表    kh=0                #判断怎么加括号    jian=0                 #判断是否是减数运算    for m in range(i+1):         #根据i的值遍历输出数值列表        nlist.append(Fraction(random.randint(1, r), random.randint(1, r)))     for x in range(i):        sy=random.choice(['+','-','×','÷'])        if sy=='+'or sy=='-':            kh +=10**(i-x-1)        else :            kh += 2 * (10 ** (i - x - 1))        slist.append(sy)        if sy=='-':            l=1    return nlist,slist,kh,i,jian

 

3、分数转换及运算

def calculate(a,b,s):#计算单元,a,b是数,s是符号    ans=0    if s=='+':        #加法运算        ans=a+b    elif s=='-':      #减法运算        a,b=max(a,b),min(a,b)     #防止结果为负数        ans=a-b    elif s=='×':      #乘法运算        ans=a*b    else:ans=a/b      #除法运算    return ans

 

4、生成题目及答案

def gett(n,r):         #用于生成题目和答案列表    E,A,E1,E2=[],[],[],[]    global j,k    x=1    while x
=2 and calculate(num[0],num[1],slist[0])
=3 and calculate(calculate(num[0],num[1],slist[0]),num[2],slist[1])
=0: ans=cal else: legal=False break if legal: #判断算式是否重复 try: num=A.index(ans) #第一个答案的索引 except ValueError as e: #可以写入 A.append(ans) E1.append(slist) E2.append(num1) E.append('%d. %s'%(x,writet(slist,num1,kh))) x+=1 else:pass return E,A

 

5、写入文件

def savet(fname, d):#fname为写入文件的路径,d为要写入的数据列表    file = open(fname,'a')    file.seek(0)    file.truncate() #清空    for i in range(len(d)):#循环写入文件fname        s = str(d[i]).replace('[','').replace(']','')        s = s.replace("'",'').replace(',','') +'\n'        file.write(s)                     file.close()    print('%s文件已保存'%fname)

 

6、main函数

def main():#主函数    args = get_Parameter()    if args.n:        n=args.n        print('共生成%d道题目'%n)    if args.r:        r=args.r        print('均为%d以内的四则运算'%r)        E, A=gett(n,r)        for x in range(n):#循环生成答案列表            A[x]='%d. %s'%(x+1,fens(A[x]))        savet('Exercises.txt',E)        savet('Answers.txt',A)     end = time.clock()    print('运行时间: %s '%(end-start))   if __name__ == '__main__':    main()

6、测试运行

7、效能分析

8、改进

 程序一开始出现多元式子时,只计算第一个和最后一个的结果,于是我改进了程序,使得能计算出每个数的值。

此程序中我没有使用循环将出现负数结果的式子删除,而是简单的把此式子的被减数与减数交换,使之计算出正值。

9、收获

  在这次实践中,我体会到了软件工程的不易。想要一个人真正做好一个项目是要花费大量时间的,想要一周完美的写好这个项目有点困难,还是有很多漏洞没有处理;做出的程序也不完整,有很多功能没有实现。

这也体现出了团队的重要性,一方面会有人监督,帮你找出错误,另一方面分工合作,花费的时间也会减少。不过我还是从这次项目中学到了很多技巧,希望下一次的项目可以完成的更好。

转载于:https://www.cnblogs.com/HardenMVP/p/10615157.html

你可能感兴趣的文章
Hibernate二级缓存配置
查看>>
LoadRunner常用术语
查看>>
关于jedis2.4以上版本的连接池配置,及工具类
查看>>
记忆讲师石伟华微信公众号2017所有文章汇总(待更新)
查看>>
mechanize (1)
查看>>
FactoryBean
查看>>
Coolite动态加载CheckboxGroup,无法在后台中获取
查看>>
如何在我们项目中利用开源的图表(js chart)
查看>>
nfs服务器工作原理
查看>>
C3P0连接池工具类使用
查看>>
SVN常用命令备注
查看>>
孩子教育
查看>>
解决Cacti监控图像断断续续问题
查看>>
结构体的传参理解成员的存储方式
查看>>
python 进程与线程(理论部分)
查看>>
什么是API
查看>>
Java反射中method.isBridge() 桥接方法
查看>>
[shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证
查看>>
强名称程序集(strong name assembly)——为程序集赋予强名称
查看>>
1028. List Sorting (25)
查看>>