python计算器作业

#1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )

#找到最内层的括号,
#处理括号内的符号变换
#先乘除
# 后加减
import re
a='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'

def brcket(num):
'''去括号'''
regax=re.search('\([^()]+\)',num)
regax=regax.group()
return regax

def change_char(num):
'''++=+ +-=- --=+ -+=-'''
if '++' in num:
num=num.replace('++','+')
return num
elif '+-' in num:
num=num.replace('+-','-')
return num
elif '--' in num :
num=num.replace('--','+')
return num
elif '-+' in num:
num=num.replace('-+','-')
return num
else:return num

def multi_div(num):
'''先算乘除'''
num=change_char(num)
regax=re.search('[\-]?\d+(\.\d+)?[*/]+[-]?\d+(\.\d+)?',num)
regax=regax.group()
if '*' in regax:
a,b=regax.strip().split('*')
num=num.replace(regax,'+'+str(float(a)*float(b)))
return num
if '/' in regax:
a,b=regax.strip().split('/')
num=num.replace(regax,'+'+str(float(a)/float(b)))
return num

def add_min(num):
'''再算加减'''
num=change_char(num)
regax=re.search('[+-]?\d+(\.\d+)?[+\-]+\d+(\.\d+)?',num)
regax=regax.group()
if '+' in regax:
a,b=regax.strip().split('+')
num=num.replace(regax,str(float(a)+float(b)))
return num
if '-' in regax:
a,b=regax.strip().split('-')
num=num.replace(regax,str(float(a)-float(b)))
return num

#第一层括号
num_org='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
#去掉所有空格
num_org=re.sub('\s+','',num_org)

while 1:
try:
num_withbrcket=brcket(num_org)

num_without_brcket=num_withbrcket.replace('(','')
num_without_brcket=num_without_brcket.replace(')','')
while 1:
try:
num_without_brcket=multi_div(num_without_brcket)
except Exception:
break
while 1:
try:
num_without_brcket=add_min(num_without_brcket)
except Exception:
break
# print(num_without_brcket)
num_org=num_org.replace(num_withbrcket,num_without_brcket)
# print(num_withbrcket)
except Exception:
break

#已经去掉了所有括号,最后循环一遍乘除和加减
while 1:
try:
num_org=multi_div(num_org)
except Exception:
break
while 1:
try:
num_org=add_min(num_org)
except Exception:
break
print(num_org)

posted @ 2020-03-25 22:20  新手战斗机  阅读(223)  评论(0编辑  收藏  举报