第一次软件工程作业
1、GitHub项目地址:https://github.com/HardenMVB/3.14
2、PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 90 |
· Estimate | · 估计这个任务需要多少时间 | 60 | 90 |
Development | 开发 | 1720 | 2070 |
· Analysis | · 需求分析 (包括学习新技术) | 200 | 250 |
· Design Spec | · 生成设计文档 | 50 | 60 |
· Design Review | · 设计复审 (和同事审核设计文档) | 20 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 30 | 40 |
· Coding | · 具体编码 | 1300 | 1600 |
· Code Review | · 代码复审 | 50 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 60 |
Reporting | 报告 | 100 | 100 |
· Test Report | · 测试报告 | 60 | 60 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 1880 | 2260 |
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.建立一个类用以生成随机数与运算符
class com(object): def __init__(self, r):#初始化 self.r=r def get_Arithmeticl(self):#获得随机数字与符号 symbol=[] numerical=[] syb=0 n=1 m=0 i=random.randint(1, 3) for x in range(i): sy=random.choice(['+','-','×','÷']) if sy=='+'or sy=='-': syb +=10**(i-x-1) else : syb += 2 * (10 ** (i - x - 1)) symbol.append(sy) if self.r < 10: n = int(10 / self.r) if n==1: while m <= i: numerical.append(Fraction(random.randint(1, self.r), random.randint(1, self.r))) m+=1 else: while m <= i: nu = Fraction(random.randint(1, self.r * n), random.randint(1, self.r * n)) if nu<=self.r: numerical.append(nu) m += 1 return symbol,syb,numerical,i
3.识别运算符和分数的转换
def get_Calculate(a,b,c):#四则运算 if c=='+': results=a+b elif c=='-': results=a-b elif c=='×': results=a*b else:results=a/b return results def get_Conversion(fraction):#假分数转化真分数 if fraction.numerator%fraction.denominator==0: return '%d'%(fraction.numerator/fraction.denominator) elif fraction.numerator>fraction.denominator: a=int(fraction.numerator/fraction.denominator) b, c = fraction.numerator - a * fraction.denominator, fraction.denominator return '%d%s%d%s%d' % (a,'’',b,'/',c) else: b, c = fraction.numerator, fraction.denominator return '%d%s%d' % (b,'/',c)
4.生成算式列表和查重
def get_Formula(n,r):#生成题目和答案列表 Exercises,Answers,Exercises1,Exercises2=[],[],[],[] x=1 while x<n+1: symbol, syb, numerical,i = com(r).get_Arithmeticl() results = numerical[0] judge = True for y in range(i): calculate=get_Calculate(results,numerical[y+1],symbol[y]) if calculate>=0:#判断算式是否合法 answer=calculate else: judge=False break if judge:#查重 try: num=Answers.index(answer)#第一个重复答案的索引 if operator.eq(Exercises1[num],symbol) and operator.eq(Exercises2[num],numerical): pass except ValueError as e:#可以写入 Answers.append(answer) Exercises1.append(symbol) Exercises2.append(numerical) Exercises.append('%d. %s'%(x,set_Formula(symbol,numerical,syb))) x+=1 else:pass return Exercises,Answers
5.写入文件
def text_save(filename, data):#filename为写入文件的路径,data为要写入数据列表. file = open(filename,'a') file.seek(0) file.truncate() # 清空文件 for x in data: x='%s\n'%(x) file.write(x) file.close() print('%s文件保存成功'%filename)
6.main函数
def main(): args = get_Parameter() if args.n: n = args.n if args.r: r = args.r Exercises, Answers = get_Formula(n, r) for x in range(n): Answers[x] = '%d. %s' % (x + 1, get_Conversion(Answers[x])) print('本次共生成题目%d道\n题目数值范围为0-%d' % (n, r)) text_save('Exercises.txt', Exercises) text_save('Answers.txt', Answers)
6、测试运行
7、效能分析
8、收获
在这次实践中,我体会到了软件工程的不易。想要一个人真正做好一个项目是要花费大量时间的,想要一周完美的写好这个项目有点困难,还是有很多漏洞没有处理;做出的程序也不完整,有很多功能没有实现。
这也体现出了团队的重要性,一方面会有人监督,帮你找出错误,另一方面分工合作,花费的时间也会减少。不过我还是从这次项目中学到了很多技巧,希望下一次的项目可以完成的更好。