python-24:四则计算器
import re
def input_check(): # 算式输入检测审
while True:
s=input('输入算式或退出(Q)--->>')
# 1.除去空格
s = s.replace(' ', '')
if s[0]=='Q':
exit('正常退出')
# 2.检测是否含有非法字符,除数字、括号、+-*/以外的任何符号
elif re.findall('[^\d()\-*/+\.]', s):
print('---->算式含有非法字符,重新输入或退出(Q)')
continue
# 3.检测左右括号是否匹配
elif not s.count('(') == s.count(')'):
print('---->算式括号不匹配,重新输入或退出(Q)')
continue
# 4.检测分母是否为0
elif re.findall('/[+-]?\d+\.?\d*', s):
rz=re.findall('/[+-]?\d+\.\d*', s)
flag=False
for i in rz:
if float(i[1:-1])==0:
print('---->算式分母为0,重新输入或退出(Q)')
flag=True
break
if flag:
continue
#5.运算符号格式化
s=format_symbol(s)
return s
def format_symbol(s): #符号检测,格式化
s=re.sub('\+\+|--','+',s)
s=re.sub('\+-|-\+','-',s)
s=re.sub('[+\-*/]\*','*',s)
s=re.sub('[+\-*/]/','/',s)
return s
def mul_div(s): # 计算单个乘除
if '*' in s:
a,b=s.split('*')
t=float(a)*float(b)
else:
a,b=s.split('/')
t=float(a)/float(b)
return str(t)
def add_sub(s): #计算只有加减运算的算式总和
ls=re.findall('[+\-]?\d+\.?\d*',s)
exp_sum=0
for i in ls:
exp_sum+=float(i)
return str(exp_sum)
def bracket(s): #先计算括号里算式
while True:
res=re.search('\([^()]*\)',s)
if res:
exp=res.group()
val=mix_cal(exp)
s=s.replace(exp,val)
s=format_symbol(s)
print('--->%s'%s)
else:return s
def mix_cal(s): #计算加减乘除混合运算'
while True:
res=re.search('\d+\.?\d*[*/]-?\d+\.?\d*',s)
if res:
exp=res.group()
val=mul_div(exp)
s=s.replace(exp,val)
s=format_symbol(s) #乘除之后要判断一次符号
else:
return add_sub(s)
def main():
s='带符号的四则计算器'
print(s.center(33,'*'))
s=input_check()
print('整理后的算式--->>%s'%s)
print('分步计算:')
exp=bracket(s) #除括号
res=mix_cal(exp) #混合运算,返回最终结果
if float(res)==eval(s):
print('计算结果:%s'%res)
else:
print('计算错误')
if __name__=='__main__':
main()
-------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------
************带符号的四则计算器************
输入算式或退出(Q)--->>>1 - 2 * ( (60-30 +(-9-2-5-2*3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
整理后的算式--->>1-2*((60-30+(-9-2-5-2*3-5/3-40*4/2-3/5+6*3)*(-9-2-5-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
分步计算:
--->1-2*((60-30-86.26666666666667*(-9-2-5-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
--->1-2*((60-30-86.26666666666667*173520.88095238098)-(-4*3)/(16-3*2))
--->1-2*(-14969037.996825399-(-4*3)/(16-3*2))
--->1-2*(-14969037.996825399+12.0/(16-3*2))
--->1-2*(-14969037.996825399+12.0/10.0)
--->1-2*-14969036.7968254
计算结果:29938074.5936508