一、前言
第一次作業總結
1. 作業內容
設計實現答題程式,模擬一個小型的測試,要求輸入題目資訊和答題資訊,根據輸入題目資訊中的標準答案判斷答題的結果。
本次題目主要透過輸入:題目數量、題目內容:輸入多行資料,每行代表一道題目。每行資料包含題號(#N:)、題目內容(#Q:)和標準答案(#A:)。題目的輸入順序與題號不相關,即題號可能不是按順序給出的、答題資訊:輸入多行資料,每行代表一組答案。每行資料包含多個答案,答案之間用英文空格分隔,順序與題目題號相對應。答題資訊以一行"end"結束,"end"之後的資訊將被忽略。所以需要讀取到主要的題目數量,並根據題目數量建立問題陣列、答案陣列,分別用於儲存問題資訊、答案資訊後對答案和問題的標準答案進行比較給出輸出結果。
第一次作業的主要任務是實現一個簡單的判題程式。程式根據使用者輸入的題目和答題資訊,進行判分並輸出結果。
輸入內容包括題目數量、題目內容、正確答案和答題資訊,以"end"結束輸入。輸出部分包含答題資訊和最終的判題結果。
2. 主要知識點
物件導向程式設計:透過類與物件組織程式碼,提升結構清晰度,便於維護和擴充套件。
輸入輸出:使用 Scanner 類處理使用者輸入,讀取題目和答案。
正規表示式:用正規表示式提取題目編號、內容和標準答案等關鍵資訊。
排序:透過 Collections.sort() 方法按題目編號升序排序,確保輸出順序一致。
自定義比較器:定義比較器,按照題目編號排序,滿足特定需求。
控制流程:靈活使用 if 和 for 控制結構實現判題邏輯。
方法與引數傳遞:定義方法,用引數傳遞資料實現不同功能。
3. 題量與難度
第一次作業題量不大,難度適中,主要用於練習輸入輸出、資料組織和簡單判題邏輯的實現。
第二次作業總結
1. 作業內容
第二次作業在第一次基礎上擴充套件了功能,設計了一個模擬小型測試的判分程式。程式需根據輸入的題目、試卷、答題資訊進行評分,此外還需檢測總分和試卷格式等錯誤。
要求混合輸入題目、試卷、答題資訊三類內容,系統需自動分辨並解析,並輸出成績和錯誤試卷號等資訊。
2. 主要知識點
類與物件:定義 Judge 類及其成員變數和方法,增強程式碼結構化。
集合操作:使用 ArrayList 儲存題目、試卷、答題卡等物件,便於動態管理資料。
迴圈與條件判斷:利用 for 迴圈遍歷列表,用 if-else 判斷題目有效性和得分條件。
方法呼叫和引數傳遞:透過方法實現各項功能,並透過傳參增強靈活性。
字串處理:拼接和比較字串,確保輸入輸出一致性。
異常處理:新增提示機制,指出試卷缺失等情況。
格式化輸出:使用 System.out.printf 格式化輸出成績,增強可讀性。
3. 題量與難度
第二次作業題量和程式碼行數顯著增加,難度提升,特別在資訊解析和多樣化輸出方面有所突破。
第三次作業總結
1. 作業內容
第三次作業在前兩次作業基礎上,增加了學生資訊和題目刪除等內容,實現了一個更復雜的測試系統。程式要求處理五種輸入:題目、試卷、答題、學生、刪除題目,且輸入順序可能混亂。
輸出內容包括:判分結果、總分校驗、題目引用錯誤、格式錯誤、試卷號和學號引用錯誤等提示。
2. 主要知識點
迴圈與條件判斷:大量使用 for 和 if-else 來評分並根據條件輸出不同資訊。
集合操作: ArrayList 儲存試題、答案和得分,透過集合操作進行查詢和遍歷。
自定義類和物件操作:自定義 Testpaper、Topic、Answerpaper 類,靈活呼叫物件實現複雜邏輯。
異常處理:提示學生未作答、題目缺失等異常情況,增強程式健壯性。
字串處理:熟練使用正規表示式進行精確處理,便於格式化輸出。
算術運算:對得分累加計算,實現自動評分。
邏輯控制:基於題目有效性和答案正確性判分,豐富判題邏輯。
3. 題量與難度
第三次作業題量進一步增加,難度顯著提升。資訊處理和邏輯判斷複雜,對程式設計邏輯和錯誤處理能力要求較高。
二、設計與分析
第一次作業
在第一次作業的最後一題中,設計了 Topic、Testpaper 和 Answerpaper 三個類來分別管理題目、試卷和答題資訊。Topic 類包含題目編號、內容和標準答案;Testpaper 類包含題目列表和數量,並定義了新增題目和排序的方法;Answerpaper 類則用於儲存學生答案、判題結果,並輸出最終得分。在 main 方法中,程式首先接收題目資訊並利用正規表示式解析新增到試卷中,隨後接收答案資訊,將試卷題目按編號排序後進行判分,最後輸出題目、學生答案和判題結果。
第二次作業
在第二次PTA作業中,相比第一次新增了一個試卷類,要求程式根據試卷引用的題目匹配題目和答案,判定對錯,並根據相應分值累加得分後輸出。此外,程式還需處理多種異常輸出,如試卷不存在或總分未達滿分等,難度較第一次顯著提升。在設計時,我保留了第一次作業中的 Question、Answer 和 Paper 三個類,沒有新增判分或輸出的類,導致主函式整合了過多功能。
在主函式中,首先將輸入資訊儲存在字串陣列中;待資訊全部錄入後,依次解析每行字串並傳遞給相應類(如 Question、Answer、Paper)進行儲存。完成解析後,根據 Paper 類中記錄的試卷號順序依次匹配題目和答案資訊,並進行判分,最後輸出對應結果。以下是第二次PTA類圖:
第三次作業
在第三次PTA作業中,相比於第二次,程式進一步增加了 Student 類、Delete 類,並引入了錯誤格式檢查功能。新功能包括異常資訊輸出,如學生資訊不存在、資訊格式錯誤等,這使得整體難度進一步提升。為最佳化設計,我重新規劃了類結構,引入了多個新類來承擔不同的功能。具體來說,引入了 Controller 類用於解析字串資訊、View 類用於管理輸出、Student 類用於儲存學生資訊、Delete 類用於處理刪除操作等。這樣,主函式最終只負責輸入工作,其他功能由相應的類分擔,使程式碼結構更為清晰。
在我的設計中,首先將所有輸入資訊儲存並處理,依次解析後,根據解析結果將資訊分配到五個不同的類中儲存。對於不符合格式的錯誤資訊,當沒有匹配到任何正規表示式時立即輸出錯誤提示;而刪除資訊在最後處理,避免在題目資訊載入前提前執行刪除操作的衝突。
完成所有解析後,程式在 Answer 類中按序查詢對應的試卷,並進行判斷和處理。最終,輸出結果時常常用一個方法的返回值作為另一個方法的引數,這雖然簡化了變數的定義,但降低了程式碼的可讀性,也使後續理解和修改變得困難。
儘管主函式的職責更為單一,但各類之間的呼叫關係和方法顯得較為複雜。例如,在 View 類中直接完成了正確答案輸出、答案不存在提示及答案被刪除提示,這樣設計雖然集中管理了輸出邏輯,但增加了修改的難度。
三.踩坑心得
測試出現非零返回例如:
這個問題的主要原因在於定義陣列後未對其進行正確的初始化,或陣列在使用時超出了定義的邊界。每次出現非零返回值時,仔細檢查陣列的定義和使用位置往往能找到問題的根源。另外,輸入資料中包含空格或空值的情況也容易導致陣列越界或賦值為空。這類情況在陣列操作中尤為常見,需要特別留意。為避免類似問題,應確保在定義陣列後立即進行初始化,並在訪問陣列元素前進行有效性檢查。同時,處理輸入資料時,應對可能的空值或空格進行過濾,以防止因資料不完整而影響程式的穩定性。其他問題諸如:
1.未考慮到題目,試卷,答卷列表為空的情況,導致單資訊輸入有問題。
2.未考慮資訊亂序輸入情況。如先輸入試卷資訊,再輸入題目資訊
3.未考慮空字元情況
4.正規表示式不夠嚴格,要認真讀題,確保正規表示式的正確
四.改進建議
程式碼編寫中,變數名稱應具有描述性,以便清晰表達其含義。例如,如果陣列的用途不夠明確,可以更換為一個更具描述性的名稱,以便他人理解程式碼意圖。同時,新增註釋來解釋程式碼的作用,尤其是在邏輯複雜或不太直觀的部分,以提升程式碼的可讀性。
為提高程式碼的結構性和複用性,可以將題目和答案的讀取邏輯封裝到獨立的方法中,這樣不僅能使程式碼更簡潔,還可以在其他地方重複呼叫,減少程式碼冗餘。此外,當前使用巢狀迴圈來檢查題目是否匹配,實際操作中可以透過單層迴圈遍歷題目列表進行最佳化,避免巢狀迴圈帶來的效能開銷。
為了增加程式的穩健性,建議在輸入題目數量與實際讀取題目數量不符時加入錯誤處理機制,確保程式在出現異常情況時不會崩潰。程式碼風格上應保持一致的縮排格式,這將大大提高程式碼的可讀性,使得不同部分的邏輯結構一目瞭然。同時,避免在一行內疊加過多操作,防止程式碼變得過於複雜,難以理解和維護。
透過這些改進,程式碼將更加規範、簡潔,便於後續的維護和升級。
五.總結
在過學習和完成PTA作業後,我收穫頗豐,尤其是在Java程式設計方面。不僅深入理解了物件導向程式設計的單一職責原則,還對程式設計中的物件導向思想有了更深層次的認識。除此之外,我還掌握了一些非常實用的程式設計技巧,比如動態陣列的實現、雜湊表的運用以及正規表示式的應用。
在第一次PTA作業中,任務相對簡單,程式設計實現過程也較為順利。然而,隨著後續作業難度的加大,我逐漸遇到了更多的程式設計挑戰。第二次作業中,引入了試卷類和多種異常處理,這要求我在設計程式碼時更加全面地考慮各種情況。儘管第一次提交透過了大部分測試點,但在理解“依次檢索試卷中的答案順序”時出現偏差,導致部分功能未能正確實現。這讓我意識到,準確理解題目要求是確保程式碼正確性的關鍵,也讓我意識到在審題方面還需加強。
到了第三次PTA作業,任務更加複雜,新增了學生類、刪除類以及格式錯誤處理等需求。為應對這些新要求,我重新規劃了程式碼結構,設計了新的類來分擔主函式的部分功能,使程式碼結構更加清晰合理。然而,儘管結構得到了最佳化,但在方法呼叫和引數傳遞時仍然遇到了一些問題,影響了程式碼的可讀性。這讓我認識到,在編寫程式碼時,不僅要關注功能實現,還要注重結構的簡潔性和可維護性,這對未來的程式設計實踐至關重要。
在三次PTA作業中,有兩次因誤解題目要求而導致需要對程式碼進行大幅修改,使我深刻認識到審題的重要性。只有準確理解題意,才能在編寫程式碼時避免方向性的偏差,減少後續修改的工作量。
回顧這三次PTA作業的經歷,我收穫了許多寶貴的經驗和教訓。在未來的程式設計實踐中,我會更加註重審題的準確性,確保程式碼簡潔明瞭、便於維護。同時,我也會加強與他人的合作和交流,不斷積累和提升自己的程式設計能力與問題解決能力。