對前三週pta總結

luailu發表於2024-04-21

在進入總結之前,先講講我在學習過程中的曲折的心路歷程:在剛開始學習java時,我覺得java與我們上學期接觸的c語言(在語法上)沒有什麼差別,甚至在剛用java寫一些簡單題目時(數學題),感覺需要打非常多的字母,就例如輸入這方面,c語言可能只需要scanf一下,但java卻要先import一下,再......(不過多贅述),在我心裡java確實沒有c語言那麼方便,不過在解決前幾次簡單的pta(小雜毛)過程中,我還是對自己的水平蠻有信心的,但直到....
直到我接觸到了java的核心:類設計時,我就知道:it’s hard!第二次的正式大作業的最後一題,就極大考驗了我對類設計的理解,我設計的也確實非常不好,導致了在某個點上糾結過多時間,還經常會忘記之前的類設計,導致結構的亂與雜。我最後也沒有拿到滿分(好難過),以下是我對這三次作業的一個總結:
******(1).前言:

第一次作業知識點:(1).如何設計一個類(2).如何使用一個類(3).如何使用陣列(4).正規表示式的使用(5).對字串的處理
題量:中
難度:低

第二次作業知識點:(1).Collections排序的使用(2).LinkedList類的使用(3).類的設計(4).正規表示式的使用(5).對字串的處理(6).Pattern以及Matcher的使用
題量:中
難度:中等偏上

第三次作業知識點:(1).日期類的使用(2).LinkedList類的使用(3).類的設計(4).正規表示式的使用(5).對字串的處理(6).hashmap類的使用(7).Pattern以及Matcher的使用
題量:少
難度:高
******(2).設計與分析:
第一題:
設計實現答題程式,模擬一個小型的測試,要求輸入題目資訊和答題資訊,根據輸入題目資訊中的標準答案判斷答題的結果。

輸入格式:
程式輸入資訊分三部分:

1、題目數量

格式:整數數值,若超過1位最高位不能為0,

樣例:34

2、題目內容

一行為一道題,可以輸入多行資料。

格式:"#N:"+題號+" "+"#Q:"+題目內容+" "#A:"+標準答案

格式約束:題目的輸入順序與題號不相關,不一定按題號順序從小到大輸入。

樣例:#N:1 #Q:1+1= #A:2

     #N:2 #Q:2+2= #A:4

3、答題資訊

答題資訊按行輸入,每一行為一組答案,每組答案包含第2部分所有題目的解題答案,答案的順序號與題目題號相對應。

格式:"#A:"+答案內容

格式約束:答案數量與第2部分題目的數量相同,答案之間以英文空格分隔。

樣例:#A:2 #A:78

  2是題號為1的題目的答案
  78是題號為2的題目的答案

答題資訊以一行"end"標記結束,"end"之後的資訊忽略。

輸出格式:
1、題目數量

格式:整數數值,若超過1位最高位不能為0,

樣例:34

2、答題資訊

一行為一道題的答題資訊,根據題目的數量輸出多行資料。

格式:題目內容+" ~"+答案

樣例:1+1=~2

      2+2= ~4

3、判題資訊

判題資訊為一行資料,一條答題記錄每個答案的判斷結果,答案的先後順序與題目題號相對應。

格式:判題結果+" "+判題結果

格式約束:

 1、判題結果輸出只能是true或者false,
 2、判題資訊的順序與輸入答題資訊中的順序相同

樣例:true false true

在第一次作業的類設計時,我只寫了一個叫all的類,其中的屬性有編號,內容,標準答案以及我的答案(非標準答案),好處是在建立物件時比較方便,以及對於正確答案與給出的答案比較好比較。缺點是無法對後續類進行擴充,沒有體現單一職責功能,這也是後續程式碼比較亂的重要原因之一,所以缺點是明顯大於優點的,只貪圖了一時的方便,而且對於字串的處理全寫在了主類裡,這非常不好。
第二題:
設計實現答題程式,模擬一個小型的測試,以下粗體字顯示的是在答題判題程式-1基礎上增補或者修改的內容。

要求輸入題目資訊、試卷資訊和答題資訊,根據輸入題目資訊中的標準答案判斷答題的結果。

輸入格式:

程式輸入資訊分三種,三種資訊可能會打亂順序混合輸入:

1、題目資訊

一行為一道題,可輸入多行資料(多道題)。

格式:"#N:"+題目編號+" "+"#Q:"+題目內容+" "#A:"+標準答案

格式約束:

1、題目的輸入順序與題號不相關,不一定按題號順序從小到大輸入。
2、允許題目編號有缺失,例如:所有輸入的題號為1、2、5,缺少其中的3號題。此種情況視為正常。

樣例:#N:1 #Q:1+1= #A:2

     #N:2 #Q:2+2= #A:4

2、試卷資訊

一行為一張試卷,可輸入多行資料(多張卷)。

格式:"#T:"+試卷號+" "+題目編號+"-"+題目分值

 題目編號應與題目資訊中的編號對應。

 一行資訊中可有多項題目編號與分值。

樣例:#T:1 3-5 4-8 5-2

3、答卷資訊

答卷資訊按行輸入,每一行為一張答卷的答案,每組答案包含某個試卷資訊中的題目的解題答案,答案的順序與試卷資訊中的題目順序相對應。

格式:"#S:"+試卷號+" "+"#A:"+答案內容

格式約束:答案數量可以不等於試卷資訊中題目的數量,沒有答案的題目計0分,多餘的答案直接忽略,答案之間以英文空格分隔。

樣例:#S:1 #A:5 #A:22

   1是試卷號 

   5是1號試卷的順序第1題的題目答案

   22是1號試卷的順序第2題的題目答案

答題資訊以一行"end"標記結束,"end"之後的資訊忽略。

輸出格式:

1、試卷總分警示

該部分僅當一張試卷的總分分值不等於100分時作提示之用,試卷依然屬於正常試卷,可用於後面的答題。如果總分等於100分,該部分忽略,不輸出。

格式:"alert: full score of test paper"+試卷號+" is not 100 points"

樣例:alert: full score of test paper2 is not 100 points

2、答卷資訊

一行為一道題的答題資訊,根據試卷的題目的數量輸出多行資料。

格式:題目內容+""+答案++""+判題結果(true/false)

約束:如果輸入的答案資訊少於試卷的題目數量,答案的題目要輸"answer is null"

樣例:3+2=5true

     4+6=~22~false.

  answer is null

3、判分資訊

判分資訊為一行資料,是一條答題記錄所對應試卷的每道小題的計分以及總分,計分輸出的先後順序與題目題號相對應。

格式:題目得分+" "+....+題目得分+"~"+總分

格式約束:

1、沒有輸入答案的題目計0分

2、判題資訊的順序與輸入答題資訊中的順序相同
樣例:5 8 0~13

根據輸入的答卷的數量以上2、3項答卷資訊與判分資訊將重複輸出。

4、提示錯誤的試卷號

如果答案資訊中試卷的編號找不到,則輸出”the test paper number does not exist”,參見樣例9。

設計建議:

參考答題判題程式-1,建議增加答題類,類的內容以及類之間的關聯自行設計。

第二次的類就設計的比較多,也非常亂,先對我第二次作業的類設計介紹一下:第一個類叫做topic類(題目類,屬性有編號,內容,標準答案)(這個題目類倒是符合單一職責)。第二個類叫做paper類(試卷類,屬性有編號,題目數量,試卷總分,以及一個連結串列(放的是題目類的物件),以及分數陣列)。第三個類叫做answerpaper類(答卷類:屬性有編號,以及一個連結串列(放的是String型別的答案(非標準答案)))。還有一個主類(裡面有一個字元匹配的方法)。總的來說,設計的很差,因為在儲存完資料之後,連我自己都用不來了(捂臉),找不到對應資料存放的地方,所以總的來說設計的很亂很雜。
第三題:
設計實現答題程式,模擬一個小型的測試,以下粗體字顯示的是在答題判題程式-2基礎上增補或者修改的內容,要求輸入題目資訊、試卷資訊、答題資訊、學生資訊、刪除題目資訊,根據輸入題目資訊中的標準答案判斷答題的結果。

輸入格式:

程式輸入資訊分五種,資訊可能會打亂順序混合輸入。

1、題目資訊
題目資訊為獨行輸入,一行為一道題,多道題可分多行輸入。

格式:"#N:"+題目編號+" "+"#Q:"+題目內容+" "#A:"+標準答案

格式約束:
1、題目的輸入順序與題號不相關,不一定按題號順序從小到大輸入。
2、允許題目編號有缺失,例如:所有輸入的題號為1、2、5,缺少其中的3號題。此種情況視為正常。
樣例:#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4

2、試卷資訊

試卷資訊為獨行輸入,一行為一張試卷,多張卷可分多行輸入資料。
格式:"#T:"+試卷號+" "+題目編號+"-"+題目分值+" "+題目編號+"-"+題目分值+...

格式約束:
題目編號應與題目資訊中的編號對應。
一行資訊中可有多項題目編號與分值。
樣例:#T:1 3-5 4-8 5-2

3、學生資訊

學生資訊只輸入一行,一行中包括所有學生的資訊,每個學生的資訊包括學號和姓名,格式如下。

格式:"#X:"+學號+" "+姓名+"-"+學號+" "+姓名....+"-"+學號+" "+姓名

格式約束:
答案數量可以不等於試卷資訊中題目的數量,沒有答案的題目計0分,多餘的答案直接忽略,答案之間以英文空格分隔。
樣例:
#S:1 #A:5 #A:22
1是試卷號
5是1號試卷的順序第1題的題目答案
4、答卷資訊

答卷資訊按行輸入,每一行為一張答卷的答案,每組答案包含某個試卷資訊中的題目的解題答案,答案的順序號與試 卷資訊中的題目順序相對應。答卷中:

格式:"#S:"+試卷號+" "+學號+" "+"#A:"+試卷題目的順序號+"-"+答案內容+...

格式約束:
答案數量可以不等於試卷資訊中題目的數量,沒有答案的題目計0分,多餘的答案直接忽略,答案之間以英文空格分隔。
答案內容可以為空,即””。
答案內容中如果首尾有多餘的空格,應去除後再進行判斷。
樣例:
#T:1 1-5 3-2 2-5 6-9 4-10 7-3
#S:1 20201103 #A:2-5 #A:6-4
1是試卷號
20201103是學號
2-5中的2是試卷中順序號,5是試卷第2題的答案,即T中3-2的答案
6-4中的6是試卷中順序號,4是試卷第6題的答案,即T中7-3的答案
注意:不要混淆順序號與題號

5、刪除題目資訊

刪除題目資訊為獨行輸入,每一行為一條刪除資訊,多條刪除資訊可分多行輸入。該資訊用於刪除一道題目資訊,題目被刪除之後,引用該題目的試卷依然有效,但被刪除的題目將以0分計,同時在輸出答案時,題目內容與答案改為一條失效提示,例如:”the question 2 invalid~0”

格式:"#D:N-"+題目號

格式約束:

   題目號與第一項”題目資訊”中的題號相對應,不是試卷中的題目順序號。

   本題暫不考慮刪除的題號不存在的情況。      

樣例:

N:1 #Q:1+1= #A:2

N:2 #Q:2+2= #A:4

T:1 1-5 2-8

X:20201103 Tom-20201104 Jack

S:1 20201103 #A:1-5 #A:2-4

D:N-2

end

輸出
alert: full score of test paper1 is not 100 points
1+1=5false
the question 2 invalid~0
20201103 Tom: 0 0~0
答題資訊以一行"end"標記結束,"end"之後的資訊忽略。

輸出格式:

1、試卷總分警示

該部分僅當一張試卷的總分分值不等於100分時作提示之用,試卷依然屬於正常試卷,可用於後面的答題。如果總分等於100 分,該部分忽略,不輸出。

格式:"alert: full score of test paper"+試卷號+" is not 100 points"

樣例:alert: full score of test paper2 is not 100 points

2、答卷資訊

一行為一道題的答題資訊,根據試卷的題目的數量輸出多行資料。

格式:題目內容+""+答案++""+判題結果(true/false)

約束:如果輸入的答案資訊少於試卷的題目數量,每一個缺失答案的題目都要輸出"answer is null" 。
樣例:
3+2=5true
4+6=22false.
answer is null

3、判分資訊

判分資訊為一行資料,是一條答題記錄所對應試卷的每道小題的計分以及總分,計分輸出的先後順序與題目題號相對應。

格式:**學號+" "+姓名+": "**+題目得分+" "+....+題目得分+"~"+總分

格式約束:

 1、沒有輸入答案的題目、被刪除的題目、答案錯誤的題目計0分
 2、判題資訊的順序與輸入答題資訊中的順序相同
樣例:20201103 Tom: 0 0~0

   根據輸入的答卷的數量以上2、3項答卷資訊與判分資訊將重複輸出。

4、被刪除的題目提示資訊

當某題目被試卷引用,同時被刪除時,答案中輸出提示資訊。樣例見第5種輸入資訊“刪除題目資訊”。

5、題目引用錯誤提示資訊

試卷錯誤地引用了一道不存在題號的試題,在輸出學生答案時,提示”non-existent question~”加答案。例如:

輸入:

N:1 #Q:1+1= #A:2

T:1 3-8

X:20201103 Tom-20201104 Jack-20201105 Www

S:1 20201103 #A:1-4

end

輸出:
alert: full score of test paper1 is not 100 points
non-existent question~0
20201103 Tom: 0~0
如果答案輸出時,一道題目同時出現答案不存在、引用錯誤題號、題目被刪除,只提示一種資訊,答案不存在的優先順序最高,例如:
輸入:

N:1 #Q:1+1= #A:2

T:1 3-8

X:20201103 Tom-20201104 Jack-20201105 Www

S:1 20201103

end

輸出:
alert: full score of test paper1 is not 100 points
answer is null
20201103 Tom: 0~0

6、格式錯誤提示資訊

輸入資訊只要不符合格式要求,均輸出”wrong format:”+資訊內容。

  例如:wrong format:2 #Q:2+2= #4

7、試卷號引用錯誤提示輸出

如果答卷資訊中試卷的編號找不到,則輸出”the test paper number does not exist”,答卷中的答案不用輸出,參見樣例8。

8、學號引用錯誤提示資訊

如果答卷中的學號資訊不在學生列表中,答案照常輸出,判分時提示錯誤。參見樣例9。

本題暫不考慮出現多張答卷的資訊的情況。

看到第三題的類圖我自己看了都頭皮發麻,連主類一共寫了12個類(總算是在一定程度上保證了單一職責),簡單介紹一下各個類的職責:1.topic類(題目類)2.paper類(試卷類)3.answerpaper類(答卷類)4.student類(學生類)5.topicinput類(解析輸入用來儲存題目)6.paperinput類(解析輸入用來儲存試卷)7.answerinput類(解析輸入用來儲存答卷)8.delinput類(解析輸入用來儲存刪去的題目)9.studentinput類(解析輸入用來儲存學生)10.agent_1類(解析刪去的題目並對改題目進行處理以刪去這道題目)11.agent_2類(用來輸出)12.Test類(主類:僅輸入)。僅透過類圖就可以看出來我的設計,好吧,根本沒有設計可言,完全就是在亂寫一通,也是向第二題一樣,在輸出時根本沒有頭緒(搞得我頭都大了)。
******(3).踩坑心得:
在寫這次pta時我還是踩了非常多的坑的,提交程式碼時總是會有那麼幾個錯誤,於是得從頭開始除錯程式碼,花了好多時間發現了以下的坑,不過這才是真正有意義的東西。現在讓我對其說明一下。
【1】.在使用hashmap時,我採用的是用set遍歷hashmap,但遍歷順序並不是按照存入順序來的(可能會一樣)就如以下程式碼及其結果:


正如結果所演示的,遍歷出來的順序並沒有按照我的排列順序。解決方法:使用LinkedHashMap。
【2】.在使用.split函式將字串切割成字元陣列時,在字串的開頭有需要被切割的地方,字元陣列下標為0對應的字串為空,就如以下程式碼及其結果


正如結果所演示的,ss[0]對應的值為空。
【3】.在使用HashMap時,如果有key值相同的value值,後來輸入的value會覆蓋之前的value值,就如以下程式碼及其結果


正如所演示的,後來的value值java會覆蓋之前的value值c語言。
******(4).改進建議:
【1】.資料儲存上:過多的使用了LinkedList,導致資料的訪問比較困難(需要自己翻前面的程式碼去回憶怎麼存的,存到哪裡去了),而且也無法做到很靈活的使用,建議是改成更為方便的容器,就如陣列之類的。
【2】.字串的處理上:使用了Matcher以及Pattern去匹配正規表示式,但是用了先儲存後判斷的方式,雖說可以做到隨時呼叫,但卻導致出了一點差錯以及不方便的地方:導致了判斷Wrong Format的過程非常困難,建議是先判斷後儲存。
【3】.程式碼設計上:在儲存題目編號時,有可能出現1.2.5題的現象,在原來的程式碼中使用的是LinkedList的儲存方式,但LinkedList有一個非常大的弊端就是在儲存完過後很容易忘記下標對應的題目標號是多少(下標肯定與題目編號對不上,就如只有一道題時,題目編號為1,但其下標是0,所以不利於後面的使用),改進建議是將LinkedList改用成其他的容器,就比如hashmap,其特點就是可以隨意改變key值。
******(5).總結:
在這幾次pta作業中我學會了如何使用更多的java容器:如除了陣列之外的LinkedList,HashMap,LinkedHashMap,arrayList.....我也在寫程式碼的過程中理解並逐漸學會了如何設計類的單一職責。同時,學習 Java 是一段充滿挑戰和收穫的旅程,而在這個過程中,踩坑更是不可避免的一部分。透過踩坑,我深刻領悟到了許多關於程式設計的知識。
其次,我意識到理解和實踐並重的重要性。學習 Java 不僅僅是為了掌握其語法規則,更重要的是理解其背後的設計原理和程式設計思想。透過實踐,我不僅加深了對 Java 語言的理解,還提高了自己的程式設計能力。編寫程式碼、除錯程式是學習過程中的重要環節,只有透過不斷地實踐,才能真正掌握程式設計技能,才能成為一個優秀的程式設計師。
此外,我學會了善用除錯工具。除錯工具可以幫助我們逐步跟蹤程式碼執行過程,找出問題的根源。透過除錯工具,我能夠更快地定位問題,並找到解決方案。除錯是解決問題的有效手段之一,掌握好除錯工具對於提高程式設計效率至關重要。
以上就是我對pta這幾次作業的總結,感謝您的觀看!!!