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

    #!/usr/bin/env python
    #-*-coding=utf-8 -*-
    #GKX
    import re
    
    def dealwith(express):
        '''
        将表达式中 ‘+-’替换为 -   --替换为+
        :param new_express: 计算完原子型表达式后的主表达式
        :return:
        '''
        express:express = express.replace('+-','-')
        express:express = express.replace('--','+')
        return express
    
    def cal_exp_son(exp_son):
        '''
        计算原子型表达式 两个数之间的乘除法
        :param exp_son: 传进来的,只有两个数之间的乘除法
        :return: 返回计算后的值
        '''
        if '/' in exp_son:
            a,b = exp_son.split('/')  # -40/5
            return str(float(a)/float(b))
        elif '*' in exp_son:
            a,b = exp_son.split('*')
            return str(float(a)* float(b))
    
    
    def cal_express_no_bracket(exp):
        '''
        计算里层不带括号的表达式
        :param exp: 最里层不带括号的表达式传进来
        :return:
        '''
        exp = exp.strip('()')
        #先乘除后加减
        #-40/5*8+2         9-2*5/3+7/3*99/4*2998+10*568/14
        while True:
            ret = re.search('d+.?d*[*/]-?d+.?d*',exp)
            if ret:
                exp_son = ret.group() #子表达式  最简单的乘除法
                ret = cal_exp_son(exp_son)
                exp = exp.replace(exp_son,ret)   #ret为计算后的值,替换为 乘除的式子
                #111print(exp)
                exp = dealwith(exp)
                #111print(exp)
            else:  #当表达式里没有了乘除法
                ret = re.findall('-?d+.?d*',exp)
                sum = 0
                for i in ret:
                    sum += float(i)
                return str(sum)
    
    
    #提取括号里面没有其他括号的表达式
    def remove_bracket(new_express):
        while True:
            ret = re.search('([^()]+)',new_express)
            if ret:
                express_no_bracket = ret.group()
                #111print('匹配到内部不再有括号的值',express_no_bracket)   #表达式没括号
                ret = cal_express_no_bracket(express_no_bracket)
                #print(new_express,express_no_bracket,ret)
                new_express = new_express.replace(express_no_bracket,ret)
                #print(new_express)
                #new_express = dealwith(new_express)
                #111print(new_express)
            else:
                #111print('表达式中没有括号了',new_express)
                ret = cal_express_no_bracket(new_express)
                #111print(ret)
                return ret
    
    #去空格
    def calculator(express):
        #express = input('表达式')
        if express.count('(') != express.count(')'):
            print('表达式括号有误,请检查并重新输入')
        else:
            new_express = re.sub('[s]','',express) #express.replace(' ','')
            #11print(new_express)
            res = remove_bracket(new_express)
            print(res)
    
    express = '1 - 2 * ( ( (6 0) -3 0  +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
    calculator(express)
    import re
    def math(dic):
        x,y=float(dic['x']),float(dic['y'])
        if dic['mark']=='+':return x+y
        elif dic['mark']=='-':return x-y
        elif dic['mark']=='*':return x*y
        else:return x/y
    def suansu(re_str):
        ret4=re.search(r'(?P<x>d+.?d*)(?P<mark>[*/])(?P<y>[-]?d+.?d*)',re_str)
        try:
            while ret4.group():
                re_str=re_str.replace(ret4.group(),str(math(ret4.groupdict())))
                if '--' in re_str: re_str =re_str.replace('--','+')
                if '++' in re_str: re_str =re_str.replace('++','+')
                ret4=re.search(r'(?P<x>d+.?d*)(?P<mark>[*/])(?P<y>[-]?d+.?d*)',re_str)
        except AttributeError:pass
        ret4=re.search(r'(?P<x>d+.?d*)(?P<mark>[+-])(?P<y>[-]?d+.?d*)',re_str)
        try:
            while ret4.group():
                re_str=re_str.replace(ret4.group(), str(math(ret4.groupdict())))
                ret4=re.search(r'(?P<x>d+.?d*)(?P<mark>[+-])(?P<y>[-]?d+.?d*)',re_str)
        except AttributeError:return re_str
    def main(user_inp):
        while True:
            if not re.search('([+*/d.-]*)',user_inp):
                print(user_inp)
                return suansu(user_inp)
            else:
                for i in re.findall('([+*/d.-]*)',user_inp):
                    user_inp=user_inp.replace(i,suansu(i.replace('(','').replace(')','')))
                    print (user_inp)
    a='1 - 2 * ( ( (6 0) -3 0  +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
    print(main(a.replace(' ','')))
  • 相关阅读:
    c++字符串
    iOS调用相册
    cocos2d-x中有一个JniHelper类详细使用
    iOS 字符串应用
    c++调用java
    iOS调用相册、相机、上传等问题
    win32中GBK、UTF8的互转
    SQL Server海量数据查询代码优化建议
    JSON中的[]和{}
    数据库范式
  • 原文地址:https://www.cnblogs.com/saolv/p/10097888.html
Copyright © 2011-2022 走看看