**前言**
前三次PTA大作業包含多個小題總體,其中每次P他的最後一道題是由一道題目的不斷迭代而來,總體考察了類與物件的理解、正規表示式的使用、陣列的使用和字串的處理等多種知識點;從題量來看,雖然題目數量不多,但是難度卻不小,尤其是最後一題,題目難度較以往突然加大的同時題目資訊也增加了,確實是入學以來第一次一次性接受這麼大量的題目資訊來進行程式碼的編寫,三次作業的程式碼總量也接近一千行;從難度來看,除了第一次的P他的作業,後兩次的作業由於涉及到更多的知識點,測試點測試的方面更加地細緻,為題目增加了不少難度;同時,第三次P他的日期類,第二次P他的連結串列的使用,相較於上學期的C語言也有不同。尤其是日期類的使用,是C語言的所沒有接觸到過的,需要重新學習。
**設計與分析**
題目大致資訊如下:
設計實現答題程式,模擬一個小型的測試,以下粗體字顯示的是在答題判題程式-2基礎上增補或者修改的內容,要求輸入題目資訊、試卷資訊、答題資訊、學生資訊、刪除題目資訊,根據輸入題目資訊中的標準答案判斷答題的結果。
第一次PTA作業由於難度較低,這裡不做分析,重點放在後兩次作業上;
第二次PTA作業在第一次基礎上增加了試卷類,要求根據試卷所引用的題目去尋找對應的題目和答案,判斷對錯,並按照相應的分值進行賦分彙總並輸出;除此以外,還增加了多種異常資訊的輸出,比如試卷不存在,試卷總分值不滿分等等,從難度上比第一次有了較大提升。
第二次PTA類圖設計如下:
在第二次P他的設計中,我只延續使用了第一次pta中的三個類而並沒有增加諸如判斷,輸出的類,這使得我的主函式融入了許多功能,是我以後需要改進的地方。
在主函式中,我首先對資訊進行輸入並儲存在字串陣列中;在資訊全部錄入完成後,我再依次對每行字串進行解析,並將其傳入對應的類中(Question,Answer,Paper)儲存;所有解析工作完成後,再依照Paper類中儲存的試卷號順序,依次去對應的題目類中去尋找題目,標準答案,去答案類中去尋找作答資訊,加以判斷並輸出相應的資訊。
第三次PTA在第二次的基礎上加入了學生類,刪除類和錯誤格式的問題,還進一步增加了異常資訊的輸出,比如學生資訊不存在,各種資訊格式錯誤等等,難度進一步加大。
第三次PTA類圖設計如下
在第三次PTA中,我重新規劃了我的類的設計,引入了幾個新的類來替代我的主函式暫代的功能,比如Controller類:用於進行字串的解析;View類:用於輸出;Student類:用於儲存學生資訊;Delete類:用於刪除資訊等,由此,我的主函式最終只承擔了輸入的工作:
在我的設計中,我先將所有的資訊全部讀入並處理,隨後依次解析,按照解析完成之後的結果分類存入五個不同的資訊類當中;對於錯誤的資訊,在沒有被任何一個正規表示式匹配到後輸出錯誤資訊;對於刪除資訊,我選擇將其放在最後解析,避免出現刪除資訊在題目資訊之前出現的情形。
在全部的解析完成之後,程式在答案類中依次尋找對應的試卷並進行相應的判斷和處理,然後依次輸出。在輸出的過程中,我常常會使用一個方法的返回值作為另一個或多個方法的引數使用,這種方法雖然使得我的引數的使用更加方便,不需要額外定義一個變數來儲存可能只使用一次、或者變化較頻繁的資料,但也大大降低了程式碼的可讀性,難以後續理解並修改,這是後續設計中需要考慮並改進的地方。
但是儘管我的主函式的功能比較單一,但我各個類之間的方法還是顯得比較複雜,比如,在View類的方法中,我就直接完成了正確答案輸出,答案不存在的輸出和答案被刪除資訊的輸出,這對於程式的修改也是非常不利的,在下一次的PTA中,我會盡可能改善這個問題。
**踩坑心得**
在第二次P他的初次編寫完成後,我的提交透過了大部分測試點
然而,在初次完成後有幾個測試點一直無法透過。
在與同學討論後,我才明白了我理解錯誤了題目的輸出資訊,按照正確的題目意思,輸出時需要按照答案的出現順序去一一檢索試卷,而非按照試卷去匹配答案,這使得我的異常資訊“The test paper number is not exist”這個資訊的輸出時機不正確。
重新縷清思路後,我認識到原先的程式碼設計在核心邏輯上存在一些問題,這導致我無法透過最後一個測試點。儘管我嘗試在原有程式碼上進行修改,試圖修復這些問題,但每次修改後都發現新的問題湧現,彷彿陷入了一個無盡的迴圈。
每次修改後的程式碼,我都滿懷期待地提交測試,但結果總是令人失望。我開始懷疑自己的程式設計能力,甚至對程式設計這門學科產生了深深的挫敗感。那種道心破碎的感覺,讓我幾乎想要放棄。
然而,我深知放棄並不是解決問題的辦法。於是,我決定重新開始,重新設計整個程式的架構和邏輯。我花費了大量的時間,仔細研究題目的要求,分析每一個測試點的意圖,確保自己對題目的理解準確無誤。
在重新設計的過程中,我更加註重程式碼的可讀性和可維護性,更加註重異常處理,確保程式在遇到錯誤時能夠給出明確的提示資訊。
經過接近一個小時的返工努力,我終於完成了新程式碼的編寫。當我再次提交測試時,心中充滿了忐忑和期待。幸運的是,這次我的程式碼透過了所有測試點,包括之前一直無法透過的那個。
在第三次PTA中,由於錯誤格式的出現,對正規表示式的使用要求更加嚴格,一旦有某個錯誤的點沒有考慮到,不僅會導致這道題的答案錯誤,還會影響後續的資訊拆分,錄入,導致多種錯誤,使得分析錯誤原因更加困難;我在前期的提交中由於正規表示式使用不正確,不規範而導致有許多錯誤格式的測試點過不去,不得不臨時補習相關知識和與同學交流。
同時,後面幾個測試點中的亂序輸出問題在一開始我也沒能理解,不過在後續老師的補充說明後我理解了題目意思並修改了我的程式碼。
在完成了以上測試點後,還剩下最後一個測試點我一直尋找不到錯誤的地方,讓我很是苦惱;在作業的最後一天,在與同學討論後,我才明白沒有考慮過在題目,答案前後出現多餘空格的問題。這個錯誤導致了我差分後的字串中不僅包含了答案內容,還包含了多餘空格,在使用eqauls語句判斷答案是否匹配時出現了問題。為此,我在各個類中增加了刪除字串前後空格的程式碼,終於透過了所有測試點。
**改進建議**
1.類的方法設計複雜,多種功能混合在一起
在第二,第三次PTA中,我的五個資訊儲存類中,只是用了一個setter方法來拆分錄入資訊;而在View類中,也同樣只用的一個方法來輸出所有的資訊,包括正確答案,答案缺失,題目不存在,題目被刪除,試卷不存在等多種問題。在下一次的作業中,我應當適當的將這幾個方法拆分成多個方法,這樣不僅可以縮短每個方法的長度,使得方法的職責更加單一,同時也可以增加可讀性。
2.多餘的重複判斷
在第三次PTA中,由於一開始的正規表示式使用不正確,於是我在每一個類當中再次進行更加細緻的錯誤格式檢測;而這個問題在修改了正規表示式後已經得到解決,各個類中的錯誤格式判斷,包括返回格式是否錯誤的方法已經無用,在下次的PTA中可以考慮刪除該部分的程式碼加以修改。
3.不同類中使用同名或名稱相似的方法,容易造成混亂
在一開始寫程式碼時,為了方便,將許多序號類都命名為number,將標準答案和答卷中的答案都命名為answer,這使得我在後續編寫程式碼時常常會出現多個number或answer的方法名,雖然其都加上了特殊限定字首來加以區分,但是在後續的編寫和修改中還是造成了許多不便。不過好在這個問題只是表層,不涉及到程式碼本體的問題,只需要後續多加註意即可。
4.缺少註釋,在後續程式碼的修改和討論中不利於分析
由於以往的題目沒有這麼複雜和需要頻繁修改的情況,因此在初次寫題的時候沒有想起寫註釋,這實際上對我後續的修改產生了一點影響,更重要的是不利於我和同學們的程式碼交流。在下一次的PTA作業中,對於重要的函式、類和方法,我應該在開頭新增簡要的說明,解釋它們的作用、輸入引數和返回值。對於複雜的程式碼段或邏輯,我也應該在關鍵位置新增註釋,說明程式碼的工作原理和為什麼要這樣寫,才能便利程式碼的維護與修改。
**總結**
經過前三次PTA大作業的洗禮,我深刻體會到了程式設計實踐中的挑戰與成長。這三次作業不僅考驗了我對類與物件的理解、正規表示式的使用、陣列的使用和字串的處理等知識點的掌握程度,還鍛鍊了我的問題分析與解決能力。
在第一次PTA作業中,由於題目相對簡單,我較為順利地完成了任務。然而,隨著後兩次作業難度的逐漸加大,我遇到了越來越多的挑戰。第二次作業中,試卷類的引入以及多種異常資訊的處理,使得我需要在設計時更加周全地考慮各種情況。儘管初次提交後大部分測試點透過,但在“答案的出現順序去一一檢索試卷”這一理解上的偏差,讓我意識到自己在審題方面還有待加強。
在第三次作業中,學生類、刪除類和錯誤格式的處理等新增要求,使得問題變得更加複雜。為了應對這些挑戰,我重新規劃了類的設計,引入了新的類來分擔主函式的功能,使得程式碼結構更加清晰。然而,在方法的呼叫和引數傳遞方面,我仍然存在一些不足,導致程式碼可讀性降低。這也提醒我在未來的程式設計實踐中,需要更加註重程式碼的可讀性和可維護性。
三次的PTA中有兩次因為誤解題目資訊而導致需要大量修改,使我深刻體會到了審題的重要性。只有準確理解題目要求,才能避免在後續的開發過程中出現方向性的錯誤。此外,我也認識到了團隊合作的重要性。在與同學討論和互相幫助的過程中,我能夠更快地找到問題的癥結所在,從而更快地解決問題。
回顧這三次PTA大作業的經歷,我收穫了很多寶貴的經驗和教訓。在未來的程式設計實踐中,我將更加註重審題、注重程式碼的可讀性和可維護性、注重團隊合作和互相學習。同時,我也會保持謙虛和進取的心態,不斷挑戰自己,努力提升自己的程式設計能力和問題解決能力。
**寫在最後**
三次P他的作業不是學習終點,後續還有一共六次的PTA作業需要完成,從前三次的作業來看,後續作業的難度亦當不會簡單,希望在今後的學習中,能少一分迷茫,多一分堅定;少一分慌張,多一分從容。提前學習相關知識,做到步步為營,穩紮穩打。