尝试找出如何处理包括括号的数学表达式

问题描述 投票:0回答:1

所以我目前正在尝试编写一个基本上知道如何处理数学表达式的代码,它还有一些其他的小功能,例如计算平均值、从 2 中获取最小数、从 2 中获取最大数等等。 问题是,它目前缺少支持括号的能力。我需要它来处理多个括号,或者括号内的括号。您建议如何以“简单”且易于理解的方式实现它?

注意:我是一个初学者,正在努力向上:) 这是我的代码:

def parse_expression(expr):
    elements = list(expr.replace(" ", ""))
    exercise = []
    operators = ('+', '-', '*', '/', '$', '&', '@') #### @ = Average, & = Min, $ = Max
    i = 0

    while i < len(elements):
        if elements[i].isdigit() or (elements[i] == '-' and (i == 0 or elements[i - 1] in operators)):
            num = elements[i]

            while i + 1 < len(elements) and (elements[i + 1].isdigit() or elements[i + 1] == '.'):
                i += 1
                num += elements[i]

            exercise.append(float(num))
        elif elements[i] in operators:
            exercise.append(elements[i])
        i += 1

    return exercise

def calculate_result(exercise):
    k = 0
    while k < len(exercise):
        if exercise[k] == '$' or exercise[k] == '&' or exercise[k] == '@':
            operator = exercise[k]
            left_num = exercise[k - 1]
            right_num = exercise[k + 1]
            if operator == '$':
                result = max(left_num, right_num)
            elif operator == '&':
                result = min(left_num, right_num)
            elif operator == '@':
                result = (left_num + right_num) / (2)

            exercise[k] = result
            exercise.pop(k + 1)
            exercise.pop(k - 1)
        else:
            k += 1

    k = 0
    while k < len(exercise):
        if exercise[k] == '*' or exercise[k] == '/':
            operator = exercise[k]
            left_num = exercise[k - 1]
            right_num = exercise[k + 1]
            if operator == '*':
                result = left_num * right_num
            elif operator == '/':
                try:
                    result = left_num / right_num
                except ZeroDivisionError:
                    print("ERROR: Can't divide by zero. ")
                    return None
            exercise[k] = result
            exercise.pop(k + 1)
            exercise.pop(k - 1)
            k -= 1
        k += 1

    k = 0
    while k < len(exercise):
        if exercise[k] == '+' or exercise[k] == '-':
            operator = exercise[k]
            left_num = exercise[k - 1]
            right_num = exercise[k + 1]
            if operator == '+':
                result = left_num + right_num
            elif operator == '-':
                result = left_num - right_num
            exercise[k] = result
            exercise.pop(k + 1)
            exercise.pop(k - 1)
        else:
            k += 1

    return round(exercise[0], 2)

while True:
    expr = input("calc> ")
    if expr in ('EXIT', 'Exit', 'exit'):
        print("Bye")
        break
    exercise = parse_expression(expr)
    if len([s for s in exercise if isinstance(s, float)]) == 0:
        print("Invalid input.")


    else:
        result = calculate_result(exercise)
        if result is not None:
            print(f"{expr} = {result}")
python calculator parentheses
1个回答
0
投票

parse_expression()
中,每当您看到左括号时就开始一个新表达式,然后当您看到右括号时发送然后将其发送到
parse_expression()

expression = '2 + 3 * (4 + 5)'

new_expression = '4 + 5'

我假设你这样做是为了好玩,因为 python 可以用

eval(exp)

解释数学字符串

so

eval('2 + 3 * (4 + 5)')
输出 29,但不确定它能解析多复杂。

编辑:

对于更高级的方法,您可以阅读Shunting Yard算法,一种解析算术或逻辑表达式或两者组合的方法,以中缀表示法指定。

© www.soinside.com 2019 - 2024. All rights reserved.