PTA大作業 家居強電電路模擬7-8 第三次總結Blog

ming_oo3發表於2024-06-29

**前言**

  家居強電電路模擬7-8是物件導向課程的最後兩次大作業,難度相比於前面幾次的大作業也是最大的,尤其是大作業8。當然毋庸置疑的是,PTA大作業不僅是對我們所學知識的一次全面檢驗,更是對我們程式設計能力和邏輯思維的一次深度錘鍊。

  在家居強電電路模擬程式中,每一個“傢俱”都可以被抽象為一個物件,它們各自擁有獨特的屬性和方法,就像真實的傢俱那樣擁有電流,電阻和電壓。而強電電路的模擬,則需要我們理解物件間的關聯與互動,如何在不同的條件下做出合理的響應。然而,家居強電電路的模擬並非簡單的物件堆砌。更重要的是,我們需要理解這些物件之間是如何相互關聯、相互作用的。當電路中的某個傢俱的電流發生變化時,其他傢俱的電流、電壓和電阻可能會隨之產生變化。如何在這樣的動態系統中確保電路的穩定性和安全性,就需要我們具備深厚的物件導向程式設計知識和高超的程式設計技巧。

  這種關聯和互動的思考方式,正是物件導向程式設計所要培養的核心能力。透過不斷地分析、設計和實現家居強電電路模擬程式,我們學會了如何運用OOP的思想來分析和解決問題。我們學會了如何將複雜的問題分解為簡單的物件,學會了如何定義物件之間的關聯和互動,學會了如何在不同的條件下讓物件做出合理的響應。

**設計與分析**

題目大致資訊如下:

家居強電電路模擬程式
分數 100
作者 蔡軻
單位 南昌航空大學

智慧家居是在當下家庭中越來越流行的一種配置方案,它透過物聯網技術將家中的各種裝置(如音影片裝置、照明系統、窗簾控制、空調控制、安防系統、數字影院系統、影音伺服器、影櫃系統、網路家電等)連線到一起,提供家電控制、照明控制、電話遠端控制、室內外遙控、防盜報警、環境監測、暖通控制、紅外轉發以及可程式設計定時控制等多種功能和手段。與普通家居相比,智慧家居不僅具有傳統的居住功能,兼備建築、網路通訊、資訊家電、裝置自動化,提供全方位的資訊互動功能。請根據如下要去設計一個智慧家居強電電路模擬系統。以下題目介紹中加粗的部分為本次迭代在“家居強電電路模擬程式-3”的基礎上增加的功能要求。

  家居強電電路模擬-3分析

  家居強電電路模擬-3是在上一次的大作業中實現進行了迭代,出現了多條並聯電路的情況的同時,加入了互斥開關這一新的控制裝置。好在在上一次的PTA作業中,我在程式碼中已預留了容納多條並聯電路的修改空間,因此這次大作業並不是很複雜。

  家居強電電路模擬-3類圖設計如下:

  

  家居強電類比電路中,由於並聯電路中的串聯線路的電壓需要由並聯線路進行一次傳遞,無法像普通用電器一樣一次賦值即可在類內部工作,因此在為主線路的並聯電路分配相應電壓後,還需再呼叫並聯電路的方法為在其中的每一條串聯電路分配電壓。所幸在家居強電類比電路-3中,由於確定並聯中不會出現進一步並聯,因此在分配電壓時無需進行多次迴圈去保證每一條電路都能分得電壓。

  在實現功能方面,我還是採用使用Agent類幫助分清功能,比如:analyse方法用以記錄電路資訊,同時在記錄的時候就計算相應串聯、並聯電路的電阻;setController方法用以記錄用電器資訊,完成用電器的初始化;work類用以計算電壓分配,實現電路狀態的變化;display類用以實現結果的輸出。透過Agent類呼叫不同的用電器類,控制裝置類和線路類即可實現要求。

  在考慮互斥開關時,其實可以把它當作兩個帶電阻的普通開關,相比與普通開關,它只需要多考慮新的引腳資訊即可:在識別到1,2引腳時,讀取開關狀態,呼叫1,2引腳的特定檢視狀態方法,如果是未閉合(0),即返回1,反之則返回0;識別到1,3引腳時,讀取開關狀態,呼叫1,3引腳的特定檢視狀態方法,如果是閉合(1),即返回1,反之則返回0。需要特殊考慮的就是互斥開關也擁有相應電阻,在計算串聯電路電阻時需要考慮。

  家居強電電路模擬-4分析

  家居強電電路模擬-4中出現了上一次所提及的並聯電路中出現並聯電路的情況,相比與前幾次,這種特殊情況更加的複雜,需要考慮線路之間電壓的多重傳遞,難度驟然加大;除此以外,新增的需求輸出管腳電壓也很麻煩,由於之前沒有考慮到出現這種需求,因此並未設定一種用於記錄電壓在各個管腳之間變化的引數和方法;電流警告資訊也同理,不過相對於管腳電壓比較簡單。

  家居強電電路模擬-3類圖設計如下:

  在家居強電電路模擬-4中,為了解決多重並聯帶來的電壓分配問題,我使用了一個陣列用來儲存串聯電路編號,即:在主線路中尋找並聯電路,並記錄其內部串聯線路的編號,然後依據編號,將編號內的串聯線路按照主線路來考慮,進一步計算其並聯電路電壓,再記錄其並聯電路的編號用以後續計算,以此類推直至沒有更進一步的並聯電路。

  而在關於管腳電壓方面,由於一開始並沒有考慮相關問題,因此我不得不設定一個新的引數來記錄管腳電壓的變化情況。管腳電壓在每次為用電器或者控制裝置設定初始值的時候都會在管腳電壓自身基礎上減去用電器消耗的電壓。在碰見串聯電路和並聯電路資訊時,為串聯和並聯電路中的記錄管腳電壓的變數賦值即可。

  新增的二極體可以直接視作是一個狀態鎖定的開關,如果讀到引腳順序為先1後2,則閉合,反之則開啟。依照這種方法即可實現二極體的使用。

**踩坑心得**

  家居強電電路模擬-3相比之下測試點強度一般,再加上上一次大作業預留了修改的空間,簡單修改後就可以透過大部分測試點,只剩下3個測試點過不去:

  簡單思考後,我認為是沒有考慮到編號大於10的情況,但修改後非零返回消失,錯誤型別變為了答案錯誤;在此之後,我測試了許多樣例,都沒能找到問題的所在。後來與班級同學討論後發現,原來在最後輸出的時候並不是按照編號大小順序輸出,而是按照字典序進行排序的。修改輸出方法後即可。

  家居強電電路模擬-4是最複雜的一次大作業,不僅增加了並聯中含並聯的情況,還增加了更多的輸出資訊,這使得程式碼的編寫更加困難。

  由於最後一次大作業未獲得滿分,因此只從可能的錯誤角度來分析。

  1.管腳電壓計算有誤

  在我的程式設計中,控制器的管腳電壓由傳入電壓和控制器狀態來計算輸出電壓,而用電器的輸出電壓由傳入電壓和用電器分配的電壓相減得到,而有的控制器比如互斥開關既受到控制器狀態影響,又含有電阻,容易導致管腳電壓計算出錯。

  2.多重迴圈後尋找並聯電路中的串聯線路重複導致出錯

  在迴圈以實現多重並聯電路的計算時,由於所有串聯電路編號儲存在統一陣列中,可能會由於重複計算導致線路電壓分配錯誤,導致輸出結果錯誤。

  3.仍有部分電器未使用字典序排序

  由於字典序的排序方法與我一直以來的排序方法不同,修改起來極其麻煩,因此我未修改所有裝置的排序方法為字典序,這可能也是我的錯誤問題之一。

  4.串聯線路是否聯通判斷不清

  由於新的計算管腳電壓要求不能對於不接通的串聯電路直接賦值電壓為0,因此可能會出現電路不接通但用電器工作,或者電路接通但用電器不工作的情況,進而導致管腳電壓輸出錯誤。

**改進建議**

  1.函式職責不單一

  Agent是函式的主體功能的控制類,雖然它已經被分為了多個函式來實現不同的功能,但某些函式仍然承擔了過多的職責,這導致了程式碼結構的複雜性。比如,在“分析”函式中,不僅包含了分析電路資訊的功能,還混入了用電器的初始化和線路電阻的計算。同樣,在“設定控制器”的函式中,除了設定控制器的引數外,還負責更新控制器的狀態。

  2.沒有留有足夠的修改空間,後續新功能加入困難

  在最後一次的大作業中需要加入的管腳電壓,由於沒有考慮過並且函式設計相對死板,沒法直接加入計算的方法,只能修修補補才勉強實現管腳電壓的計算,並且在管腳電壓的計算中還會出錯。而上一次由於考慮了並聯電路的情況,因此在家居強電電路模擬-3中就可以簡單修改後即可實現功能。在今後的程式碼設計中,也要充分考慮未來新需求增加的可能性,實現功能的隨時增加。

  3.抽象類使用不夠靈活

  首先,沒有將這些共有方法放在抽象類中意味著每個控制器類都需要單獨實現這些方法,這會導致大量的重複程式碼。這不僅增加了程式碼的長度,也使得程式碼的維護變得困難。每當需要修改這些共有方法的行為時,開發者需要在每個控制器類中分別進行更改,這很容易引發錯誤和遺漏。

  其次,對於部分控制器帶有電阻等用電器特有的屬性,如果界定模糊且沒有寫入抽象方法,這會導致程式碼的可讀性和可維護性降低。這些特有的屬性可能只在某些控制器中有意義,但在其他控制器中卻毫無用處。將它們作為控制器類的成員變數或方法可能會讓其他開發者感到困惑,不清楚這些屬性和方法的具體用途和適用範圍。

**總結**

  

  在本次專案中,我首先根據題目要求,對家居強電電路模擬系統進行了詳細的分析和設計。透過構建類圖,明確了系統中各個類的屬性和方法,以及它們之間的關聯和互動。在程式設計實現過程中,我採用了物件導向的設計思想,將每個“傢俱”抽象為一個物件,透過封裝屬性和方法來實現物件的獨立性和可擴充套件性。

  在迭代過程中,我遇到了多重並聯電路、互斥開關、二極體等新功能要求的挑戰。針對這些挑戰,我採用了不同的策略和方法進行解決。例如,對於多重並聯電路帶來的電壓分配問題,我使用了陣列來記錄串聯電路編號,並透過遞迴的方式實現了電壓的逐層分配。對於互斥開關和二極體等特殊控制裝置,我透過增設狀態標誌和引腳檢測方法來實現其特殊功能。

  經過多次迭代和除錯,我成功實現了家居強電電路模擬系統的主要功能,並達到了題目要求的各項效能指標。在程式設計過程中,我不僅學會了如何運用物件導向的設計思想來解決問題,還掌握了多種程式設計技巧和方法,如遞迴、封裝、多型等。同時,我也深刻體會到了團隊合作和溝通交流的重要性。

  雖然本次專案取得了較為滿意的成果,但仍存在一些不足之處。例如,在程式碼最佳化和效能提升方面還有很大的提升空間;在功能擴充套件和介面設計方面也有待進一步完善。未來,我將繼續深入學習物件導向程式設計和智慧家居系統的相關知識,努力提升自己的程式設計能力和創新能力,為智慧家居領域的發展貢獻自己的力量。

**寫在最後**

  P他的所有作業已經全部完成了,這不僅僅是一個簡單的任務完成通知,它更是我這一段時間裡辛勤付出、不懈努力的結果的見證。回想起在PTA上的每一次作業提交,我都彷彿能看到自己深夜挑燈夜讀、不斷嘗試、不斷修正的身影。每一個問題、每一個難點,都像是我在學術道路上的一個個小障礙,而每一次的克服,都讓我更加堅定自己的信念,更加確信自己能夠走得更遠。

  如今,所有的作業都已經完成,我感到了一種前所未有的輕鬆與自由。但同時,我也清楚地知道,這只是一個階段的結束,更是下一個階段的開始。下週,我將迎來期末考試,這是對我這一學期學習成果的一次全面檢驗。

  面對即將到來的期末考試,我充滿了期待與信心。因為我知道,我已經做好了充分的準備,我已經在PTA上鍛鍊了自己的能力和技巧。我相信,只要我保持冷靜、沉著應對,我一定能夠取得優異的成績。

 

相關文章