題目集4-6次PTA大作業總結

望川凝發表於2024-06-09

前言:

總結4—6次PTA大題目題目集的知識點、題量、難度等情況。

  • 知識點:在原先的基礎上題目四依舊是前三個題目的迭代,我個人認為這些題目集難處主要集中在正規表示式的運用以及對整體結構的設計等方面。題目集的最後一個大題都要求了考察物件導向程式與設計中的單一職責原則,迪米特法則和對類的設計,類設計的模板格式、正規表示式的熟悉和使用,而除卻題目集四之外,題目集五和六開始加入了抽象類、介面設計考察里氏替換原則而且要求開閉原則的熟悉使用以便進行迭代以提高程式碼穩定性和擴充套件性。
  • 題量和難度:我覺得題目雖然說一星期只有一道題,但就難度來說確實有點大,而且題目沒看個二十來分鐘是完全不能夠準確地進行類的設計和程式碼結構設計的,而我依舊是對於正規表示式依舊沒能熟練掌握,很多情況下不知道應該如何將輸入框的內容進行分割,這使得我感到難度增大。對於新增加的電路系列題目集來說,我個人認為給予足夠的時間應該是可以寫出來的,因為電路題目集的第一個題目在我接觸之後我心裡面是有一種能夠寫出來的感覺的,但是基於前幾次PTA大題的失利對我造成了嚴重的打擊,認為自己就是不能夠寫出來,而此時段老師給予我們鼓舞讓我敢於再次嘗試,嘗試後發現這題目雖難,尤其是對於正規表示式這一塊,但整體而言如果再給我點時間並與同學一起討論的話我有信心做出來,但由於我起步太晚導致我依舊沒能寫出來,這也算是一個小遺憾,但我在題目集結束過後我依舊進行構造最後也是成功寫了出來。雖說我的PTA沒成績但總的來說。

設計與分析:

  • 第四次大作業第一題
    7-1 答題判題程式-4
    與前三次相比,第四次答題判題程式新增內容為:
  1. 輸入選擇題題目資訊
    題目資訊為獨行輸入,一行為一道題,多道題可分多行輸入。

2.輸入填空題題目資訊
題目資訊為獨行輸入,一行為一道題,多道題可分多行輸入。

3.輸出順序變化
只要是正確格式的資訊,可以以任意的先後順序輸入各類不同的資訊。比如試卷可以出現在題目之前,刪除題目的資訊可以出現在題目之前等。

經過第三次未達標轉而來到第四次時,難度無疑是斷崖式的提升,較第三題而言此題變得更加神秘莫測,據說眾多選手都在此栽了跟頭,而且我也是沒看懂題目的意思,只是大概懂了一些內容,並不能夠完全將其理解透徹,還是跟第三次作業一樣的原因並不能夠對原始碼進行擴充套件。而且由於第三題的失利導致我對其產生了畏難心理,故而只花了很少的時間在這給題目上面。

  • 類圖設計



根據資料和雷達圖分析:
檔案大小: 443行程式碼,是一個相對較小到中等規模的Java檔案。

複雜度: 平均複雜度為4.00,表明大部分方法結構較為簡單。

最大複雜度: 最複雜的方法是Main.main(),複雜度為9,這意味著它是程式中最複雜的部分。

註釋比例: 程式碼註釋比例為2.0%,仍然偏低,增加註釋有助於提高程式碼可讀性。

方法平均長度: 平均每個方法8.63條語句,表明方法設計較為緊湊,不過度膨脹。

關鍵的和建議
Main.main()方法複雜度: 作為入口點,複雜度高達9,可能存在過度集中問題。考慮將其中的功能邏輯拆分為更小的輔助方法,以提高可讀性和可維護性。

註釋缺乏: 繼續強調,儘管程式碼量不大,但註釋的缺乏仍然是一個需要注意的問題。對關鍵邏輯、類、方法的意圖和複雜運算進行註釋,有助於未來理解和維護。

控制流: 最大塊深度為4,雖然不算太深,但出現在Main.main()方法中,提示可能存在多層邏輯巢狀。簡化控制流程,減少巢狀層級,有助於提升程式碼清晰度。

方法分佈: 專案包含3個類,平均每類2.67個方法,表明類設計較為簡潔。然而,具體到每個方法的複雜度和長度,還需逐一審查,確保它們遵循單一職責原則。

模組化設計:每個類專注於自己的職責,如Question處理題目資訊,TestPaper管理試卷內容,這樣的設計使得程式碼易於理解和擴充套件。

使用列舉型別:透過定義QuestionType列舉,清晰地區分不同型別的題目,增加了程式碼的可讀性和型別安全性。

虛擬碼邏輯清晰:雖然提供的程式碼主要是框架和邏輯概述,但它清晰地展現了處理不同型別輸入(單選、多選、填空題、試卷、學生資訊、答題卡等)的邏輯,為實現具體功能提供了明確的方向。

  • 總結分析
    程式碼問題:主要原因還是對於正規表示式的不熟練,類的設計過程中並未遵循開閉原則,即一個類應該對擴充套件開放,對修改關閉。對於類的設計不夠熟練,雖說在補錄中成功攻略第一題但我到現在為止任然透過不了測試點,連基本的測試的輸出都不能列印出來一個樣例,不能將其基本掌握的問題。
    同時我也發現我應該從總體出發,構建一個基本的框架,進而一開始的時候只需要進行擴充套件類的數量就夠了,而非在原始碼上進行修改。

  • 第五次大作業第一題
    “家居強電電路模擬程式一”

    • 答題判題程式-5
      本題設計圍繞著電路聯通的設計而來,要求我們分別設計
  • 控制裝置模擬

  • 本題模擬的控制裝置包括:開關、分檔調速器、連續調速器。

開關:包括0和1兩種狀態。

開關有兩個引腳,任意一個引腳都可以是輸入引腳,而另一個則是輸出引腳。開關狀態為0時,無論輸入電位是多少,輸出引腳電位為0。當開關狀態為1時,輸出引腳電位等於輸入電位。

分檔調速器
按檔位調整,常見的有3檔、4檔、5檔調速器,檔位值從0檔-2(3/4)檔變化。本次迭代模擬4檔調速器,每個檔位的輸出電位分別為0、0.3、0.6、0.9倍的輸入電壓。
連續調速器

沒有固定檔位,按位置比例得到檔位引數,數值範圍在[0.00-1.00]之間,含兩位小數。輸出電位為檔位引數乘以輸入電壓。
所有調速器都有兩個引腳,一個固定的輸入(引腳編號為1)、一個輸出引腳(引腳編號為2)。當輸入電位為0時,輸出引腳輸出的電位固定為0,不受各類開關調節的影響。

所有控制裝置的初始狀態/檔位為0。

控制裝置的輸入引腳編號為1,輸出引腳編號為2。

  • 受控裝置模擬

本題模擬的受控裝置包括:燈、風扇。兩種裝置都有兩根引腳,透過兩根引腳電壓的電壓差驅動裝置工作。

燈有兩種工作狀態:亮、滅。在亮的狀態下,有的燈會因引腳電位差的不同亮度會有區別。
風扇在接電後有兩種工作狀態:停止、轉動。風扇的轉速會因引腳的電位差的不同而有區別。
本次迭代模擬兩種燈具。

白熾燈:

亮度在0~200lux(流明)之間。
電位差為0-9V時亮度為0,其他電位差按比例,電位差10V對應50ux,220V對應200lux,其他電位差與對應亮度值成正比。白熾燈超過220V。
日光燈:

亮度為180lux。
只有兩種狀態,電位差為0時,亮度為0,電位差不為0,亮度為180。
本次迭代模擬一種吊扇。

工作電壓區間為80V-150V,對應轉速區間為80-360轉/分鐘。80V對應轉速為80轉/分鐘,150V對應轉速為360轉/分鐘,超過150V轉速為360轉/分鐘(本次迭代暫不考慮電壓超標的異常情況)。其他電壓值與轉速成正比,輸入輸出電位差小於80V時轉速為0。

  • 設計類圖

  • 14個類設計
    1.ElectricLoad類設計用於封裝電路負載的相關資訊,如引腳編號、電壓、名稱及從名稱中提取的數字序號以及負載的工作狀態。這種設計有利於在類比電路系統軟體中,以物件導向的方式處理和操作電氣負載物件。透過getter和setter方法,外界可以安全地訪問和修改這些屬性,而isNum()這樣的輔助方法則提供了從負載名稱中提取額外資訊的能力。
    2.Control抽象類的設計目的是為不同的電路控制策略提供一個統一的介面和基礎框架。透過定義changeState和loadVoltage這兩個抽象方法,強制要求所有繼承Control的子類實現如何改變負載狀態和如何獲取負載電壓的邏輯。這在設計複雜的電路控制系統時非常有用,可以確保所有控制類遵循相同的基本互動模式,同時允許它們根據具體需求實現各自獨特的功能。
    3.Agent類起到了一個協調者或控制器的角色,它利用DataDeal提供的資料,組織和配置電氣系統的各個元件(負載),並依據操作指令調整這些元件的狀態。這一過程體現了物件導向程式設計的思想,透過抽象和封裝,使得系統各部分職責清晰,易於理解和維護。


根據資料和雷達圖分析:

  • 檔案大小: 590行程式碼,屬於中等規模的Java檔案。

  • 複雜度: 平均複雜度為2.00,表明大多數方法相對簡單,易於理解和維護。

  • 最大複雜度: 最複雜的方法為Agent.initialize(),複雜度為24,這可能是程式碼審查和最佳化的重點。

  • 註釋比例: 程式碼中的註釋佔比非常低(1.5%),增加註釋對於提高程式碼可讀性和維護性很重要。

  • 方法數量: 平均每個類有5.21個方法,表明類設計較為均衡。

關鍵點和建議:

  • 複雜度集中: Agent.initialize()方法是最複雜的,具有最高的複雜度(24)和最多的語句(37),這可能是效能瓶頸或維護難題的來源。考慮重構此方法,將其分解為更小、更易管理的子方法。

  • 註釋缺失: 程式碼的註釋率極低,強烈建議增加方法、類及複雜邏輯段落的註釋,以提高程式碼的可讀性和團隊協作效率。

  • 塊深度: 最大塊深度達到6,意味著某些邏輯巢狀較深,這可能降低程式碼的可讀性和可維護性。儘量減少巢狀,透過提前返回、方法抽離等方式簡化控制流。

  • 方法大小: 平均每個方法2.89條語句,較為理想,但注意少數方法如dealPins()、dealOperations()等較長,也值得審視是否有重構空間。

  • 類和介面: 14個類和介面,表明系統分解得當,但需確保每個類都遵守單一職責原則,避免職責過載。

第五次大作業第二題
家居強電電路模擬程式-2
新增串並聯電路模式,並迭代了一個落地扇,
且迭代考慮電阻:白熾燈的電阻為 10,日光燈的電阻為 5,吊扇的電阻為 20,落 地扇的電阻為 20
透過增加電阻和串並聯相結合的形式來改變各分路之中的電壓進而改變其工作的轉速、亮度等數值。
但遺憾的是不會處理其電壓之間的關係
如圖所示:

  • 總結分析:
    從本次看來,自己沒有很好的實現開閉原則,還是在程式碼裡面進行的修改,(直接透過上一個題目集進行擴充套件)自己的設計沒有非常合理,按照自己的初衷,自己僅需要擴充幾個子類即可實現程式的實現,下次程式碼需要好好設計。

踩坑心得:

  • 1.對於電路題目集1中的問題中,我在處理其輸入資料的時候
    我先建立了一個LinkedHashSet物件set。LinkedHashSet是一種特殊的集合,它不僅不允許重複元素,還維護了元素的插入順序。
    Set set = new LinkedHashSet<>(names);
    而後,清空原來的names列表,這是為了準備填充去重後的結果。
    names.clear();
    最後,將set中的所有元素新增回names列表。因為set中已經去除了重複項,所以這樣操作可以保證names列表中的元素都是唯一的,且順序與初次新增時相同。
    names.addAll(set);
    返回去重後的列表: 完成上述步驟後,方法返回去重後的names列表。

  • 很明顯這給步驟有點兒重複了。
    改進方法可以為:
    在向names列表新增元素之前,
    透過 if (!names.contains(name))
    檢查該名稱是否已存在於列表中,以此來避免重複新增。這種方式雖然沒有直接使用集合的去重功能,但邏輯相對直觀,易於理解。
    如圖所示:

改進建議:

  • 1.我們的題目集最後一題都是採取的迭代型別,故而我們應該嚴格遵循著我們的java七大設計原則,無論是單一職責原則,還是開閉原則,亦或是迪米特法則等等我們都需要在我們類的設計中圍繞著它們進行設計並以此進行結構框架的構建。而最為重要的便是理清設計思路,正所謂一個好思路可以抵過大量的重複程式碼,思索一個好思路也更好讓我們對於題目進行進一步的理解,並在思索時對問題抽絲剝繭,一步步剖析問題的本質,進而讓我們進一步理解物件導向程式與設計這門課程。

  • 2.根據我們題目要求的行為考慮到我們眾多類之間存在著什麼關係:是依賴?關聯?聚焦?還是泛化?
    許多的行為我們都可以單獨拎出來,而非是放在單獨某個固定的類中,就比如說我們對資料處理的這個過程就完全可以單獨拿出來獨自成為一個處理資料的類,進而減少元件之間的耦合性。

  • 3.註釋偏少,600行的程式碼1.5%的註釋確實是很少,日後如果還是這樣子的程式碼,完全不利於他人理解,這樣就不利於團隊之間的溝通和聯絡,在這方面確實值得改進。

總結:

  • 1.透過此次三大作業的實踐操作和練習,我相信只要認真寫了的同學都對於正規表示式有了一個更深的理解和認識,但對於我來說正規表示式卻還是一個難點,我在有些時候仍就不能對輸入的內容進行正確的分割,這樣警醒著我要加強這方面的學習理解。

  • 2.在我們的學習方面應熟悉更多方法,如String裡面的contains方法、Map類裡面的clear()方法、Set類裡面的contains()方法,以及使用StringBuffer裡面的如append()、insert()、delete()、replace()等方法,使得字串的構建、修改和操作變得非常靈活方便。

  • 3.對於題目集的解題思路,我覺得還是有必要給同學們更為詳細的解答過程,有時候老師發來的思路有某些地方對於同學們並不友好,而且類圖中並無註釋。

  • 4.對於課程而言,我們確實需要學習極其多的知識,掌握極其多的方法和技巧,而更重要的是打好相應的基礎,只有基礎足夠牢固,我們才能進一步地提升自己的程式設計能力。故而我建議大家可以去B站、mooc等眾多學習軟體上進行相應知識的擴充和補充。

相關文章