小言_互联网的博客

计算器小程序

421人阅读  评论(0)
import re

def silmple_cal(mul_div):  #乘法或除法计算函数
    if '/' in mul_div:   #如果‘/’在这个计算式里面
        val1,val2 = mul_div.split('/')
        ret_val = float(val1)/float(val2)
        return ret_val  #返回除法计算结果
    elif '*' in mul_div:  #如果乘法在计算式里面
        val1, val2 = mul_div.split('*')
        ret_val = float(val1) * float(val2)
        return ret_val   #返回除法计算结果
def modify_express(express):
    express = express.replace('--',' ')
    express = express.replace('- ','-')
    express = express.replace(' -','-')
    express = express.replace('  ',' ')
    return express
def express_cal(express_new):
    # 没有括号的表达式的计算
    no_bracket_express = express_new.strip('()')  #将传进来的小括号去掉
    while re.search(r'\d \.?\d*[*/]\-?\d \.?\d*', no_bracket_express): #当这个计算式里面含有*或者除号的时候,
        ret_mul_div = re.search(r'\d \.?\d*[*/]\-?\d \.?\d*', no_bracket_express)  #取到计算式里的第一个乘法或除法
        mul_div = ret_mul_div.group()   #取到计算式里的第一个乘法或除法
        ret_val = silmple_cal(mul_div)  #调用silmple_cal函数,并将这个除法或乘法传进去,并拿到它的返回值,拿到的是一个数
        no_bracket_express = no_bracket_express.replace(mul_div, str(ret_val), 1)  #将已经去掉括号的计算式里的第一个乘法或除法替换为它的结果,并只替换最前面的一次
        no_bracket_express = modify_express(no_bracket_express)#调用 modify_express函数,并将结果传进去,得到一个正确的计算式
    ret_lst = re.findall(r'[ \-]?\d \.?\d*', no_bracket_express)  #将已经没有乘除法的计算式里面的正负数取出来得到一个列表
    if ret_lst: #如果这个列表不为空,表示计算式里面含有加减法,要进行加减法计算
        total = 0
        for item in ret_lst:
            total  = float(item)
        return total   #返回最终结果
    return no_bracket_express   #如果没有走if语句说明里面没有加减法,将乘除法的结果返回即可
#去括号
def remove_bracket(s): #s= 'a1-2*((60-30 (-40/5)*(9-2*5/3 7/3*99/4 *2998  10* 568/14))-(-4*3)/(16-3*2))' #将计算式去除括号,并返回最终计算结果
    while re.search(r'\([^()] \)',s):    #当计算式里还含有小括号时,表示search能拿到值,不为空
        express_new = re.search(r'\([^()] \)',s).group()    #拿到第一个最里层的括号内的东西
        ret_val = express_cal(express_new)  #开始调用express_cal函数,将取到的第一小括号传进去,并拿到第一个小括号的计算总结果,
        express = s.replace(express_new,str(ret_val)) #将计算式第一个括号替换为总结果
        s = modify_express(express)#整理算式中的 -号
    ret = express_cal(s)
    return ret
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 = s.replace(' ','')
ret = remove_bracket(s)  #调用去括号函数,并拿到最终计算的结果
print('result : ',ret)  #将最终计算结果打印

  


更多专业前端知识,请上 【猿2048】www.mk2048.com
转载:https://blog.csdn.net/setsunadoudou/article/details/102228282
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场