python_四則運算改進版(去掉括號無用化)
GitHub的項目地址
https://github.com/LWX1/-
【小學生的四則運算】--PSP表格
PSP2.1 |
任務內容 |
計劃完成需要的時間(min) |
實際完成需要的時間(min) |
Planning |
計劃 |
300 |
180 |
Estimate |
估計這個任務需要多少時間,並規劃大致工作步驟 |
60 |
90 |
Development |
開發 |
100 |
80 |
Analysis |
需求分析 (包括學習新技術) |
60 |
30 |
Design Spec |
生成設計文檔 |
10 |
5 |
Design Review |
設計復審 (和同事審核設計文檔) |
30 |
20 |
Coding Standard |
代碼規範 (為目前的開發制定合適的規範) |
100 |
40 |
Design |
具體設計 |
100 |
120 |
Coding |
具體編碼 |
300 |
200 |
Code Review |
代碼復審 |
30 |
30 |
est |
測試(自我測試,修改代碼,提交修改) |
60 |
100 |
Reporting |
報告 |
120 |
100 |
Test Report |
測試報告 |
60 |
50 |
Size Measurement |
計算工作量 |
30 |
20 |
Postmortem & Process Improvement Plan |
事後總結 ,並提出過程改進計劃 |
60 |
80 |
Summary |
合計 |
1420 |
1045 |
項目要求
根據上個四則運算的項目把無效化括號去除
思路描述
四則運算括號無用性判斷:
主要判斷方法:
對比各個符號之間的優先級,很明顯 *和/ 明顯高於 -和+
外面的優先級高於裏面的優先級時,則為有效括號,否則為無用括號
但有特殊情況,如1-(1-2),1/(1/2)這兩種左邊為減號或者除號的特殊情況則為有用符號
如何解決
括號的出現主要分為兩類:1、開始出現括號;2、中間出現括號
1、如(1+4)+7、(1*2)+1等
主要比較括號裏的符號和右括號右邊符號的優先級,括號裏的優先級高於右括號右邊符號的優先級,則為無用括號
2、如1+(1+2)-1,2*(1*2)+1,1-(2*3)*1,1+(1+3*2)+2等
主要分為兩種,第一種比較括號裏的符號和左括號的左邊符號的優先級,第二種括號裏的符號和右括號的右邊符號的優先級
第一種除了比較優先級,還要註意上述的兩種特殊情況
第二種則和開始出現括號一種
只要兩種情況滿足其中一種,則為有效括號
具體程序設計
公共變量
變量 | 類型 | 作用 |
p1 | int | 存儲左括號左邊的符號 |
p2 | int | 存儲右括號右邊的符號 |
que | list | 存儲表達式中每組括號的有用性 |
函數
函數名 | 作用 |
integer(n) |
隨機產生幾個表達式 |
judge(f, ch) |
判斷表達式中的每個括號是否有用 |
代碼說明
#integer 函數
1 def integer(): 2 ch = [] #存儲表達式 3 number = random.randint(1, 5) #隨機產生表達式的數量 4 for i in range(number): 5 rand = random.randint(0, 1) #隨機產生0和1 判斷是否使用括號 6 a = func_integer(number) #調用表達式產生函數,產生表達式 7 if rand == 0: 8 op = operation[random.randint(0,3)] #產生*,/來連接有括號的表達式,避免產生+,— 9 rand = random.randint(0, 1) #隨機產生0和1 判斷是否使用內嵌括號或外嵌括號 10 if i != number - 1: #避免開始和結尾用無意義的括號 11 if rand == 0: 12 ch.append(‘(‘) 13 ch.append(a) 14 ch.append(op) 15 ch.append(random.randint(1,10)) 16 ch.append(‘)‘) 17 ch.append(operation[random.randint(0, 3)]) 18 else: 19 ch.append(a) 20 ch.append(operation[random.randint(0, 3)]) 21 else: 22 ch.append(a) 23 ch.append(operation[random.randint(0, 3)]) 24 else: 25 ch.append(a) 26 ch.append(operation[random.randint(0, 3)]) 27 28 kuohao = [] 29 f = ‘‘ 30 for k,i in enumerate(ch): #把列表中的所有值用f一個個連起來 31 if k != len(ch)-1: 32 f += str(i) 33 for i in f: 34 if i.isdigit() == False: 35 if i == ‘+‘: 36 kuohao.append(0) 37 elif i == ‘-‘: 38 kuohao.append(1) 39 elif i == ‘*‘: 40 kuohao.append(2) 41 elif i == ‘/‘: 42 kuohao.append(3) 43 else: 44 kuohao.append(i) 45 result_integer(f, ch, kuohao)View Code
#judge函數
1 def judge(f, ch): 2 p1 = -1 #左括號的左符號 3 p2 = -1 #右括號的右符號 4 que = [] #判斷各組符號是否為有用,False為無用,True為有用 5 for k, i in enumerate(ch): 6 p = [] #存儲括號中的符號 7 if i == ‘(‘ and k == 0: #開始出現括號 8 for j in range(1, len(ch)): 9 if ch[j] != ‘(‘ and ch[j] != ‘)‘ and ch[j] >= 0: 10 p.append(ch[j]) #ch[j]為括號中間的符號 11 elif ch[j] == ‘)‘: 12 for n in range(j + 1, len(ch)): 13 if ch[n] != ‘)‘ and ch[n] >= 0: 14 p2 = ch[n] #右括號的符號 15 break 16 else: 17 continue 18 break 19 else: 20 continue 21 #分兩種情況,判斷中間的括號的符號有幾個符號 22 if len(p) == 1: #括號中間只有一個符號時 23 if (p[-1] == 0 or p[-1] == 1) and (p2 == 0 or p2 == 1): #括號中間符號為—或+時,右括號右邊為—或+,為無用括號 24 que.append(False) 25 elif (p[-1] == 2 or p[-1] == 3): #括號中間符號為*或/時,為無用括號 26 que.append(False) 27 else: #其他的情況為有用括號 28 que.append(True) 29 if len(p) > 1: #括號中間不只符號時 30 if p2 == 0 or p2 == 1: #當右邊符號為-或+,為無用符號 31 que.append(False) 32 elif (p2 == 3 or p2 == 4) and (0 not in p or 1 not in p): #當右括號右邊的符號為*或/, 33 que.append(False) # 中間括號裏沒有+或-,則為無用符號 34 else: 35 que.append(True) 36 # 括號在中間的情況 37 if i == ‘(‘ and k != 0: 38 p1 = ch[k - 1] #左括號左邊的符號 39 for j in range(k + 1, len(ch)): 40 if ch[j] != ‘(‘ and ch[j] != ‘)‘ and ch[j] >= 0: 41 p.append(ch[j]) #中間的符號 42 elif ch[j] == ‘)‘: 43 if j != len(ch) - 1: #判斷右括號右邊是否有符號 44 for n in range(j + 1, len(ch)): 45 if ch[n] != ‘)‘ and ch[n] >= 0: 46 p2 = ch[n] #右括號右邊的符號 47 break 48 else: 49 continue 50 break 51 else: 52 p2 = -1 #右括號右邊沒有符號 53 else: 54 continue 55 #中間括號只有一個符號的情況 56 if len(p) == 1: 57 if p1 == 3: #左括號左邊為/,都為有用括號 58 que.append(True) 59 elif p1 == 2 and (0 == p[-1] or 1 == p[-1]): #左括號為*,中間括號為-或+,為有用括號 60 que.append(True) 61 elif p1 == 1 and (0 == p[-1] or 1 == p[-1]): #左括號為-,中間的括號為-或+,為有用括號 62 que.append(True) 63 elif p1 == 0 and (0 == p[-1] or 1 == p[-1]) and (p2 == 3 or p2 ==2): 64 que.append(True) #左括號為+,中間括號為-或+,右括號為*或/ 65 else: 66 que.append(False) #其他情況為無用括號 67 #中間括號不只一個的情況 68 else: 69 if p1 == 3: #左括號左邊為/,都為有用括號 70 que.append(True) 71 elif p1 == 1 and (1 in p or 0 in p): #左括號為-,中間的括號有-或+,為有用括號 72 que.append(True) 73 elif p1 == 2 and (0 in p or 1 in p): #左括號為*,中間括號有-或+,為有用括號 74 que.append(True) 75 elif p1 == 0 and (0 in p or 1 in p) and (p2 == 3 or p2 ==2): 76 que.append(True) #左括號為+,中間括號有-或+,右括號為*或/ 77 else: 78 que.append(False) 79 return queView Code
代碼運行如下
性能檢測
總結及收獲
本次項目雖然改進要求並不難,但是去除無用括號中的一些細節我沒有想到,也把一些某個有用括號當無用的去掉了,但這種情況並不普遍。
這次的改進我能做好每個函數的性能測試及優化
這個項目過程也可謂是坎坷不斷。
因為我個人現在能力問題和一點點地個人時間問題,這項目代碼還有很多需要改進的地方,例如不把有用括號當無用括號除去等等,我都沒能很好的解決。
還有很多需要改進的地方,以後再做補充。
python_四則運算改進版(去掉括號無用化)