zoukankan      html  css  js  c++  java
  • Python 练习: 计算器

    import re
    
    def format_string(s):             # 对表达式进行格式化
        s = s.replace(' ', '')
        s = s.replace("--", "+")
        s = s.replace("++", "+")
        s = s.replace("+-", "-")
        s = s.replace("*+", "*")
        s = s.replace("/+", "/")
        return s
    
    
    def check_expression(s):          # 对表达式进行检测
        flag = True
        if not s.count("(") == s.count(")"):
            print("括号没有闭合")
            flag = False
        if re.findall('[a-z]+', s.lower()):
            print("有非法字符")
            flag = False
    
        return flag
    
    
    def calc_mul_div(s):
        regular = '[-]?d+.?d*[*/][-]?d+.?d*'
    
        while re.findall(regular, s):
            expression = re.search(regular, s).group()
    
            if expression.count("*"):          # 判断是否是乘法
                x, y = expression.split("*")
                mul_result = str(float(x) * float(y))
                s = s.replace(expression, mul_result)
                s = format_string(s)
    
            if expression.count("/"):          # 判断是否是除法
                x, y = expression.split('/')
                div_result = str(float(x) / float(y))
                s = s.replace(expression, div_result)
                s = format_string(s)
    
        return s
    
    
    def calc_add_sub(s):                       # 判断加减法
        add_regular = '[-]?d+.?d*+[-]?d+.?d*'
        sub_regular = '[-]?d+.?d*-[-]?d+.?d*'
    
        while re.findall(add_regular, s):
            add_list = re.findall(add_regular, s)
            for add_str in add_list:
                x, y = add_str.split("+")
                add_result = "+" + str(float(x) + float(y))
                s = s.replace(add_str, add_result)
            s = format_string(s)
    
        while re.findall(sub_regular, s):
            sub_list = re.findall(sub_regular, s)
            for sub_str in sub_list:
                numbers = sub_str.split("-")
                if len(numbers) == 3:      # 如果表达式类似 -1-1,则 list 是 ['', '1', '1'] ,
                                           # 如果表达式类似 8-2, 则 list 是 ['8', '2']
                    result = 0
                    for v in numbers:
                        if v:
                            result -= float(v)
                else:
                    x, y = numbers
                    result = float(x) - float(y)
                s = s.replace(sub_str, "+" + str(result))
            s = format_string(s)
    
        return s
    
    
    if __name__ == "__main__":
        s = '(( 2 /1 * 7 ) - ( 3 *4 ) )'
    
        if check_expression(s):
            s = format_string(s)
    
            while s.count("(") > 0:
                strs = re.search('([^()]*)', s).group()
                replace_str = calc_mul_div(strs)
    
                replace_str = calc_add_sub(replace_str)
    
                s = format_string(s.replace(strs, replace_str[1:-1]))  # 去掉多余的括号
    
            else:
                replace_str = calc_mul_div(s)
    
                replace_str = calc_add_sub(replace_str)
    
                s = s.replace(s, replace_str)
    
            print("result: ", s.replace("+", ""))
    
    
    运行结果:
    result:  2.0
    
  • 相关阅读:
    C++Builder中的异常传递
    lpc1343 usb isp not work in linux and mac
    玩玩Hiweed linux 2.0
    有关 stringWithString 和 initWithString
    Windows mobile 中获取内存使用情况
    玩玩xubuntu 8.10
    升级我的ipaq hx2110到Windows Mobile 6.0
    面试技巧 from IBM
    常用Sql语句
    c#的事件机制示例代码: 猫> 老鼠, 主人
  • 原文地址:https://www.cnblogs.com/klvchen/p/8961467.html
Copyright © 2011-2022 走看看