Python四则运算
GitHub项目地址:https://github.com/rekosama/-2/blob/master/%E5%9B%9B%E5%88%99%E8%BF%90%E7%AE%972
题目:
(1)能自动生成小学四则运算题目,并且不能出现负数;
(2)能支持真分数的四则运算;
思路:
(1)四则运算加减乘除,采用两个随机数,由于不能出现负数,则对两个随机数进行比较大小再进行减法运算,除法一向特殊,所以在随机数的取值范围中设置不包括0。另外,整数类型除法中两数相除不能出现无限循环小数,故需要对除法做限制。
(2)真分数运算在pycharm中导入fractions库,其余类似。
(3)题库的生成,由于其随机性需要导入random函数。
(4)对于加减乘除的混合运算,先判断运算顺序,再调用两个数的运算规则进行计算。
实现过程:
设计三个函数:
(1)newint() 生成整数四则运算
(2)newfra() 生成真分数四则运算
(3)newtest() 生成制定指定数量的四则运算题目
(4)newfi() 生成整数与分数的四则运算
(5)jisuan() 随机两个数字的运算函数
(6)num() 产生随机的两个数字
(7)hunhe() 生成3个数字的综合算式
函数关系:
newint(),newfra(),new()fi为独立的函数,负责生成随机四则运算,
num(),jisuan()分为为hunhe()产生随机数以及两数计算,hunhe()负责生成综合算式。newtest()则随机调用上述四个函数生成题目。
代码说明:
1 from fractions import Fraction #fraction:分数,即在此导入分数模块 2 import random #用于随机生成题目 3 import profile 4 5 #整数四则运算 6 def newint(): 7 fh = ['+', '-', '×', '÷'] 8 k = random.randint(0, 3) #随机生成0到3内的整数,用于fh的下标 9 n1 = random.randint(0, 50) 10 n2 = random.randint(0, 50) 11 result = 0 #存运算结果 12 if k == 0: 13 result = n1 + n2 14 elif k == 1: 15 n1, n2 = max(n1, n2), min(n1, n2) 16 result = n1 - n2 17 elif k == 2: 18 result = n1 * n2 19 elif k == 3: 20 while n2 == 0 or float(n1/n2)*1000%10!=0: #分母不能为0,运算结果控制在2位小数内。 21 n1 = random.randint(0, 50) 22 n2 = random.randint(0, 50) 23 result = float(n1 / n2) 24 print(n1, fh[k], n2, '= ', end='') 25 return result 26 27 #分数四则运算 28 def newfra(): 29 fh = ['+', '-', '×', '÷'] 30 k = random.randint(0, 3) 31 t1 = random.randint(1,20) 32 t2 = random.randint(t1, 20) #做分母,控制为真分数 33 n1 = Fraction(t1, t2) #即表示n1为分数 34 t1 = random.randint(1, 20) 35 t2 = random.randint(t1, 20) 36 n2 = Fraction(t1, t2) 37 result = 0 38 if k == 0: 39 result = n1 + n2 40 elif k == 1: 41 n1, n2 = max(n1, n2), min(n1, n2) 42 result = n1 - n2 43 elif k == 2: 44 result = n1 * n2 45 elif k == 3: 46 result = n1 / n2 47 print(n1, fh[k], n2, '= ', end='') 48 return result 49 50 51 #分数与整数的四则运算 52 def newfi(): 53 fh = ['+', '-', '×', '÷'] 54 k = random.randint(0, 3) # 随机生成0到3内的整数,用于fh的下标 55 n1 = random.randint(0, 10) 56 t1 = random.randint(1, 20) #做分子 57 t2 = random.randint(t1, 20) # 做分母,控制为真分数 58 n2 = Fraction(t1, t2) # 即表示n2为分数 59 result = 0 # 存运算结果 60 if k == 0: 61 result = n1 + n2 62 elif k == 1: 63 n1, n2pi = max(n1, n2), min(n1, n2) 64 result = n1 - n2 65 elif k == 2: 66 result = n1 * n2 67 elif k == 3: 68 result = n1 / n2 69 print(n1, fh[k], n2, '= ', end='') 70 return result 71 72 ##############################综合算式############################# 73 def jisuan(a,b,k): #两个数字的计算 74 if k==0: 75 return a+b 76 elif k==1: 77 return a-b 78 elif k==2: 79 if a*b * 10000 % 10 == 0: # 如果结果为3为小数内,则输出小数,反之输出为分数 80 return a*b 81 else: 82 return Fraction(a*b) 83 else: 84 if a/b * 10000 % 10 == 0: # 如果结果为3为小数内,则输出小数,反之输出为分数 85 return a/b 86 else: 87 return Fraction(a,b) 88 89 def num(): #产生随机数 90 k=random.randint(0,1) 91 if k==0: 92 a=random.randint(0,20) 93 else: 94 t1 = random.randint(1, 20) # 做分子 95 t2 = random.randint(t1, 20) # 做分母,控制为真分数 96 a = Fraction(t1, t2) # 即表示a为分数 97 return a 98 99 def hunhe(): #综合算式 100 fh = ['+', '-', '×', '÷'] 101 k1= random.randint(0, 3) 102 k2= random.randint(0, 3) 103 n=[num(),num(),num()] 104 if k1>=2: #加减乘除运算顺序 105 jieguo=jisuan(n[0],n[1],k1) 106 while k2 == 1 and n[2] > jieguo: 107 n[2] = num() 108 result=jisuan(jieguo,n[2],k2) 109 elif k1<=1 and k2>=2: 110 jieguo = jisuan(n[1], n[2], k2) 111 while k1==1 and n[0]<jieguo: 112 n[0]=num() 113 result = jisuan(n[0],jieguo,k1) 114 else: 115 while k1==1 and n[0]]: 116 n[0]=num() 117 n[1] = num() 118 jieguo = jisuan(n[0],n[1],k1) 119 while k2==1 and jieguo ]: 120 n[2]=num() 121 result = jisuan(jieguo,n[2],k2) 122 print(n[0], fh[k1], n[1],fh[k2], n[2], '= ', end='') 123 124 if result*10000%10==0: # 如果结果为3为小数内,则输出小数,反之输出为分数 125 return result 126 else: 127 return Fraction(result) 128 129 ################################################################3 130 131 132 133 #newtest()函数是要求用户输入一个整数来输出算式的数量,采用while循环随机生成整数或者真分数运算, 134 # 将答案保存在result列表的同时输出算式直到算式数量达到要求。最后输出result列表即输出答案。 135 def newtest(): 136 fh = ['+', '-', '×', '÷'] 137 print('输入题库所需要的题目数量') 138 n=int(input()) 139 result=[] 140 m=0 141 while m<=(n-1): 142 k = random.randint(0, 3) #0表示真分数的运算,1表示整数的运算,2表示整数与分数的运算,3表示混合运算 143 if k==0: 144 print(m+1,end='、') 145 result.append(newfra()) 146 print(' ') 147 elif k==1: 148 print(m+1,end='、') 149 result.append(newint()) 150 print(' ') 151 elif k==2: 152 print(m+1,end='、') 153 result.append(newfi()) 154 print(' ') 155 else: 156 print(m + 1, end='、') 157 result.append(hunhe()) 158 print(' ') 159 m=m+1 160 m=0 161 print('答案:') 162 while m<=(n-1): 163 print(m+1,'、',result[m]) 164 m=m+1 165 166 #下列为主函数,第一个模式负责调用上述newint()、new函数, 167 # 并获得函数返回值即算式答案,与用户输入值进行比较。第二个模式则是生成算式题目。 168 print('请选择需要进行的操作(输入数字代号)') 169 print('1、四则运算') 170 print('2、制作题库') 171 n=int(input()) 172 if n==1: 173 print('请输入在线答题的数量:') 174 sm=int(input()) 175 print('input "exit" to Quit') 176 cj=0 #记录学生成绩(百分比形式) 177 while True: 178 for i in range(1,sm+1): 179 k = random.randint(0, 3) #0表示真分数的运算,1表示整数的运算,2表示整数与分数的混合运算,3表示混合运算 180 #同时此处亦可控制计算题型输出的比例 181 print(i,end='、') 182 if k == 0: 183 result = newfra() 184 elif k == 1: 185 result = newint() 186 elif k==2: 187 result = newfi() 188 else: 189 result=hunhe() 190 jg = input() 191 if jg == 'exit': 192 break; 193 sr = Fraction(jg) #化为分数形式 194 if sr == result: #检测输入(sr)的答案与正确答案是否一致 195 print('right \n') 196 cj+=1 197 else: 198 print('error. the Tight answer is', result,'\n') 199 i+=1 200 break 201 print('您最后的总成绩为:{:.2f}%'.format(cj/sm*100)) 202 203 if n==2: 204 newtest()
运行效果:
(1)四则运算效果
(2)制作题库效果
效能分析:
PSP表格:
|
|
预计耗时(分钟) |
是实际耗时(分钟) |
Planning |
计划 |
25 |
20 |
Estimate |
估计这个任务需要多少时间 |
/ |
/ |
Development |
开发 |
180 |
180 |
Analysis |
需求分析 |
10 |
10 |
Design Spec |
生成设计文档 |
/ |
/ |
Design Review |
设计复审(和同事审核设计文档) |
/ |
/ |
Coding Standerd |
代码规范(为目前的开发制定合适的规范) |
/ |
/ |
Design |
具体设计 |
5 |
10 |
Coding |
具体编码 |
70 |
90 |
Code Review |
代码复审 |
5 |
10 |
Text |
测试(自测,修改代码,提交修改) |
20 |
30 |
Reporting |
报告 |
10 |
20 |
Text Report |
测试报告 |
10 |
20 |
Size Measurement |
计算工作量 |
5 |
5 |
Postmortem & Process Improvement Plan |
事后总结,并提出过程改进计划 |
10 |
5 |
Sum |
合计 |
360 |
500 |