利用python实现计算器

意义

通过联系可以熟练掌握,正则表达式,循环,以及字符串操作。

业务流程     

实现

#___author: laughing
#date:   2018/7/3
import re
a='1 - 2 * ( (60-30 +(-3+5+40*5*6+20*2/2) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
def show_home():
    print('请输入您要计算的算术表达式!')
def str_test(scanf):
    def inner():
        ret=scanf()
        tmp=re.search('[\d*/()+\-. ]+',ret)
        if tmp ==None:
            print('error !')
            return True, ret
        elif not ret.count('(')==ret.count(')'):
            print('error !')
            return True, ret
        else:
            tmp=tmp.group()
        if ret==tmp:
            return False,ret
        else:
            flag=True
            return flag,ret
    return inner
def hadle_repeat(f):                                    #去除空格
    def inner(*ret):
        ret1=f(*ret)
        ret1 = ret1.replace(' ', '')
        ret1 = ret1.replace('+-', '-')
        ret1 = ret1.replace('--', '+')
        ret1 = ret1.replace('-+', '-')
        ret1 = ret1.replace('++', '+')
        ret1 = ret1.replace('*-', '+')
        ret1 = ret1.replace('e', '')
        return ret1
    return inner
@str_test
@hadle_repeat
def scanf():
    st=input()
    return st
@hadle_repeat
def mut_div(ret):
    while True:
        tmp=re.search('\d+\.?\d*[*/]\d+\.?\d*',ret)                 #获得x*y
        if tmp != None:
            tmp=tmp.group()
            simple=re.search('[*/]',tmp).group()               #获取*或者/的符号
            tmp1=re.split('[*/]',tmp)                           #获得[x,y]的列表
            tmp1[0]=float(tmp1[0])                               #修改type
            tmp1[1]=float(tmp1[1])
            if simple == '*':
                ind=str(tmp1[0]*tmp1[1])
                ret=ret.replace(tmp,ind)
            else:
                ind=str(tmp1[0]/tmp1[1])
                ret = ret.replace(tmp,ind)
        else:
            break
    return ret
@hadle_repeat
def add_sub(ret):
    while True:
        tmp=re.search('-?\d+\.?\d*[+-]\d+\.?\d*',ret)                 #获得x*y
        print(tmp)
        if tmp != None:
            tmp=tmp.group()
            print(tmp,type(tmp))
            simple=re.findall('\d+.?\d*(\W)\d+.?\d*',tmp)               #获取*或者/的符号
            print(simple,type(simple))
            tmp1=re.split('[+-]',tmp)                           #获得[x,y]的列表
            print(tmp1,type(tmp1))
            if tmp1[0]=='':
                del tmp1[0]
            if tmp[0]=='-':
                tmp1[0] = -float(tmp1[0])
                tmp1[1] = float(tmp1[1])
            else:
                tmp1[0]=float(tmp1[0])                               #修改type
                tmp1[1]=float(tmp1[1])
            if simple[0] == '+':
                ind=str(tmp1[0]+tmp1[1])
                ret=ret.replace(tmp,ind)
            else:
                ind=str(tmp1[0]-tmp1[1])
                ret = ret.replace(tmp,ind)
        else:
            break
    return ret
flag=True              #输入检测标志位,输入正确跳出,输入错误继续
while flag:
    show_home()
    flag,ret_code=scanf()
    print(ret_code)
while re.search('\([^()]+\)',ret_code):
    ret1=re.search('\([^()]+\)',ret_code).group()           #获得最里面的括号和值
    ret=ret1.strip('()')                                     #去掉括号
    print(ret)
    ret = mut_div(ret)
    print(ret)
    ret = add_sub(ret)
    print(ret)
    ret_code=ret_code.replace(ret1,ret)
    print(ret_code)
else:
    ret=mut_div(ret_code)
    print(ret)
    ret=add_sub(ret)
    print(ret)

发布了20 篇原创文章 · 获赞 0 · 访问量 3810

猜你喜欢

转载自blog.csdn.net/Laughing_G/article/details/80921636