公式计算器(加减乘除法)

#_date:2021/4/19 0019
import re

#判断字符串合法性
def geshi(s):
    if re.findall('[a-zA-Z]',s):
        print('您的字符串不正确!请修改后再继续。')
        flag = False
    else:flag = True
    return flag

#规范字符串格式
def formats(s):
    s = s.replace(' ', '')
    s = s.replace('++', '+')
    s = s.replace('+-', '-')
    s = s.replace('-+', '-')
    s = s.replace('*/','/')
    s = s.replace('/*','/')
    s = s.replace('**','*')
    s = s.replace('//','/')
    return s

#计算方法函数(乘除法函数)
#相同数字连续相乘除出错
def chengchu(s):

    while re.search('[*/]',s):
        obj = re.compile('[-]?\d+\.?\d*[*/][-]?\d+\.?\d*')
        starts = re.search(obj, s).group()
        #接下来进行计算任务
        aa = 0
        a0 = float(re.split('[*/]',starts)[0])
        a1 = float(re.split('[*/]',starts)[1])

        if re.search('[*/]',starts).group()=='*':
            aa = a0*a1

        elif re.search('[*/]',starts).group()=='/':
             aa = a0/a1
        # 如何只替换第一个匹配对象,其他不替换.
        s = s.replace(starts, str(aa))
        # print('替换前的S值:',s)
        # print('匹配出来的字符串',starts)
        # print('a0=',a0)
        # print('a1=',a1)
        # print("计算的结果aa:",aa)
        # print('替换后s的值:,第一次替换结束',s)
    return s

#加减法计算:
def addnum(s):
#对第一个数据为-的数据进行格式化
#相同数字连续相加或相减出错
    while re.search('[-]?\d+\.?\d*[+-]\d+\.?\d*',s):
        obj = re.compile('[-]?\d+\.?\d*[+-]\d+\.?\d*')
        starts = re.search(obj, s).group()
        strs = starts
        a0=re.search('[-]?\d+\.?\d*',strs).group()
        strs = strs.replace(a0,'')
        a1=re.search('[-]?\d+\.?\d*', strs).group()
        aa= float(a0)+float(a1)
        s = s.replace(starts, str(aa))

    return s



#程序计算过程主函数
s=input('请输入公式:')
if geshi(s)==False:
    print('原始s=',s)
    s = input('请重新输入:')

st = formats(s)
print('原始的',st)
#循环判断是否扣号:
#判断是否有乘除法:
while st.count('(')>0:
    ret = re.search('\([^()]*\)', st).group()
    print(ret)
    ret1=ret

    while re.search('[*/+-]', ret1):
        if re.search('[*/]',ret1):
            ret1 = chengchu(ret1)
            print(ret1)
        elif re.search('[+-]',ret1):
            ret1 = addnum(ret1)
            print(ret1)

    ret1 = ret1.replace(ret1, ret1[1:-1])
    print('旧的ret',ret)
    print('新的ret1',ret1)
    st= st.replace(ret,ret1)
    print(st)

#---------------------------
while re.search('[*/+-]', st):
    if re.search('[*/]',st):
        st = chengchu(st)
    elif re.search('[+-]',st):
        st = addnum(st)
    print(st)

posted @ 2021-04-21 14:53  戴云山庄  阅读(293)  评论(0)    收藏  举报