第一次软件工程作业

 1、GitHub项目地址:https://github.com/HardenMVB/3.14

 2、PSP

PSP2.1Personal 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、收获

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

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

 
posted @ 2019-03-21 21:49  余力  阅读(168)  评论(0编辑  收藏  举报