一、需求分析
设计一个不重复的100以内的无括号非分数四则运算生成器,符合加减乘除四则运算 可以选择自动生成题目数量、负数输出、非整数输出、限制大小、运算符的个数(>=1, 记为:num_opt)。
二、设计思路
-
题目避免重复:随机产生 num_opt+1 个数,通过列表存储产生的数,使用题库字典判断是否重复,如果与前面的题目不重复就继续操作,否则 continue
-
整数输出:对除法运算,先进行模运算判断是否有余数,如果有余数则重新生成
-
四则运算结果计算:使用两个栈进行实现,先消除算式中的乘除法,再通过两个栈中的对应关系进行计算
from random import randint
operators = ['+', '-', '*', '/']
ti_kus = [] # 防止重复
questions = []
answers = []
def generate_express(nums_opt):
if nums_opt <= 0:
return 0
ti_ku = []
a = randint(1, 100)
ti_ku.append(a)
express = [a]
for loc in range(nums_opt):
num = randint(1, 100)
opt = operators[randint(0, 3)]
ti_ku.append(num)
express.append(opt)
express.append(num)
if ti_ku in ti_kus:
return 0
else:
ti_kus.append(ti_ku)
return express
def cal(number1, number2, operator, need_integer):
if operator == '+':
return number1 + number2
if operator == '-':
return number1 - number2
if operator == '*':
return number1 * number2
if operator == '/':
if need_integer:
if number1 % number2:
return None
else:
return int(number1 / number2)
return number1 / number2
def get_res(expression, need_integer):
opt_stack = list()
num_stack = list()
index = 0
while index < len(expression):
element = expression[index]
if element in operators:
if element == '+' or element == '-':
opt_stack.append(element)
else: # 消除乘除法
a = num_stack.pop()
b = expression[index + 1]
res = cal(a, b, element, need_integer)
if res is None:
return None
num_stack.append(res)
index += 2
continue
else:
num_stack.append(int(element))
index += 1
index_num = 0
index_opt = 0
while index_opt < len(opt_stack) and index_num < len(num_stack): # 一个运算符对应两个数
res = cal(num_stack[0], num_stack[index_num + 1], opt_stack[index_opt], need_integer)
num_stack[0] = res
index_num += 1
index_opt += 1
return num_stack[0]
def run(nums_iter, nums_opt, max_value=None, need_integer=True, need_negative_num=False):
count = 0
while count < nums_iter:
express = generate_express(nums_opt)
if express == 0:
continue
answer = get_res(express, need_integer)
if answer is None:
continue
if answer < 0 and not need_negative_num:
continue
if max_value is not None:
if answer > max_value:
continue
expression = ''
for index in range(len(express)):
if express[index] not in operators:
expression += str(express[index])
else:
expression += express[index]
questions.append("{}=".format(expression))
answers.append(answer)
count += 1
if __name__ == '__main__':
# run(200, 1)
run(300, 2, max_value=100)
# run(200, 3, max_value=1000)
# run(200, 2, max_value=1000, need_integer=False)
# run(100, 2, max_value=100, need_negative_num=True)
# 仅输出问题
# for i in range(len(questions)):
# print(questions[i])
# 输出问题与答案
for i in range(len(questions)):
print("{}{}".format(questions[i], answers[i]))
run(200, 1)

run(300, 2, max_value=100)

run(200, 3, max_value=1000)

run(200, 2, max_value=1000, need_integer=False)

run(100, 2, max_value=100, need_negative_num=True)

