Github项目地址:https://github.com/wxy4845/goodgood.git
PSP表格:
解题思路:
计算四则运算,先从整数开始。除法的计算与结果表达分为真分数与带分数。
带分数的表达需要定义一个函数得出的结果与小学运算的表达结果一致。
实现过程:
代码的加减乘的表达结果不需要做过多的修改,除法的结果需要一个Fraction(n1, n2)函数来得出一个分数。
还需要一个自定义的函数来实现把假分数转换成带分数的功能。
这个转换的函数我定义为f(),功能主要是把假分数能换成带分数。
代码说明:
import random
#四则运算
from fractions import Fraction
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)
def ysfz():
sym = ['+', '-', '×', '÷']
f= random.randint(0, 3)
n1 = random.randint(1, 20)
n2 = random.randint(1, 20)
result = 0
if f== 0:#加法
result = n1 + n2
elif f == 1:#减法,要先比较大小,防止输出负数
n1, n2 = max(n1, n2), min(n1, n2)
result = n1 - n2
elif f== 2:#乘法
result = n1 * n2
elif f == 3:#除法,要比较大小
result =Fraction(n1, n2)
print(n1, sym[f], n2, '= ', end='')
return result
print('请输入1进行四则运算')
n=int(input())
#当输入1时,进行四则运算,调用函数syzs()
if n==1:
while True:
result = ysfz()
j= input()
if j== f(result ):
print('well',f(result))
else:
print('more again,the answer is', f(result))
测试运行:
代码改进:
改进代码后,可以进行分数的四则运算,并且可以规定抽取的题目数量,最后还可以看到自己所得分数。
import random
from fractions import Fraction
##两个整数的四则运算
def c1(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 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)
##两个分数的四则运算
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(f1*f2)
else:
while f1/f2>1:
f1,f2=createF()
q.append(str(f1)+'÷'+str(f2)+'=')
ans.append(Fraction(f1,f2))
def main():
while 1:
print("输入题目的数量", end=' ')
k = int(input())
p = 100 / k
s = 0
q = []
ans = []
ans2 = []
for i in range(k):
n = random.randint(1, 4)
if n == 1:
c1(q, ans)
g = Fraction(ans[i])
ans2.append(f(g))
else:
c2(q, ans)
g = Fraction(ans[i])
ans2.append(f(g))#记录带分数答案
for i in range(k):
print("第{}题:{}".format(i + 1, q[i]), end=" ")
a = input()
if a == str(ans[i]):
s = s + p
print("所得的分数为:{}".format(s))
print("正确答案:", end=" ")
for i in range(k):
if str(ans[i]) == str(ans2[i]):
print(q[i] + str(ans[i]))
else:
print("{}{}或{}".format(q[i],str(ans2[i]),str(ans[i])))
if __name__ == '__main__':
main()
代码运行结果如下:
整个程序目前为止结束。