Github项目地址:
https://github.com/pirigg/-
题目描述:
通过python语言编写一个能够自动生成小学四则运算的程序(注意是给小学生用的,要是结果出现负数的话他们会很迷茫的!),同时,除了整数外,还要支持真分数的四则运算。
Psp表格:
PSP2.1
任务内容
计划完成需要的时间(min)
实际完成需要的时间(min)
Planning
计划
50
60
Estimate
估计这个任务需要多少时间,并规划大致工作步骤
20
30
Analysis
需求分析 (包括学习新技术)
60
90
Design
具体设计
50
60
Coding
具体编码
400
500
test
测试(自我测试,修改代码,提交修改)
200
250
Postmortem & Process
Improvement Plan
事后总结 ,并提出过程改进计划
30
50
Summary
合计
810
1040
1.程序设计
首先以“1+1=”为例,我们要生成简单的四则运算题目需要两个整数或是分数,为了将答案与算式分类,我们分别用两个列表来储存。
q[]用来存储问题,ans[]用来存储答案。我们可以通过random模块生成一定区间里的随机数,分数也可以通过随机生成分子和分母的形式随机生成。同时分数可以使用Fraction模块,可以同时实现分数与整数的运算以及分子和分母的约分。
下面是各个函数的代码:
2.实现代码
defc1(q, ans):
symbol= random.choice(['+', '-', '*', '/']) #生成随机符号
if symbol == '+':
n1= random.randint(0, 20)
n2= random.randint(0, 20)
q.append(str(n1)+ '+' + str(n2) + '=')
ans.append(n1+n2)elif symbol == '-':
n1= random.randint(0, 20)
n2= random.randint(0, 20)
n1,n2= max(n1,n1),min(n1,n2)#防止出现负数
q.append(str(n1) + '-' + str(n2) + '=')
ans.append(n1-n2)elif symbol == '*':
n1= random.randint(0, 20)
n2= random.randint(0, 20)
q.append(str(n1)+ '×' + str(n2) + '=')
ans.append(n1*n2)else:
n1= random.randint(0, 20)if n1 ==0:
n2= random.randint(1, 20)else:
n2= random.randint(1, n1 + 1)
q.append(str(n1)+ '÷' + str(n2) + '=')
ans.append(Fraction(n1, n2))
def createF(): #生成分数
fz1 = random.randint(0, 20)if fz1 ==0:
fm1= random.randint(1, 20)else:
fm1= random.randint(1, 20)
f1=Fraction(fz1, fm1)
fz2= random.randint(1, 20)
fm2= random.randint(20, 20)
f2=Fraction(fz2, fm2)return f1, f2
def c2(q,ans): #两个分数的四则运算
symbol = random.choice(['+','-','*','/'])
f1,f2=createF()if symbol =='+':while f1+f2>1:
f1,f2=createF()
q.append(str(f1)+'+'+str(f2)+'=')
ans.append(f1+f2)elif symbol =='-':
f1,f2= max(f1,f2),min(f1,f2) #防止出现负数
q.append(str(f1)+'-'+str(f2)+'=')
ans.append(f1-f2)elif symbol == '*':while f1*f2>1:
f1,f2=createF()
q.append(str(f1)+'×'+str(f2)+'=')
ans.append(f1*f2)else:while f1/f2>1:
f1,f2=createF()
q.append(str(f1)+'÷'+str(f2)+'=')
ans.append(Fraction(f1,f2))
更新升级:
在原有程序的基础上,我添加了一个转换假分数答案为带分数答案(存储在ans2[]列表中)的函数f(f),以便当学生给出带分数答案时程序不会认为是错误的。
def f(f): #分数的转换
a=f.numerator #分子
b=f.denominator #分母
if a%b==0: #为整数
return '%d'%(a/b)elif a
return '%d%s%d' % (a,'/',b)else: #为带分数
c=int(a/b)
a= a - c *breturn '%d%s%d%s%d' % (c,'’',a,'/',b)
更新并修改了主函数后代码运行结果如下:
3.学习总结
尽管我从完成本次作业的过程中学到了许多,像是粗略掌握了Fraction模块以及一些程序题目的解题思想,但在写程序的过程中我发现了自己许多许多的不足,这次的作业代码也是匆匆忙忙赶出来的,还有很多要补充的方面,像是括号以及长运算题等等,在以后精进自己的水平后便会适时补上。