一:前言:
1.知識點:主要包括類和物件的使用、資料封裝、方法的定義和使用、陣列操作、字串處理、以及基本的輸入輸出操作,每次題集的最後一題對於字串的處理的要求都比較細緻,有很多需要考慮的細節,這部分在後面詳細介紹。
2.題量:每次題目集的題目量都比較適中,不多不少
3.難度:除了最後一題外難度都比較適中,最後一題的難度較大,每次都要7.8小時及以上
二:設計與分析:
第一次作業:
答題判題程式-1:本題要求實現一個簡單的答題判題程式,包括題目的輸入、試卷的輸入,答案的提交、以及答案的校驗和輸出。
解題思路:設計了四個類:
Question 類
屬性:number(題目編號)、content(題目內容)、standardAnswer(標準答案)
方法:建構函式、getter方法、checkAnswer方法用於檢查答案是否正確
功能:表示一個題目,包含編號、內容和標準答案,並能檢查給定的答案是否正確
Exam 類
屬性:count(題目數量)、questions(題目陣列)
方法:建構函式、judgeAnswer方法用於判斷特定題目的答案是否正確、saveQuestion方法用於儲存題目
功能:表示一次考試,包含多個題目,並能對答案進行校驗
AnswerPaper 類
屬性:exam(考試物件)、answerList(答案列表)、judgeList(答案校驗結果列表)
方法:建構函式、check方法用於檢查特定題目的答案是否正確、output方法用於輸出題目、答案和校驗結果
功能:表示一份答題卡,包含答案和校驗結果,並能輸出這些資訊
Main 類
方法:main方法,程式的入口點
功能:讀取題目和答案,建立考試和答題卡物件,然後輸出答案和校驗結果
程式碼流程分析
讀取題目數量:透過Scanner讀取題目數量n。
讀取題目資訊:迴圈讀取n個題目的資訊,包括編號、內容和標準答案,並建立Question物件儲存到Exam物件中。
讀取答案:讀取答案資訊,並透過split方法分割成陣列。
建立答題卡物件:使用考試物件和答案陣列建立AnswerPaper物件。
輸出答案和校驗結果:呼叫AnswerPaper物件的output方法輸出題目、答案和校驗結果。
類圖
第二次作業:
答題判題程式-2:實現了一個考試系統,涵蓋了題目管理、考試管理、成績管理和學生答案管理等功能
解題思路:設計了十個個類:
Question 類
屬性:
int number: 題目編號
String content: 題目內容
String StandarAnswer: 標準答案
方法:
構造方法和 checkAnswer 方法用於檢查學生的答案是否正確。
功能:表示單個題目。
QuestionList 類
屬性:
Question[] questionsList: 儲存題目的陣列
方法:
saveQuestion: 儲存題目到陣列中。
功能:管理題目列表。
Exam 類
屬性:
int id: 考試編號
Question[] questions: 儲存考試題目的陣列
方法:
addQuestion: 向考試中新增題目。
judgeAnswer: 判斷學生的答案是否正確。
功能:表示一次考試。
Examlist 類
屬性:
Exam[] examList: 儲存考試的陣列
方法:
saveExam: 儲存考試到陣列中。
功能:管理考試列表。
sco 類
屬性:
int scoredata: 分值
int id: 題目編號
功能:表示每道題目的分值。
Score 類
屬性:
int totalScore: 總分
sco[] scores: 儲存分值的陣列
方法:
save: 儲存分值並更新總分。
功能:管理考試的分數。
ScoreList 類
屬性:
Score[] scoreList: 儲存分數的陣列
方法:
saveScore: 儲存分數到陣列中。
功能:管理分數列表。
AnswerList 類
屬性:
String[] StudentAnswers: 儲存學生答案的陣列
方法:
saveAnswers: 儲存學生答案。
功能:管理學生的答案。
AnswerPaper 類
屬性:
AnswerList[] AnswerPapers: 儲存答卷的陣列
方法:
saveAnswerPaper: 儲存答卷。
功能:管理所有答卷。
Main 類
功能:程式入口,負責呼叫資料輸入、分數判斷和答卷比較的功能。
資料流分析
輸入資料:
使用 Scanner 讀取輸入資料,支援題目、考試和學生答案的輸入。
資料格式透過特定的字首(如 #N:、#T:、#S:)進行區分。
資料處理:
透過 extractContent 方法提取題目內容、答案等資訊。
將提取的資料封裝到相應的類中(如 Question、Exam、Score 等)。
分數判斷:
judgeScore 方法檢查每份試卷的總分是否為100,並輸出相應資訊。
答卷比較:
comparePaper 方法遍歷學生的答案,比較每道題目的答案是否正確,並輸出分數。
類圖
第三次作業:
答題判題程式-3:實現了一個考試系統,涵蓋了題目管理、考試管理、成績管理和學生答案管理等功能
解題思路:設計了八個類
類設計分析
Question 類
屬性:
int number: 題目編號
int score: 題目分數
int getscore: 學生獲得分數
String content: 題目內容
String StandarAnswer: 標準答案
int flag: 題目有效性標誌
方法:
構造方法和 checkAnswer 方法用於檢查學生的答案是否正確。
QuestionList 類
屬性:
Question[] List: 儲存題目的陣列
方法:
saveQuestion: 儲存題目到陣列中
Exam 類
屬性:
int id: 考試編號
Question[] questions: 儲存考試題目的陣列
int totalScore: 總分
方法:
addQuestion: 向考試中新增題目。
judgeAnswer: 判斷學生的答案是否正確。
ExamList 類
屬性:
Exam[] exams: 儲存考試的陣列
方法:
saveExam: 儲存考試到陣列中。
Student 類
屬性:
String sid: 學生編號
String sname: 學生姓名
StudentData 類
屬性:
Student[] sList: 儲存學生的陣列
方法:
saveStudent: 儲存學生到陣列中。
AnswerPaper 類
屬性:
int Aid: 答卷編號
String Sid: 學生編號
String[] answers: 儲存學生答案的陣列
int[] ids: 儲存題目編號的陣列
方法:
saveAnswer: 儲存學生答案。
setid: 設定答卷編號和學生編號。
DeleteQues 類
屬性:
int[] deles: 儲存要刪除的題目編號的陣列
方法:
savedel: 儲存要刪除的題目編號。
類圖
資料流分析
輸入資料:
使用 Scanner 讀取輸入資料,支援題目、考試、學生和答卷的輸入。
資料格式透過特定的字首(如 #N:、#T:、#S:、#X:、#D:)進行區分。
資料處理:
透過 extractContent 方法提取題目內容、答案等資訊。
將提取的資料封裝到相應的類中(如 Question、Exam、Student 等)。
刪除題目:
DeleteQuestion 方法根據刪除列表 DeleteQues 刪除題目。
分數判斷:
JudgeScore 方法檢查每份試卷的總分是否為100,並輸出相應資訊。
答卷比較:
CompareAnswer 方法遍歷學生的答案,比較每道題目的答案是否正確,並輸出分數。
三:採坑心得:
第一次作業:
1.在處理字串,提取題目的編號,內容,標準答案時出錯
程式碼如下:
使用indexOf記錄#N:,#Q:,#A:,然後用substring提取#N:到#Q:,#Q:到#A:,#A:之後的內容時出錯,未考慮#N:本身的長度,導致提取的內容出錯
測試時報錯如下:
解析:這個異常 java.lang.NumberFormatException 發生在嘗試將字串轉換為整數時,如果字串不是有效的整數格式,就會丟擲這個異常。程式碼中,異常是在 Main 類的 main 方法的第88行丟擲的,這是因為 Integer.parseInt 方法接收了一個不能解析為整數的字串。根據異常資訊 For input string: "#N:1",我們可以看到問題出現在嘗試將字串 "#N:1" 轉換為整數時。這個字串顯然是不符合整數格式的,因為它包含了非數字字元。
要解決這個問題,需要確保傳遞給 Integer.parseInt 方法的字串只包含數字。
程式碼修改後:
這次程式碼在使用indexOf時,加上了#N:本身的長度,這樣用substring提取的資料就是準確的
2.未考慮題號順序與輸入順序不同
導致答案校驗的結果錯誤
輸入:
2
//#N:2 #Q:1+1= #A:2
//#N:1 #Q:5+5= #A:10
//#A:10 #A:2
//end
預計輸出:
5+5=~10
1+1=~2
true true
實際輸出:
1+1=~10
5+5=~2
false false
修改程式碼,在儲存題目和校驗答案輸出時,按照題號來對應答題卡中的答案,然後給出相應的的輸出
第二次作業:
1.未考慮到答卷可以為空,(#S:2)
這樣提取到的a是錯誤的無法轉化為int型別
報錯如下:
這個異常 java.lang.NumberFormatException 發生時,通常意味著嘗試將一個空字串或非數字字串轉換為整數。在您提供的程式碼中,異常是在 Main 類的 InputData 方法的第218行丟擲的,這通常是因為 Integer.parseInt 方法接收到了一個空字串或者不包含有效數字的字串。
修改程式碼:
增加一個判斷,答卷是否為空,若為空答卷的編號則為#S:後面的字元,若不為空為為#S: - #A:之間的字元,然後再轉換為int型別
同時增加對答案的判斷,若不為空則儲存
第三次作業:
1.未考慮到輸入的字串的格式錯誤,將錯誤的內容儲存
導致答案錯誤
增加正規表示式來判斷輸入的字串格式是否正確
2.在增加了正規表示式之後,未考慮到,空白卷 沒有答案的試卷,答案為空字元等問題,導致在提起資訊並儲存的時候出錯,然後在後面校驗答案時出現陣列越界的錯誤
修改正規表示式,並在處理資料時增加對空白卷等情況的判斷
3.在處理無效的試卷引用時,一開始考慮的是遍歷答卷,來判斷試卷是否有對應的答卷導致錯誤,
後面修改為遍歷試卷,看是否有與答卷匹配的試卷。並且增加對答卷是否存在的判斷
用flat來記錄是否有匹配的試卷,並用brr記錄所匹配到的試卷的編號
四:改進建議:
第一次作業:
異常處理:程式碼中沒有對輸入進行異常處理,例如輸入的不是整數或者輸入的格式不正確。應該新增異常處理來確保程式的健壯性。
輸入驗證:在讀取題目和答案時,應該驗證輸入的合法性,例如題目編號是否重複,答案是否為空等。
程式碼重構:AnswerPaper類的output方法中,輸出題目和答案的迴圈可以合併,減少程式碼的重複。
資料結構最佳化:Exam類中的questions陣列使用編號作為索引可能不是最優選擇,因為編號可能不是連續的。可以考慮使用HashMap來儲存題目。
程式碼清晰性:Main類中的main方法過長,可以考慮將其拆分為幾個小方法,每個方法負責一個特定的功能,以提高程式碼的可讀性和可維護性。
第二次作業:
異常處理:增加輸入驗證和異常處理,確保輸入資料的格式正確,避免程式崩潰。
資料結構最佳化:使用 ArrayList 替代陣列,以便動態管理題目、考試和答案的數量,避免頻繁的陣列複製。
程式碼重構:將重複的程式碼提取為方法,增加程式碼的可讀性和可維護性。
第三次作業:
改進建議和前兩次一致
五:總結:
本階段的三次題目集涵蓋了Java程式設計的多個方面,包括物件導向程式設計、資料結構、異常處理、正規表示式、輸入輸出處理等。
透過這三次的題目,我學會了陣列的動態增長,對字串的處理,split,trim,substring,indexof等方法,學會了物件導向的思想,
接下來應該深入學習Java集合框架,包括List、Set、Map等介面及其實現類,瞭解它們的用途和效能特點,還需要學習異常處理:
學習如何自定義異常,並在程式碼中合理使用try-catch-finally塊來處理異常。
學習心得:在寫題時不能看個大概就直接開始寫,應該在反覆閱讀題目設計好解題思路,畫出簡易的類圖後開始寫。
不然在後面除錯程式碼改錯時會花費大量時間
建議及意見:希望老師在上課時多講一些後面大作業可能需要用到的語法和技巧,同時建議能夠給出大作業中所有的測試點,有的時候一個測試點需要猜幾個小時。