首页 > 代码库 > 模拟计算器

模拟计算器

需求
    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) ),计算结果


技术分享

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


本文出自 “lyndon” 博客,请务必保留此出处http://lyndon.blog.51cto.com/11474010/1955313

模拟计算器