前三次大作業總結

yim-1發表於2024-04-21

一、前言
這三次作業都是完成一個答題判題程式,但是每一次的都在增加新的內容,所以難度逐次增加。
1.第一次作業
程式輸入三部分內容:題目數量、題目內容、答題資訊。設計類並根據所輸入的資訊使用正規表示式進行切割,把每一部分存進各個物件中的屬性中並呼叫函式進行判題。因為是第一次大作業,所以題目相對簡單,題量不是很大,難度也適中。
2.第二次作業
程式在第一次的基礎上增加了內容,這次輸入的內容也是三種:題目資訊、試卷資訊、答卷資訊。因為上次給出了題目的數量所以可以直接使用陣列,但是這次需要我們學習ArrayList和HashMap的知識來實現對未知大小的資訊進行儲存,並會遍歷去尋找我們需要的內容。這次也增加了計算試卷總分的輸出內容,也爭對答案資訊缺少時進行了"answer is null"的輸出。對比第一次大作業難度有了不少的增加,因為增加了一些功能所以題量也有所增加,因為當時的ArrayList與HashMap沒有掌握透徹,難度稍微偏大。
3.第三次大作業
程式內容繼續在第二次的基礎上進行增加,這次輸入的資訊內容增加到了五種:題目資訊、試卷資訊、答題資訊、學生資訊、刪除題目資訊。這次的資訊會打亂輸入,也需要正規表示式判斷輸入的資訊是否滿足格式,只有正確的格式才能進行儲存。這次仍然需要熟練使用ArrayList和HashMap的知識來實現對未知大小的資訊進行儲存,在主函式中也要使用List對每一種類的所有物件進行儲存,並增加了許多限制,例如:(1)試卷中的題目儲存可以不按照題目自身的編號但是在答卷中答案輸入的答案編號是按照它所匹配的試卷試題的順序進行匹配;(2)增加了學生資訊,在每一次判斷答卷時需要判斷試卷,題目,學生是否存在;(3)題目錯誤引用:答案不存在,引用錯誤題號,題目被刪除,每一種情況輸出的結果都有所不同等等。題量增加了很多,需要有清晰的邏輯,難度也大大提升。
二、設計與分析
以下是我對每次大作業的程式碼分析:
1.第一次大作業
因為第一次的輸入格式比較簡單,所以我設計了一個試題類來儲存所有的試題(題號,內容,答案),並將這些屬性封裝,編寫了一些get,set函式對這些屬性進行編寫。
也使用了有參與無參的構造器方便主函式建立新的物件。
也在類裡面編寫了一個判斷答案正確與否的方法,並且能返回結果。
在主函式中我迴圈接收輸入的資訊並進行切割存放進問題物件中,並建立陣列對所有問題進行儲存,答案直接存進答案陣列中
再對答案與各個問題中的標準答案進行比對

這次作業讓我知道了如何使用類,並學會了如何建立物件並使用它的方法。
2.第二次大作業
這次作業的輸入資訊種類有所增加,所以我設計了題目類,試卷類和答卷類。在主函式中迴圈輸入這三種資訊的時候,用正規表示式對其進行分割並建立相應的物件並用List進行儲存


因為在輸出得分前需要給出試卷是否為100分,所以遍歷儲存試卷的List,並呼叫每個試卷物件中的總分方法判斷總分
再進行一次遍歷將所有的試卷資訊,答案資訊,判斷是否正確,並計算總得分等資訊全部輸出

在這一次的大作業裡面,我初次使用ArrayList與HashMap,瞭解到如何儲存一類中的所有物件,並對這些物件進行增刪改查,也進一步加深瞭如何切割字串並進行儲存。
3.第三次大作業
這次輸入的資訊種類在第二次的基礎上增加到了五種,但是我還是設計了三個類,題目增加了判斷輸入的資訊是否符合格式要求,不符合則不能儲存,所以使用了一個函式,用正規表示式對每種資訊都進行判斷


輸入並將不同的資訊儲存到相應的List中,因為題目引用錯誤的不同,輸出的答案也有所不同,因為題目被刪除這個引用錯誤在輸入時就可以進行對所有題目以及所有試卷各自所含題目的答案進行修改,與其它的題目進行區分
在試題輸入時我將所有的試題全部進行儲存,而在試卷輸入時,試卷每增加一個題目,都需要去全部題目中透過題目編號遍歷並將找到的試題儲存金試卷的題目List裡
下面是在試卷類裡面增加題目的方法,如果找不到,對這題進行標記,在後面輸出時,輸出這題不存在

因為還是要輸出試卷是否為100分,所以還是遍歷List並找到對應物件使用方法返回它的總分並進行判斷
接下來對所有答卷進行遍歷,因為答案全部存在相應答卷物件的屬性中,所以我將對答卷進行判斷的過程放在答卷類的方法中,傳進去所有的試卷資訊和學生資訊,在每一張答卷中進行判斷並輸出
先透過答卷的序號遍歷所有試卷並找出對應試卷,如果找不到就輸出“找不到試卷”,找到了就遍歷這張試卷所有的題目,並記錄現在遍歷到第幾道題,並在同時找到這份答卷中的答案List尋找此順序號所對應的答案並進行判斷,如果找不到則輸出“答案不存在”
在遍歷到下一張答卷前,在呼叫一個答卷方法,輸出每道題的得分並計算總得分,但是要先判斷這個學生是否在學生的列表中,不在則輸出“這個學生不存在”,找到則遍歷相應試卷的題目判斷每道題是否正確,只有正確才會輸出相應分值並加入總分,其餘情況全部按0分處理

在這次的作業裡我更加透徹的瞭解到ArrayList和HashMap的增刪改查以及相互巢狀的用法,也加深了使用正規表示式方法的印象,會使用其進行字串的判斷和字串的拆分,這次題目的結構更加的複雜,資訊更加的繁雜,需要理清邏輯再進行編碼,也在編碼的過程中我不僅增強了我的思維能力,也讓我認識到物件導向的優點,可以讓我的程式碼更加有條理。

三、踩坑心得
第一次大作業
在對題目進行遍歷時,沒考慮到題目可能亂序輸入,導致答案出錯,正確的輸入輸出是
出錯時的輸出是
所以需要將題目按順序輸出,再與答案進行比較,就是將
更改為
這個錯誤讓我明白了要細心讀題,瞭解到不同輸入方式可能會對輸出造成的影響,並需要想辦法解決這些麻煩。
2.第二次大作業
遍歷題目時因為Map並不能按輸入順序儲存所有的題目資訊,所以導致輸出的題目與答案不能匹配,導致出現錯誤,正確的輸入輸出是
錯誤輸出時輸出的是
這時我們可以改變儲存方式,用其他的方式進行輸出,就是將
更改為
所以以後在使用這些工具的時候需要了解到每一個工具的優缺點和可能會在運用時產生的錯誤,也讓我對List和Map有了更加深刻的認識。
3.第三次大作業
在開始輸入的時候,應該先判斷這一題是否存在,再去刪除這一題並作記號,正確的輸入輸出時
錯誤的輸入輸出是
所以應該先判斷這一題是否存在,再去修改,就是將
改成
還有在判斷輸入切割時,使用的正則出現了錯誤,使正確的輸入無法正確儲存,正確的輸入輸出
錯誤的輸入輸出
所以需要改變正規表示式對字串的拆分,即將

改為

在這次作業我學習到了許多正規表示式的使用方法,也知道需要從多個方面思考問題,不能按照自己的思路隨意拆分,要結合實際情況。而且不同的情況需要確定先後順序,不能想當然。
四、改進建議
1.第一次大作業
這次大作業是規定的大小的,所以可以直接定義陣列對所有的物件進行儲存,但是在實際生活中很少出現這種特殊情況,所以最好將陣列改為List,以免輸入的題目超出陣列大小導致編譯錯誤。
2.第二次大作業
這個作業的順序是亂序,最好能將所有題號按照試卷新增題目的順序將這張試卷所擁有的題目儲存在試卷類中,可以節省許多不必要的麻煩,並且方便我們查詢程式碼,答卷也是同樣,將該答卷的所有答案存進該答卷中,這樣不用每次都去所有的題目或答案中尋找,也可以讓程式碼的邏輯更加清晰。
3.第三次大作業
這次作業沒有判斷刪除的題目是否存在,所以應該提前設定一個判斷以免錯誤刪除導致新增錯誤資訊,題目的錯誤引用可以更改題目資訊進行記錄,方便查詢。
五、總結
1.這三次大作業讓我知道了何用面對物件的設計方式設計我的程式,學會利用類設計物件,並將不同的物件進行分類儲存。
2.學會了如何使用正規表示式判斷一段字串是否符合需求,並對字串進行分割。
3.學會了ArrayList和HashMap,知道如何在不知道大小的情況下儲存一系列資料,並進行增刪改查。
4.對於正規表示式還需要進一步的學習,加強練習,達到對正規表示式的熟練運用。
5.對於物件的一些調取功能還不是特別熟練,需要培養更加清晰的邏輯思路。
6.希望老師能在課堂上適當提醒一些想不到的樣例,開拓我們的思路。

相關文章