计算器作业(参考)

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 = str(exp).replace('--', '+')
    exp = str(exp).replace('-+', '-')
    exp = str(exp).replace('+-', '-')
    exp = str(exp).replace('++', '+')
    return exp
def mul_div(exp): #筛选出乘除法
    while True:
        ret = re.search('-?\d+(?:\.\d+)?[*/]-?\d+(?:\.\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+)?', exp) #匹配带符号的数字,返回一个列表
    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 str(exp_sum)

def main(exp):
    exp = exp.replace(' ', '') #删除空格
    while True:
        ret = re.search('\([^()]*\)', exp) #匹配括号
        if ret:
            inner_bracket = ret.group()
            # print(inner_bracket)
            res = cal(inner_bracket)  
            exp = exp.replace(inner_bracket, res) #替换
            exp = format_exp(exp)#处理符号
        else:
            break #没有括号跳出循环
    return cal(exp)
# s = '1 + 2+(2*3)+(4/2*3+1)+1+(1+(2*3/6-(-1+1)))'
# s = '1-2*((3+1)+1)'
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 = '1-2*3'
ret3 = main(s)
print(ret3)

  

转载于:https://www.cnblogs.com/dabai123/p/11399980.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值