zoukankan      html  css  js  c++  java
  • 计算器

    1.计算器方法一

    import re
    MUL = 'd+(.d+)?[*/]-?d+(.d+)?'
    ADD = '-?d+(.d+)?'
    
    def fsdf(exp):
        exp = exp.replace('--','+')
        exp = exp.replace('+-', '-')
        exp = exp.replace('-+', '-')
        exp = exp.replace('++', '+')
        return exp
    
    def mul_div(exp):
        lis = re.split('([*/])',exp)
        # print(len(lis))
        if lis[1] == '*':
            result = float(lis[0]) * float(lis[-1])
        else:
            result = float(lis[0]) / float(lis[-1])
        return result
    
    def add_sub(exp):
        m = 0
        ret = re.finditer(ADD, exp)
        for ret1 in ret:
            result = ret1.group()
            m += float(result)
        return m
    
    def first_(exp):
        exp = exp.replace(" ","")
        cp = re.compile('([^()]*)')
        try:
            while True:
                ret = re.search(cp,exp)  #m = '5+(6-1*(2-3/4))+(5-6/3)'  (2-3/4) (5-6/3)
                m = ret.group()
                while '*'in m or '/' in m:
                    ret1= re.search(MUL,m)
                    result = mul_div(ret1.group())
                    m = re.sub(MUL,str(result),m,1)
                else:
                    m = fsdf(m)
                    result = add_sub(m)
                    exp = re.sub(cp,str(result), exp, 1)
        except Exception as e:
            while '*' in exp or '/' in exp:
                ret1 = re.search(MUL, exp)
                result = mul_div(ret1.group())
                exp = re.sub(MUL, str(result), exp, 1)
            else:
                exp = fsdf(exp)
                result = add_sub(exp)
            return result
    
    result = first_('5*-5+(6-1*(- 2-3/  -4))+(  5-6  /-3)')#
    print(result)

    2.计算器方法二

    import re
    
    MUL = 'd+(.d+)?[*/]-?d+(.d+)?'
    ADD = '-?d+(.d+)?'
    
    def symbol(exp):
        exp = exp.replace('--','+')
        exp = exp.replace('+-','-')
        exp = exp.replace('-+', '-')
        exp = exp.replace('++', '+')
        return exp
    
    def mul_div(exp):
        """
        乘除法
        :param exp:
        :return:
        """
        if '*' in exp:
            a, b = exp.split('*')
            result = float(a) * float(b)
        else:
            a, b = exp.split('/')
            result = float(a) / float(b)
        return result
    
    def add_sub(exp):
        m = 0
        ret = re.compile(ADD)
        while True:
            exp_add_sub = ret.finditer(exp)
            for i in exp_add_sub:
                m += float(i.group())
            exp = exp.replace(exp, str(m))
            return exp
    
    
    def cal_mul_div(exp):
        ret = re.compile(MUL)
        while True:
            m = ret.search(exp)
            if m:
               exp_mul_div = m.group()
               result = mul_div(exp_mul_div)
               exp = exp.replace(exp_mul_div,str(result))
            else:break
        return exp
    
    def all(exp):
        result = cal_mul_div(exp)
        result = symbol(result)
        result = add_sub(result)
        return result
    
    def run(exp):   # m = '5+(6-1*(2-3/4))+(5-6/3)'
        exp = exp.replace(" ","")
        ret = re.compile("([^()]+)")
        while True:
            n = ret.search(exp)
            if n:
                m = n.group()
                result = all(m)
                exp = exp.replace(m,str(result))
            else:break
        result = all(exp)
        return result
    
    exp = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
    result = run(exp)
    print(result)
  • 相关阅读:
    打开安装 好的Microsoft Dynamics CRM 4.0 报错误为 Caller does not have enough privilege to set CallerOriginToken to the specified value 的解决办法
    基于 Windows Server 2008 的计算机对 Microsoft Dynamics CRM 4.0 的支持
    Microsoft Dynamics CRM 4.0 如何添加自定义按钮
    Microsoft Dynamics CRM 4.0 Plugin 取值,赋值,查询
    C# 中的 enum(枚举) 类型使用例子
    vue事件的绑定
    表单验证2
    node中模块
    node模块的引入
    node中的读文件
  • 原文地址:https://www.cnblogs.com/liuweida/p/10860441.html
Copyright © 2011-2022 走看看