首页 > 编程语言 > 详细

用Python自动生成小学四则运算题目

时间:2020-09-20 20:45:44      阅读:45      评论:0      收藏:0      [点我收藏+]

Github项目地址:

1.题目要求

  • 能自动生成小学四则运算题目(注意是给小学生用的,要是结果出现负数的话他们会迷茫的!)
  • 除了整数外,还要支持真分数的四则运算

2.PSP表格

(在开始实现程序之前,在下述PSP表格记录估计将在程序的各个模块的开发上耗费的时间。)

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

 10

 15

Estimate

估计这个任务需要多少时间

 120

 180

Development

开发

 40

 60

Analysis

需求分析 (包括学习新技术)

 15

 20

Design Spec

生成设计文档

 10

 15

Design Review

设计复审 (和同事审核设计文档)

 10

 15

Coding Standard

代码规范 (为目前的开发制定合适的规范)

 5

 10

Design

具体设计

 15

 20

Coding

具体编码

 30

 40

Code Review

代码复审

 5

 10

Test

测试(自我测试,修改代码,提交修改)

 10

 25

Reporting

报告

 20

 30

Test Report

测试报告

 10

 15

Size Measurement

计算工作量

 5

 10

Postmortem & Process Improvement Plan

事后总结, 并提出过程改进计划

 10

 15

合计

 

 310

 480

3.解题思路

刚开始拿到题目后,如何思考,如何找资料的心路历程。

  首先想到的是该软件给小学生使用的,所以答案不应该出现负数,即自动生成的两个随机数在进行减法运算时需比较大小;而在除法运算时,除数不能为0;还要实现支持真分数的四则运算,避免假分数自动生成,所以自动生成的数若为分数则需小于1;若回答错误需要给出正确答案。

4.设计实现

 定义函数:用def szys()实现随机生成整数的四则运算最后输出算式并返回正确答案。

        用def c1()和def c2()实现随机生成整数或分数的四则运算最后输出算式并返回正确答案。

通过random模块生成一定区间里的随机数,分数也可以通过随机生成分子和分母的形式随机生成。同时分数可以使用Fraction模块,可以实现分数与整数的运算以及分子和分母的约分。

5.代码说明

 

 1 import random
 2 #四则运算
 3 def szys():
 4     sym = [, , ×, ÷]
 5     f= random.randint(0, 3)
 6     n1 = random.randint(1, 99)
 7     n2 = random.randint(1, 99)
 8     result = 0
 9     if f== 0:#加法
10        result  = n1 + n2
11     elif f == 1:#减法,要先比较大小,防止输出负数
12         n1, n2 = max(n1, n2), min(n1, n2)
13         result  = n1 - n2
14     elif f== 2:#乘法
15         result  = n1 * n2
16     elif f == 3:#除法,要比较大小,并循环取整除
17         n1, n2 = max(n1, n2), min(n1, n2)
18         while n1 % n2 != 0:
19             n1 = random.randint(1, 10)
20             n2 = random.randint(1, 10)
21             n1, n2 = max(n1, n2), min(n1, n2)
22         result  = int(n1 / n2)
23     print(n1, sym[f], n2, = , end=‘‘)
24     return result
25 print(请输入555进行四则运算) 
26 n=int(input())
27 #当输入555时,进行四则运算,调用函数szys()
28 if n==555:
29     while True:
30         result  = szys()
31         j= input()
32         s= int(j)
33         if s== result :
34             print(Bingo~恭喜你答对了!)
35         else:
36             print(很遗憾你答错了,继续加油哟~ 正确答案是:, result )

 

  1 import random
  2 from fractions import Fraction
  3 ##两个整数的四则运算
  4 def c1(q, ans):
  5     symbol = random.choice([+, -, *, /])  # 生成随机符号
  6     if symbol == +:
  7         n1 = random.randint(0, 20)
  8         n2 = random.randint(0, 20)
  9         q.append(str(n1) + + + str(n2) + =)
 10         ans.append(n1 + n2)
 11     elif symbol == -:
 12         n1 = random.randint(0, 20)
 13         n2 = random.randint(0, 20)
 14         n1,n2 = max(n1,n1),min(n1,n2)#防止出现负数
 15         q.append(str(n1) + - + str(n2) + =)
 16         ans.append(n1 - n2)
 17     elif symbol == *:
 18         n1 = random.randint(0, 20)
 19         n2 = random.randint(0, 20)
 20         q.append(str(n1) + × + str(n2) + =)
 21         ans.append(n1 * n2)
 22     else:
 23         n1 = random.randint(0, 20)
 24         if n1 == 0:
 25             n2 = random.randint(1, 20)
 26         else:
 27             n2 = random.randint(1, n1 + 1)
 28         q.append(str(n1) + ÷ + str(n2) + =)
 29         ans.append(Fraction(n1, n2))
 30 ##随机生成两个分数
 31 def createF():
 32     fz1 = random.randint(0, 20)
 33     if fz1 == 0:
 34         fm1 = random.randint(1, 20)
 35     else:
 36         fm1 = random.randint(1, 20)
 37     f1 = Fraction(fz1, fm1)
 38     fz2 = random.randint(1, 20)
 39     fm2 = random.randint(20, 20)
 40     f2 = Fraction(fz2, fm2)
 41     return f1, f2
 42 def f(f):#分数的转换
 43     a=f.numerator #分子
 44     b=f.denominator #分母
 45     if a%b==0:#为整数
 46         return %d%(a/b)
 47     elif a<b:#为真分数
 48         return %d%s%d % (a,/,b)
 49     else:#为带分数
 50         c=int(a/b)
 51         a = a - c * b
 52         return %d%s%d%s%d % (c,,a,/,b)
 53 ##两个分数的四则运算
 54 def c2(q,ans):
 55     symbol = random.choice([+,-,*,/])
 56     f1,f2 = createF()
 57     if symbol ==+:
 58         while f1+f2>1:
 59             f1,f2 = createF()
 60         q.append(str(f1)+++str(f2)+=)
 61         ans.append(f1+f2)
 62     elif symbol ==-:
 63         f1,f2 = max(f1,f2),min(f1,f2)#防止出现负数
 64         q.append(str(f1)+-+str(f2)+=)
 65         ans.append(f1-f2)
 66     elif symbol == *:
 67         while f1*f2>1:
 68             f1,f2 = createF()
 69         q.append(str(f1)+×+str(f2)+=)
 70         ans.append(f1*f2)
 71     else:
 72         while f1/f2>1:
 73             f1,f2=createF()
 74         q.append(str(f1)+÷+str(f2)+=)
 75         ans.append(Fraction(f1,f2))
 76 def main():
 77     while 1:
 78         print("输入题目的数量:", end=  )
 79         k = int(input())
 80         p = 100 / k
 81         s = 0
 82         q = []
 83         ans = []
 84         ans2 = []
 85         for i in range(k):
 86             n = random.randint(1, 4)
 87             if n == 1:
 88                 c1(q, ans)
 89                 g = Fraction(ans[i])
 90                 ans2.append(f(g))
 91             else:
 92                 c2(q, ans)
 93                 g = Fraction(ans[i])
 94                 ans2.append(f(g))#记录带分数答案
 95         for i in range(k):
 96             print("第{}题:{}".format(i + 1, q[i]), end="  ")
 97             a = input()
 98             if a == str(ans[i]):
 99                 s = s + p
100         print("所得的分数为:{}".format(s))
101         print("正确答案:", end="  ")
102         for i in range(k):
103             if str(ans[i]) == str(ans2[i]):
104                 print(q[i] + str(ans[i]))
105             else:
106                 print("{}{}或{}".format(q[i],str(ans2[i]),str(ans[i])))
107 if __name__ == __main__:
108     main()

6.测试运行

技术分享图片

 

 

 

 技术分享图片

7.改进思路

上述第一个代码将不能整除的式子过滤了,经修改可自动生成,代码更新如下:

 

 1 import random
 2 #四则运算
 3 from fractions import Fraction
 4 def f(f):#分数的转换
 5     a=f.numerator #分子
 6     b=f.denominator #分母
 7     if a%b==0:#为整数
 8         return %d%(a/b)
 9     elif a<b:#为真分数
10         return %d%s%d % (a,/,b)
11     else:#为带分数
12         c=int(a/b)
13         a = a - c * b
14         return %d%s%d%s%d % (c,,a,/,b)
15 def szys():
16     sym = [, , ×, ÷]
17     f= random.randint(0, 3)
18     n1 = random.randint(1, 99)
19     n2 = random.randint(1, 99)
20     result = 0
21     if f== 0:#加法
22        result  = n1 + n2
23     elif f == 1:#减法,要先比较大小,防止输出负数
24         n1, n2 = max(n1, n2), min(n1, n2)
25         result  = n1 - n2
26     elif f== 2:#乘法
27         result  = n1 * n2
28     elif f == 3:#除法,要比较大小
29         result =Fraction(n1, n2)
30     print(n1, sym[f], n2, = , end=‘‘)
31     return result
32 print(请输入555进行四则运算) 
33 n=int(input())
34 #当输入555时,进行四则运算,调用函数szys()
35 if n==555:
36     while True:
37         result  = szys()
38         j= input()
39        
40         if j== f(result ):
41             print(Bingo~恭喜你答对了!)
42         else:
43             print(很遗憾你答错了,继续加油哟~ 正确答案是:, result )

 

修改后的结果显示:

技术分享图片

 

 8.记录实际花费时间

 

用Python自动生成小学四则运算题目

原文:https://www.cnblogs.com/wawaer/p/13699874.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!