思路: 用迴圈提取最裡面的括弧,再進行運算 運算時利用正則表達式尋找相應的運算符 先進行乘除,再進行加減 (參考武sir和金角大王的代碼) 流程圖: 代碼: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import re 4 def chen
思路:
用迴圈提取最裡面的括弧,再進行運算
運算時利用正則表達式尋找相應的運算符
先進行乘除,再進行加減
(參考武sir和金角大王的代碼)
流程圖:
代碼:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import re 4 def cheng_and_chu(arg): #計算乘除 5 val = arg[0] #把傳入的列表中第0個元素賦值給val 6 mch = re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', val) #利用正則表達式的查找字元串功能匹配val中的算數符賦值給mch 7 if not mch: #如果mch中沒有乘除 8 return #結束函數返回這個mch中的值 9 content = re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', val).group() #利用正則表達式的查找字元串功能匹配val中的算數符,並使用group獲取分組賦值給content 10 if len(content.split('*'))>1: #將content中的組以*分割,分割後的字元串長度大於1 11 n1,n2 = content.split('*') #將content中的組以*分割,分割後的兩部分分別賦值給n1,n2 12 value = float(n1) * float(n2) #將n1,n2轉換為浮點數,並相乘,結果賦值給value 13 else: 14 n1,n2 = content.split('/') 15 value = float(n1) / float(n2) 16 qianzhui,houzhui = re.split('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', val, 1) #用正則中的分割方法,吧val中的值以\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*分割,並將分割後的值分別賦值給qianzhi,尾碼 17 new_str = "%s%s%s"%(qianzhui,value,houzhui) #將字元串重新格式化拼接 18 arg[0] = new_str #講新的字元串複製給arg中的第0個元素 19 cheng_and_chu(arg) #繼續運行乘除函數 20 21 def jia_and_jian(arg): #計算加減 22 while True: 23 if arg[0].__contains__('+-') or arg[0].__contains__("++") or arg[0].__contains__('-+') or arg[0].__contains__("--"): #如果arg的第0個元素是'+-','--','++','-+' 24 arg[0] = arg[0].replace('+-','-') #將-替換掉+- 25 arg[0] = arg[0].replace('++','+') #將+替換掉++ 26 arg[0] = arg[0].replace('-+','-') #將-替換掉-+ 27 arg[0] = arg[0].replace('--','+') #將+替換掉-- 28 else: 29 break 30 if arg[0].startswith('-'): #如果arg的第0個元素是以-開頭 31 arg[1] += 1 #arg的第一個元素自加1 32 arg[0] = arg[0].replace('-','&') 33 arg[0] = arg[0].replace('+','-') 34 arg[0] = arg[0].replace('&','+')#將-變+,+變- 35 arg[0] = arg[0][1:]#將arg中第0個元素中前面多出來的符號去掉 36 val = arg[0] 37 mch = re.search('\d+\.*\d*[\+\-]{1}\d+\.*\d*', val) 38 if not mch: 39 return 40 content = re.search('\d+\.*\d*[\+\-]{1}\d+\.*\d*', val).group() 41 if len(content.split('+'))>1: 42 n1, n2 = content.split('+') 43 value = float(n1) + float(n2) 44 else: 45 n1, n2 = content.split('-') 46 value = float(n1) - float(n2) 47 before, after = re.split('\d+\.*\d*[\+\-]{1}\d+\.*\d*', val, 1) 48 new_str = "%s%s%s" % (before,value,after) 49 arg[0] = new_str 50 jia_and_jian(arg) 51 52 def jisuan(sr): #計算函數 53 new_sr = [sr.strip('()'),0] #將傳入的值兩邊括弧去掉,並組成列表賦值給new_sr 54 cheng_and_chu(new_sr) #調用乘除函數 55 jia_and_jian(new_sr) #調用加減函數 56 if divmod(new_sr[1],2)[1] == 1: #將運算後的傳回的列表中的第1個元素處於2,除後得到的元組第1個元素等於1的話, 57 jieguo = float(new_sr[0]) #將運算後傳回的列表中的第0個元素轉化為浮點型,賦值給jieguo 58 jieguo = jieguo * -1 #並將jieguo乘-1 59 else: #如果不等於1 60 jieguo = float(new_sr[0]) #將運算後傳回的列表中的第0個元素轉化為浮點型,賦值給jieguo 61 return jieguo #結束函數返回jieguo 62 63 def kuohao(sr): #去除括弧函數 64 flag = True #設置一個標誌位 65 while flag: 66 m = re.search("\([^()]+\)",sr) #找出sr中最裡面的括弧,賦值給m 67 if m: 68 sub_sr = m.group() #截取m中第一個括弧 69 sub_res = jisuan(sub_sr) #調用計算函數,返回值賦值給sub_res 70 sr = sr.replace(m.group(),str(sub_res)) #將m截取的第一個括弧內容替換為轉化為str類型的sub_res 71 else: 72 print('結果:',jisuan(sr)) #如果沒有括弧了,列印計算函數返回的結果 73 flag = False #將標誌位設置為False,用於跳出迴圈 74 75 if __name__ == "__main__": 76 print("----------歡迎使用計算器----------") 77 while True: 78 flag = True #設置一個標誌位 79 sr = input("輸入要計算的函數(q:退出):") #讓用戶輸入計算函數,賦值給sr 80 sr = re.sub("\s*","",sr) #在sr中找到所有的空格,刪除 81 error = re.search('[0-9q\*\/\-\+]',sr) #使用正則查找方法,在sr中找到0-9q\*\/\-\+這些字元,賦值給error 82 while flag: 83 if not error: #如果error為空 84 print("輸入有誤") #列印輸入有誤 85 sr = input("請重新輸入要計算的函數(q:退出):") #重新讓用戶輸入 86 else: 87 if error.group() == 'q': #如果用戶輸入的是q 88 exit("感謝使用,再見") #則推出整個程式 89 kuohao(sr) #用戶輸入的是計算函數,則調用去除括弧函數 90 flag = False #並將標誌位設置為False計算器