OOP第一次Blog

我超厉害的發表於2024-04-21

本次Blog總結前三次作業的心得和體會

**前言:前三次PTA作業整體難度不算很大,題量也一般,但是運用的知識點還是挺多挺雜的。
第一次:沒用到什麼繁瑣的知識點,初步見識到類之間的關聯性和耦合性,難度不大,但是比較考驗耐性。

第二次:開始接觸介面,用介面輔助排序,最後一道題在第一次的基礎上進行了迭代,我引入了Linklist類,可以更好地操作。

第三次:這次比較考驗類的封裝性,最後一題經過兩次迭代,類與類之間的關係更加複雜,有幾個測試點沒有過。

**設計與分析:

首先第一次題目都比較簡單其他的都是最基本的類的構建,分析一下最後一題吧,第一次最後一題,我構建了三個類
題目類(用於封裝單個題目的資訊):
屬性:題目編號、題目內容、標準答案-standardAnswer
方法:資料讀寫set\get方法、
判題方法(答案-answer):判斷答案-answer是否符合標準答案-standardAnswer

試卷類(用於封裝整套題目的資訊)
屬性:題目編號,試卷編號,題目分值
方法:判題方法(題號-num、答案-answer):判斷答案-answer是否符合對應題號的題目標準答案-standardAnswer
儲存題目(題號-num、題目-question):將題目儲存到題目列表中,儲存位置與num要能對應

答卷類(用於封裝答題資訊)
屬性:試卷(試卷類的物件)、答案列表(儲存每一題的答案)、判題列表(儲存每一題的判題結果true/false)
方法:判題方法(題號-num):判斷答案列表中第num題的結果是否符合試卷中對應題號的題目標準答案
輸出方法(題號-num):按照題目的格式要求,輸出題號為num的題目的內容和答題結果。
儲存一個答案(題號-num,答案-answer):儲存題號為num的題目的答題結果answer。

由於第一次這種題目,對java的封裝性還是很好的掌握,寫題目是破壞了類與類之間的關係。
我在答卷中搜尋對應題目時,我把所有的題目都遍歷了一遍,沒有將這道張卷子的題目取出來
就像下面這樣

我開了一個Linklist類儲存所以分數,我挨個檢查所以題目找到對應的編號,比較答案,然後輸出。
這是很麻煩的一種做法。
但是最後也是把所有測試點過了,也沒有太大問題。

然後是第二次作業,這次作業第一題我接觸到了介面,用來自定義排序方式

從而達到降序的目的。
然後分析這次作業的最後一題,在第一次的基礎上進行了迭代,但是改變不算很大,我沒有新加類,所以簡單說一下哪些改變。
這次可能會有多張答卷和試卷,所以為了我採用LinkList型別儲存答卷和試卷。

使用while死迴圈多次輸入直到end,每次分別加入對應的連結串列中。

然後又改變這次試卷中題目的順序,但是這個改變沒有影響,因為本就是從小到大的遍歷,但是有一點不一樣,題目順序可能有空缺。
例如,1,2,4沒有3。這是合法輸入。
所以我在Test(試卷類)中將題目序號用LinkList類儲存,排序。

這道題之後也和上次差不多了。

最後是第三次作業,這次作業第二題,學習到了日期類的基本使用方法。
建立日期物件:Date date = new Date();
格式化日期:SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");,然後使用sdf.format(date)進行格式化。
日期比較:date1.compareTo(date2),返回值表示date1和date2之間的差異。
日期計算:date1.getTime() - date2.getTime(),返回兩個日期之間的時間差(以毫秒為單位)。
其他也沒什麼難度。
然後第三次作業最後一題,就非常讓人崩潰,我這道題有幾個測試點沒有過。
本次新加了一個類
Student(學生類)
屬性:學號,姓名。
方法:檢查學生是否存在,返回String型別。

本次輸入資訊中引入了一種新的資訊,刪除資訊,用LinkList型別儲存了所以刪除的題目。
並在題目連結串列中刪除。

然後答卷類中也新加入了學號的新屬性(String型別)
並且新增檢測學號是否存在的方法、

然後還加入了錯誤格式檢測,有多中錯誤格式,用正規表示式一一比對即可
String[] regex = { "^#N:\d\s#Q:.#A:.",
"^#T:\s\d+\s((\d+\s-\s\d+\s)+)$", "^#S:\s\d+\s\d+\s(.?)$",
"^#X:\s
\d+\s(.?)+(?:-\d+\s(.?)+)$", "^#D:\sN\s-\s\d+\s*$", };
然後和上次一樣進行遍歷比對,過程比較繁瑣。
根據試卷的題目順序,在答卷中遍歷查詢答案,如果沒有則輸出相應提示,
然後根據優先順序查詢問題是否被刪除,如果沒有就比對答案,新增分數。
如果問題被刪除加入0分,輸出提示。






但是最後的最後還是有三個測試點沒有過去。

**踩坑心得:

正規表示式多次匹配錯誤,題目說的比較模糊,導致我寫正規表示式時多次錯誤。
導致匹配失敗。
例如:
"#N:(.)#Q:([ a-zA-Z0-9])#A:(.)"
"([0-9]+)[ ]
([a-zA-Z]*)"等都是匹配失敗案例。

java中想要多行輸入,nextInt()與nextLine()
千萬千萬千萬不要同時使用,很可能會報錯,如果要輸入數字,先用String型別接收,之後轉化為int型別。

多次迴圈過後,迴圈數弄反了。這是一個很崩潰的錯誤,因為非常難找。
好幾百行程式碼中找這種錯誤真的很絕望。
例如:

邏輯錯誤,推薦寫大作業之間用筆寫下自己的邏輯和思路,不然純靠自己腦子記住真的很容易邏輯出錯,忽然混淆,java程式碼本身就比較繁瑣,
邏輯錯誤就會導致之間退出程式碼或者無法訪問。
例如:

**改進建議:
第三次作業可以透過新加一種類來最佳化程式碼
試卷題目類(Question_Paper):用於儲存試卷中的題目資訊。

由於試卷中的題目序號與題 目本身的題號不一致。且題目在不同試卷中的分值可能不一樣,因此,設計試卷題目類。
int p_q_num;//試卷中題目的順序號
Question question;//題目類的物件,儲存題目資訊
int question_score;// 題目分值
int judge_markAnswer(String answer) // 判斷題目得分

這樣儲存了試卷與題目的關係,就不需要每一次都從所有題目中遍歷。

另外還可以使用HashMap型別儲存試卷中對應編號和分數,也可以簡化程式碼。

以提高程式碼的質量和效能。

**總結:

對物件導向程式設計(OOP)概念理解加深了,Java是一種物件導向的語言,透過這三次作業,更深入地理解類、物件等概念。

然後程式碼組織與結構的能力增強,編寫大型Java程式需要良好的程式碼組織和結構。

會學習如何使用介面、類組織程式碼,以及如何使用註釋來提高程式碼的可讀性。

除錯能力提高,除錯是開發過程中不可或缺的一部分。學會如何使用除錯工具和技巧來定位和修復程式碼中的錯誤。

還學會了許多類的使用例如LinkList,ArraysList,HashMap等等。

然後是一些建議:
第三次的作用最後一題,僅僅是一張答卷,可以新增多張答卷,更符合實際。

之後的PTA作用可以加入一些演算法資料結構的知識,促進我們自學,這幾次作用都沒有什麼演算法知識。

可以加入更多關聯實際的題目,增強對物件導向的理解。