1. 程式人生 > 其它 >第一單元(表示式解析)總結

第一單元(表示式解析)總結

寫在前面

本單元的任務是解析表示式。共有三次任務,層層遞進,每一次的任務都向前相容上一次的任務。所以,我會簡單略述我的前兩次作業中的架構,並在第三次作業的部分詳細展示我的構建思路。

第一次作業

檔案結構

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行之內修復他們)

  1. 問題出在三角函式因子的toString方法重寫。在解析形如sin(x)**0的這種指數為0的三角函式因子時,我忽視了這種情況,導致其toString方法返回的字串形式錯誤。
  2. 在使用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。

問題出在TrigFactortoString方法中。有些情況,innerPart在toString之後還需要再額外包裹一層括號,以適應因子的形式化表述。但是,我在某些必須加括號的情況下(形如sin((x+3))),忘記添加了括號。導致最終的輸出不符合形式化表述。