python-—计算器
python-練習—計算器
一、要求
傳入字符串,計算結果
string='1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
二、實現思路
1、先去除字符串內的空格。
2、然后按照括號優(yōu)先的規(guī)則先用正則找出最里層的括號。
3、去除括號后把括號里的內容傳入計算的函數。
4、在計算函數內用遞歸對傳入的內容按照先乘除后加減的順序進行計算和替換,直到得到一個數字。
5、最后把計算的結果返回賦值并對整個字符串進行替換。
6、在把新的字符串傳入進行尋找括號的計算。
7、如果已經沒有括號了就直接把該字符串傳入計算。
8、直到最后如果已經找不到加減乘除這些計算符號,得到的就是最后的結果。
三、流程圖
四、實現
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 import re
4 #當加減相疊時使其轉換成一個
5 def plus_minus(string):
6 string = string.replace('++','+')
7 string = string.replace('--','+')
8 string = string.replace('-+','-')
9 string = string.replace('+-','-')
10 return string
11
12 #運算函數
13 def count(result):
14 result = plus_minus(result) #調用plus_minus函數,去除想疊的加減
15 if re.search('d+.?d*[+-*/]d+.?d*',result): #如果匹配到有+-*/,進入下面的if
16 if re.search("[/*]",result): #先判斷是否有乘除,有則先進入計算乘除
17 #該正則意思為匹配:兩個相乘或相除的整數或浮點數
18 ss=re.search('(d+.?d*)[*/]([+-]*d+.?d*)',result).group()
19 if re.search("*",ss): #如果匹配的是相乘
20 a=re.split("*",ss) #以*分隔開
21 a1=float(a[0])*float(a[1]) #取出兩個數相乘
22 result=result.replace(ss,str(a1)) #把計算好的結果替換到result里
23 return count(result) #把新的result傳入count函數繼續(xù)計算
24 if re.search("/",ss): #如果匹配的是相除
25 a=re.split("/",ss) #以/分隔開
26 a1=float(a[0])/float(a[1]) #取出兩個數相除
27 result=result.replace(ss,str(a1)) #同上
28 return count(result)
29 else: #如果沒有匹配到乘除,則進入計算加減
30 if re.search("[+-]",result): #先判斷是否有加減
31 ss=re.search('(d+.?d*)[+-]([+-]*d+.?d*)',result).group()
32 if re.search("+",ss): #如果匹配的是相加
33 a=re.split("+",ss) #以+分隔開
34 a1=float(a[0])+float(a[1]) #取出兩個數相加
35 result=result.replace(ss,str(a1)) #把計算好的結果替換到result里
36 return count(result)
37 if re.search("-",ss): #如果匹配的是相減
38 a=re.split("-",ss) #以-分隔開
39 a1=float(a[0])-float(a[1]) #取出兩個數相減
40 result=result.replace(ss,str(a1)) #同上
41 return count(result)
42 else:
43 return result
44
45 #取值替換
46 def inin(string):
47 string = plus_minus(string)
48 if re.search('(([+-*/]*d+.*d*)+)',string): #如果該字符串能匹配括號
49 result=re.search('(([+-*/]*d+.*d*)+)',string).group() #取出最里面的括號
50 print(result)
51 result1=result.strip("()") #除去括號
52 aa=count(result1) #把除去括號的結果傳入count函數
53 cc=string.replace(result,aa) #把函數返回的計算結果替換到string
54 print(cc)
55 else: #如果沒有匹配到括號
56 return count(string) #直接把string傳入count函數
57 return inin(cc) #把新的string字符串傳入count
58
59 #程序開始
60 if __name__ == '__main__':
61 print('1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )')
62 string=input("請輸入表達式:")
63 string = re.sub('s*','',string) #除空格
64 string_result=inin(string) #把string傳入inin函數,并把返回的結果賦值給string_result
65 print(string_result) #輸出結果
改進版,加了**和//
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 import re
4 #當加減相疊時使其轉換成一個
5 def plus_minus(string):
6 string = string.replace('++','+')
7 string = string.replace('--','+')
8 string = string.replace('-+','-')
9 string = string.replace('+-','-')
10 return string
11
12 #加減乘除運算函數
13 def count(result):
14 result = plus_minus(result) #調用plus_minus函數,去除想疊的加減
15
16 result=count_add(result) #運算冪次等其他算法
17 if re.search('d+.?d*[+-*/]d+.?d*',result): #如果匹配到有+-*/,進入下面的if
18 if re.search("[/*]",result): #先判斷是否有乘除,有則先進入計算乘除
19 #該正則意思為匹配:兩個相乘或相除的整數或浮點數
20 ss=re.search('(d+.?d*)[*/]([+-]*d+.?d*)',result).group()
21 if re.search("*",ss): #如果匹配的是相乘
22 a=re.split("*",ss) #以*分隔開
23 a1=float(a[0])*float(a[1]) #取出兩個數相乘
24 result=result.replace(ss,str(a1)) #把計算好的結果替換到result里
25 return count(result) #把新的result傳入count函數繼續(xù)計算
26 if re.search("/",ss): #如果匹配的是相除
27 a=re.split("/",ss) #以/分隔開
28 a1=float(a[0])/float(a[1]) #取出兩個數相除
29 result=result.replace(ss,str(a1)) #同上
30 return count(result)
31 else: #如果沒有匹配到乘除,則進入計算加減
32 if re.search("[+-]",result): #先判斷是否有加減
33 ss=re.search('(d+.?d*)[+-]([+-]*d+.?d*)',result).group()
34 if re.search("+",ss): #如果匹配的是相加
35 a=re.split("+",ss) #以+分隔開
36 a1=float(a[0])+float(a[1]) #取出兩個數相加
37 result=result.replace(ss,str(a1)) #把計算好的結果替換到result里
38 return count(result)
39 if re.search("-",ss): #如果匹配的是相減
40 a=re.split("-",ss) #以-分隔開
41 a1=float(a[0])-float(a[1]) #取出兩個數相減
42 result=result.replace(ss,str(a1)) #同上
43 return count(result)
44 else:
45 return result
46
47 def count_add(result):
48 result = plus_minus(result)
49 if re.search('d+.?d***d+.?d*',result) or re.search('d+.?d*//d+.?d*',result):
50 if re.search('d+.?d***d+.?d*',result):
51 ss=re.search('d+.?d***d+.?d*',result).group()
52 a=re.split("**",ss)
53 a1=float(a[0])**float(a[1])
54 result=result.replace(ss,str(a1))
55 return count_add(result)
56 if re.search('d+.?d*//d+.?d*',result):
57 ss=re.search('d+.?d*//d+.?d*',result).group()
58 a=re.split("http://",ss)
59 a1=float(a[0])//float(a[1])
60 result=result.replace(ss,str(a1))
61 return count_add(result)
62 else:
63 return result
64
65 #取值替換
66 def inin(string):
67 string = plus_minus(string)
68 if re.search('(([+-*/]*d+.*d*)+)',string): #如果該字符串能匹配括號
69 result=re.search('(([+-*/]*d+.*d*)+)',string).group() #取出最里面的括號
70 print(result)
71 result1=result.strip("()") #除去括號
72 aa=count(result1) #把除去括號的結果傳入count函數,運算加減乘除
73 cc=string.replace(result,aa) #把函數返回的計算結果替換到string
74 print(cc)
75 else: #如果沒有匹配到括號
76 return count(string) #直接把string傳入count函數
77 return inin(cc) #把新的string字符串傳入count
78
79 #程序開始
80 if __name__ == '__main__':
81 print('1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )')
82 string=input("請輸入表達式:")
83 string = re.sub('s*','',string) #除空格
84 string_result=inin(string) #把string傳入inin函數,并把返回的結果賦值給string_result
85 print(string_result) #輸出結果
總結
以上是生活随笔為你收集整理的python-—计算器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电动车的车主帮忙回答一下,电动车没有发动
- 下一篇: 汽车冲压模具反面铣多少