PTA題目集7-8的總結性Blog

章致诚發表於2024-06-28

一:前言:

1. 知識點總結:

①:遞迴的使用

②:java物件導向類和物件的基本用法

③:關聯類,依賴類和組合等類間關係

④:正規表示式的運用

⑤:介面的基本使用

⑥:Comparator介面及比較器基本使用

⑦:ArrayList的基本使用

2. 題量:

較少,每次題目集只有1題

3. 難度:

由於題量少,所以每次題目集難度較大,難點在於電路複雜多變的情況,這兩次題目集加入了多並聯及並聯包含並聯,這樣在計算電流時需要考慮區域性短路及斷路分壓

等特殊情況,這對於分流及分引腳電壓帶來了多種情況,當然這題的難度也不是太大,因為老師設計的測試點捨去了許多異常情況。

二:設計與分析:

第七次題目集:

1. 類圖設計:

這次包括主類我總共設計了22個類,6個介面,相較於上一次題目集我新新增了繼承自電器類的受控窗簾和互斥開關類,新增了判斷斷路,搜尋受控窗簾,獲取總亮度

和輸出介面,都是device類實現他們,然後子類去重寫。

2. 原始碼分析:

1、原始碼資訊:

程式碼行數:1351

語句行數:769

分支數佔總語句數百分比:23.8

方法呼叫語句數:346

註釋語句佔總語句百分比:11.0

類和介面數:18

最複雜函式的複雜度:36

平均深度:1.84

最大深度:6

平均複雜度:2.08

由上圖,紅色線表示當前的情況,在綠色範圍(所推薦的java良好程式碼,如平均複雜度在2.0-4.0之間)表示良好,可知當前程式碼在每個函式平均包含的語句個數

(Average Statements per Method),最複雜函式的複雜度(Maximum Complexity)不合格,其他方面較上次題目集有所改良。

2、原始碼思路及問題:

思路:首先在Main類中建立一條總幹路儲存串並聯電路及幹路電器,然後建立一個臨時列表用於儲存所有具體的電器裝置,這個臨時列表就是用於輸出所有電

器的狀態用的,然後解析三種輸入資訊,存到總幹路及臨時列表裡,然後計算電流及電壓,然後分流分壓,由於受控窗簾的狀態基於其他電器,所以單獨建立一個

類來計算電路的總亮度,然後透過搜尋受控窗簾介面給其賦值,由於本題新增了一個互斥開關,我就給互斥開關增加了兩個屬性,一個是計算時的狀態,一個是真

實狀態,因為如果只有1.3引腳接入電路,互斥開關真實狀態預設是閉合的,但這裡顯然是斷開的,所以真實狀態用於輸出,計算時狀態用於計算電流等,最後是輸

出, 利用Comparator的sort方法排序即可。

問題:本次程式存在許多多餘的介面,比如搜尋受控窗簾這個介面完全沒必要,統計電路總亮度可以用其他的方法,不需要單獨建立一個類和介面來統計,而且

我是device類實現這個介面,因為我想利用多型,但是實際上只有子類的串聯和並聯電路類才會用到這個介面,其他的子類完全用不到,但是還是要重寫,這就導致

整個程式非常冗長;其次,目前寫的這個程式是完全無法應對引腳電壓的,我只是讓電器分了電壓,但是他的輸入引腳電壓輸出引腳電壓具體是多少是無法求得的。

第八次題目集:

1. 類圖設計:

這次題目集相對於上次我刪去了搜尋受控窗簾及獲取總亮度這兩個多餘的介面,加上了判斷短路介面。

2. 原始碼分析:

1、原始碼資訊:

程式碼行數:1811

語句行數:1038

分支數佔總語句數百分比:27.9

方法呼叫語句數:526

註釋語句佔總語句百分比:11.3

類和介面數:19

最複雜函式的複雜度:50

平均深度:2.02

最大深度:8

平均複雜度:2.56

由上圖,紅色線表示當前的情況,在綠色範圍(所推薦的java良好程式碼,如平均複雜度在2.0-4.0之間)表示良好,可知當前程式碼在最複雜函式的複雜度

(Maximum Complexity),每個函式平均包含的語句個數(Average Statements per Method),類和介面數(Classes and Interfaces)

和最大深度(Max Depth)不合格。

2、原始碼思路及問題:

思路:首先在Main類中建立一條總幹路儲存串並聯電路及幹路電器,然後建立一個臨時列表用於儲存所有具體的電器裝置,因為這次加入了要輸出輸

入輸出引腳電壓,所以這次又新建一個列表用於儲存含兩個不同狀態的互斥開關,並且在device類加入了一個順序屬性表示引腳順序,因為電器引腳可能

反接,然後是在計算電路屬性時,我在計算電流時,所有的device子類重寫斷路,短路介面,輸入輸出電流介面,在遍歷時就是遞迴呼叫,所以不論並聯

裡面是否還是有並聯,透過這樣重寫來實現遞迴呼叫這個方法就可以遍歷各條電路,透過判斷斷路或短路及輸入輸出電流然後就可以正確地計算電流及電

壓;在計算總亮度時,因為我們之前用了臨時列表存了所有的電器,直接在輸出之前遍歷即可,然後再將值賦給受控窗簾,其他的跟上次題目集邏輯差不多。

問題:最後一次題目集我儘管得了96分,但設計十分失敗,因為我的程式碼寫了1800多行,十分冗長,並且沒有處理很多的異常,另外一名同學在主函式

只寫了try,catch處理了一些異常,並且程式碼只有1200多行,他在設計時是用連結串列寫的,對了兩個引腳設計的更能體現題意,我只是取巧,透過在device類

加一個順序屬性表示兩個引腳,順序表示1-2引腳連線,逆序則2-1引腳;

三:踩坑心得:

第七次題目集:

①:

在本輸入樣例中,在輸出順序存在著坑,就是B2與B12應該按著什麼順序輸出按照之前的寫法是B12在後面,因為12比2大嘛,但是這樣寫的話,就會錯以下

測試點:

於是後來與同學討論得知是按字典序排序,即B2在後面,這樣便順利透過了以下測試點,以下是正確的輸出結果:

②:

在本輸入樣例中,互斥開關只有1-3引腳接入電路,這條路是斷開的,但是此時坑就在這裡,因為此時互斥開關的實際狀態是閉合的,所以這條路如何判斷就成為

了問題,因此在處理這個問題的時候,我就給互斥開關設定了兩種狀態,一個是計算時狀態一個是輸出時狀態,就是如果是1-3引腳計算狀態初始時都是斷開的,而

1-2引腳初始計算時狀態就是閉合的,然後不管是1-2還是1-3他們的初始輸出時狀態都是閉合的,在調互斥開關時,兩個狀態都要調,這樣就解決了這個坑,以下是

正確的輸出結果:

儘管互斥開關時閉合的,但未調互斥開關的話1-3就是斷開的,所以D1的值為0;

③:

在以上樣例中,坑就是在於判斷並聯是否斷路這裡,在並聯電路中,若所有的分路都是斷開的,則該並聯電路時斷路的,我之前只判斷了串聯電路的斷路狀態,並未判

斷並聯電路的斷路狀態,以下是正確的輸出結果:


因為兩條分路都是斷開的,所以整個電路就是斷開的。

第八次題目集:

本次題目集的坑主要在於引入了輸入引腳和輸出引腳電壓之後造成的,以下是多個點

①:

第一個坑就是受控窗簾的問題,在之前的題目描述中,若電壓為0,那麼受控窗簾的開啟程度為100%,但是在這次題目集就不是這樣了,若電壓小於50,受控窗簾為0%,

透過我和同學們的測試,明確這就是32這個測試點,就考這一點:

以下為正確的輸出結果:

②:

在這個測試點中就產生了一個問題,這個並聯分路全是開關,說明這兩條分路都是短路的,那麼怎麼分流呢,我之前並未處理這個問題,實際上他是均分的,比如,三條分

路全是短路的則電流均分為3,那麼會對什麼產生影響呢,就是電流超限,如果沒有均分,而是全集中在一條分路上,那麼可能對於這個開關電流就超限了,在輸出時就要輸

出“exceeding current limit error”,以下是本例正確的輸出結果:

四:改進建議:

由於第八次是第七次的迭代,我就只說明第八次的改進建議。

第八次題目集:

1.針對程式碼冗長問題:在第八次題目集中,我足足寫了1800多行,按照老師所述,這題最多1000左右,而我的程式碼太過冗長,首先是主類,我寫了40行,經過與其他同學討論

可以在主類只寫try-catch程式碼塊,try裡面有兩行,一行建立一個類處理輸入,第二行處理輸出即可,catch用於處理異常;其次在解析輸入時,有多少個電器我就寫了多少

個if這是不對,這會造成很高的圈複雜度,使得程式碼難以維護及理解,應該用多型才對,因為所有電器都是繼承自device類。

2.針對電流計算方法:這題我是透過分流來寫的,就是先計算總電流,然後乘以各個電器的電阻從而得出各個電器的電壓,這樣寫的誤差其實是比較大的,因為在計算並聯電阻

時,會算出無限小數,那麼在傳值時計算的總電流就有誤差,我是透過保留6位小數並四捨五入來減小了這個誤差,但若用分壓的寫法,就可以明確哪一部分電壓是多少,透過電

阻來分壓。

五:總結:

這二次題目集總共進行了3周左右,這兩次題目集的難度明顯高於前面兩次,因為要處理多種複雜的電路狀態,比如斷路分壓問題,就是並聯電路中一條斷開一條連通,但是斷

開的電路是有輸入引腳電壓和輸出引腳電壓的,儘管電壓為0,那麼在賦電壓時就需要考慮在什麼情況這樣處理,以及遍歷到這個斷路;這兩次題目集我與同學們討論較多,可以

說是共同完成了這兩次PTA中不少難的測試點,確實,有時候一個人還真不一定能想到某個測試點,大家共同討論來解決這個問題,讓我收穫頗多,比如一位同學丟擲異常使其非

零返回,為了測試哪裡出了問題,這都是值得我學習的,運用多方面的知識來解決問題。

六:課程的建議及意見:

本門課程就像老師一開始所說,是有挑戰的,也確實如此,但這樣讓我們學會了許多東西,有時可能在晚上12點左右還在與同學討論P他的題目,鍛鍊了我們的抗壓能力及共同

解決問題的能力,這是一種新奇的體驗,因為在高中,我覺得這樣的討論機會比較少;對於這門課程我的拙見是:在課程引進一些最新的技術,來增加我們的知識面,還可以搞一

些程式設計競賽或者設計競賽,選程式設計能力強的或者設計思路較好的來分享經驗。

以上就是我針對七八次題目集的Blog,感謝助教組和老師們的辛勤付出,感謝共同討論、分享的同學!

相關文章