模擬計算器

需求
    a.實現加減乘除及拓號優先級解析
    b.用戶輸入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ),計算結果


wKioL1mMi93gcKdyAAC_pg1dZe4307.png

import re

def mul_div(m_d):      # 計算乘除公式
    for index, member in enumerate(m_d):
        if "*" in member or "/" in member:
            oper = re.findall("[*/]", member)
            calculation = re.split("[*/]", member)
            num = None
            for i, e in enumerate(calculation):
                if num:
                    if oper[i - 1] == "*":
                        num *= float(e)
                    elif oper[i - 1] == "/":
                        num /= float(e)
                else:
                    num = float(e)
            m_d[index] = num
    return m_d

def add_sub(oper, num_list):   #計算加減公式
    num = None
    for i, n in enumerate(num_list):
        if num:
            if oper[i - 1] == "+":
                num += float(n)
            elif oper[i - 1] == "-":
                num -= float(n)
        else:
            num = float(n)
    return num

def brackets(formula):      #格式化計算公式
    formula = re.sub("[()]", "", formula)               # 去除兩邊的()
    formula = formula.replace(" ", "")                  # 去除空字符
    formula = formula.replace("+-", "-")                # 定義計算規則,正負得負
    formula = formula.replace("--", "+")                # 定義計算規則,負負得正
    sign = re.findall("[+-]", formula)   # 取出公式內加減運算符
    m_d = re.split("[+-]", formula)    # 以加減運算符切割計算公式,取出帶有'*' '/'
    if m_d[0] == "":                   # 若是列表第一個字符爲空,表示一個數字爲負號
        m_d[1] = "-" + m_d[1]     # 從新定義帶有*/的公式,加上負號
        del sign[0]
        del m_d[0]
    for index, member in enumerate(m_d):      #枚舉列表
        if member.endswith("*") or member.endswith("/"):
            m_d[index] = member + sign[index] + m_d[index + 1]
            del m_d[index + 1]
            del sign[index]
    res=sign, m_d
    sign = res[0]
    m_d = res[1]
    after_m_d = mul_div(m_d)
    res = add_sub(sign, after_m_d)
    return res

def main(formula):     # 主邏輯,循環取出括號內計算公式並進行公式拼接
    while True:
        formula_cut = re.search("\([^()]+\)", formula)
        if formula_cut:
            formula_cut = formula_cut.group()
            res = brackets(formula_cut)   # 格式化計算公式
            formula = formula.replace(formula_cut, str(res))  # 把括號計算後的內容拼接到計算公式
        else:
            res = brackets(formula)
            print("\33[31;1m結果:%s\33[0m" % (res))
            exit()

formula=input('''
請輸入運算公式:
格式如:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
【Q】 退出
''')
if formula.lower() == 'q':
    print('計算器已退出')
    exit()
main(formula)


測試效果

請輸入運算公式:
格式如:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
【Q】 退出
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
結果:2776672.6952380957
相關文章
相關標籤/搜索