OOP第7-8次作業總結

夜暮之风發表於2024-06-29

前言

時光飛快, 轉眼就到了學期末尾。從第七次作業開始,作業便開始加難度了。第七次作業加了互斥開關和窗簾,但是這次的電子元件不能像之前簡單的寫如同寫商品類這樣簡單的寫出,需要思考如何設計這個電器類。並且,在加上上面兩個類的基礎上,電路開放了串聯電路中有串聯電路以及幹路上存在多個並聯電路的電路情況。這就要思考如何設計用來檢查開關、電阻以及電壓的方法。而第八次作業開放的電路情況是並聯電路中包含並聯電路。也就是用遞迴的方法對開關、電阻以及電壓進行處理。

分析:

<1>

設計與分析:

互斥開關,也就是單刀雙擲開關,需要考慮它的刀頭在執行完操作之後到底接到了哪一條支路上。當然,這只是當互斥開關兩端都有連線到電路的情況。如果它只有一端有連線電路,那麼它便與普通的開關並無一二。於是,我便先new了電路類,再new了互斥開關,並把電路根據2、3引腳用HashMap儲存。如果HashMap的size等於1的話,那麼它便相當於普通的開關,當然,如果HashMap的size等於2的話,便根據設定的刀頭屬性是2還是3,那麼HashMap中key值為3或2便是斷路,同時,因為互斥開關只可能在主幹路上或者在串聯電路上,所以寫開關檢查方法的時候只用檢查主幹路上和串聯電路便可以了。
同時,電路開放的串聯電路中有串聯電路以及幹路上存在多個並聯電路的電路情況將電路結構分成了兩層。就像吃多層蛋糕一樣,我們會從最高層開始逐步往下吃,新加的電路情況也要先計算完串聯電路中的第二層串聯電路上的開關、電阻以及電壓情況。再計算第一層串聯電路上的開關、電阻以及電壓情況。當時為了圖簡便,直接在上次程式碼把不同的電路種類一依次迴圈計算的基礎上,在串聯電路的外面再加入一層的迴圈使它完整執行兩遍,便能處理出來。
image
image

踩坑心得:

1.未思考清楚,因為寫程式碼時把電路分為了主幹路、並聯電路、串聯電路三種類,所以下意識的把主幹路從串聯電路中分離出來,導致對主幹路進行開關檢查的時候跳過了主幹路上的串聯電路斷開的情況。
image
2.在進行開關檢查時開始的判斷方法是獲取電路的名字後去除它後面的數字,如果剩餘的字串是“T”,那麼便是串聯電路。但是,因為我的主幹路在new時並沒有把它的名字一併存進,所以它的名字屬性的字串為null,導致非零返回。所以把判斷條件改為電路名字是否為空。
image
3.忘記了電子元件是按名字序號進行順序輸出的。最開頭按照先後出現順序把新加的電子元件存入HashMap中。後面把key值改為了名字序號變好了。
4.沒看清楚題目要求,“當電壓低於50V,窗簾不工作,預設為全開狀態。”這點在窗簾的開啟程度計算中漏掉了沒寫。
5.計算精度損失。因為窗簾的開啟程度計算是根據整個電路上的所有燈的亮度總和來進行判斷計算的,所以在計算燈亮度總和時,因為把double型別的資料強制轉換成int型別,一次次迴圈把誤差變得有點大,導致窗簾的開啟程度出現了偏差。

改進建議:

這也是當然當時也沒考慮清楚,其實這時的電路就應該必須採用遞迴的方法對開關、電阻以及電壓進行處理。因為這時的電路就已經不是單純的二層電路了。它已經有串聯電路中含串聯電路中含串聯電路,串聯電路中含串聯電路中含串聯電路中含串聯電路的電路情況,再進一步,串聯電路中含串聯電路中含串聯電路······這樣可以無窮多層。可能這次pta沒過的測試點也有三層的情況。

<2>

設計與分析:

第八次作業開放的電路情況是並聯電路中包含並聯電路,也就是說,不能簡單的把不同的電路種類依次迴圈計算,第七次還好,只是加上了串聯電路中有串聯電路,還能透過迴圈大致完成,但是加入了並聯電路中包含並聯電路的第八次作業就不是簡單的加迴圈能解決的了。在各種電路中都可能包含並聯電路和串聯電路的情況下,如果要那樣寫會寫的十分複雜。所以毫無疑問的選擇了用遞迴進行解答。然後,因為無論是在電路閉合斷開檢查還是在電阻電壓計算方面,主幹路因為本質上就是串聯電路,所以主幹路和串聯電路的電路閉合斷開檢查方式還是在電阻電壓計算方式都十分的相近。所以我又新建了個電路類,三類電路繼承至電路類。這樣便能透過new一個電路類來調取屬於電路的方法,可以把電路閉合斷開檢查還是在電阻電壓計算中的主幹路和串聯電路情況合併到一起。
這次作業除了加入了並聯電路中包含並聯電路的情況,還加入了二極體、電流超限警告和輸出形式修改。其中當屬輸出形式修改十分麻煩,題目要求把引腳1和引腳2上的電壓值依次輸出。乍看之下,好像十分的簡單,但對於物理不好且許久沒碰過物理的人來說,其實一點也不簡單。要考慮的情況也不少。而且別忘了,第七次作業可是加了個麻煩的東西--互斥開關。要讓這個東西正確輸出可比其他電子元件難幾倍。對於一般的電器,也是簡單的加個引腳序號屬性,先計算電壓,左引腳電壓等於上一個電器的右引腳電壓,右引腳電壓等於左引腳電壓減電壓,至於其他的特殊情況便不一一贅述了。而有關互斥開關的判斷和輸出大體上也跟前面的大差不差,只是情況更復雜而已。
image
image

踩坑心得:

1.資料精度錯誤。題目對於電壓的要求是int型別,在輸出時不能用“%。0f”進行輸出,因為這樣對資料是四捨五入。我在輸出時對電壓進行強制型別轉換捨去小數點後面部分便可以了。
2.對於電路短路的情況判斷錯誤。最開頭對電路短路的情況判斷為主幹路的電阻等於零,忽略了當主幹路斷路的情況,導致主幹路斷路斷路的情況下依舊會輸出“short circuit error”。
3.忽略了並聯電路上的一條串聯電路短路的情況。當並聯電路上的一條串聯電路短路的時候,這時無論這條並聯電路上其他串聯電路是什麼情款,這條並聯電路上的電阻均為0。
4.互斥開關斷開的那條支路所連線的引腳當時想當然的認為是0,其實對於那個引腳的情況處理和處理其他斷路上電子元件的引腳電壓是一樣的。
5.計算主幹路初始電壓時忘記用set方法儲存更改後的電壓,因為是和串聯電路放在一起,所以讀取電壓時是讀取左引腳電壓而不是電路總電壓,導致即使主幹路有調速器,主幹路的初始電壓還是以220v去計算。
6.在進行電路閉合斷路情況判斷時,對於並聯電路,只要找到一個串聯電路是閉合的,就會跳出並聯電路中電子元件的迴圈,導致一些串聯電路的閉合斷路情況根本沒有進行判斷,就跳到了下一步的電阻計算,直接導致了後面一系類的計算錯誤。

改進建議:

對於有些方法,寫的時候邏輯沒理順,導致程式碼過多且複雜難懂,需要精煉簡化對方法的實現。對於透過許多get得到的資料new一個相應的資料型別進行獲取使程式碼更容易理解。

總結:

透過這兩次作業,我加深了對遞迴的理解,明白了透過思考,使用遞迴等方法,不斷簡化自己的程式碼,不僅是讓別人更易看懂自己寫的程式碼,而且也鍛鍊了自己,提高了自己的能力。這一個學期的學習,我學習到了Java的三大技術特性:封裝、繼承、多型,學習到了七大設計原則:單一職責原則、開閉原則、里氏代換原則等,還有設計模式。寫程式碼時要物件導向程式設計,要遵守七大原則,熟連運用三大特性(封裝,繼承,多型)和23個設計模式。要培養縝密的思維,把握住細節,使程式碼更具有嚴謹性,不至於寫完之後有太多沒考慮或者寫錯的點。同時也要不斷提高程式碼各個類的內聚性,降低各個類之間的耦合度。

評價:

講課基本沒有什麼問題,不過既然出了網課,能把設計模式什麼的其它上課講的內容也在網課上備份一遍就好了。