ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

四则运算

2019-11-23 21:57:01  阅读:327  来源: 互联网

标签:syb Conversion numerical get symbol 四则运算 fraction


#python实现自动四则运算2019.11.23
   
  import random
  import operator
  import argparse
  from fractions import Fraction
   
   
  def get_Parameter():#命令行控制模块
  parser = argparse.ArgumentParser()
  parser.add_argument('-n', help='设定题目数量',type=int)
  parser.add_argument('-r', help='设定数值范围',type=int)
  return parser.parse_args()
   
   
  class com(object):
  def __init__(self, r):#初始化
  self.r=r
   
   
  def get_Arithmeticl(self):#获得随机数字与符号
  symbol=[]
  numerical=[]
  syb=0
  n=1
  m=0
  i=random.randint(1, 3)
  for x in range(i):
  sy=random.choice(['+','-','×','÷'])
  if sy=='+'or sy=='-':
  syb +=10**(i-x-1)
  else :
  syb += 2 * (10 ** (i - x - 1))
  symbol.append(sy)
  if self.r < 10:
  n = int(10 / self.r)
  if n==1:
  while m <= i:
  numerical.append(Fraction(random.randint(1, self.r), random.randint(1, self.r)))
  m+=1
  else:
  while m <= i:
  nu = Fraction(random.randint(1, self.r * n), random.randint(1, self.r * n))
  if nu<=self.r:
  numerical.append(nu)
  m += 1
  return symbol,syb,numerical,i
   
   
  def get_Calculate(a,b,c):#四则运算 que:a b == int ?
  if c=='+':
  results=a+b
  elif c=='-':
  results=a-b
  elif c=='×':
  results=a*b
  else:results=a/b
  return results
   
   
  def get_Conversion(fraction):#假分数转化真分数
  if fraction.numerator%fraction.denominator==0:
  return '%d'%(fraction.numerator/fraction.denominator)
  elif fraction.numerator>fraction.denominator:
  a=int(fraction.numerator/fraction.denominator)#numerater是分子
  b, c = fraction.numerator - a * fraction.denominator, fraction.denominator
  return '%d%s%d%s%d' % (a,'’',b,'/',c)
  else:
  b, c = fraction.numerator, fraction.denominator
  return '%d%s%d' % (b,'/',c)
   
   
  def set_Formula(symbol,numerical,syb):#算术表达式
  s=''
  if syb>100:
  if syb == 112 or syb ==212:
  s = '(%s %s %s %s %s) %s %s = ' % (get_Conversion(numerical[0]), symbol[0],
  get_Conversion(numerical[1]),symbol[1], get_Conversion(numerical[2]), symbol[2], get_Conversion(numerical[3]))
  elif syb == 121 or syb ==122:
  s = '(%s %s %s) %s %s %s %s = ' % (get_Conversion(numerical[0]), symbol[0],
  get_Conversion(numerical[1]),symbol[1], get_Conversion(numerical[2]), symbol[2], get_Conversion(numerical[3]))
  else:
  s = '%s %s %s %s %s %s %s = ' % (get_Conversion(numerical[0]), symbol[0],
  get_Conversion(numerical[1]),symbol[1], get_Conversion(numerical[2]), symbol[2], get_Conversion(numerical[3]))
  elif syb>10:
  if syb == 12:
  s = '(%s %s %s)%s %s = ' % (get_Conversion(numerical[0]), symbol[0],
  get_Conversion(numerical[1]), symbol[1], get_Conversion(numerical[2]))
  else:
  s = '%s %s %s %s %s = ' % (get_Conversion(numerical[0]), symbol[0],
  get_Conversion(numerical[1]), symbol[1], get_Conversion(numerical[2]))
  else :
  s ='%s %s %s = ' % (get_Conversion(numerical[0]),symbol[0],get_Conversion(numerical[1]))
  return s
   
   
  def get_Formula(n,r):#生成题目和答案列表
  Exercises,Answers,Exercises1,Exercises2=[],[],[],[]
  x=1
  while x<n+1:
  symbol, syb, numerical,i = com(r).get_Arithmeticl()
  results = numerical[0]
  judge = True
  for y in range(i):
  calculate=get_Calculate(results,numerical[y+1],symbol[y])
  if calculate>=0:#判断算式是否合法
  answer=calculate
  else:
  judge=False
  break
  if judge:#查重
  try:
  num=Answers.index(answer)#第一个重复答案的索引
  if operator.eq(Exercises1[num],symbol) and operator.eq(Exercises2[num],numerical):
  pass
  except ValueError as e:#可以写入
  Answers.append(answer)
  Exercises1.append(symbol)
  Exercises2.append(numerical)
  Exercises.append('%d. %s'%(x,set_Formula(symbol,numerical,syb)))
  x+=1
  else:pass
  return Exercises,Answers
   
   
  def text_save(filename, data):#filename为写入文件的路径,data为要写入数据列表.
  file = open(filename,'a')
  file.seek(0)
  file.truncate() # 清空文件
  i = 1
  for x in data:
  x='四则运算题目%i:%s\n'%(i,x)
  file.write(x)
  i +=1
  file.close()
  print('%s文件保存成功'%filename)
   
   
  def text__save(filename,data):
  file = open(filename,'a')
  file.seek(0)
  file.truncate() # 清空文件
  i = 1
  for x in data:
  x='答案%s:%s\n'%(i,x)
  file.write(x)
  file.close()
  i+=1
  print('%s文件保存成功'%filename)
   
   
  def main():
  args = get_Parameter()
  if args.n:
  n = args.n
  if args.r:
  r = args.r
  Exercises, Answers = get_Formula(n, r)
  for x in range(n):
  Answers[x] = '%d. %s' % (x + 1, get_Conversion(Answers[x]))
  print('本次共生成题目%d道\n题目数值范围为0-%d' % (n, r))
  text_save('Exercises.txt', Exercises)
  text__save('Answers.txt', Answers)
   
   
  if __name__ == '__main__':
  main()

标签:syb,Conversion,numerical,get,symbol,四则运算,fraction
来源: https://www.cnblogs.com/zzjjyy123/p/11919851.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有