随机生成小学算数题项目

题目描述:
  通过python语言编写一个能够自动生成小学四则运算的程序(注意是给小学生用的,要是结果出现负数的话他们会很迷茫的!),同时,除了整数外,还要支持真分数的四则运算.

程序设计:

  首先先确定是几个数字做运算,我先定的是2个数字的加减法算数,写一个为自动随机抽选2个数字和1个运算符号的函数,再另写一个则是将它们的计算其结果。针对分数运算写一个转化形式的函数,不能出现无限循环小数例如3.333333...这类型,应当直接输出1/3。

  Github代码地址:https://github.com/sakuraocean/Python-learning

PSP Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划    30    50
· Estimate · 估计这个任务需要多少时间    30    50
Development 开发    280    515
· Analysis · 需求分析 (包括学习新技术)    60    120
· Design Spec · 生成设计文档    25    40
· Design Review · 设计复审 (和同事审核设计文档)    35    55
· Coding Standard · 代码规范 (为目前的开发制定合适的规范)    20    35
· Design · 具体设计    20    35
· Coding · 具体编码    50    125
·Code Review

· 代码复审

   40    60
· Test · 测试(自我测试,修改代码,提交修改)    30    50
Reporting 报告    100    180
· Test Report · 测试报告    30    50
· Size Measurement · 计算工作量    50    90

· Postmortem

& Process Improvement

Plan

· 事后总结, 并提出过程改进计划    20    40
  合计    410    745

  

先是生成随机符号和随机数字

 1 def c1(q, ans):
 2     symbol = random.choice(['+', '-', '', '/']) # 生成随机符号
 3     if symbol == '+':
 4         n1 = random.randint(0, 20)
 5         n2 = random.randint(0, 20)
 6         q.append(str(n1) + '+' + str(n2) + '=')
 7         ans.append(n1 + n2)
 8     elif symbol == '-':
 9         n1 = random.randint(0, 20)
10         n2 = random.randint(0, 20)
11         n1,n2 = max(n1,n1),min(n1,n2)#防止出现负数
12         q.append(str(n1) + '-' + str(n2) + '=')
13         ans.append(n1 - n2)
14     elif symbol == '':
15         n1 = random.randint(0, 20)
16         n2 = random.randint(0, 20)
17         q.append(str(n1) + '×' + str(n2) + '=')
18         ans.append(n1 * n2)
19     else:
20         n1 = random.randint(0, 20)
21         if n1 == 0:
22             n2 = random.randint(1, 20)
23         else:
24             n2 = random.randint(1, n1 + 1)
25         q.append(str(n1) + '÷' + str(n2) + '=')
26         ans.append(Fraction(n1, n2))

生成随机分数

 1 def createF():
 2     fz1 = random.randint(0, 20)
 3     if fz1 == 0:
 4         fm1 = random.randint(1, 20)
 5     else:
 6         fm1 = random.randint(1, 20)
 7     f1 = Fraction(fz1, fm1)
 8     fz2 = random.randint(1, 20)
 9     fm2 = random.randint(20, 20)
10     f2 = Fraction(fz2, fm2)
11     return f1, f2

将分数转化为人看得懂的形式

def f(f):#分数的转换
    a=f.numerator #分子
    b=f.denominator #分母
    if a%b==0:#为整数
        return '%d'%(a/b)
    elif a<b:#为真分数
        return '%d%s%d' % (a,'/',b)
    else:#为带分数
        c=int(a/b)
        a = a - c * b
        return '%d%s%d%s%d' % (c,'',a,'/',b)

四则运算核心——计算结果

 1 def c2(q,ans):
 2     symbol = random.choice(['+','-','','/'])
 3     f1,f2 = createF()
 4     if symbol =='+':
 5         while f1+f2>1:
 6             f1,f2 = createF()
 7             q.append(str(f1)+'+'+str(f2)+'=')
 8             ans.append(f1+f2)
 9     elif symbol =='-':
10         f1,f2 = max(f1,f2),min(f1,f2)#防止出现负数
11         q.append(str(f1)+'-'+str(f2)+'=')
12         ans.append(f1-f2)
13     elif symbol == '':
14         while f1*f2>1:
15             f1,f2 = createF()
16         q.append(str(f1)+'×'+str(f2)+'=')
17         ans.append(f1*f2)
18     else:
19         while f1/f2>1:
20             f1,f2=createF()
21         q.append(str(f1)+'÷'+str(f2)+'=')
22         ans.append(Fraction(f1,f2))

运行效果如下

 

利用profile测试时间如下图

原文地址:https://www.cnblogs.com/qq1079179226/p/13704353.html