需求:

简单公式计算:
实现加减乘除及拓号优先级解析
用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-25/3 + 7 /399/42998 +10 * 568/14 )) - (-43)/ (16-32) )等类似公式后,必须自己解析里面的(),+,-,,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致

实现代码:

#!/usr/bin/python3
# czh
import re
#########乘除#######################
def Mu_di(formula):
    if "*" in formula:
        a,b = formula.split("*")
        a = float(a)
        b = float(b)
        formula = float(a)*float(b)
        return formula
    if "/" in formula:
        a,b = formula.split("/")
        a = float(a)
        b = float(b)
        formula = float(a)/float(b)
        return formula
    else:
        print("乘除函数符号错误")
##########加减###########################
def Add_Sub(num):
    lst_num = re.findall("[-+]?[0-9]+\.?[0-9]*", num)    ##匹配数字可以包含或不包含小数点后面和前面的正负数
    count = 0
    for i in lst_num:
        count += float(i)
    return count
# print(Mu_di("3.43/121"))
#############去符号###################
def degbug(num):
    num = num.replace("--","+")
    num = num.replace("-+","-")
    num = num.replace("++","+")
    num = num.replace("+-","-")
    return num
# num = --343.23
# print(num)
####################计算#########################
def calculate(formula):
    #formula = str(formula)
    #print(type(formula))
    while True:
        tmp = re.search("[0-9]+\.?[0-9]*[*/][+-]?[0-9]+\.?[0-9]*",formula)    ###找出第一个乘除,后面循环全部替换为浮点数
        if tmp :
            tmp = tmp.group()
            tmp2 =str(Mu_di(tmp))
            formula = formula.replace(tmp,tmp2)
            #tmp = re.search("[0-9]+\.?[0-9]*[*/][+-]?[0-9]+\.?[0-9]*",formula).group()
        else:
            break
    formula1 = degbug(formula)
    formula2 = Add_Sub(formula1)
    return formula2

##############括号内计算#############
def No_brackets(formula):
    while True:
        innum = re.search(r'\([^()]+\)', formula)         ###匹配第一个没有内部括号的括号内函数,后面循环全部替换为浮点数
        if innum:
            tmp = innum.group()
            tmp2 = calculate(tmp)
            formula = formula.replace(tmp,str(tmp2))
        else:
            break
    return formula

#############主函数################

def exp_mian(formula):
    formula = formula.replace(" ","")
    formula_tmp1 = No_brackets(formula)
    result_exp = calculate(formula_tmp1)
    #print(result_exp)
    return result_exp



hanshu = " 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
s1 = exp_mian(hanshu)
print(s1)

#################验证##############
s2 = eval(hanshu)
print(s2)

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐