BUAA OO 第一單元總結

2022-08-28 09:06:07 字數 2707 閱讀 3669

(1)類關係圖

(2)作業設計思路:

(3)類與方法內部分析:

poly類

方法:

(4)優缺點分析:

缺點:

(1)類關係圖

(2)作業設計思路

分割表示式思路:

優化表示式思路:

a*sin(x)^2+b*cos(x)^2 = (a-b)*sin(x)^2+b=(b-a)*cos(x)^2+a

a-b*cos(x)^2 = a*sin(x)^2-(b-a)*cos(x)^2 = b*sin(x)^2+(a-b)

a-b*sin(x)^2 = a*cos(x)^2-(b-a)*sin(x)^2 = b*cos(x)^2+(a-b)

經過實踐驗證可得,該方法也許不能每次都將表示式化至最簡,但大部分情況都能夠化到最短,有少部分情況會出現tle或者不能化至最簡情況。

(3)類與方法分析

expression類:

方法:

item類:

方法:

index類:

方法:

expressionbetter類:

方法:

各個類與方法的複雜度量如下:

可以觀察到各個類的構造方法複雜度都偏高,因為採用的是狀態機和正則相結合的形式,if語句巢狀層數大,因此邏輯複雜度高。

(4)本次作業的bug

1

private index newx(int i, string ss) throws

formatexception else

if (xs.length > 0)

9 ......

(5)優缺點分析

缺點:

(1)類關係圖

(2)作業設計思路

字串解析:

表示式優化:

a*(expr) + expr 第乙個項為僅含有表示式因子和常數因子的項,因此將常數因子乘給表示式因子中表示式的各個項,將表示式因子括號拆去。

sin((factor)) / cos((factor)) / ((factor)) sin或者cos函式中的因子為表示式因子,而該表示式因子僅含有乙個乘積項且該項僅含有乙個因子,因此可以拆除多餘括號,表示式因子同理。

(factor*factor*factor)*term 該項中前半部分的表示式因子僅含有乙個項,因此可以將其外圍括號拆除合併成乙個項。

(3)類屬性和方法分析

expression類:

方法:

term類:

方法:

factor類:

方法:

expressionbuilder類:

方法:

各個類的複雜度度量如下:  

由於builder方法中if語句巢狀多,因此複雜度高,而expression和term類為了使表示式化簡更加方便增加了一些判定可否化簡的方法,因此if語句也較多。

(4)優缺點分析

缺點:

第一單元互測階段,我是採取構建自動化評測指令碼和人工查bug相互進行的方式來找別人程式中的bug。

自動化指令碼構建:

人工評測方式:

因此對於第三次作業,深刻的思考了前兩次作業犯下的問題,得出一些結論:

此外,對於可變與不可變物件的思考,在第三次試驗中,本人將底層的因子全部設計為不可變物件,而頂層的表示式為可變物件,這樣設計只是為了方便化簡,因為若均為不可變物件將會導致在每一次化簡過程中都需要重新clone一樣的物件,這對於較長的表示式是需要一定時間的,而如果括號巢狀的多則更需要不斷的呼叫化簡函式,會導致程式執行效率降低。

關於優化

BUAAOO第一單元總結

第一單元的作業是對多項式求導,三次作業分別完成了簡單冪函式表示式求導 帶簡單巢狀的表示式求導和三角函式求導 豐富巢狀的表示式求導及格式檢查。本人在第一次作業中使用的是正規表示式匹配和字串預處理相結合的方法,可以達到需要的效果,但是越過了格式約束並降低了可擴充套件性,導致第二次作業不得不重構。第二次作...

BUAAOO 第一單元

1.1 類圖 1.2 類的設計 1.3 類的度量分析 經過分析可以看到,combine和main的複雜度較高,因為我在main裡一共進行了好幾次獨立操作,比如在項裡遍歷因子求導,但實際上這個操作應該放在poly裡更為合適。combine裡我先採用了treemap進行合併同類項,最後又把treemap...

2021 BUAA OO第一單元總結

oo第一單元總結 第一次作業 一 題目要求 簡單多項式求導,僅支援常數與冪函式的乘積作為項,保證輸入無格式錯誤。二 作業實現及分析 由於第一次作業要求實現的功能並不複雜,且我當時對於物件導向的理解並不夠深入,所以我當時只是根據自己的想法構建了4個類來解決這個問題 類圖如下 關鍵類分析如下 strin...