(1) 基於度量來分析本身的程序結構正則表達式
方法和類的複雜度分析圖片中ev(G),iv(G),v(G),OCavg,WMC含義以下:算法
ev(G)即Essentail Complexity,用來表示一個方法的結構化程度,範圍在[1,v(G)]之間,值越大則程序的結構越「病態」,其計算過程和圖的「縮點」有關。數組
iv(G)即Design Complexity,用來表示一個方法和他所調用的其餘方法的緊密程度,範圍也在[1,v(G)]之間,值越大聯繫越緊密。優化
v(G)即循環複雜度,能夠理解爲窮盡程序流程每一條路徑所須要的試驗次數。spa
OCavg表明類的方法的平均循環複雜度。設計
WMC表明類的總循環複雜度。orm
第一次做業對象
類圖blog
方法以及類的複雜度遞歸
思路分析:第一次做業中使用了四個類。Main類負責輸入表達式正確性的判斷,首先是利用正則匹配,直接對錶達式進行判斷,後來發現出現爆棧的問題,出現爆棧的緣由是由於正則的貪婪特性,以後便改成用替換的方法,先將首項替換爲空字符串,再將其餘項替換爲空字符串,最後和空字符串比較,二者比較結果爲真則輸入正確;Pushtoarr類將表達式分離爲項,經過ArrayList保存,再將項中係數和指數經過動態數組保存,最後進行求導並保存結果;Remove類主要是去除數的前導0,但互測時才發現這一步多餘,將字符串轉換爲BigInteger類型不須要去除前導0;Jianhua類主要是將求導後的表達式簡化,合併同類項,對指數爲0,1,係數爲0,1,-1的項進行優化處理。
優勢:學到了正則表達式的用法,使用了四個類,雖說還未擺脫掉c語言代碼風格,但經過此次做業瞭解並應用了對象與類。
缺點:正則表達式過長,出現bug後難以定位。類中許多方法都使用了許多if else語句,致使代碼量較多。
第二次做業
類圖
方法以及類的複雜度
思路分析:第二次做業使用了五個類,Main類進行輸入,輸出;Judgeregex類利用正則判斷表達式的正確性,改進了第一次的正則寫法,寫出因子的正則,而後合併爲項的正則,判斷正確性則是與第一次做業同樣;Cutterm類經過split將項與項分離;Splitfactor類將項分割成係數,x的指數,sinx的指數,cosx的指數。Derivative類進行求導,合併和優化。
優勢:將項化爲了x,sinx,cosx,便於之後的求導,合併,優化,對於類中的屬性,只能經過get()的方法讀取,封裝得較好。
缺點:未能用到同窗課上介紹到的try-catch,不熟悉其用法,Derivative類中進行了求導優化化簡,方法太多,代碼量較多。
第三次做業
類圖
方法以及類的複雜度
思路分析:這次做業寫出的程序與第一次和第二次做業有了較大的區別,表達式正確性的判斷並非提早處理,而是邊建樹邊判斷,運用到了五個類,Main類進行輸入輸出,Wrongformat類進行預處理,提早處理一些顯而易見的錯誤,以及將空白字符給去掉,便於之後的數據處理,Expression類屬性爲ArrayList,儲存Term對象,Term類屬性爲ArrayList,儲存Factor對象,Factor屬性爲me和ArrayList,屬性me區分數,x,sin,cos,表達式因子,ArrayList存儲可能存在的嵌套因子(Factor對象)或者表達式(Expression對象)。將樹創建後,進行求導。
優勢:學會了用try-catch機制,應用遞歸建樹。
缺點:未能進行合併優化,未能用到接口。
(2)本身程序的bug
第二次做業:互測時發現了一個bug,未能仔細閱讀題目,忽略了項與項之間能夠存在三個正負號的問題,
第三次做業:強測時,輸入x*+x未能輸出相應結果,預處理時忽略了這一狀況。
互測時,輸入sin(-7)未能得出正確結果,在程序中將-+也當成了因子,因此會程序錯誤。
(3)發現別人程序bug所採用的策略
第一次經過爆棧,空格超時,以及閱讀他人正則表達式時發現了一些bug。
第二次經過閱讀正則表達式(例如缺乏\t)以及表達式輸出找到了bug。
第三次主要是經過設計正確的輸入來找bug。
(4)Applying Creational Pattern
第三次做業創建了樹的概念,若增長其餘數學符號tan等,能夠在原有代碼上增長少許代碼便可將樹創建起來,但第三次做業未能實現一個求導的接口,未能描述類之間的共性行爲,而且在求導時,因子與因子之間只考慮了乘法,若是增長其餘的運算法則,則難以擴展,所以應該實現一個求導的接口,加強程序的可擴展性。