结对项目
这个作业属于哪个课程 | 软件工程 |
---|---|
这个作业要求在哪里 | 结对作业 |
这个作业的目标 | 制作一个自动生成十以内四则运算的项目,熟悉结对项目的开发 |
Github仓库 | Github |
姓名 | 郑炜 | 冯可富 |
---|---|---|
学号 | 3122004504 | 3122004476 |
PSP表
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 35 |
· Estimate | ・估计这个任务需要多少时间 | 30 | 25 |
Development | 开发 | 500 | 550 |
· Analysis | ・需求分析 (包括学习新技术) | 120 | 100 |
· Design Spec | ・生成设计文档 | 45 | 40 |
· Design Review | ・设计复审 | 20 | 20 |
· Coding Standard | ・代码规范 (为目前的开发制定合适的规范) | 20 | 15 |
· Design | ・具体设计 | 60 | 80 |
· Coding | ・具体编码 | 120 | 140 |
· Code Review | ・代码复审 | 30 | 30 |
· Test | ・测试(自我测试,修改代码,提交修改) | 90 | 100 |
Reporting | 报告 | 30 | 40 |
· Test Repor | ・测试报告 | 30 | 30 |
· Size Measurement | ・计算工作量 | 30 | 25 |
· Postmortem & Process Improvement Plan | ・事后总结,并提出过程改进计划 | 30 | 30 |
・合计 | 1185 | 1290 |
实现过程
生成运算式
- 1.使用random.randint生成运算符的个数、所需数字、分数个数,然后同样用random.randint产生所需数字的列表并计算出分数(使用fraction库),最后统计出所用到的数字列表。其次,保证分数优先运算添加括号。
- 2.使用 random.choice选择符号插入数字列表,把列表转换成string再使用eval函数计算出结果。此时,结果是分数应该是float型的循环小数,再使用fraction中的limit_denominator把结果转换成分数。若结果小于0大于r 、分母大于r重新生成数字列表和结果。再通过自建的字典对应手写的加减乘除符号和转换真分数,把数字列表和结果准换成字符串。
- 3.最后采用字典存储等式、问式、答案,在存储等式前进行判断是否有存过,有则重新生成。
点击查看代码
def make_questions(num, limit): # 产生题目
no = 1 # 题目序号
text_list = dict() # 整条等式
answer_list = dict() # 答案部分
question_list = dict() # 问题部分
while no <= num: # 循环产生num个题目
res, num_list = text(limit)
if res < 0 or res > limit or res.denominator > limit: # 若结果为0、大于r分母大于r则重新生成
continue
else:
tag = 0 # 标记是否重复
question = request_format(num_list)
num_list.append("=")
num_list.append((str(res)))
exp = request_format(num_list)
for i in text_list: # ------------但生成式子多时效率很低------换种查找
if text_list.get(i) == question: # 判断是否有相同的式子后加入
tag = 1
if tag == 1: # 判断是否新增题目
continue
else: # 新增题目
text_list[no] = question
question_list[no] = exp
if res > 1 and res.denominator != 1: # 转换为真分数
integer_part = res // 1 # 得到整数部分
proper_fraction = res % 1 # 得到真分数部分
res = "{}\'{}".format(integer_part, proper_fraction)
answer_list[no] = res
no += 1
return [text_list, answer_list, question_list] # 返回整个等式 答案 问式
文件读写
调用make_quesetions函数取得字典返回值后,使用with...as打开文件,循环取得键入key,在依次写入Exercises.txt和Answer.txt中。
def file(num,limit):
startT = time() #起始时间
bag = make_questions(num,limit) #bag取make_questions的返回值列表
with open('Exercises.txt','w',encoding='utf-8') as f: #问题
for i in range(num):
question = bag[0][i+1] #bag[0]是问题字典
f.write("{}. {}\n".format(i+1,question))
with open('Answer.txt','w',encoding='utf-8') as k: #答案
for i in range(num):
answer = bag[1][i+1] #bag[1]是答案字典
k.write("{}. {}\n".format(i+1,answer))
with open('test.txt','w',encoding='utf-8') as g: #整式
for i in range(num):
test = bag[2][i+1] #bag[2]是整式字典
g.write("{}. {}\n".format(i+1,test))
endT = time() #终止时间
print("time = %.2g 秒\n" % (endT - start))
主要函数
使用命令行参数控制生成的题目数量以及数字的范围。
点击查看代码
def main():
str_input = ''
for i in range(1, len(sys.argv)):
str_input += sys.argv[i]
num_arg = '-n([\d]+)'
limit_arg = '-r([\d]+)'
num = int(re.search(num_arg,str_input).group(1))
limit = int(re.search(limit_arg,str_input).group(1))
if (num <= 0) or (limit <= 0):
print("[-]参数错误")
print("exiting")
return
else:
file(num,limit)
return 0
测试
生成十道题目。
生成10000道题目
代码覆盖率
总结
- 郑炜:在生成题目部分,有部分代码好像进行了重复的操作,感觉可以进行优化精简。有的地方当数据庞大的时候效率不够搞,感觉还可以采用更好的存储方式和算法。
- 冯可富:文件写入函数内重复内容过多,应该再用一个函数来使得代码精简一点。这次结对项目过程我俩就沟通时间不算多,就这点而言我觉得我俩应该在改进一下,尽量做到实时沟通进度,这样就会更高效的完成项目。