自动生成小学生题目(改进)


代码管理:

      代码已上传至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 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("恭喜你答对啦! ! !\n")
128     else:
129         print("很遗憾你答错了!正确答案是:", answer,"\n")
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
 Design  具体设计 40 58
Coding  具体编码  400 478
Code Review   代码复审  58 72 
 Text  测试(自测,修改代码,提交修改) 30  43 
 Reporting  报告 32   34
Text Report  测试报告 6 8
 Size Measurement 计算工作量  7
 Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 20  28 
Sum  合计 770 885