• 计算器


    设计一个计算器计算字符串类型的算式

    s = '1 - 2 / ( (60-30 +(-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+)?(?:e[+-]d+)?[*/]-?d+(.d+)?(?:e[+-]d+)?', exp)  # 匹配乘除法算式
            if ret:
                atom_exp = ret.group()
                res = atom_cal(atom_exp)            # 调用单个乘除函数
                exp = exp.replace(atom_exp,res)     # 得到的值替换原算式
            else:return exp
    
    def add_sub(exp):       # 加减法
        ret = re.findall('[+-]?d+(?:.d+)?(?:e[+-]d+)?', exp)    # (?:e[+-]d+)?返回所有满足匹配条件的结果,放在列表里
        exp_sum = 0
        for i in ret:
            exp_sum += float(i)  # 计算列表里的值
        return exp_sum
    
    def cal(exp):
        exp = mul_div(exp)      # 调用计算乘除法
        exp = format_exp(exp)   # 调用替换符号
        exp_sum = add_sub(exp)  # 调用计算加法
        return exp_sum   # 返回计算结果为 float
    
    def main(exp):
        exp = exp.replace(' ', '')      # 去除空格
        while True:
            ret = re.search('([^()]+)', exp)  # 匹配最里层括号
            if ret:
                inner_bracket = ret.group()         # 取出最里层括号算式
                res = str(cal(inner_bracket))       # 计算最里层括号算式
                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) )'
    # s = " 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)
     
  • 相关阅读:
    设计模式学习笔记--原型模式
    设计模式学习笔记--工厂方法模式
    复制、粘贴一个物体的所有组件
    设计模式学习笔记--装饰模式
    模板方法模式(TemplateMethod)
    FreeSql 与 SqlSugar 性能测试(增EFCore测试结果)
    FreeSql 新查询功能介绍
    FreeSql 过滤器使用介绍
    非常贴心的轮子 FreeSql
    .NETCore 下支持分表分库、读写分离的通用 Repository
  • 原文地址:https://www.cnblogs.com/JinMuBaoBao/p/9514506.html
Copyright © 2020-2023  润新知