一:前言:
1. 知識點總結:
①:java物件導向類和物件的基本用法
②:關聯類,依賴類和組合等類間關係
③:正規表示式的運用
④:Comparator介面及比較器基本使用
⑤:ArrayList的基本使用
⑥:Collections.sort方法使用
2. 題量:
較少,每次題目集不超過3題
3. 難度:
由於題量少,所以每次題目集難度較大,特別是每次題目集的第一題,難點在於類的設計,以及每次迭代增加了許多內容,如何對上次程式碼進行更改,本次
程式碼如何做到合適的擴充套件來適應下次的迭代等都比較難。這次前一個題目集是對上次的迭代,增加了更多型別的題目,例如多選題,填空題,這對判題程式
提出了新的要求,對於後兩次題目集,是針對家居電路的,難點在於程式如何設計來實現電器之間連起來,以及在串並聯電路情況下電流電壓的計算
二:設計與分析:
第四次題目集:(只分析第一題)
1. 類圖設計:
這次包括主類我總共設計了16個類,相較於上一題我新新增了繼承自抽象題目類的多選題類,填空題類以及一般題目類,以及輸出類ViewPrint
2. 原始碼分析:
1、原始碼資訊:
程式碼行數:1157
語句行數:594
分支數佔總語句數百分比:18.5
方法呼叫語句數:338
註釋語句佔總語句百分比:16.4
類和介面數:6
最複雜函式的複雜度:10
平均深度:1.81
最大深度:9+
平均複雜度:3.06
由上圖,紅色線表示當前的情況,在綠色範圍(所推薦的java良好程式碼,如平均複雜度在2.0-4.0之間)表示良好,可知當前程式碼在最大深度(Max Depth)
,最複雜函式的複雜度(Maximum Complexity)不合格,其他方面較上次題目集有所改良。
2、原始碼思路及問題:
思路:首先在Main類中建立五個列表,分別是題目,試卷,答卷,考生和刪除列表,用來接收輸入的五種資訊,在輸入一行資訊,透過判斷第二個字
母來判斷輸入的是什麼資訊,在去擷取內容資訊。然後建立題目物件存題目資訊,建立試卷資訊存題目及本身的資訊,建立答卷物件存試卷及本身的資訊,
建立考生物件存答題者的資訊;全部輸入完後再去給試卷賦題,給答題者賦試卷,這樣可以解決亂序的問題,然後再去判題即可,判題方法需要多加兩種,
用來判選擇及填空題,最後我建立一個輸出類,輸出答案及得分。
問題:本次程式在第一,二三次的基礎上逐漸最佳化,但存在一個明顯的問題,就是if-else語句用的太多了,在判斷輸入時,在判斷答題結果時,都用
到了大量的if-else,雖然可以解決當前的問題但是實在不易擴充套件。
第五次題目集:(只分析第一題)
1. 類圖設計:
這次題目集與前四次不一樣,換了一次主題,這次是家居電路,我這次設計了20個類,分別是繼承自Device主類的幾種用電器,然後是控制電器包括開
關及幾種調速器,然後是判斷輸入類及跟電路相關的檢查通路類及賦值通路類。在控制裝置和受控裝置裡都加上一個輸出方法用於輸出自己的狀態。
2. 原始碼分析:
1、原始碼資訊:
程式碼行數:758
語句行數:397
分支數佔總語句數百分比:19.4
方法呼叫語句數:140
註釋語句佔總語句百分比:9.2
類和介面數:11
最複雜函式的複雜度:15
平均深度:1.75
最大深度:7
平均複雜度:2.11
由上圖,紅色線表示當前的情況,在綠色範圍(所推薦的java良好程式碼,如平均複雜度在2.0-4.0之間)表示良好,可知當前程式碼在最複雜函式的複雜度
(Maximum Complexity)和每個函式平均包含的語句個數(Average Statements per Method)不合格。
2、原始碼思路及問題:
思路:我首先建立一個泛型為Device的列表用來裝所有的電器,先去判斷屬於什麼資訊,然後去解析裝置資訊,連線資訊以及調節資訊,然後依次存
到列表中,然後去遍歷列表去做調節裝置,以及判斷電器的狀態,最後輸出即可。
問題:這次題目集我儘管對了,但設計十分失敗,我將所有電器放到一個列表中,對於下次的迭代我直接被淘汰,我需要重構,下次有並聯電路,那我
這次設計顯然不合理,並且我這次是無法計算電流等屬性,儘管這次題目集並沒有要求;這次我設計了許多毫無用處的類,比如開關和連續調速器都有一個
抽象開關及抽象調速器類,完全多餘,只需要繼承自一個控制裝置再去擴充套件就行了,還有在計算亮度時,我寫了一個介面,結果就只有燈能用,並且這本應
該作為燈的方法。
第六次題目集:
1. 類圖設計:
這次我在老師的建議下,將所有電器繼承自主類Device,然後受控裝置,控制裝置,串聯電路,並聯電路都去繼承Device類,受控裝置裡包括風扇,燈等,
控制裝置包括開關和調速器等,串並聯電路看成一個獨立的電器裝置,然後跟上次一樣去解析,這次我是建立一個主幹路列表,裡面是電器或者是串並聯電
路(電器列表),這樣就可以實現一條電路可以有多條串並聯電路,可滿足下次迭代;在計算電流時,我寫了一個介面,裡面有兩個方法,一個是輸入電流,
一個是輸出電流,然後Device主類去實現它,然後根據需要每個子類去重寫即可,這樣就可以去計算電流,電壓等屬性。
2. 原始碼分析:
1、原始碼資訊:
程式碼行數:988
語句行數:554
分支數佔總語句數百分比:23。8
方法呼叫語句數:253
註釋語句佔總語句百分比:11.3
類和介面數:15
最複雜函式的複雜度:24
平均深度:1.79
最大深度:6
平均複雜度:2.03
由上圖,可知當前程式碼在每個函式平均包含的語句個數(Average Statements per Method)和最複雜函式的複雜度(Maximum Complexity)不合格
2、原始碼思路及問題:
思路:首先建立一個總幹路列表,用於儲存在幹路的電器,裡面包括串並聯電路(列表),然後去解析三種資訊,串聯資訊,並聯資訊,調節資訊,
依次存進幹路或幹路中的分路,本題我採用分流的方式去計算電流等屬性,先計算總電流,然後透過實現一個介面讓電流流過總幹路,用電流乘以電阻
的方式去計算電壓,然後寫一個比較器用於排序,最後輸出即可。
問題:本次程式碼存在的問題就是對於並聯電路中還有並聯電路處理起來較麻煩,這樣時間複雜度比較大,程式碼效率低
三:踩坑心得:
第四次題目集:
①:
在本輸入樣例中,對於多選題的答案構成存在著許多坑,我以為只有A, B, C, D四種形式
於是我用以下資料進行測試
我改變了答案的輸出順序,發現輸出結果是
也就是說亂序也是對的,A,C與C,A結果是一樣的,但我還是過不去有關多選題的全部測試點
於是我用以下資料進行測試
這次新加了不存在的答案V,但我的程式碼確認為是半對的,正確的是全錯才對
對於選擇題還有一種測試點,就是答案數量超出A, B, C, D的情況,這也是我後來才考慮到的,以下為測試樣例及正確結果展示
本次題目集主要坑集中在選擇題上,填空題沒有什麼坑,不在過多贅述。
第五次題目集:
本次題目集的坑主要在開關的順序上,以下為樣例
①:
這個測試樣例考慮的就是開關在電器後面的情形,因為我在檢查通路時,是從前往後的,我只能應對開關在前面的情形,如果開關在後面,我是不影響前
面的電器的,正確的如下
於是我重寫了檢查通路這個方法,因為本次題目集只有幹路沒有分路,所以在檢查時,只要開關是斷開的,其他受控裝置的相關屬性就為0
下面的是一般樣例(針對本樣例)
第六次題目集:
由於加入了並聯電路導致本題的坑比較多
①:
第一個坑就在於判斷電路狀態上,以下是本樣例的輸出結果
分路的開關閉合了,但是幹路上的連續調速器卻是0,所以導致整個電路的受控裝置全為0
②:
第二個坑在於部分短路的情況
這次我按一般情況下計算電流,只有70多分,但這第二個坑我後來才想到,以下為測試結果
D1電器為0,這是因為在並聯電路中,一條分路只有開關的話,可以說這個並聯電路被短路了,那麼在分路的D1自然沒有任何電流
③:
經過前兩個坑,我就卡在了94分,最後兩個點一直過不去,直到測到了這個點,以下為修改之前與之後的結果
可以看出問題出現在誤差上,因為我是透過計算總電流,然後用電流乘以電阻的形式計算各個電器的電壓,這樣在計算並聯電路電阻時會出現小數,
此時就產生了誤差,然後計算的電壓就可能變小,針對這個問題,只需要在在計算並聯電路電阻時四捨五入即可。
四:改進建議:
第四次題目集:
1.針對判題方法:在本次題目集中,我每種題目的判題程式是寫在各自類中,但是這樣不方便修改,並且不清晰,我建議可以寫一個判題介面,然後
Title主類實現這個方法,然後選擇題等子類重寫這個方法,這樣更能體現單一職責。
2.針對主類:我主類程式碼120多行,太長了,許多邏輯應該建立一個類來實現,比如在判斷輸入的是哪種資訊時,我寫了5個if,以及在輸出時,一些、
Wrong Format格式問題也應寫在輸出類ViewPrint。
第五六次題目集:
第六次是第五次的迭代,所以我主要對題目集六改進:
1.針對並聯中有並聯:在本次題目集中,我用一個主列表表示幹路,裡面存著分路(列表)或一些幹路上的電器,但是這樣寫遍歷非常麻煩,我在遍歷
時需要先判斷是否為串並聯電路還是幹路上的電器,如果是串並聯電路,我又要遍歷到串並聯電路里面去,遍歷分路中的電器。如果並聯電路里面還
有並聯電路,那麼遍歷起來非常麻煩,時間複雜度就位O(n^3)了,效率太低,所以我建議用連結串列去寫,用連結串列去實現這種電路。
2.針對計算電流的方式:本題我是用分流的方式去寫,即先計算總電流(幹路電流),在用電流乘以電阻計算各部分電壓,但是這題目集的要求是在輸出
前所有的小數用double型別存,最後輸出時在截尾,那麼我這樣算就有誤差,最好按分壓方式算,就是透過電阻比的形式計算各部分電壓。
五:總結:
這三次題目集總共進行了5周,第四次的題目集迭代以及第五次的題目集較簡單,多花點時間就能寫出來,但是在題目集六,這次老師關閉了測試點提示,
最後兩個測試點找了很久都沒找出來,是與別人討論的過程中,他測出來了,並告知我問題出現在哪,我才能透過最後兩個測試點。這樣的教學顯然是有
利的,因為在實際工作中,這些問題本來就需要你自己去測出來,儘管非常痛苦且枯燥。對於老師的嚴苛教導,我非常感謝,老師主講設計模式,這些設
計模式才能體現我們的專業能力,簡單工廠模式,職責鏈模式等都需要我們掌握,但在這幾次題目集中我都未運用進去,這是這幾次題目集我的不足,今
後我要多加改善。
以上就是我針對三次題目集的Blog,感謝助教組和老師們的辛勤付出,感謝共同討論、分享的同學!