• 计算器


    需求: 计算加减乘除和小括号级别的运算,需考虑到正负数

    运算优先级:括号>乘除>加减

    流程图:

     

    主函数:

    if __name__ == '__main__':
        exp = str(input('请输入公式:
    >>'))
        # 测试公式:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
        exp = exp.split()
        exp = ''.join(exp)
        exp = exp.strip()
        print(exp)
        figure_up(exp)
    View Code

    获取里层括号公式:

    def figure_up(exp_get):
        flag_exit = False
        while not flag_exit:
            every_percent = re.search('([^()]*)', exp_get)    # 获取里层括号部分
            if every_percent:
                formula = every_percent.group().strip('()')     # 对获取部分去括号处理
                ret = calculate(formula)
                exp_get = exp_get.replace(every_percent.group(), str(ret))
            else:
                ret_end = calculate(exp_get)
                print('最终结果为:', ret_end)
                flag_exit = True
    View Code

    无括号运算:

    def calculate(expression):
        expression = symbol_fix(expression)
        symbol_list = re.findall('[+-]', expression)  # 取+-运算符和正负号
        mul_div_list = re.split('[+-]', expression)  # 按+-运算符和正负号分割
        if not mul_div_list[0]:  # 开头为负号的情况, 列表压缩处理
            mul_div_list[1] = symbol_list[0] + mul_div_list[1]
            del mul_div_list[0]
            del symbol_list[0]
        symbol_list, mul_div_list = minus_fix(symbol_list, mul_div_list)
        for index, item in enumerate(mul_div_list):
            ret = mul_div(item)
            mul_div_list[index] = ret
    
        # 乘除计算完毕,并成功替换,开始计算加减
        if len(symbol_list):
            ret_end = None
            for index, item in enumerate(mul_div_list):
                if index:
                    if symbol_list[index - 1] == '+':
                        ret_end += float(item)
                    elif symbol_list[index - 1] == '-':
                        ret_end -= float(item)
                else:
                    ret_end = float(mul_div_list[0])
            return ret_end
        else:
            return mul_div_list[0]
    View Code

    乘除运算:

    def mul_div(formula):           # 乘除运算
        if re.search('[*/]', formula):
            list_items = re.split('[*/]', formula)
            list_symbol = re.findall('[*/]', formula)
            ret = None
            for index, item in enumerate(list_items):
                if index:
                    if list_symbol[index-1] == '*':
                        ret *= float(item)
                    elif list_symbol[index-1] == '/':
                        ret /= float(item)
                else:
                    ret = float(item)
            return ret
    
        else:
            return formula
    View Code

    去除重复加减号:

    def symbol_fix(formula):            # 去除重复加减号
        formula = ''.join(formula)
        formula = formula.strip()
        formula = formula.replace('--', '+')
        formula = formula.replace('-+', '-')
        formula = formula.replace('+-', '-')
        formula = formula.replace('++', '+')
        return formula
    View Code

    乘除符号后面接负号的情况:

    def minus_fix(symbol, expression):          # */ 后面接负号的情况, 列表压缩处理
        for index, item in enumerate(expression):
            if item.endswith('*') or item.endswith('/'):
                expression[index] = expression[index] + symbol[index] + expression[index+1]
                del expression[index+1]
                del symbol[index]
        return symbol, expression
    View Code
  • 相关阅读:
    leetcode-000-序
    统计学习方法:支撑向量机(SVM)
    统计学习方法:CART算法
    统计学习方法:最大熵模型
    〖Linux〗关于Linux软件包安装位置、版本查询
    〖Linux〗ltib的使用帮助
    〖Linux〗Debian 7.1.0 Wheezy使用ltib报错的解决办法
    〖Android〗把CM(Android)源代码导入eclipse的正确方法(2013-7-3)
    【Linux】eclipse juno 边框过大的调整方法
    【Android】在build/envsetup.sh中添加自己的命令(函数)
  • 原文地址:https://www.cnblogs.com/mountian-lion/p/6085509.html
Copyright © 2020-2023  润新知