软件工程小项目——小学生四则运算自动刷题库
一、项目开发计划
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()函数的运行时间占总时间的很大比重(当然这与测试时,选择不同题目类型和难度有关)
总体来说,性能还可以继续改进。
————————————————