• Python计算器实操


      要求:

      开发一个简单的python计算器  

        实现加减乘除及拓号优先级解析

        用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式

    后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计

    算器所得出的结果一致。

    import re
    def chengchu(num):
        '''乘除操作'''
        while re.search("-?d+.?d*[*/]-?d+.?d*",num): #当有*/运算时循环
            ret = re.search("-?d+.?d*[*/]-?d+.?d*",num).group() #获取包含*/运算的算式
            if re.search("-?d+.?d**-?d+.?d*",ret): #是乘的时候
                n1,n2 = re.split("*",ret) #以*分割两边的数字
                ji = float(n1)*float(n2) #得到数字进行运算
                if re.search("-d+.?d**-d+.?d*",num): #特殊情况,两负相乘的正,得加上+
                    num = re.sub("-?d+.?d**-?d+.?d*",("+"+str(ji)),num,1) #替换刚算的公式
                    return chengchu(num) #继续递归
                else:
                    num = re.sub("-?d+.?d**-?d+.?d*", str(ji), num, 1) #一般正常情况下替换
                    return chengchu(num) #继续递归
            else: #是/的时候
                n1,n2 = re.split("/",ret) #以/分割两边的数字
                shang = float(n1)/float(n2) #得到数字进行运算
                num = re.sub("-?d+.?d*/-?d+.?d*",str(shang),num,1) #一般正常情况下替换
                return chengchu(num) #继续递归
        else: #没有*/的时候
            return num #返回算的结果
    def jiajian(num):
        '''加减操作'''
        while re.search("-?d+.?d*[+-]-?d+.?d*",num): #当有+-运算时循环
            ret = re.search("-?d+.?d*[+-]-?d+.?d*",num).group() #获取包含+-*运算的算式
            if re.search("-?d+.?d*+-?d+.?d*",ret): #是+的时候
                n1,n2 = re.split("+",ret) #以+分割两边的数字
                he = float(n1)+float(n2) #得到数字进行运算
                num = re.sub("-?d+.?d*+-?d+.?d*",str(he),num,1) #替换刚算的公式
                return jiajian(num) #继续递归
            else:
                n1, n2 = re.split("-", ret,1)  # 以-分割两边的数字
                if n1 == "": #n1分割为空时,说明-号在开头
                    n1,n2 = re.split("-",n2) #重新分割上面n2的结果
                    cha = -float(n1)-float(n2) #得到数字进行运算,注意前面得加上-号
                else : #不是-开头的时候
                    cha = float(n1) - float(n2)  # 得到数字进行运算
                num = re.sub("-?d+.?d*--?d+.?d*",str(cha),num,1) #替换刚算的公式
                return jiajian(num) #继续递归
        else: #没有+-的时候
            return num #返回算的结果
    def form(res,sums1):
        '''格式输出'''
        res = re.sub("(|)", "", res) #去掉括号
        ret = re.sub("([^()]+)",res,sums1,1) #把括号里的公式替换成结果
        ret = re.sub("++|--", "+", ret) #统一运算符,++为+,--为+
        ret = re.sub("+-|-+", "-", ret) #统一运算符,+-为-,-+为-
        return ret #返回结果
    def sear(num):
        '''运算规则'''
        if re.search("([^()]+)",num): #有括号先算
            ret = re.search("([^()]+)", num).group() #获取括号里的公式
            res = jiajian(chengchu(ret)) #在括号里先算乘除,后算加减
            return sear(form(res, num)) #将格式化后的结果传给函数sear递归
        else: #没有括号的时候
            res = jiajian(chengchu(num)) #也是先算乘除,后算加减
            return res #返回结果
    while True: #用户交互模式
        sums = input("请输入您要计算的内容q(quit):") #输入内容
        if sums.lower() == "q": #输入q时,退出
            break
        ret = sear(re.sub(" ","",sums)) #防止公式里有空格,替换空格后,调用函数
        print("最终结果:",ret) #打印最终返回的运算结果
    -------------------输出结果--------------------
    最终结果: 2776672.6952380957
    

     

      

  • 相关阅读:
    zz解读NoSQL技术代表之作Dynamo
    愚蠢且能干
    Schema 验证和 DTD 验证
    Office Addin (VSTO) Performance Tips & Tricks
    提高 .NET 应用 XML 处理性能的几点开发经验(转载)
    C# 实现对XML文件的基本操作(创建xml文件,增、删、改、查 xml节点信息)zz
    XML/XSLT/XPATH
    Linux下基于DNS的多机均衡负载的实现
    Linux 上的高可用中间件,第 3 部分: IBM LoadLeveler
    Creating Web Services using Apache
  • 原文地址:https://www.cnblogs.com/Michael--chen/p/6786781.html
Copyright © 2020-2023  润新知