OO第一單元總結——表達式求導

第一次做業正則表達式

(1) UML結構圖
算法

(2)結構分析函數

Polynomial 類是對輸入的字符串進行預處理,其中包括判斷格式是否合法,運算符簡化,分割成項等方法。
學習

Polynomial處理後獲得的每個項的字符串,傳給Iterm類(這個類名是item和term的組合,互測中獨一無二的類名,真是可怕!),iterm類經過構造函數獲取各個信息。iterm類還有實現求導的方法,以及生成合並同類項的方法。測試

PolyDer類沒有屬性,只有enter(Arraylist 添加對象)方法,和print方法。優化

(3)耦合度分析spa

 

 

PolyDer中,print方法以及enter方法複雜度高,寫的比較面向過程。尤爲是print方法有待改進。改進方法可在iterm類中寫一個成員方法print,按要求輸出該項。而後只需在main函數中的for循環下,調用每一個對象的print方法便可。3d

(4)難點分析對象

第一次做業的難點在於正則表達式解析字符串。一開始我是用大正則匹配整項的,後來發現存在爆棧的風險就作了改進。利用項的幾個基本形式,對錶達式挨個項匹配。blog

(5)BUG分析

本身:

第一次做業比較慶幸,強測互測都沒有被找到bug,不過優化忘了將正項提早,因此也不是滿分。

同屋:

感受強測仍是很弱的……

bug集中在兩個地方:

(1)關於 結果爲0的一些輸入上(大概你們對這個0的輸出優化條件並無考慮周全)

 好比 0 ,+x-x,……

(2)格式錯誤

在OO以前,咱們不多考慮程序的魯棒性。可是這種什麼錯誤輸入都有的狀況才更貼切實際。此次做業不少人的bug出在\v,\f等上

 

第二次做業

(1)UML結構圖

(2)結構分析

此次個人結構和第一次是差很少的,只是Iterm類增長了幾個屬性。每一個項均可表示爲 係數*冪函數*三角函數的形式。Iterm類中也增長了sin和cos的求導方法。除此以外,相比於第一次做業的print部分,這是有在Iterm類中寫了一個toString方法。

PolyDer類是個比較雜糅的類,我把優化的各類方法(簡單的合併同類項,sin(x)^2+cos(x)^2=1的化簡,正項提早等)都寫在了這裏面。

(3)耦合度分析

 

不是很高明的結構,三次嵌套的循環等致使此次的個人優化部分尤爲是simpeList方法的耦合度和複雜度都比較高。還有,Iterm的構造函數既提取信息又檢驗格式,耦合度和複雜度也很高。

(4)BUG分析

本身的BUG

+ - 號位置不一樣致使的數量多變的關係,其中還有不少與空格、*的組合關係。這讓我從表達式中分割出項的時候忘考慮了*後面也能夠有+-號,所以強測卡了三個點(心痛……)。

同屋的BUG

此次的BUG中 ,仍是集中在WF和優化方面。

錯誤格式好比1*-sin(x),1*--1等

(5)Applying Creational Pattern

對於個人sin(x)^2+cos(x)^2=1的化簡,應該是比較充分的,可是沒有用什麼高明的算法,實現方式比較蠢笨。

反覆遍歷ArrayList,直到上一次沒有化簡(sin(x)^2+cos(x)^2=1處理後的兩項toString的長度和比以前小則算做一次化簡)終止循環。

研討課上大佬介紹了啓發式化簡,運用的結構是treeMap。感受很高明,正在研究……

 

第三次做業

(1)UML結構圖

(2)結構分析

此次做業第一次嘗試使用接口。寫了四個最小單元類(常數類,冪函數類,sin類,cos類),兩個運算類(乘法類,加法類)

表達式字符串傳給加法類的構造函數,而後加法類分解各個項,傳至其餘五個類。其中乘法類也對字符串進行分解,將各個因子傳給四個最小單元類,表達式因子傳給加法類。

至於提取各個部分,我並無用正則的方法,而是用了匹配的括號進行分割,這個比較面向過程,有待改進……

(3)耦合度分析

就每一個方法來講的話,其實耦合度和複雜度都還好。

但對每一個類來講,複雜度比較高。我把格式判斷與提取信息全放在構造函數裏,實在是太菜了!我要學習!

(4)難點分析

a.表達式的提取。遞歸降低啊,其實我也不知道本身寫的是否是遞歸降低……

b.優化。這很大程度上取決於工程採起的結構。此次我沒有刻意的去優化,只去除了多餘的外圍括號……

(5)BUG分析

本身:

慶幸強測互測都沒被hack,不過也多虧互測不給測試錯誤格式的數據。其實個人代碼是有bug的(暗喜)

同屋的BUG:

此次我有嘗試用腳本,能夠同時輸出同屋全部人的輸出。固然一對比,有的人很強,作了不少優化,有的人卻很長很長……能夠看出,一個屋的實力差距仍是蠻大的。也驚奇地發現,有的人的代碼在處理加法的時候會更短,有的人是乘法,有的人是嵌套。這大概和每一個人採起的結構有很大關係。

至於bug,我只找到了兩個。一個是0*0*0*0*0*0*0*0……(沒輸出),還有一個是(((((……(x)……)))))的嵌套(爆棧了)。

(6)Applying Creational Pattern

我將字符串分解依次往下傳到構造函數中,雖是遞歸,卻很不「文明」。應該採起真正的遞歸降低的算法。

其實實現簡單的優化仍是能夠的,好比同底數因子的合併,以及同類項的加減合併。只需我每一個基類裏寫上同類、同底數的方法。而後在加法類加入項的時候有序,而且合併同類項;在乘法類加入因子的時候有序,而後同底的化簡便可。

相關文章
相關標籤/搜索