1. 程式人生 > >python_四則運算改進版(去掉括號無用化)

python_四則運算改進版(去掉括號無用化)

新技術 mea RoCE 規劃 合計 工作 ali 性能測試 tar

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 que
View Code

代碼運行如下

技術分享圖片

技術分享圖片

技術分享圖片

性能檢測

技術分享圖片

技術分享圖片

總結及收獲

本次項目雖然改進要求並不難,但是去除無用括號中的一些細節我沒有想到,也把一些某個有用括號當無用的去掉了,但這種情況並不普遍。

這次的改進我能做好每個函數的性能測試及優化

這個項目過程也可謂是坎坷不斷。

因為我個人現在能力問題和一點點地個人時間問題,這項目代碼還有很多需要改進的地方,例如不把有用括號當無用括號除去等等,我都沒能很好的解決。

還有很多需要改進的地方,以後再做補充。



python_四則運算改進版(去掉括號無用化)