代码管理:
代码已上传至Gitee:https://gitee.com/above-the-clouds/codes/go85ra14ine092jzcxklm46
一、改进方向
功能改进:
(1)分年级:分为1-2和3-6,1-2年级是做加减运算,而3-6则是加减乘除都做
(2)分模式:分为做题模式(题库)和答题模式
(3)分形式:整数和分数运算
二、解题思路
第一步:我认为分年级比较容易,所以我就先加入分年级这个功能。联系现实中1-2年级还没有学乘除法,所以1-2年级只做加减运算,而3-6年级则是加减乘除都有。实现这里指要控制运算符的选择就可以了。即1-2年级只能从“+”和“-”中选,而高年级的则有四种选择“+-*、”。
第二步:加入模式,因为这是改进,而我的第一版就是做题模式,所以我只要加进答题模式就可以了。答题模式即题目统一输出,这就需要用一个循环,把所有题目一起输出,再用一个数组把所有的答案存起来,最后在一起输出答案。
第三步:我觉得做分数运算是最难的,所以我把它放到了最后。首先随机生成两个数,大的数做分母,且不能为0,这样就保证为真分数,再调用Fraction()生成一个分数,运算时需要注意做减法时不能结果为负数,做除法时结果要还是分数,即还要调用Fraction()
三、设计实现
1、分年级:def chooseGrade()
2、分模式:def choosePattern():
3、分形式:def chooseShape()
4、题库:def test(grade,shape)
5、分数运算:def fractions()
6、整数运算:def integer(grade)
7、结果显示:def result(grade,shape)
8、主函数:def main()
四、代码展示
1 # -*- coding: utf-8 -*- 2 """ 3 function:自动生成小学四则运算题目(升级) 4 (1)分年级:1-2和3-6 5 (2)分两种模式: 6 模式1-做题模式 7 模式2-题库模式 8 (3)分形式:整数、真分数 9 """ 10 11 import profile 12 import random 13 from fraction import Fraction 14 15 16 def chooseGrade(): #年级分为两个阶段:1-2和3-6 17 grade=int(input("请输入你的年级:")) 18 return grade 19 20 21 def choosePattern(): #分为两个模式:模式1-做题模式 模式2-题库模式 22 pattern=int(input("请输入你要的模式(1-做题模式 2-题库模式):")) 23 return pattern 24 25 26 def chooseShape(): #是整数还是分数计算 27 shape=int(input("请输入你想要的形式(1-整数形式 2-分数形式):")) 28 return shape 29 30 31 def test(grade,shape): #题库 32 numOfQuestion=int(input("生成的题目的数量:")) 33 answ =[] 34 if shape==1: #整数题库 35 for i in range(numOfQuestion): 36 print(i+1,end='、') 37 answer=integer(grade) 38 answ.append(answer) 39 elif shape==2: #分数题库 40 for i in range(numOfQuestion): 41 print(i+1,end='、') 42 answer=fractions() 43 answ.append(answer) 44 print("请输入你的答案(有小数则保留两位小数):") 45 for i in range(numOfQuestion): 46 print(i+1,"、",end='') 47 yoursAns=input() 48 print('正确答案:') 49 for i in range(numOfQuestion): 50 print(i+1,"、",answ[i]) 51 52 53 def fractions(): #分数题目 54 operator=random.choice("+-*/") 55 numerator1 = random.randint(1, 20) 56 denominator1 = random.randint(numerator1, 20) #做分母,控制为真 57 fract1 = Fraction(numerator1, denominator1) #生成分数 58 numerator2 = random.randint(1, 20) 59 denominator2 = random.randint(numerator2, 20) 60 fract2 = Fraction(numerator2, denominator2) 61 if operator=="+": 62 answer=fract1 + fract2 63 64 elif operator=="-": 65 fract1,fract2=max(fract1,fract2),min(fract1,fract2) #大的数放前面 66 answer=fract1 - fract2 67 68 elif operator=="*": 69 answer=fract1 * fract2 70 71 elif operator=="/": 72 answer=fract1 / fract2 73 print(fract1,operator,fract2,'=') 74 ''' 75 #分数的转换 76 nume=answer.numerator #分子 77 deno=answer.denominator #分母 78 if nume%deno==0: #为整数 79 return '%d'%(nume/deno) 80 elif nume<deno: #为真分数 81 return '%d%s%d' % (nume,'/',deno) 82 else: #为带分数 83 an=int(nume/deno) 84 nume = nume - an * deno 85 return '%d%s%d%s%d' % (an,'’',nume,'/',deno)''' 86 return answer 87 88 89 def integer(grade): #整数题目 90 numberOne=random.randint(1,100) 91 numberTwo=random.randint(1,100) 92 #grade=int(input("请输入你的年级:")) 93 #grade=chooseGrade() 94 if grade==1 or grade==2 : 95 operator=random.choice("+-") #1-2年级只做加减运算 96 elif grade==3 or grade==4 or grade==5 or grade==6: 97 operator=random.choice("+-*/") #3-6年级则加减乘除运算都有 98 99 if operator=="+": 100 answer=numberOne + numberTwo 101 102 elif operator=="-": 103 numberOne , numberTwo=max(numberOne , numberTwo),min(numberOne , numberTwo) #大的数放前面 104 answer=numberOne - numberTwo 105 106 elif operator=="*": 107 answer=numberOne * numberTwo 108 109 elif operator=="/": 110 answer=numberOne / numberTwo 111 if answer % 1 != 0: 112 answer = ('%.2f' %answer) #不能整除时取两位小数 113 print("题目:",numberOne,operator,numberTwo,"=") 114 return answer 115 116 117 def result(grade,shape): #判断你是否回答正确,并返回结果 118 if shape==1: 119 answer=integer(grade) 120 yourAnswer=int(input("请输入你的答案(有小数则保留两位小数):")) 121 122 elif shape==2: 123 answer=fractions() 124 yourAnswer=input("请输入你的答案:") 125 yourAnswer=Fraction(yourAnswer) 126 if yourAnswer==answer: 127 print("恭喜你答对啦! ! ! ") 128 else: 129 print("很遗憾你答错了!正确答案是:", answer," ") 130 131 132 def main(): #主函数 133 pattern=choosePattern() 134 grade=chooseGrade() 135 shape=chooseShape() 136 if pattern==1: #答题模式 137 numOfQuestion=int(input("生成的题目的数量:")) 138 for i in range(numOfQuestion): 139 print("第",i+1,"题: ") 140 result(grade,shape) 141 elif pattern==2: #题库模式 142 test(grade,shape) 143 #profile.run('fractions()') #性能测试 144 #profile.run('test(6,2)') #换成实参 145 #profile.run('integer(6)') 146 147 148 149 main() 150 151
五、结果显示
1、做题模式、整数运算
2、做题模式、分数运算
3、题库模式、整数运算
六、性能分析
1、fractions()
2、test(grade,shape)
3、integer(grade)
七、PSP表格
PSP | personal Software Process Tages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 25 | 15 |
Estimate | 估计这个任务需要多少时间 | 10 | 8 |
Development | 开发 | 65 | 61 |
Analysis | 需求分析 | 30 | 32 |
Design Spec | 生成设计文档 | 32 | 28 |
Design Review | 设计复审(审核设计文档) | 10 | 8 |
Coding Standerd | 代码规范(为目前的开发制定合适的规范) | 3 | 5 |
Design | 具体设计 | 40 | 58 |
Coding | 具体编码 | 400 | 478 |
Code Review | 代码复审 | 58 | 72 |
Text | 测试(自测,修改代码,提交修改) | 30 | 43 |
Reporting | 报告 | 32 | 34 |
Text Report | 测试报告 | 6 | 8 |
Size Measurement | 计算工作量 | 9 | 7 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 20 | 28 |
Sum | 合计 | 770 | 885 |