def test_result(self): """测试查重方法是否正确""" self.postfix_formula1 = FormatUtils.get_result_formula( self.source_expr) # 转换成后缀表达式 self.postfix_formula2 = FormatUtils.get_result_formula( self.target_expr) self.check_formula1 = FormatUtils.get_check_formula( self.postfix_formula1) # 转换成查重表达式 self.check_formula2 = FormatUtils.get_check_formula( self.postfix_formula2) self.assertEqual( True, Tree.duplicate_check(self.check_formula1, [self.check_formula2]), """查重失败""")
def generate_formula(self, num_range, number, negative): """随机生成式子""" num = 0 degree = random.randrange(3, 4) # 随机设置操作数的个数 while num < number: empty_node = [self.root] for _ in range(degree): '''生成操作符号节点''' node = random.choice(empty_node) empty_node.remove(node) node.operator = random.choices(self.op_list, cum_weights=self.op_weight)[0] # node.operator = random.choices(self.op_list)[0] node.type = 2 # 每生成一个操作符号节点,生成两个空节点 node.left = Node() node.right = Node() empty_node.append(node.left) empty_node.append(node.right) for node in empty_node: '''将所有空结点变为数字结点''' node.type = 1 # 设置真分数的比重 1为整数 0为分数 num_type = random.choices(self.type_list, self.num_weight)[0] if num_type == 1: # 生成一个整数 node.number = random.randint(1, num_range) else: # 生成一个真分数 node.number = Fraction(random.randint(1, num_range), random.randint(1, num_range)) try: # self.root.show_node() # 获取生成的二叉树结构 self.root.get_answer(negative) # 计算答案 if self.root.number.denominator > 99: # 分母超过99抛出异常 raise DifficultError() self.pre_formula = self.root.get_formula() # 获取前缀表达式 self.post_formula = FormatUtils.get_result_formula( self.pre_formula) # 获取后缀表达式 self.check_formula = FormatUtils.get_check_formula( self.post_formula) # 获取查重表达式 a.append(self.pre_formula) b.append(self.post_formula) c.append(self.check_formula) # 进行查重 if not Tree.duplicate_check(self.check_formula, self.result_formula): # 返回false 则表明没有重复 self.result_formula.append(self.check_formula) else: raise DuplicateError output = FormatUtils.standard_output( self.pre_formula) # 格式化前缀表达式 if isinstance(self.root.number, Fraction): answer = FormatUtils.standard_format( self.root.number) # 格式化答案 else: answer = self.root.number # print(output, answer) self.formula.append(output) self.answer.append(answer) except ZeroDivisionError: # print("除数为零,删除该式子") continue except NegativeError: # print("出现负数,删除该式子") continue except DifficultError: # print("题目较难,删除该式子") continue except DuplicateError: # print("题目重复,删除该式子") continue else: num += 1 return self.formula, self.answer