python 计算器,,弄了6个小时,各种出


弄了6个小时,各种出错,伪静态规则出错1次,

def逻辑思维出错1次。哈哈

# 实现加减乘除及拓号优先级解析# 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致import reequation = "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"equation = re.sub(" ","",equation)#去除空格‘‘‘英文不好,先看翻译addition --加subtraction -- 减multiplication --乘division --除‘‘‘#定义四个基础算法def addition(a,b):    return a+bdef subtraction(a,b):    return a-bdef multiplication(a,b):    return a*bdef division(a,b):    return a/bdef operator_substitution(s): #将--或者+-转意为单符号    s = re.sub("--","+",s,1)    s = re.sub("\+\-", "-", s, 1)    return sobj = re.compile("(^\-)?(\d+\.)?\d+[\*|/]\-?\d+(\.\d+)?")obj2 = re.compile("(^\-)?(\d+\.)?\d+[\+|\-]\-?\d+(\.\d+)?")def yunsuan(s):    if "*" in s or "/" in s:        prt = re.search(obj,s).group()        hao = re.match(obj,prt).group()        if "*" in hao:            pp = "*"            k1 = prt.split(pp)            print(k1)            de = multiplication(float(k1[0]), float(k1[1]))        elif "/" in hao:            pp = "/"            k1 = prt.split(pp)            de = division(float(k1[0]), float(k1[1]))        # de = int(de)        s = re.sub(obj,str(de),s,1)        s = operator_substitution(s)        return s    elif "+" in s or "-" in s:        prt = re.search(obj2,s).group()        hao = re.match(obj2,prt).group()        if "+" in hao:            pp = "+"            k1 = prt.split(pp)            de = addition(float(k1[0]), float(k1[1]))        elif "-" in hao:            pp = "-"            k1 = prt.split(pp)            de = subtraction(float(k1[0]),float(k1[1]))        s = re.sub(obj2, str(de), s, 1)        s = operator_substitution(s)        return sdef zhongji(s):    while "*" in s or "/" in s or "+" in s or "-" in s and s.find("-") !=0:        s = yunsuan(s)    return sdef teji(s):    prt = re.search("\([^()]+\)", s).group()    krt = re.search("[^(]+[^)]",prt).group()    if krt.find("-") == 0:        krt = re.sub("-","",krt)        krt = -float(zhongji(krt))    else:        krt = zhongji(krt)    s = re.sub("\([^()]+\)",str(krt),s,1)    s = operator_substitution(s)    return sdef yesok(s):    while "(" in s:        s = teji(s)        print(s)    s = zhongji(s)    return sprint(yesok(equation))print(1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2)))

精简了一下,没有优化程序

# 实现加减乘除及拓号优先级解析# 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致import reequation = "1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"equation = re.sub(" ","",equation)def addition(a,b):    return a+bdef subtraction(a,b):    return a-bdef multiplication(a,b):    return a*bdef division(a,b):    return a/bdef operator_substitution(s): #将--或者+-转意为单符号    s = re.sub("--","+",s,1)    s = re.sub("\+\-", "-", s, 1)    return sobj = re.compile("(^\-)?(\d+\.)?\d+[\*|/]\-?\d+(\.\d+)?")obj2 = re.compile("(^\-)?(\d+\.)?\d+[\+|\-]\-?\d+(\.\d+)?")def yunsuan(s):    if "*" in s or "/" in s:        prt = re.search(obj,s).group()        hao = re.match(obj,prt).group()        if "*" in hao:            pp = "*"            k1 = prt.split(pp)            de = multiplication(float(k1[0]), float(k1[1]))        elif "/" in hao:            pp = "/"            k1 = prt.split(pp)            de = division(float(k1[0]), float(k1[1]))        s = re.sub(obj,str(de),s,1)        s = operator_substitution(s)        return s    elif "+" in s or "-" in s:        prt = re.search(obj2,s).group()        hao = re.match(obj2,prt).group()        if "+" in hao:            pp = "+"            k1 = prt.split(pp)            de = addition(float(k1[0]), float(k1[1]))        elif "-" in hao:            pp = "-"            k1 = prt.split(pp)            de = subtraction(float(k1[0]),float(k1[1]))        s = re.sub(obj2, str(de), s, 1)        s = operator_substitution(s)        return sdef zhongji(s):    while "*" in s or "/" in s or "+" in s or "-" in s and s.find("-") !=0:        s = yunsuan(s)    return sdef teji(s):    prt = re.search("\([^()]+\)", s).group()    krt = re.search("[^(]+[^)]",prt).group()    if krt.find("-") == 0:        krt = re.sub("-","",krt)        krt = -float(zhongji(krt))    else:        krt = zhongji(krt)    s = re.sub("\([^()]+\)",str(krt),s,1)    s = operator_substitution(s)    return sdef yesok(s):    while "(" in s:        s = teji(s)    s = zhongji(s)    return sprint(yesok(equation))print(yesok("1+1-(105/999)"))print(yesok("8+9*85-(-898/58+666-8989/20)"))

python 计算器

评论关闭