小学算术题四则运算(升级)
Github项目地址:
https://github.com/cx-38/python/compare/master...cx-38-patch-1?expand=1
一.程序设计
1.题目要求:能自动生成小学四则运算题目,且每一道题目的运算结果不能为负。除了支持整数运算外,还要支持真分数四则运算。
2.工具清单:
1)编程语言:python
2) 效能分析工具:profile
3)源代码管理平台:Gitbee
3.PSP表格
预计耗时(分钟) | 实际耗时(分钟) | ||
Planning | 计划 | 20 | 20 |
Estimate | 估计这个任务需要多少时间 | 5 | 5 |
Development | 开发 | 80 | 90 |
Analysis | 需求分析 | 10 | 10 |
Design Spec | 生成设计文档 | / | / |
Design Review | 设计复审(和同事审核设计文档) | / | / |
Coding Standerd | 代码规范(为目前的开发制定合适的规范) | / | / |
Design | 具体设计 | 30 | 30 |
Coding | 具体编码 | 100 | 100 |
Code Review | 代码复审 | 10 | 15 |
Text | 测试(自测,修改代码,提交修改) | 20 | 20 |
Reporting | 报告 | 20 | 20 |
Text Report | 测试报告 | 10 | 10 |
Size Measurement | 计算工作量 | 5 | 5 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 5 | 5 |
Sum | 合计 | 305 | 330 |
4.功能升级
原自动生成四则运算题目运行过于简单(上一条博客),生成的题目四则运算只是两个整数的运算,没有出现分数和小数的运算。为此功能上进行了升级。
升级后的功能分为:1)两个整数之间加减运算
2)带有两位小数的两个数之间加减运算
3)两个分数之间加减运算
4)两个整数之间乘除法运算
5)两个分数之间的加减运算。
增加了一个用户可以自己选择题目等级的选择,题目等级分为:
1)一级 :参与四则运算的两个数的取值范围位0~100
2)二级 : 参与四则运算的两个数的取值范围位0~500
3)三级: 参与四则运算的两个数的取值范围位0~1000
二.实现代码
import random from fractions import Fraction #主干函数 def useAnsult(): print("\033[1;31m此软件能计算的类型有:1)两个整数之间加减运算 2)带有两位小数的两个数之间加减运算 3)两个分数之间加减运算\033[0m") print("\033[1;31m 4)两个整数之间乘除法运算 5)两个分数之间的加减运算\033[0m") homeworkType=int(input("请输入要生成的题目类型代号(1,2,3,4,5,6)中的其中一个:")) homeworkCount=int(input("请输入要生成的题目个数:")) level=input("\033[1;35m请输入你想计算的四则题目的等级(一级,二级,或三级):") if level=="一级": level=100 elif level=="二级": level=500 else: level=1000 count=0 while count< homeworkCount: if homeworkType==1: count=count+1 print("第"+str(count)+"道题目") intAddSub(level) elif homeworkType==2: count=count+1 print("第"+str(count)+"道题目") decAddSub(level) elif homeworkType==3: count=count+1 print("第"+str(count)+"道题目") proFraAddSub(level) elif homeworkType==4: count=count+1 print("第"+str(count)+"道题目") intMulDiv(level) elif homeworkType==5: count=count+1 print("第"+str(count)+"道题目") proFraMulDiv(level) else: homeworkType=input("\033[1;35m没有该题目类型,输入错误,请重新输入:\033[0m")
#两个整数之间加减运算 def intAddSub(level): typeCh=random.randint(0,1) #选择加减运算符 left=random.randint(0,level) #生成随机整数 right=random.randint(0,level) if typeCh==0: #加法运算 print(str(left)+"+"+str(right)+"= ?") input("请输入你的答案:") print("\033[1;35m正确答案是:\033[0m",str(left+right)) else: #减法运算 if left< right: #确保减法的结果不会出现负数 middleVariable=left left=right right= middleVariable print(str(left)+"-"+str(right)+" = ?") input("请输入你的答案:") print("\033[1;35m正确答案是:\033[0m",str(left-right))
#带有两位小数的两个数之间加减运算 def decAddSub(level): left = random.uniform(0, level) left=round(left, 2) #生成的随机数保留两位小数 right = random.uniform(0, level) right=round(right, 2) typeCh=random.randint(0,1) #选择加减运算符 if typeCh==0: #加法运算 print(str(left)+"+"+str(right)+"= ?") input("请输入你的答案:") print("\033[1;35m正确答案是:{:.2f}\033[0m".format(left+right)) else: #减法运算 if left< right: #确保减法的结果不会出现负数 middleVariable=left left=right right= middleVariable print(str(left)+"-"+str(right)+" = ?") input("请输入你的答案:") print("\033[1;35m正确答案是:{:.2f}\033[0m".format(left-right))
#两个分数之间的加减运算 def proFraAddSub(level): number1=random.randint(0,level) number11=random.randint(1,level) left=Fraction(number1,number11 ) number2=random.randint(0,level) number22=random.randint(1,level) right=Fraction(number2,number22) typeCh=random.randint(0,1) #选择加减运算符 if typeCh==0: #加法运算 print(str(left)+"+"+str(right)+"= ?") input("请输入你的答案:") print("\033[1;35m正确答案是:\033[0m",str(Fraction(left+right))) else: #减法运算 if left< right: #确保减法的结果不会出现负数 middleVariable=left left=right right= middleVariable print(str(left)+"-"+str(right)+" = ?") input("请输入你的答案:") print("\033[1;35m正确答案是:\033[0m",str(Fraction(left-right)))
#两个整数之间乘除运算 def intMulDiv(level): typeCh=random.randint(0,1) #选择运乘除算符 if typeCh==0: #乘法 left=random.randint(0,level) right=random.randint(0,level) print(str(left)+"*"+str(right)+"= ?") input("请输入你的答案:") print("\033[1;35m正确答案是:\033[0m",str(left*right)) else: #除法 if level<300: right=random.randint(1,level) left=right*random.randint(0,4) #此处考虑到用户如果选择初级或中级的除法计算,计算结果是整数比较好,故设除数是被除数的倍数 else: left=random.randint(1,level) right=random.randint(1,level) print(str(left)+"÷"+str(right)+" = ?") input("请输入你的答案:") if left%right==0: #判断是否能整除 print("\033[1;35m正确答案是:\033[0m",str(int(left/right))) else: print("\033[1;35m正确答案是:\033[0m",str(Fraction(left,right)))
#两个分数之间乘除计算 def proFraMulDiv(level): number1=random.randint(0,level) number11=random.randint(1,level) left=Fraction(number1,number11 ) typeCh=random.randint(0,1) #选择乘除运算符 if typeCh==0: #乘法运算 number2=random.randint(0,level) number22=random.randint(1,level) right=Fraction(number2,number22) print(str(left)+"*"+str(right)+"= ?") input("请输入你的答案:") print("\033[1;35m正确答案是:\033[0m",str(left*right)) else: #除法运算 number2=random.randint(1,level) number22=random.randint(1,level) right=Fraction(number2,number22) print(str(left)+"÷"+str(right)+" = ?") input("请输入你的答案:") print("\033[1;35m正确答案是:\033[0m",str(Fraction(left,right)))
useAnsult()
运行: