2017软件工程第二次作业

Github项目地址:https://github.com/liushaoshuai11/liushaoshuai

一,psp表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 60
Estimate 估计这个任务需要多少时间 860 1060
Development 开发 540 710
Analysis 需求分析 课程项目,10 20
Design Spec 生成设计文档 60 60
Design Review 设计复审 60 60
Coding Standard 代码规范 30 60
Design 具体设计 60 90
Coding 具体编码 120 180
Code Review 代码复审 个人项目,自我测试,300 240
Test 测试(自我测试,修改代码,提交修改) 300 300
Reporting 报告 60 60
Test Report 测试报告 60 60
Size Measurement 计算工作量 10 10
Postmortem&Process Improvement Plan 事后总结,并提出过程改进计划 60 60
合计 860 1060

二,解题思路描述

本次个人项目共有四个基本要求:

1,操作数随机生成,包含整数和真分数,计算结果也用真分数表示

2,运算符的种类随机生成

3,能判断对错并计分,计算总共做对的题目数量及正确率

4,生成的题目数量可以控制,通过用户交互过程确定题目个数,在运行后,输入一个数字,即为生成题目的数量

以及四个附加要求:

1,运算符的个数随机生成,可以随机生成两个运算符的题目或三个运算符的题目

2,根据题目难度分配分值。

首先考虑基本要求:用户输入题目数量;定义函数,随机生成操作符与操作数,两者相互交错得到一个题;设置变量,统计做对题目数量并计算正确率。

考虑附加要求1:针对生成两个或三个运算符,定义了两个函数,并返回一定的数值,根据随机生成的数值,取出对应的运算符。

考虑附加要求2:根据运算符的个数以及加减乘除的混合程度把难度量化,根据难度分配分值,做对一道两个运算符的题目加1分;在三个运算符的题目中,全部为加减运算或全部为乘除运算,加2分,若为加减乘除混合运算,加3分。

通过自学python,并用python完成本次作业。首先通读了《简明python教程》(Swaroop, C. H . 著沈洁元 译),明确了python的相关编程规范之后,开始了代码的编写,并在完成任务过程中遇到不懂的及时翻阅《Python编程从入门到实践》(Eric Matthes 著 袁国忠 译)。

三,设计实现过程

基本功能点:

随机生成操作符:把所有的操作符都存在一个列表中,例如【‘+’,‘-’,‘*’,‘/’】,然后随机从中抽取。通过定义两个函数,并给函数赋值,结合if语句,分别写出当函数取不同值时进行不同操作符的运算。

随机生成运算优先级:考虑到加减乘除运算优先顺序不同,定义一个函数,规定不同情况下的运算先后顺序。

随机生成操作数:首先获取六个在(1,100)中的随机整数。取其中两个数为操作数,另外四个数,结合if语句,并利用python中的Fraction类组成两个真分数,保证了操作数的随机性。

随机得到题目(包含运算符个数随机生成):首先通过用户交互得到题目数量,然后随机获取操作符和随机获取操作数,交错得到一道题目。

生成题目的答案:这部分在整个程序中有很大的比重。我通过定义函数,把“加减法”归为一类,把“乘除法”归为一类,针对可能出现的所有情况,给函数赋值,明确在函数取得一定值时的运算方法,将运算结果赋给一个变量。

统计做对的题目个数:定义一个变量,每做对一题,变量加1,做错不加不减,最后输出得到做对题的数量。

随机生成题目分数:根据操作符的种类和数量,区分不同难度。定义一个变量,题目越难,分值越高,每做对一题,根据题目难度值加相应的分数,做错不加分不扣分,并给出正确答案。

生成正确率:根据之前统计的正确题目个数和用户交互得到的题目数量之比,得到正确率,并用百分数表示。

四,代码说明

对一些关键代码进行解释说明:
代码1:
or i in range(1, length + 1):
number1=random.randint(1,100)
number2=random.randint(1,100)
number3=random.randint(1,100)
number4=random.randint(1,100)
number5=random.randint(1,100)
number6=random.randint(1,100)
n1 = random.choice(a)
n2 = random.choice(a)
n3 = random.choice(a)
if number3<number4:
f1=Fraction(number3,number4)
else:
f1=Fraction(number4,number3)
if number5 < number6:
f2=Fraction(number5,number6)
else:
f2=Fraction(number6,number5)
print number1, n1, number2, n2, f1, n3, f2, '='
代码2:
def opis(o1,o2,o3):
op=0
if o1'+' :
op=op+100
elif o1
'-':
op=op+100
else:
op=op+200
if o2'+' :
op=op+10
elif o2
'-':
op=op+10
else:
op=op+20
if o3'+' :
op=op+1
elif o3
'-':
op=op+1
else:
op=op+2
return op
代码3:
def opis2(o11,o12,o13):
op1=0
if o11'+'and o12'+':
op1=op1+12
elif o11'-'and o12'-':
op1=op1+12
elif o11'*'and o12'':
op1=op1+12
elif o11'/'and o12'/':
op1=op1+12
elif o11'+'and o13'+':
op1=op1+13
elif o11'-'and o13'-':
op1=op1+13
elif o11=='
'and o13'*':
op1=op1+13
elif o11
'/'and o13'/':
op1=op1+13
elif o12
'+'and o13'+':
op1=op1+23
elif o12
'-'and o13'-':
op1=op1+23
elif o12
''and o13=='':
op1=op1+23
elif o12'/'and o13'/':
op1=op1+23
else:
op1= opis(o11,o12,o13)
return op1
代码4:
if opis(n1,n2,n3)==111:
ans=yuns2(yuns2(yuns2(number1,number2,n1),f1,n2),f2,n3)
print ans
res = Fraction(raw_input('The result is:'))
if res == ans:
print 'Right!'
m=m+1
score=score+2
else:
print 'Wrong!'
print 'The right answer is',ans

代码1是随机选取操作数,代码2和代码3是随机选取操作符,并给其赋值,代码4是针对运算符的值,给出运算法则。用户输入运算结果,如果答案正确,显示‘Right!’,做对题数量加1,同时得到相应的分数;如果答案错误,显示‘Wrong!’,并给出正确答案。

代码5:
m=float(m)
length=float(length)
print 'The test is over.'
print 'The number of right answers is',m
print 'Your score is',score
print 'The correct rate is',m/length*100,'%'

统计做对题目数量、总得分以及正确率,并输出结果

五,测试运行

展示两个运行结果(为便于检测,我在运行时,在用户输入答案前,首先自动生成每道题的正确答案):

一:

本次运行时,通过交互得到题目个数为5道题,答对2道,每道题3分,共得到6分,正确率40%。

二:

本次运行时,通过交互得到题目个数为5道题,答对3道,一道2分题,2道3分题,共得到8分,正确率60%。

六,项目小结

通过近两个星期的时间,我从最开始的零基础,经过学习、询问、实践,从一开始的认为近乎不可能完成任务到实现基本要求,自己还是挺高兴的,特别是看到按照自己的思想编写
的代码能够成功运行,有一些小小的成就感。对于计时机制以及题目查重,由于基础较为薄弱,以及课程较多时间有限,在规定时间内没有完成,内心感到有些遗憾。从这次作业
中,还是有一些收获的:

1.写代码前,要明确自己想干什么,想通过什么方式去完成,然后想办法去实现。程序是数据结构加算法,因此在写程序前,要进行充分的程序设计,也就是进行规划,然后
有序完成,不能一上来就盲目地写。

2.对一些函数、变量等要理解清楚,活学活用。

3.Python对缩进的要求很严格,一个层次对应相同的缩进,自己多次在这上面犯错。

4.要严谨细致,一个错误就可能导致整个程序无法正常运行。

但也发现一些不足:

1.自己语言编程基础还比较薄弱,完成同样的工作需要比别人花费更多的时间,经常加班加点。

2.虽然本程序能进行不同分值的计算,但还不能使各类分值题目出现的概率相同。

3.随机生成操作符功能还不够强大,仅限于两个或三个操作符。

4.计时机制、题目查重还没有实现。

5.对博客的操作使用还不太熟悉,导致无法正常插入PSP表格。

总之,通过这次作业,自己对语言编程有了进一步了解,但是仍然任重道远。虽然与其他同学相比,我的操作技能还不够高,实现方法还不够灵活,但这次作业一定程度上增强了我学习的信心,也让我感到编程就跟做事一样,不仅要有扎实的基本功,还要有条有理,才能高效有序完成。接下来,我会认真研读《梦断代码》等书籍,进一步了解软件编程,并通过实践,提高编程技能。最后,感谢何老师以及其他同学的指导,帮助我不断进步。

原文地址:https://www.cnblogs.com/liushaoshuai11/p/8138770.html