<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Python實現自動生成小學四則運算題目

       

      Github地址:

      https://github.com/RNG-Wh1t3zZ/air-force-one-lbw/blob/master/zy1.py

      題目描述:

        通過python語言編寫一個能夠自動生成小學四則運算的程序(注意是給小學生用的,要是結果出現負數的話他們會很迷茫的!),同時,除了整數外,還要支持真分數的四則運算。

      Psp表格:

      第一次作業PSP

      任務內容

      計劃完成需要的時間(min)

      實際完成需要的時間(min)

      Planning

      計劃

      60

      60

       Estimate

      估計這個任務需要多少時間,并規劃大致工作步驟

      20

      30

      Analysis

      需求分析 (包括學習新技術)

      40

      80

      Design

      具體設計

      30

      40

      Coding

      具體編碼

      300

      500

      test

      測試(自我測試,修改代碼,提交修改)

      150

      200

      Postmortem & Process

      Improvement Plan

      事后總結 ,并提出過程改進計劃

      25

      50

      Summary

      合計

       

      625

       

      960

      1.程序設計

      生成簡單的四則運算題目需要兩個整數或是分數,為了將答案與算式分類,用兩個列表儲存。q[]用來存儲問題,ans[]用來存儲答案。我們可以通過random模塊生成一定區間里的隨機數,分數也可以通過隨機生成分子和分母的形式隨機生成。同時分數可以使用Fraction模塊,可以同時實現分數與整數的運算以及分子和分母的約分。

      下面是各個函數的代碼:

      2.實現代碼

      # -*- coding: utf-8 -*-
      '''
      * @Author : lbw
      * @Date : 2020-09-19 15:57:48
      * @version : 1.0
      * @Description : 小工具
      * @LastEditTime : 2020-09-20 20:49:30
      '''

      import random
      import datetime
      import argparse
      import re
      from fractions import Fraction

      def OPT(up_limit=10, oper_num=2, oper_variety=4, has_fraction=True):
      '''
      * 設置參數

      * @param up_limit {int} 操作數數值上限

      * @param oper_num {int} 操作數個數

      * @param oper_variety {int} 運算符種類

      * @param has_fraction {bool} 是否帶有分數
      '''
      parse = argparse.ArgumentParser()
      # 操作數數值上限
      parse.add_argument('--up_limit', type=int, default=up_limit)
      # 操作數個數
      parse.add_argument('--oper_num', type=int, default=oper_num)
      # 運算符種類
      parse.add_argument('--oper_variety', type=int, default=oper_variety)
      # 是否帶有分數
      parse.add_argument('--has_fraction', type=bool, default=has_fraction)

      return parse.parse_args(args=[])

      class GeneralFormular:
      '''
      * 生成算式

      * @param opt {OPT} 參數
      '''
      def __init__(self, opt):
      self.opt = opt

      # @profile
      def catFormula(self, operand1, operator, operand2):
      '''
      * 連接算式

      * @param operand1 {str} 操作數1

      * @param opertor {str} 運算符

      * @param operand2 {str} 操作數2

      * @return {str}
      '''

      return "{}{}{}".format(operand1, operator, operand2)

      # @profile
      def getRandomIntOperand(self):
      '''
      * 返回隨機整數操作數

      * @return {int}
      '''
      return random.randint(0, self.opt.up_limit)

      # @profile
      def getRandomFractionOperand(self):
      '''
      * 返回隨機分數操作數

      * @return {str}
      '''
      num01 = self.getRandomIntOperand()
      num02 = self.getRandomIntOperand()
      while num01 == num02 or num02==0:
      num02 = self.getRandomIntOperand()
      while num01 == 0:
      num01 = self.getRandomIntOperand()

      # 保證分數為真分數
      if num01 < num02:
      return str(num01) + "/" + str(num02)
      else:
      return str(num02) + "/" + str(num01)

      # @profile
      def getRandomOperator(self):
      '''
      * 返回隨機運算符

      * @return {str}
      '''
      index = random.randint(0, self.opt.oper_variety-1)
      if index == 0:
      return '+'
      elif index == 1:
      return '-'
      elif index == 2:
      return '×'
      else:
      return '÷'

      # @profile
      def getOriginFormular(self):
      '''
      * 生成整數源算式

      * @return {str}
      '''
      tmp = self.getRandomIntOperand()
      for i in range(self.opt.oper_num-1):
      tmp = self.catFormula(tmp, self.getRandomOperator(), self.getRandomIntOperand())

      # 去掉'÷0'
      while(True):
      if '÷0' in tmp:
      tmp = tmp.replace('÷0', '÷'+str(self.getRandomIntOperand()))
      else:
      break

      return tmp

      # @profile
      def insertBracket(self, formular):
      '''
      * 插入括號

      * @param formular {str} 源算式

      * @return {str}
      '''
      # print(formular)

      # 若只包含+號 或 只有兩個操作數 則不用加括號
      if self.opt.oper_variety <= 2 or self.opt.oper_num == 2:
      return formular
      # 若不包含×÷ 則不用加括號
      if '×' not in formular and '÷' not in formular:
      return formular

      # 操作數列表
      operand_list = re.split("[-|+|×|÷]", formular)
      # 操作符列表
      operator_list = re.split("[!0-9]", formular)
      # 去掉空字符
      while '' in operator_list:
      operator_list.remove('')
      # print(operand_list, operator_list)

      # 添加括號
      new_formular = ""
      flag = 0
      for i in range(len(operator_list)):
      oper = operator_list.pop(0)
      if oper == '-' or oper == '+':
      if flag == 0:
      new_formular += "("
      flag = 1
      new_formular += (str(operand_list.pop(0)) + str(oper))
      else:
      new_formular += str(operand_list.pop(0))

      if flag == 1:
      new_formular += ")"
      flag = 0

      new_formular += str(oper)
      # print(operand_list, operator_list, new_formular)

      new_formular += str(operand_list.pop(0))
      if flag == 1:
      new_formular += ")"

      return new_formular

      # @profile
      def replaceFraction(self, formular):
      '''
      * 帶入分數

      * @param formular {str} 源算式,可能包含括號

      * @return {str}
      '''

      # 帶入分數個數
      fraction_num = 1
      if self.opt.oper_num > 2:
      fraction_num = (self.opt.oper_num - 1) / 2
      # 操作數列表
      operand_list = re.split("[-|+|×|÷|(|)]", formular)
      # 去掉空字符
      while '' in operand_list:
      operand_list.remove('')
      index = random.randint(0, len(operand_list)-1)

      formular = formular.replace(str(operand_list[index]), self.getRandomFractionOperand())

      return formular

      # @profile
      def solve(self):
      '''
      * 整合生成算式的后綴表達式,帶括號

      * @return {str}
      '''
      # 生成原生算式
      ori_formular = self.getOriginFormular()
      # 添加括號
      bra_formular = self.insertBracket(ori_formular)
      # 帶入分數
      if self.opt.has_fraction:
      bra_formular = self.replaceFraction(bra_formular)

      return bra_formular

      class ComputeFormular:
      '''
      * 計算算式的值
      '''
      def __init__(self):
      pass

      # @profile
      def getPostFormular(self, formular):
      '''
      * 中綴表達式轉為后綴表達式

      * @param formular {str} 中綴表達式

      * @return {str}
      '''
      # 運算符棧
      operator_stack = []

      # 后綴表達式
      post_formular = ""

      # 中綴表達式轉為后綴表達式
      i = 0
      while i < len(formular):
      char = formular[i]
      # print("1: ", i, char, operator_stack, post_formular)
      if char == '(':
      operator_stack.append(char)
      i += 1
      # print("2: ", i, operator_stack, post_formular)
      elif char == ')':
      tmp_char = operator_stack.pop()
      while tmp_char != '(':
      post_formular += tmp_char
      if len(operator_stack) != 0:
      tmp_char = operator_stack.pop()
      else:
      break
      i += 1
      # print("3: ", i, operator_stack, post_formular)
      elif char == '+' or char == '-':
      try:
      tmp_char = operator_stack.pop()
      except Exception as e:
      pass
      while len(operator_stack) != 0:
      if tmp_char != '(':
      post_formular += tmp_char
      if len(operator_stack) != 0:
      tmp_char = operator_stack.pop()
      else:
      break
      else:
      operator_stack.append(tmp_char)
      break
      operator_stack.append(char)
      i += 1
      # print("4: ", i, operator_stack, post_formular)
      elif char == '×' or char == '÷':
      while len(operator_stack) != 0:
      tmp_char = operator_stack.pop()
      if tmp_char== '×' or tmp_char == '÷':
      post_formular += tmp_char
      if len(operator_stack) != 0:
      tmp_char = operator_stack.pop()
      else:
      break
      else:
      break
      operator_stack.append(char)
      i += 1
      # print("5: ", i, operator_stack, post_formular)
      # 存在數字時
      else:
      # print("6: ", i, operator_stack, post_formular)
      while char >= '0' and char <= '9' or char == '/':
      post_formular += char
      i += 1
      if i < len(formular):
      char = formular[i]
      else:
      break
      post_formular += '#'
      # print("7: ", i, operator_stack, post_formular)

      # 若符號棧不為空則循環
      while len(operator_stack) != 0:
      tmp_char = operator_stack.pop(0)
      post_formular += tmp_char
      # print("8: ", i, operator_stack, tmp_char)

      # print(post_formular)
      return post_formular

      # @profile
      def calcFormular(self, formular):
      '''
      * 計算算式的值

      * @param formular {str} 后綴表達式

      * @return {str}
      '''
      # 操作數棧
      operand_stack = []
      i = 0
      while i < len(formular):
      if formular[i] == '+':
      num01 = operand_stack.pop()
      num02 = operand_stack.pop()
      result = Fraction(num02) + Fraction(num01)
      operand_stack.append(result.__str__())
      elif formular[i] == '-':
      num01 = operand_stack.pop()
      num02 = operand_stack.pop()
      result = Fraction(num02) - Fraction(num01)
      operand_stack.append(result.__str__())
      elif formular[i] =='×':
      num01 = operand_stack.pop()
      num02 = operand_stack.pop()
      result = Fraction(num02) * Fraction(num01)
      operand_stack.append(result.__str__())
      elif formular[i] == '÷':
      num01 = operand_stack.pop()
      num02 = operand_stack.pop()
      try:
      result = Fraction(num02) / Fraction(num01)
      operand_stack.append(result.__str__())
      except Exception as e:
      # print('Error: 除零錯誤!')
      return "NaN"
      else:
      number = ""
      while formular[i] >= '0' and formular[i] <= '9' or formular[i] == '/':
      number += formular[i]
      if i < len(formular):
      i += 1
      else:
      i -= 1
      break
      operand_stack.append(number)

      i += 1

      return operand_stack.pop()

      # @profile
      def solve(self, formular):
      '''
      * 整合計算中綴表達式的值

      * @param formular {str} 后綴表達式

      * @return {str}
      '''
      # 轉為后綴表達式
      post_formular = self.getPostFormular(formular)
      value = self.calcFormular(post_formular)

      return value


      if __name__ == "__main__":
      opt = OPT(up_limit=10, oper_num=5, has_fraction=False)
      gf = GeneralFormular(opt)
      # gf.getRandomIntOperand()
      # gf.getRandomFractionOperand()
      # gf.getRandomOperator()
      # formular = gf.getOriginFormular()
      # new_formular = gf.insertBracket(formular)
      # fra_formular = gf.replaceFraction(new_formular)
      # print("源算式:", formular)
      # print("加括號:", new_formular)
      # print("換分數:", fra_formular)

      cf = ComputeFormular()
      # post_formular = cf.getPostFormular(fra_formular)
      # value = cf.calcFormular(post_formular)
      # print("后綴式:", post_formular)
      # print("結果:", value)

      fra_formular = gf.solve()
      print("中綴式:", fra_formular)
      value = cf.solve(fra_formular)
      print("結果:", value)

       

        

      3.程序運行結果

      posted on 2020-09-20 23:26  阿炳1  閱讀(631)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国内少妇偷人精品免费| 久久五月丁香激情综合| 国产精品天堂蜜av在线播放| 男人的天堂av一二三区| 色综合久久网| 亚洲国产午夜精品理论片妓女| 亚洲va中文字幕无码久久 | 午夜毛片精彩毛片| 国产黄色一区二区三区四区| 18禁国产一区二区三区| 亚洲sm另类一区二区三区| 成人午夜污一区二区三区| 国产精品一区二区三区激情| 福利成人午夜国产一区| 久久精品国产蜜臀av| 日韩本精品一区二区三区| 无码国模国产在线观看免费| 国内精品人妻一区二区三区| 成av免费大片黄在线观看| 亚洲精品熟女一区二区| 无棣县| japanese人妻中文字幕| 国产黄色大片网站| 国产无码高清视频不卡| 福利视频一区二区在线| 国产综合精品91老熟女| 亚洲中文字幕一二三四区| 中文字幕精品亚洲无线码二区| 成人午夜av在线播放| 国产精品美女一区二三区| 老太脱裤让老头玩ⅹxxxx| 国产一区二区三区18禁| 91蜜臀国产自产在线观看| 国产va免费精品观看| 国产一区二区亚洲一区二区三区| 深夜av免费在线观看| 淳安县| 亚洲精品区二区三区蜜桃| 亚洲无?码A片在线观看| 国产精品一码二码三码四码| 啊轻点灬大JI巴太粗太长了欧美|