zoukankan      html  css  js  c++  java
  • 用python语言写一个简单的计算器

    假如我们有这样一个式子:

    1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
    思路:按照逻辑应该先算括号里面的
       然后在算括号外面的
       所以我们就可以将所有内层括号里面的算式找出来
       应该是"(-40/5)","(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14)","(-4*3)","(16-3*2)"这样的
       而括号里面应该是先算乘除法,然后再算加减法
       将这些值算出来之后,然后将原来带括号的式子用算出来的值给他替换掉
       然后在找有没有括号,如果有就继续一次上面个的操作
       将带括号的算式计算完之后
       最后再进行加减乘除运算,之后得出的结果就是运算结果
    下面个见代码:
    import re
    def atom_cal(exp):
        if '*' in exp:       #计算单个的乘法
            a,b = exp.split('*')
            return str(float(a) * float(b))
        elif '/' in exp:  #计算单个的除法
            a, b = exp.split('/')
            return str(float(a) / float(b))
    
    def format_exp(exp):  #处理符号的问题
        exp = exp.replace('--','+')
        exp = exp.replace('+-','-')
        exp = exp.replace('-+','-')
        exp = exp.replace('++','+')
        return exp
    
    def mul_div(exp):    #计算乘除法
        while True:
            ret = re.search('d+(.d+)?[*/]-?d+(.d+)?',exp)  #利用正则表达式匹配乘或除法
            if ret:   #如果匹配到的话
                atom_exp = ret.group()  #将这个值拿出来
                res = atom_cal(atom_exp) #调用上面个的atom_cal计算
                exp = exp.replace(atom_exp,res) #将计算的结果把原来的算是替换掉
            else:return exp   #如果匹配不到的话说明乘除法计算完毕,返回计算结果
    
    def add_sub(exp):  #计算加减法
        ret = re.findall('[+-]?d+(?:.d+)?', exp)  #利用正则表达式匹配算式中的带符号的每项数字,返回一个列表
        exp_sum = 0
        for i in ret:
            exp_sum += float(i)   #将列表中的每一项求和
        return exp_sum
    
    def cal(exp):    #计算加减乘除混合运算
        exp = mul_div(exp)  #调用mul_div函数先计算乘除法
        exp = format_exp(exp)  #调用format_exp处理计算时候的符号
        exp_sum =  add_sub(exp)  #调用add_sub计算加减法
        return exp_sum   # float  #返回计算结果
    
    def main(exp):
        exp = exp.replace(' ','')   #删除字符串中的空格
        while True:
            ret = re.search('([^()]+)',exp)  #匹配括号
            if ret :    #如果匹配到的话
                inner_bracket = ret.group() #用group()将匹配到的括号内容取出来
                res = str(cal(inner_bracket))  #调用cal()计算括号中的内容,将返回的结果转换成字符串
                exp = exp.replace(inner_bracket,res)  #将匹配到的括号中的内容用计算结果替换
                exp = format_exp(exp)  #处理符号
            else:break  #直到没有括号跳出循环
        return cal(exp)  #将剩下的内容进行计算,然后返回
    
    s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
    ret = main(s)
    print(ret)
    
    最后结果:
    2776672.6952380957
    加法运算解释:9+6-9+5+8-6-5
      这样的算式我们可以把它看成是9+(+6)+(-9)+(+5)+(+8)+(-6)+(-5)

      
     
  • 相关阅读:
    opencv-python与c++ opencv中的一些区别和基础的知识
    使用TensorFlow Object Detection API+Google ML Engine训练自己的手掌识别器
    使用Google Cloud Platform构建机器学习项目-宠物识别
    dlib下训练自己的物体检测器--手的检测
    python学习--Linux下dlib安装(主要是cmake和boost的安装)
    Python学习--使用dlib、opencv进行人脸检测标注
    《Python网络编程》学习笔记--UDP协议
    《Python网络编程》学习笔记--从例子中收获的计算机网络相关知识
    《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档
    Spring Cloud Gateway:使用ReadBodyPredicateFactory读取request的body,可能无法匹配404
  • 原文地址:https://www.cnblogs.com/baijinshuo/p/9520320.html
Copyright © 2011-2022 走看看