计算器work_day05
day_work_05
------Python是一個優雅的大姐姐
作業計算器
設計思路
- 按照運算優先級和正則先算括號內的值,提出來判斷符號問題,然后依次計算。
- 分析題目設計了四個函數,分別為a)去括號函數b)去符號函數c)去乘除號函數d)去加減號函數
- 各個函數之間實行調用,完美解決問題,可能會有bug。
運行代碼
# Author:Xiong
# 開發一個簡單的python計算器
# 實現加減乘除及拓號優先級解析
# 用戶輸入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7
/3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
# 等類似公式后,必須自己解析里面的(),+,-,*,/符號和公式(不能調用eval等類似功能偷懶實現),
import re
def remove_04(str_4):
print('******去掉符號重復******')
flag = True
while flag:
flag = False
if str_4.find('*+') != -1:
str_4 = str_4.replace('*+','+')
flag = True
if str_4.find('+-') != -1:
str_4 = str_4.replace('+-','-')
flag = True
if str_4.find('--') != -1:
str_4 = str_4.replace('--','+')
flag = True
if str_4.find('*-') != -1:
ret1 = re.search('\d+(\.\d*)?\*\-\d+(\.\d*)?', str_4)
ret2 = ret1.group().replace('*-', '*')
ret3 = ''.join(['-',ret2])
str_4 =
str_4.replace(ret1.group(), ret3)
flag = True
if str_4.find('/-') != -1:
ret1 = re.search('\d+(\.\d*)?\/\-\d+(\.\d*)?', str_4)
ret2 = ret1.group().replace('/-', '/')
ret3 = ''.join(['-',ret2])
str_4 =
str_4.replace(ret1.group(), ret3)
flag = True
return str_4
#去掉所有的括號并運算出來
def remove_01(s):
print('******去掉括號******')
while True:
ret = re.search('\([^\(,\)]+\)', s)
if ret ==
None:
break
else:
print('取出來的括號加數字:',ret.group(),
'************')
str = re.sub('\(|\)','',ret.group())
str = remove_02(str)
s = re.sub('\([^\(,\)]+\)', str , s , 1)
print('去掉括號后的字符串:',s)
s = remove_04(s)
print('去掉重復運算符后的字符串:', s,'\n\n')
return s
#去掉乘除法
def remove_02(str1):
print('******去掉乘除運算******')
while True:
print(str1,
'************')
ret = re.search('\d+(\.\d*)?(\*|\/)\d+(\.\d*)?',str1)
if ret ==
None:
break
print(ret, '************')
if ret.group().find('*') != -1:
print('這是乘法')
data = ret.group().split('*')
num = float(data[0])*float(data[1])
str1 = re.sub('\d+(\.\d*)?(\*|\/)\d+(\.\d*)?', str(num), str1, 1)
elif ret.group().find('/') != -1:
print('這是除法')
data = ret.group().split('/')
num = float(data[0])
/ float(data[1])
str1 = re.sub('\d+(\.\d*)?(\*|\/)\d+(\.\d*)?', str(num), str1, 1)
str1 = remove_03(str1)
return str1
# 去掉加減法
def remove_03(str_1):
print('******去掉加減運算******')
while True:
print(str_1,
'************')
ret = re.search('\d+(\.\d*)?(\-|\+)\d+(\.\d*)?',str_1)
if ret ==
None:
break
print(ret, '************')
if ret.group().find('+') != -1:
print('這是加法')
data = ret.group().split('+')
num = float(data[0])+float(data[1])
str_1 = re.sub('\d+(\.\d*)?(\-|\+)\d+(\.\d*)?', str(num), str_1, 1)
elif ret.group().find('-') != -1:
print('這是減法')
data = ret.group().split('-')
num = float(data[0])
- float(data[1])
str_1 = re.sub('\d+(\.\d*)?(\-|\+)\d+(\.\d*)?', str(num), str_1, 1)
return str_1
s = '1 - 2 * ( (60-30
+(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
# s =
'8888888888*8+999999999-77777/888'
# s =
'(55555+66666-88888*88888/77777+44444*88888-898889)-(44564+789673242*7867-453453/45254)'
s = s.replace(' ','')
print('運算的公式:',s,'\n\n')
if s.count(')') == s.count(')') and re.search('[0-9,+,\-,*,/,=,\(,\)]+',s).group() == s :
s = remove_01(s)
s = remove_02(s)
s = remove_03(s)
s = remove_04(s)
print('最后結果:',s)
else:
print('輸入的計算公式格式錯誤')
運行結果
運算的公式:
1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
******去掉括號******
取出來的括號加數字: (-40/5) ************
******去掉乘除運算******
-40/5 ************
<_sre.SRE_Match object; span=(1, 5),
match='40/5'> ************
這是除法
-8.0 ************
******去掉加減運算******
-8.0 ************
去掉括號后的字符串:
1-2*((60-30+-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
******去掉符號重復******
去掉重復運算符后的字符串: 1-2*((60-30-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
取出來的括號加數字: (9-2*5/3+7/3*99/4*2998+10*568/14) ************
******去掉乘除運算******
9-2*5/3+7/3*99/4*2998+10*568/14
************
<_sre.SRE_Match object; span=(2, 5),
match='2*5'> ************
這是乘法
9-10.0/3+7/3*99/4*2998+10*568/14
************
<_sre.SRE_Match object; span=(2, 8),
match='10.0/3'> ************
這是除法
9-3.3333333333333335+7/3*99/4*2998+10*568/14
************
<_sre.SRE_Match object; span=(21, 24),
match='7/3'> ************
這是除法
9-3.3333333333333335+2.3333333333333335*99/4*2998+10*568/14
************
<_sre.SRE_Match object; span=(21, 42),
match='2.3333333333333335*99'> ************
這是乘法
9-3.3333333333333335+231.00000000000003/4*2998+10*568/14
************
<_sre.SRE_Match object; span=(21, 41),
match='231.00000000000003/4'> ************
這是除法
9-3.3333333333333335+57.75000000000001*2998+10*568/14
************
<_sre.SRE_Match object; span=(21, 43),
match='57.75000000000001*2998'> ************
這是乘法
9-3.3333333333333335+173134.50000000003+10*568/14
************
<_sre.SRE_Match object; span=(40, 46),
match='10*568'> ************
這是乘法
9-3.3333333333333335+173134.50000000003+5680.0/14
************
<_sre.SRE_Match object; span=(40, 49),
match='5680.0/14'> ************
這是除法
9-3.3333333333333335+173134.50000000003+405.7142857142857
************
******去掉加減運算******
9-3.3333333333333335+173134.50000000003+405.7142857142857
************
<_sre.SRE_Match object; span=(0, 20),
match='9-3.3333333333333335'> ************
這是減法
5.666666666666666+173134.50000000003+405.7142857142857
************
<_sre.SRE_Match object; span=(0, 36),
match='5.666666666666666+173134.50000000003'> ************
這是加法
173140.1666666667+405.7142857142857
************
<_sre.SRE_Match object; span=(0, 35),
match='173140.1666666667+405.7142857142857'> ************
這是加法
173545.88095238098 ************
去掉括號后的字符串: 1-2*((60-30-8.0*173545.88095238098)-(-4*3)/(16-3*2))
******去掉符號重復******
去掉重復運算符后的字符串: 1-2*((60-30-8.0*173545.88095238098)-(-4*3)/(16-3*2))
取出來的括號加數字: (60-30-8.0*173545.88095238098) ************
******去掉乘除運算******
60-30-8.0*173545.88095238098 ************
<_sre.SRE_Match object; span=(6, 28),
match='8.0*173545.88095238098'> ************
這是乘法
60-30-1388367.0476190478 ************
******去掉加減運算******
60-30-1388367.0476190478 ************
<_sre.SRE_Match object; span=(0, 5),
match='60-30'> ************
這是減法
30.0-1388367.0476190478 ************
<_sre.SRE_Match object; span=(0, 23),
match='30.0-1388367.0476190478'> ************
這是減法
-1388337.0476190478 ************
去掉括號后的字符串: 1-2*(-1388337.0476190478-(-4*3)/(16-3*2))
******去掉符號重復******
去掉重復運算符后的字符串: 1-2*(-1388337.0476190478-(-4*3)/(16-3*2))
取出來的括號加數字: (-4*3) ************
******去掉乘除運算******
-4*3 ************
<_sre.SRE_Match object; span=(1, 4),
match='4*3'> ************
這是乘法
-12.0 ************
******去掉加減運算******
-12.0 ************
去掉括號后的字符串: 1-2*(-1388337.0476190478--12.0/(16-3*2))
******去掉符號重復******
去掉重復運算符后的字符串: 1-2*(-1388337.0476190478+12.0/(16-3*2))
取出來的括號加數字: (16-3*2) ************
******去掉乘除運算******
16-3*2 ************
<_sre.SRE_Match object; span=(3, 6),
match='3*2'> ************
這是乘法
16-6.0 ************
******去掉加減運算******
16-6.0 ************
<_sre.SRE_Match object; span=(0, 6),
match='16-6.0'> ************
這是減法
10.0 ************
去掉括號后的字符串: 1-2*(-1388337.0476190478+12.0/10.0)
******去掉符號重復******
去掉重復運算符后的字符串: 1-2*(-1388337.0476190478+12.0/10.0)
取出來的括號加數字: (-1388337.0476190478+12.0/10.0) ************
******去掉乘除運算******
-1388337.0476190478+12.0/10.0 ************
<_sre.SRE_Match object; span=(20, 29),
match='12.0/10.0'> ************
這是除法
-1388337.0476190478+1.2 ************
******去掉加減運算******
-1388337.0476190478+1.2 ************
<_sre.SRE_Match object; span=(1, 23),
match='1388337.0476190478+1.2'> ************
這是加法
-1388338.2476190478 ************
去掉括號后的字符串: 1-2*-1388338.2476190478
******去掉符號重復******
去掉重復運算符后的字符串: 1+2*1388338.2476190478
******去掉乘除運算******
1+2*1388338.2476190478 ************
<_sre.SRE_Match object; span=(2, 22),
match='2*1388338.2476190478'> ************
這是乘法
1+2776676.4952380955 ************
******去掉加減運算******
1+2776676.4952380955 ************
<_sre.SRE_Match object; span=(0, 20),
match='1+2776676.4952380955'> ************
這是加法
2776677.4952380955 ************
******去掉加減運算******
2776677.4952380955 ************
******去掉符號重復******
最后結果: 2776677.4952380955
總結
以上是生活随笔為你收集整理的计算器work_day05的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: laravel 中 同个主域名下,多个项
- 下一篇: (转)cat > file <