OOP第4-6次作業總結

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

前言:

這三次作業中第四次作業是對前三次作業答題判題程式的迭代,而從第五次作業開始,則是新的家居強電電路模擬程式題目。就難度而言,第四次作業比第五、六次作業難,第五次作業是家居強電電路模擬程式的開頭,所以自然簡單,而且第六次作業還減少了兩道題目,使得第六次作業更為輕鬆。因為是家居強電電路模擬,所以正規表示式相比第四次作業而言,是相當簡單了,沒有加入錯誤資訊匯入判斷,所以捕獲資訊方面的正規表示式可以寫的十分簡單。當然,後面加互斥開關什麼的也會開始變得難了。

分析:

<1>

設計與分析:
第四次作業相比第三次作業加入了選擇題和填空題,這對答案批改就不能單純地用matches或者equals來直接匹配整個字串了。要先判斷屬於那種題目再拆分答案字串進行匹配。雖然只是新增了兩個題目種類,但是由於第三次作業類的設計並不合理,於是重寫,但當時以為想清楚了,實際上腦子裡的框架還沒有完全搭好就開始寫的緣故,導致寫的程式碼比之前寫的還要抽象。遺憾的是,做題目的時候,不知道有哪個細節沒處理好,找了很久也沒找到,有幾個測試點始終過不去。
image
image

將題目類作為父類,加上前三次題目的通常類題型,三種題型作為題目類的子類。試卷類依賴題目類,答卷類依賴答案類,答案類依賴題目類。執行順序方面,先透過Splite類中的方法根據每行的輸入情況返回不同的值,再根據不同的值呼叫InPut類中的不同方法把資料儲存進入對應的類中並實現各類中的依賴關係完成輸入資料處理。再呼叫Correct類中的方法完成試卷分數判斷和答案批改。最後進行輸出。
踩坑心得:
1.對選擇題和填空題的部分正確未考慮周到。比如一個選擇題的正確答案是ACD,答卷答案是AD時肯定是正確的,DA也毫無疑問沒錯,但我的判斷方式是Pattern(標準答案),Matcher(答案)來進行簡單判斷。所以後面一種DA最後判斷會得0分。
2.因為用HashMap時儲存時的key值不不是簡單的0,1,2之類的,所以多名學生輸出時因為HashMap輸出的隨機性,輸出結果也是亂序的。最後也是在輸出前面用ArrayList再記錄了一遍順序進行輸出。
3.答案批改的方法,是否進入批改的判斷僅為題目是否在輸入時讀取到,這導致被刪除的題目也會被計算出答案,而我的答案輸出形式判斷的是answer是否為0,這使得題目被刪除的情況依舊會輸出答案。
改進建議:
類之間的依賴關係需要調整,類之間的屬性也需要調整。answer類中的question物件刪除,加入學號屬性,這樣儲存,輸出的時候會更方便。main類中answerpaper的儲存方式採用ArrayList。把試卷總分判斷和答案批改放入相應的類中。建立一個agent類,裡面放入輸出和類間依賴關係繫結。

<2>

設計與分析:
第五次作業是家居強電電路模擬的開頭,所以難度和第一次作業差不多。只用簡單的模擬一條串聯電路就好了。但也是因為想不到之後的變換,並且第一次題目給的東西太少,有些條件也不知道是幹什麼的(對電路電路上裝置連線順序和引腳沒有頭緒),程式碼也寫的有點亂。
image
image
我將受控裝置和控制裝置和代理類抽象化,對於擁有不同的受控裝置的電路將其儲存到不同的代理類子類裡去,再透過不同的代理類子類的方法對其進行電路運轉效果計算。最後便是按條件輸出。因為沒想到之後的變換,所以關於電路上裝置連線順序的儲存只是就簡單地在主函式中用連結串列儲存在主函式中。
踩坑心得:
1.區間範圍寫錯。擋位為0-3共4個擋位。所以下意識的寫了if(level <4)使得某些測試點沒過。
2.審題不清,以為開關也只有一個。所以當時連電路上裝置連線順序都沒有寫,於是便在主函式中新加一個連結串列儲存電路上裝置連線順序。在進行電路運轉效果計算之前再進行電路上開關的判斷。
3.寫白熾燈的時候因為它的狀態只有兩種,非常簡潔明瞭,所以寫相應的狀態計算就想當然地只寫了一個if,else,而忽略了有調速器的時候電壓也可能變為0。
改進建議:
對類進行重新設計。將電路裝置設計為最上面的父類,將受控裝置、控制裝置和電路設為電路裝置的子類。再在三大類中再往下劃分電器、控制裝置和串聯裝置。在輸入資料處理完畢後,透過agent類把電路順序串起來,再透過其他類中的開關檢查、電阻計算、電壓計算、裝置狀態計算方法進行電路處理。

<3>

設計與分析:
第六次作業增加了出現並聯電路的情況,之前第五次作業中老師給的類圖設計建議我那時候還完全不能理解,但看到第六次作業的題目之後就理解了,電路類作為電路裝置類的子類,是為了儲存電路中的元件順序。於是便按上面的設計進行了電路類修改。但是當時還是沒有意識到引腳到底有什麼用,所以還是沒有把它考慮進去。
image
image
這次的設計思路就是將電路裝置設計為最上面的父類,將受控裝置、控制裝置和電路設為電路裝置的子類。再在三大類中再往下劃分電器、控制裝置和串聯裝置。輸入資料讀取方面,我採取了分批讀取的方式,先把電路順序完全讀取,再把對電路的命令進行讀取。然後透過在輸入資料處理完畢後,先透過agent類中的conformity方法把電路順序串起來,再透過agent類中的開關檢查、電阻計算、電壓計算、裝置狀態計算方法進行電路處理。最後進行輸出。
踩坑心得:
1.資料讀取的時候,因為這次的題目新增了並聯電路,於是我下意識地認為電路順序類輸入資訊不止一行,而沒有像電路指令類輸入資訊考慮只有一行資訊輸入的情況,迴圈中讀取nextLine的語句沒有放在合適的位置,導致程式碼執行後非零返回。
2.忽略匹配情況。第一種電路順序類輸入資訊是讀取到下一行,如果下一行匹配,則把下一行儲存進去並結束迴圈;而第二種電路指令類輸入資訊是讀取到下一行,如果下一行匹配,則直接結束迴圈,並不會把下一行儲存進去。當時發現1錯誤時,簡單地把電路指令類輸入資訊的程式碼複製貼上到電路順序類輸入資訊中,導致出錯。
3.“resistance = 0;”語句在迴圈中放錯位置。當時直接放在“for(int m = 0; m < parallelcircuit.size(); m++)”這個迴圈的下面,忘記了這個resistance求的是並聯電路中的支路上的電阻總和。所以發現後立馬把它移到了“for(int n = 0; n < parallelcircuit.get(m).getSeriescircuits().size(); n++)”迴圈的下面。
改進建議:
將agent類中的方法分散到幾個新類中。Light類與Fan類也許不用搞那麼多子類,只用Light類與Fan類兩個就夠用了。將Light類與Fan類中的效果計算方法提取出來抽象成介面,將不同的電器的效果計算方法繼承該介面。這樣之後寫的時候就不用寫那麼多行程式碼了,程式碼相對來說更簡單一點,讀起來也更方便。

總結:

從答題判題程式到家居電路模擬程式,不僅僅只是幾次單純的作業,它更是我們以後工作後在實際程式設計中可能遇到的挑戰和問題的縮影。對迴圈的處理,邏輯的準確性都會直接影響到我們程式碼的成效。而在這幾次作業中,我對Java基本的繼承、多型等語法的運用更加熟練。我深刻認識到以上幾點的重要性,也在一步步中慢慢思考理解類之間的設計究竟怎麼樣才更好,讓我的程式碼更偏向物件導向。