软件工程小项目——小学生四则运算自动刷题库

一、项目开发计划

 github地址: https://github.com/Gitforyong/autoBankApp

1.1 PSP2.1表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 8
·Estimate ·估计这个任务需要多少时间 10 8
Development 开发 595 475
·Analysis ·需求分析(包括学习新技术) 60 40
·Design Spec ·生成设计文档 20 20
·Design Review ·设计复审(和同事审核设计文档) 10 10
·Coding Standard ·代码规范(为目前的开发设计合适的代码规范) 5 5
·Design ·具体设计 50 30
·Coding ·具体编码 400 300
·Code Review ·代码复审 20 40
·Tset ·测试(自我测试,修改代码,提交修改) 30 40
Reporting 报告 80 90
·Test Report ·测试报告 30 30
·Size Measurement ·计算工作量 20 30
·Postmortem & Process Improvement Plan ·事后总结,并提出过程修改计划 30 30
合计   685 573

1.2目的要求

1)自动生成小学四则运算题目。

2)除了整数外,还要支持真分数的四则运算

问题分析,根据目的要求,把两个问题分别细分解决。

1.2.1生成四则运算题目

要求:

1、能生成指定数量的题目

2、能选择不同年级,不同难度等级,不同类型的题目

3、数字和符号整合的字符串

4、式子长度(数字个数和符号个数各不超过10个

5、结果不能出现负数

6、支持真分数四则运算

格外要求:

1、真分数四则运算结果为真分数

1.2.2计算结果

1、式子保存方式:数组、字符

2、结果为负数时,不输出,并重新调用该函数生成新式子

3、计算正确答案以便进行答案匹配

1.2.3返回结果

1、获取用户提交结果,判断对错,并返回正确答案

2、返回用户刷题正确率

二、项目设计

2.1概要设计

 

 

2.2详细设计

function name(函数名) parameter(参数) function(功能)
createNumbers() nNum 生成nNum个数量的随机数字
createOperators() OpeNum 生成OpeNum个数量的随机符号
createSimpleProblems() grade,degreeOfDiff 生成年级为grade,难度系数为degree的简单式子
createProperFractionPro() grade,degreeOfDiff 生成年级为grade,难度系数为degree真分数加减问题
createProblems() num,titleType,gradeNum,degreeOfDiff 生成num个数量的式子,包括年级,类型,题目数量,返回准确率

 

 

2.2.1核心代码模块

由函数createNumbers()和createOperators()函数随机生成的数字列表和符号列表组合拼接生成一个式子,此类型题目是简单四则运算。

 1 #createSimpleProblems——生成一定数量的简单式子,proLength为式子长度,即多少个数字,proNum为式子数量,即多少条
 2 def createSimpleProblems(grade,degreeOfDiff):
 3     
 4     if degreeOfDiff == '1':                              
 5         
 6         proLength = random.randint(2,3)                #难度系数为1
 7         
 8     elif degreeOfDiff == '2':
 9         
10         proLength = random.randint(4,5)                #难度系数为2
11         
12     elif degreeOfDiff == '3':
13         
14         proLength = random.randint(6,7)                #难度系数为3
15         
16     elif degreeOfDiff == '4':
17         
18         proLength = random.randint(7,8)                #难度系数为4
19         
20     elif degreeOfDiff == '5':
21         
22         proLength = random.randint(9,10)               #难度系数为5
23     
24     else:
25         
26         proLength = random.randint(2,4)                #默认难度系数        
27         
28     numbers = createNumbers(proLength)               #创建一个随机数列表
29     
30     operators = createOperators(grade,proLength-1)   #创建一个随机符号列表
31     
32     problem = ''                                     #四则运算式子
33     
34     for i in range(0,len(operators)):                #循环将随机数和随机符号做拼接
35         
36         problem += str(numbers[i]) + ' ' + operators[i] + ' '    
37         
38     problem += str(numbers[i+1])    
39         
40     if eval(problem) < 0:
41         
42         createSimpleProblems(grade,degreeOfDiff)
43     
44     else:
45         
46         return problem

           

该类型题目是真分数加减问题,此处则是循环生成随机数和‘/’拼接组合产生。

 

 1 # createProperFractionPro——生成真分数加减问题
 2 def createProperFractionPro(num,degree):
 3     
 4     operator = ['+', '-']
 5     
 6     if degree == '1':
 7         
 8         degree = random.randint(1, 2)
 9     
10     elif degree == '2':
11         
12         degree = random.randint(3, 4)                #难度系数为2
13         
14     elif degree == '3':
15         
16         degree = random.randint(5, 6)                #难度系数为3
17         
18     elif degree == '4':
19         
20         degree = random.randint(7, 8)                #难度系数为4
21         
22     elif degree == '5':
23         
24         degree = random.randint(9, 10)               #难度系数为5
25     
26     else:
27         
28         degree = random.randint(1, 3)                #默认难度系数
29     
30     problem = ''
31     
32     trueNum = 0
33     
34     for i in range(degree):
35         
36         numerator = random.randint(1, 10)                             #随机生成分子
37         
38         denominator = random.randint(numerator, 10)                   #真分数要求分子小于分母
39         
40         operatorT = operator[random.randint(0, 1)]                    #只要求+ -
41         
42         problem += str(numerator) + '/' + str(denominator) + operatorT  #拼接成一个问题
43 
44     numerator = random.randint(1, 10)                                   #最后一个分数
45     
46     denominator = random.randint(numerator, 10)
47     
48     problem += str(numerator) + '/' + str(denominator)
49     
50     Sum = eval(problem)
51     
52     Sum = Fraction('{}'.format(Sum)).limit_denominator()
53 
54     if Sum > 0:
55         
56         print("题目:"+ problem , "=")
57         
58         #print('正确的答案为:',Sum)
59         
60         print("请输入本题的答案:")   
61         
62         inputSum = Fraction('{}'.format(eval(input()))).limit_denominator()   #获取用户输入的答案
63         
64         if Sum == inputSum:
65             
66             trueNum = 1
67             
68             print("答案正确!")
69             
70         else:
71             
72             trueNum = 0
73             
74             print("答案错误!")
75             
76             print('正确的答案为:',Sum)
77             
78     else:                                                                    #如果结果是负数,则重新生成
79         
80         createProperFractionPro(num,degree)
81         
82     #print("fanhuide="+str(trueNum))
83     
84     return trueNum

 

以上两种题型都包含了年级选择和难度选择功能,并且最终返回本次刷题正确率!

用户选择题目数量并提交答案测试都又以下函数完成。

 1 createProblems(num,titleType,gradeNum,degreeOfDiff) 

三、项目测试

 

对每个核心代码块做单元测试

 

参考博客:

 

https://www.cnblogs.com/tizer/p/11080007.html 

 

https://www.cnblogs.com/jimmyhe/p/10852764.html

 

四、性能测试

利用pycharm图像化功能对项目程序进行性能分析,结果展示。

 

图表说明:

图1:

Name显示被调用的模块或者函数;

Call Count显示被调用的次数;

Time(ms)显示运行时间和时间百分比,时间单位为毫秒(ms)

图2:

矩形的颜色表示运行时间或者时间百分比大小的趋势:红色 > 黄绿色 > 绿色

 

由此分析,此次测试中,createProblems()和createProperFractionPro()函数的运行时间占总时间的很大比重(当然这与测试时,选择不同题目类型和难度有关)

总体来说,性能还可以继续改进。

————————————————

小学生四则运算自动刷题库优化升级:https://www.cnblogs.com/liyanyinng/p/13744010.html

posted @ 2020-09-21 13:18  乘“疯”破浪  阅读(258)  评论(0编辑  收藏  举报