首页 > 代码库 > Day.9计算器小程序

Day.9计算器小程序

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

# a=eval(str( 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )))
# print(a) # 2776672.6952380957  #打死也不能用这个!!!
import re
def calculate(x):
    res=eval(x)
    return res
def myeval():#定义自己的加减乘除,不能用eval!!!(暂没思路,待补全)
    pass
def change(mystr):
    while True:
        if "--" in mystr:
            mystr=re.sub("--","+",mystr)
            continue
        elif "-+" in mystr:
            mystr=re.sub("-\+","-",mystr)
            continue
        elif "++" in mystr:
            mystr=re.sub("\+\+","+",mystr)
            continue
        elif "+-" in mystr:
            mystr=re.sub("\+-","-",mystr)
            continue
        else:
            return mystr
def mydeal(mystr):
    c = re.search("\([^()]+\)", mystr)  # 找到第一个符合条件的值并赋值给c
    # print(c.group(), type(c.group()))  # (-40/5) <class ‘str‘>
    d = re.split("[()]", c.group())
    e = "".join(d)  # 将获得的值得括号去掉
    # print(e, type(e))  # 40/5 <class ‘str‘>
    f = calculate(e)  # 获得计算结果
    # print(f)
    g = c.group().replace("(", "\(").replace(")", "\)").replace("*","\*").replace("+","\+")#将元字符进行转义
    # print(g)  # \(-40/5\)
    h = re.sub(g, str(f), mystr)  #将计算结果替换到原来的公式中
    # print(h)  # 1-2*((60-30+-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
    return h
# print(mydeal("1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))"))
# print(mydeal("1-2*((60-30+-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))"))

while True: formula=input("请输入你要计算的公式: ".strip()) a = re.split(" ", formula) b = "".join(a) # 将公式中的空格全部去掉 # formula="1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))" while True: if "(" in b: print("简化的公式如下:") b=change(b) b=mydeal(b) print(b) else: print("计算结果:") print(calculate(b)) break

输出结果如下:

请输入你要计算的公式: 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+-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
简化的公式如下:
1-2*((60-30-8.0*173545.88095238098)-(-4*3)/(16-3*2))
简化的公式如下:
1-2*(-1388337.0476190478-(-4*3)/(16-3*2))
简化的公式如下:
1-2*(-1388337.0476190478--12/(16-3*2))
简化的公式如下:
1-2*(-1388337.0476190478+12/10)
简化的公式如下:
1-2*-1388335.8476190479
计算结果:
2776672.6952380957

 

Day.9计算器小程序