python编程计算器_Python编写的计算器程序

importre,traceback

# s = '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)))'s = '----1+2+3+4+5+20*100-10*10'defformat(s):

blank_remove = re.sub(' +','',s) #去除空格add_min_corr = re.sub('\++-','-',blank_remove) #减号前的加号去除min_add_corr = re.sub('-\++','-',add_min_corr) #减号后的加号去除min_corr = re.sub('--','+',min_add_corr) #2个减号修正为1个加号add_corr = re.sub('\++','+',min_corr) #多个加号修正为1个mul_corr = re.sub('\*+','*',add_corr) #多个乘号修正为1个div_corr = re.sub('/+','/',mul_corr) #多个除号修正为1个mul_add_corr = re.sub('\/+\++','/',div_corr) #多个除号和加号,修正为1个除号div_add_corr = re.sub('\*+\++','*',mul_add_corr)#多个乘号和加号,修正为1个乘号returndiv_add_corr

#判断是否有运算符和数字外的其他字符defcheck(s):

check_result = Truespecial_symbol = re.findall('[^0-9+\-*/() ]',s)#是否有特殊符号branket_left = s.count('(')

branket_right = s.count(')')

ifspecial_symbol:

print('有特殊字符,无法计算!')

check_result = Falseifbranket_left != branket_right:

print('左右括号未匹配')

check_result = Falsereturncheck_result

#乘除法defcal_mul_div(s):

num= 0ret = re.search('\d+\.?\d*[*/][-+]?\d+\.?\d*',s)

whileret:

ret1 = ret.group()

print(ret1)

x,y = re.split('[*/]',ret1)

if'*'inret1:

num = float(x)*float(y)

else:

num = float(x)/float(y)

s=s.replace(ret1,str(num))

ret = re.search('\d+\.?\d*[*/][-+]?\d+\.?\d*',s)

print(s)

else:

print('乘法结束')

returnformat(s)

#加减法defcal_add_min(s):

num = 0ret = re.search('-?\d+\.?\d*[+-]\d+\.?\d*',s)

whileret:

ret1 = ret.group()

print(ret1)

iflen(re.split('[+-]',ret1)) == 3:

sym,x,y = re.split('[+-]',ret1)

if'+'inret1:

num = float(y)-float(x)

elif'+'not inret1:

num = -(float(x)+float(y))

else:

x,y = re.split('[+-]',ret1)

if'+'inret1:

num = float(y)+float(x)

elif'+'not inret1:

num = float(x)-float(y)

s=s.replace(ret1,str(num))

ret = re.search('-?\d+\.?\d*[+-]\d+\.?\d*',s)

print(s)

else:

print('加法结束')

returnformat(s)

s =format(s) #对运算符格式化check(s) #核查是否有运算数字,运算符之外的defcal_num(s):

if'('ins:

num = 0ret =re.search('\([^()]+\)',s)

exist_sym = re.search('-?\d+\.?\d*[+\-*/]',ret.group())

whileret andexist_sym:

ret1 = ret.group()

print(ret1)

ret2 = cal_mul_div(ret1)

print(ret2)

ret2 = cal_add_min(ret2)

ret2 = re.sub('[()]','',ret2)

print(s)

s = s.replace(ret1,ret2)

num += 1print('第%s次结果'%num,s)

ret = re.search('\([^()]+\)',s)

print('匹配括号',ret.group())

exist_sym = re.search('-?\d+\.?\d*[+\-*/]',ret.group())

print(exist_sym)

while notexist_sym andret:

ret2 = re.sub('[()]','',ret.group())

print(ret2)

s = s.replace(ret.group(),ret2)

print(s)

ret = re.search('\([^()]+\)',s)

else:

ret_s = cal_mul_div(s)

ret_s = cal_add_min(ret_s)

print('运算结果:',ret_s)

else:

ret_s = cal_mul_div(s)

ret_s = cal_add_min(ret_s)

print('运算结果:',ret_s)

cal_num(s)

运算结果:

"D:\Program Files\Python37\python.exe" "D:/Program Files/Python37/Aron/test.py"

(+9-2-5-2*-3-5/3-40*4/2-3/5+6*3)

2*-3

(+9-2-5--6.0-5/3-40*4/2-3/5+6*3)

5/3

(+9-2-5--6.0-1.6666666666666667-40*4/2-3/5+6*3)

40*4

(+9-2-5--6.0-1.6666666666666667-160.0/2-3/5+6*3)

160.0/2

(+9-2-5--6.0-1.6666666666666667-80.0-3/5+6*3)

3/5

(+9-2-5--6.0-1.6666666666666667-80.0-0.6+6*3)

6*3

(+9-2-5--6.0-1.6666666666666667-80.0-0.6+18.0)

乘法结束

(+9-2-5+6.0-1.6666666666666667-80.0-0.6+18.0)

9-2

(+7.0-5+6.0-1.6666666666666667-80.0-0.6+18.0)

7.0-5

(+2.0+6.0-1.6666666666666667-80.0-0.6+18.0)

2.0+6.0

(+8.0-1.6666666666666667-80.0-0.6+18.0)

8.0-1.6666666666666667

(+6.333333333333333-80.0-0.6+18.0)

6.333333333333333-80.0

(+-73.66666666666667-0.6+18.0)

-73.66666666666667-0.6

(+-74.26666666666667+18.0)

-74.26666666666667+18.0

(+-56.266666666666666)

加法结束

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)))

第1次结果 1-2*((60-30+-56.266666666666666*(-9-2-5-2*5/3+7/3*99/4)))

匹配括号 (-9-2-5-2*5/3+7/3*99/4)

2*5

1-2*((60-30+-56.266666666666666*(-9-2-5-10.0/3+7/3*99/4)))

10.0/3

1-2*((60-30+-56.266666666666666*(-9-2-5-3.3333333333333335+7/3*99/4)))

7/3

1-2*((60-30+-56.266666666666666*(-9-2-5-3.3333333333333335+2.3333333333333335*99/4)))

2.3333333333333335*99

1-2*((60-30+-56.266666666666666*(-9-2-5-3.3333333333333335+231.00000000000003/4)))

231.00000000000003/4

1-2*((60-30+-56.266666666666666*(-9-2-5-3.3333333333333335+57.75000000000001)))

乘法结束

1-2

-1.0*((60-30-56.266666666666666*(-9-2-5-3.3333333333333335+57.75000000000001)))

60-30

-1.0*((30.0-56.266666666666666*(-9-2-5-3.3333333333333335+57.75000000000001)))

30.0-56.266666666666666

-1.0*((-26.266666666666666*(-9-2-5-3.3333333333333335+57.75000000000001)))

-9-2

-1.0*((-26.266666666666666*(-11.0-5-3.3333333333333335+57.75000000000001)))

-11.0-5

-1.0*((-26.266666666666666*(-16.0-3.3333333333333335+57.75000000000001)))

-16.0-3.3333333333333335

-1.0*((-26.266666666666666*(-19.333333333333332+57.75000000000001)))

-19.333333333333332+57.75000000000001

-1.0*((-26.266666666666666*(38.41666666666667)))

加法结束

(-9-2-5-2*5/3+7/3*99/4)

2*5

(-9-2-5-10.0/3+7/3*99/4)

10.0/3

(-9-2-5-3.3333333333333335+7/3*99/4)

7/3

(-9-2-5-3.3333333333333335+2.3333333333333335*99/4)

2.3333333333333335*99

(-9-2-5-3.3333333333333335+231.00000000000003/4)

231.00000000000003/4

(-9-2-5-3.3333333333333335+57.75000000000001)

乘法结束

(-9-2-5-3.3333333333333335+57.75000000000001)

-9-2

(-11.0-5-3.3333333333333335+57.75000000000001)

-11.0-5

(-16.0-3.3333333333333335+57.75000000000001)

-16.0-3.3333333333333335

(-19.333333333333332+57.75000000000001)

-19.333333333333332+57.75000000000001

(38.41666666666667)

加法结束

1-2*((60-30+-56.266666666666666*(-9-2-5-2*5/3+7/3*99/4)))

第2次结果 1-2*((60-30+-56.266666666666666*38.41666666666667))

匹配括号 (60-30+-56.266666666666666*38.41666666666667)

56.266666666666666*38.41666666666667

1-2*((60-30+-2161.577777777778))

乘法结束

1-2

-1.0*((60-30-2161.577777777778))

60-30

-1.0*((30.0-2161.577777777778))

30.0-2161.577777777778

-1.0*((-2131.577777777778))

加法结束

(60-30+-56.266666666666666*38.41666666666667)

56.266666666666666*38.41666666666667

(60-30+-2161.577777777778)

乘法结束

(60-30-2161.577777777778)

60-30

(30.0-2161.577777777778)

30.0-2161.577777777778

(-2131.577777777778)

加法结束

1-2*((60-30+-56.266666666666666*38.41666666666667))

第3次结果 1-2*(-2131.577777777778)

匹配括号 (-2131.577777777778)

None

-2131.577777777778

1-2*-2131.577777777778

2*-2131.577777777778

1--4263.155555555556

乘法结束

1+4263.155555555556

4264.155555555556

加法结束

运算结果: 4264.155555555556

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值