小学四则运算题2

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)对于加减乘除的混合运算,先判断运算顺序,再调用两个数的运算规则进行计算。

 

实现过程:

 设计三个函数:

 1newint() 生成整数四则运算

 2newfra() 生成真分数四则运算

 3newtest() 生成制定指定数量的四则运算题目

 (4newfi() 生成整数与分数的四则运算

 (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]<n[1]:
116             n[0]=num()
117             n[1] = num()
118         jieguo = jisuan(n[0],n[1],k1)
119         while k2==1 and jieguo<n[2]:
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

转载于:https://www.cnblogs.com/rekosama/p/10615977.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值