第一單元(表示式解析)總結
寫在前面
本單元的任務是解析表示式。共有三次任務,層層遞進,每一次的任務都向前相容上一次的任務。所以,我會簡單略述我的前兩次作業中的架構,並在第三次作業的部分詳細展示我的構建思路。
第一次作業
檔案結構
UML類圖
Class Metrics
main.CannotParseException | 1.0 | 1.0 | 1.0 |
---|---|---|---|
main.Lexer | 1.25 | 3.0 | 10.0 |
main.Main | 3.0 | 3.0 | 3.0 |
main.TestType | 0.0 | ||
main.Tools | 1.75 | 4.0 | 7.0 |
mono.ConstantNumber | 1.5 | 2.0 | 3.0 |
mono.Monomial | 1.0 | 1.0 | 6.0 |
mono.PowerFunction | 2.0 | 3.0 | 4.0 |
poly.Expression | 9.0 | 9.0 | 9.0 |
poly.Factor | 3.0 | 3.0 | 3.0 |
poly.Polynomial | 2.8181818181818183 | 16.0 | 31.0 |
poly.Term | 4.0 | 4.0 | 4.0 |
Total | 81.0 | ||
Average | 2.1315789473684212 | 4.454545454545454 | 6.75 |
反思
優化
這次作業的優化思路比較清晰,我還發了一篇討論區文章“如何讓我們的輸出變短”。
強測與互測
這次作業強測100分,互測沒有被hack,還hack了同組的2位同學各一個bug。(並沒有仔細研究他們的程式碼,而是直接生成大量隨機樣例未給程式進行大量評測來hack的。)
其他
使用了遞迴下降法,為迭代做了充分的準備。
在完成這次作業之餘,我還和同學交流探討並且實現了自動評測機。這為驗證我自己以及其他roommate的程式正確性提供了很大幫助。
第二次作業
檔案結構
與第三次作業基本相同,詳見第三次作業的該部分
UML類圖
與第三次作業基本相同,詳見第三次作業的該部分
Class Metrics
main.CannotParseException | 1.0 | 1.0 | 1.0 |
---|---|---|---|
main.CustomFunctionDefinition | 1.2 | 2.0 | 6.0 |
main.CustomFunctionManager | 3.5 | 6.0 | 7.0 |
main.DataCarrier | 1.0625 | 2.0 | 17.0 |
main.Lexer | 1.2307692307692308 | 3.0 | 16.0 |
main.Main | 4.0 | 4.0 | 4.0 |
main.ParsingMode | 0.0 | ||
main.SumFunctionParser | 9.0 | 9.0 | 9.0 |
main.Tools | 1.5555555555555556 | 4.0 | 14.0 |
mono.ConstantNumber | 1.2 | 2.0 | 6.0 |
mono.Monomial | 1.1111111111111112 | 2.0 | 10.0 |
mono.PowerFunction | 2.25 | 4.0 | 9.0 |
poly.Expression | 10.0 | 10.0 | 10.0 |
poly.Factor | 4.5 | 8.0 | 9.0 |
poly.Polynomial | 1.3333333333333333 | 4.0 | 12.0 |
poly.Term | 5.0 | 5.0 | 5.0 |
trig.TrigExpression | 1.1666666666666667 | 2.0 | 7.0 |
trig.TrigFactor | 2.3333333333333335 | 7.0 | 14.0 |
trig.TrigFactorSimple | 1.3636363636363635 | 3.0 | 15.0 |
trig.TrigTerm | 1.2222222222222223 | 3.0 | 11.0 |
trig.TrigTermSimple | 1.3333333333333333 | 3.0 | 12.0 |
trig.TrigType | 0.0 | ||
Total | 194.0 | ||
Average | 1.6166666666666667 | 4.2 | 8.818181818181818 |
反思
優化
這次作業新加了三角函式因子,但是對於其innerPart有比較多的限制。我優化思路比較清晰,還發了一篇討論區文章“如何讓我們的輸出變短”。只不過受限於時間,沒能將“正項儘量放前面”這個小優化項寫進程式碼。
強測與互測
這次作業強測93分,互測被hack,還hack了同組的一些同學。(同樣,並沒有仔細研究他們的程式碼,而是直接生成大量隨機樣例未給程式進行大量評測來hack的。)
我自己的bug分析:
2個bug。(但是因為很細微,我可以在5行之內修復他們)
- 問題出在三角函式因子的
toString
方法重寫。在解析形如sin(x)**0
的這種指數為0的三角函式因子時,我忽視了這種情況,導致其toString
方法返回的字串形式錯誤。 - 在使用
subString(0,2).equals("1*")
進行優化的時候,不如使用startWith("1*")
。因為,前者在String
物件的長度小於2的時候會丟擲異常,導致程式出錯,而後者更為安全。
第三次作業
檔案結構
UML類圖
Class Metrics
Method Metrics
反思
優化
這次作業沒有新加任何東西,但是將第二次作業的很多限制條件去除掉了。
我做的最主要的優化是充分利用sin()**2+cos()**2=1
進行遞迴、巢狀優化。還位元組寫了計時器類進行了對於優化的限制。
但是受限於時間,我沒能將最終的版本提交上去。最終提交的版本只進行了第二次作業的優化。
強測與互測
這次作業強測83分(wa了2個點),互測被hack,還hack了同組的一些同學。(同樣,並沒有仔細研究他們的程式碼,而是直接生成大量隨機樣例未給程式進行大量評測來hack的。)
我自己的bug分析:
1個bug。
問題出在TrigFactor
的toString
方法中。有些情況,innerPart在toString之後還需要再額外包裹一層括號,以適應因子的形式化表述。但是,我在某些必須加括號的情況下(形如sin((x+3))
),忘記添加了括號。導致最終的輸出不符合形式化表述。