oop第7~8次作業總結(第三次Blog)
一、前言
二、設計與分析
三、踩坑心得
四、改進建議
五、總結
一、前言
1、第七次作業
第六次作業只有一道題,與上次相比,本次迭代考慮多個並聯電路串聯在一起的情況,考慮一條串聯電路中包含其他串聯電路的情況。增加了互斥開關和受控窗簾兩個裝置。互斥開關有三個引腳,2與3 進行選擇,預設為2,互斥開關考慮電阻的情況。受控窗簾需要根據整個電路的亮度來進行調整,預設為100%。線路中包含多個串聯起來的並聯電路。這次迭代需要考慮的情況有很多,需要在上次的基礎上再加入新程式碼。
2、第八次作業
這次迭代新增加了電流,引腳的電壓。需要遍歷進一步進行賦值。增加管腳電壓的顯示(在輸出每個電器的狀態資訊後,再依次輸出該電器每個管腳的電壓)。電流限制(電器在工作時,過大的電流會引起電器過熱,從而燒壞電路。本次迭代,每個元器件都有最大電流的設定,當實時電流超過最大電流時,在該電器輸出資訊的最後加入提示“exceeding current limit error”,與前面的資訊之間用英文空格分隔)。短路檢測(如果電路出現無窮大的電流造成短路,所有元器件資訊不輸出,僅輸出提示“short circuit error”)。並聯電路中包含並聯(本次迭代考慮並聯電路中包含並聯電路的情況,即構成並聯電路的串聯電路可以包含別的並聯電路)。還增加了二極體元件,其電路特性為:正向導通,反向截止;當電流從左至右流過時,二極體導通”conduction”,電阻為0;電流從右至左流動時,二極體截止”cutoff”,電阻無窮大,相當於開關開啟。
二、設計與分析
1、第七次作業
輸入分析:
串聯:一條串聯電路佔一行,串聯電路由按從靠電源端到接地端順序依次輸入的 n 個連線 資訊組成,連線資訊之間用英文空格分隔。
並聯:一條並聯電路佔一行,並聯電路由其包含的幾條串聯電路組成,串聯電路標識之間用英文空格分隔。
輸出分析:
和前兩次的輸出都差不多,多了互斥開關和受控窗簾。
思路分析:輸入後進入InputMatching進行資訊拆分,將裝置單獨分出來,電路單獨分出來;資訊拆分完後進入BroseMatching進行各個裝置的建立,透過遍歷InputMatching裡拆分出來的裝置資訊和調控資訊對其進行遍歷並建立裝置;裝置建立完後進入Set進行電路的設定,將串聯並聯電路上擁有的資訊加入Information中,再根據Information中的Connect,依次遍歷找到裡面的內容並放進去;每個電路都確定了之後,再設定電壓,並透過電壓來設定受控電器的工作資訊。最後是輸入,先對裝置進行排序,最後輸出。
類圖:
該題是智慧家居強電電路模擬系統,Control用來存放控制裝置,Switch是開關(可以有多個,其中包括了開關名、是否開啟),Continuous是連續調速器(只能有一個,只有檔位),Series是分檔調速器(只能有一個,只有檔位),其中Control是Switch、Continuous、Series的父類;Controlled用來存放受控裝置,Lamp是燈(有亮度,Daylight是日光燈,Incandescent是白熾燈,兩者都是Lamp的子類),Fan是風扇(有風速,Ceilingfan是吊扇,Floorfan是落地扇,兩者都是風扇的子類),其中Controlled是Lamp、Fan的父類;Concatenation是串聯電路;ToltalConcatenation是整個電路,Parallel是並聯電路,Information是資訊類(其中放入電路的名字和電路里的裝置資訊),InputMatching是是輸入類(進行輸入資訊讀取和讀取裝置資訊),BroseMatching是建立類,進行單個裝置的建立,set設定電路資訊;Main函式進行設計。
設計分析:
可以看出OutPut裡的複雜度較高,因為我為了保證各個裝置能夠按照順序輸出,加入了Conllections的sort方法,每一個裝置進行輸出,需要多個for迴圈;其次就是BroseMatching,因為需要創造裝置,就需要透過遍歷來找到該裝置,從而進行建立。
2、第八次作業
輸入分析:
與上次的相同,增加了二極體和並聯中也能有並聯
輸出分析:
與之前相比加入了許多東西,當實時電流超過最大電流時,在該電器輸出資訊的最後加入提示“exceeding current limit error”;如果電路出現無窮大的電流造成短路,所有元器件資訊不輸出,僅輸出提示“short circuit error”,二極體:當電流從左至右流過時,二極體導通”conduction”,電阻為0;電流從右至左流動時,二極體截止”cutoff”,電阻無窮大,相當於開關開啟。
思路分析:輸入後進入InputMatching進行資訊拆分,將裝置單獨分出來,電路單獨分出來;資訊拆分完後進入BroseMatching進行各個裝置的建立,透過遍歷InputMatching裡拆分出來的裝置資訊和調控資訊對其進行遍歷並建立裝置;裝置建立完後進入Set進行電路的設定,將串聯並聯電路上擁有的資訊加入Information中,再根據Information中的Connect,依次遍歷找到裡面的內容並放進去;每個電路都確定了之後,再設定電壓,並透過電壓來設定受控電器的工作資訊。最後是輸入,先對裝置進行排序,最後輸出。
因為這次加入了二極體和引腳,所以對裝置設定電勢差後,再透過遍歷設定各個引腳的電壓;二極體也要在儲存資訊時知道是從2傳入還是1傳入。
類圖:
Control用來存放控制裝置,Switch是開關(可以有多個,其中包括了開關名、是否開啟),Continuous是連續調速器(只能有一個,只有檔位),Series是分檔調速器(只能有一個,只有檔位),其中Control是Switch、Continuous、Series的父類;Controlled用來存放受控裝置,Lamp是燈(有亮度,Daylight是日光燈,Incandescent是白熾燈,兩者都是Lamp的子類),Fan是風扇(有風速,Ceilingfan是吊扇,Floorfan是落地扇,兩者都是風扇的子類),其中Controlled是Lamp、Fan的父類;Concatenation是串聯電路;ToltalConcatenation是整個電路,Parallel是並聯電路,Information是資訊類(其中放入電路的名字和電路里的裝置資訊),InputMatching是是輸入類(進行輸入資訊讀取和讀取裝置資訊),BroseMatching是建立類,進行單個裝置的建立,set設定電路資訊,Pins是引腳資訊;Main函式進行設計。
設計分析:
可以看出OutPut函式里的複雜度仍然時最高的,因為加入的裝置更多,需要遍歷的也更多。
三、踩坑心得
1、第七次作業
因為前幾次作業分析得不是很到位,所以第七次作業重新改進了我的程式碼,我覺得之前的思路不清晰也讓我狠狠踩了坑,這次也需要花大量時間來重新設計思路。其次是互斥開關:
答案錯誤的問題基本上都是互斥開關的問題,並且互斥開關需要考慮引腳的問題,因為開關是唯一的,但是不同引腳的電壓又是不同的,我在寫第七次作業時並沒有考慮在互斥開關里加入陣列電壓,而是遍歷時每次都會透過互斥開關的資訊來分配電壓,這個還是會比較麻煩的。還有很多重複的程式碼,其實做的工作都是一樣的,但是我又寫了一遍;有些其實只用遍歷一次的,但是我遍歷了多次增加了複雜度,比如:
其實這裡可以直接遍歷總電路里的受控裝置資訊找到受控窗簾。
2、第八次作業
第八次作業我覺得有點變態,老師的思路比我的跳躍很多,有時根本就想不到有這個測試點,而且老師給的測試點也少得可憐😢。這次需要改動的東西也比較多,所以有時候思路比較混亂,這次的類更多了,導致自己存了什麼東西好多都忘記了😓。還有陣列越界,非零返回這些常規的問題,有一個非零返回主要是因為遍歷控制裝置時,會不小心把i變成負數,導致陣列找不到數,比如:
四、改進建議
- 在做題前需要邊讀題邊思考,有一個清晰明確的思路後再開始編寫,不然寫了一大半發現思路錯誤後,只能推翻重寫了,不僅浪費時間,還影響了自己的思路。
- 做題時不能主觀臆斷,要看清楚題目中所給出的正確資訊,不能盲目猜想。
- 進行後續迭代時可以轉換一下自己的思路,思考一下應該怎樣寫更加便捷並且不會把自己繞暈,過於冗長繁瑣,寫程式碼之前也應該斟酌一下,避免出現後面寫了一大堆程式碼後發現想要修改很多地方的情況。上一部分不太清晰的地方即使改正,不然後續的迭代只會越來越錯。
- 自己的時間要合理安排,應該是每科平衡,而不是目前哪科更急就只看哪科,在合適的時間做合適的事情。
- 下一次迭代可以在上一次的基礎上重新編寫一下串並聯之間的關係,以及電壓的設定,仔細思考更簡單的方法,遵守單一職責原則,提高類的可讀性,可維護性。
- 對陣列的遍歷最好不要盲目地對i進行變換,要思考一下,會不會出現陣列越界的情況,不然會出現非零返回。
- 程式碼能簡潔就簡潔,不要出現重複的情況,這樣增加複雜度,同時也會讓自己比較疑惑。
五、總結
這兩次PTA作業對我來說還是有點難度的,老師的測試樣例真的好少😭,自己的思維也沒有開啟。在這兩次作業中,我學會了轉變自己的思維,當被一個難點困住時,我應該改變原來的想法,看看別的思路會不會更好做一點。還有每一步都要與這道題息息相關,透過遍歷,一步一步地找到裡面含有的資訊,這樣腦子就不會很暈。程式碼的註釋也是一個好的習慣,有了註釋除錯的時候會更加方便。JAVA的知識掌握得不是很好,希望自己能在暑假多加練習。