JAVA 前三次題目集總結

flysusdjd發表於2024-10-23

在過去的一個月裡完成了java的前三次大作業對於JAVA的語法以及物件導向程式設計還不臺上手,接下來說前三次大作業。
前三次大作業要是圍繞答題判題系統展開的每次作業都在完善這個程式的功能可以說
1.第一次作業判分功能
在第一次作業階段,核心任務是建立一個能夠接收題目資訊和答題資訊,並能夠進行基本判分的系統。
• 核心功能:
題目處理: 透過 Question 類儲存題目內容和正確答案,為判分提供基礎。
答卷處理: AnswerSheet 類用於收集學生答案,包括學生ID和他們的答案。
判分邏輯: 對學生提交的答案與標準答案進行對比,判斷答題的正確性。
• 技術實現:
使用Java的資料結構如 Map 和 List 來儲存題目和答案。
對輸入的處理採用簡單的字串解析技術,以提取關鍵資訊。
• 挑戰與解決方案:
初始階段主要挑戰是確保所有題目和答案能正確錄入並能進行準確判分。
解決方案是透過單元測試確保每部分輸入正確處理和輸出預期結果。
2.第二次作業管理與總分校驗
第二次作業引入試卷的概念,增加了試卷與題目的關聯管理以及試卷總分的驗證。
• 新增功能:
試卷類的引入: TestPaper 類管理一張試卷中的題目和各題的分值。
總分驗證: 檢查每張試卷的總分是否為100分,如果不是則發出警告。
• 技術深化:
擴充套件了對輸入的解析,包括處理更復雜的字串格式和關聯資料。
引入邏輯判斷試卷總分是否合規。
• 挑戰與解決方案:
確保試卷中的題目與題庫中題目正確關聯,並正確計算總分。
透過逐項新增題目到試卷並實時計算總分來解決問題。
3.第三次作業的錯誤管理和資料完整性
第三次作業不僅增加了對學生資訊的管理,還增強了對錯誤和資料完整性的管理。
• 擴充套件功能:
學生資訊管理: 增加對學生的資訊處理,使得每張答卷都能與具體學生關聯。
題目刪除功能: 允許從系統中刪除題目,即使這些題目已經被試卷引用。
• 健壯性提升:
引入錯誤處理機制,如輸入格式錯誤、不存在的試卷號或學生號等。
對被刪除的題目在輸出時提供特別提示,如"題目無效"。
• 挑戰與解決方案:
處理輸入的複雜性和資料的一致性問題,如確保即使題目被刪除,相關的試卷仍能正確處理。
採用資料驗證和異常處理策略,增強系統的健壯性和使用者的錯誤反饋。

程式碼分析
第一次作業:
類圖:

順序圖:

解析輸入邏輯:parseInput 方法

    try {
        if (line.startsWith("#N:")) {
            // 解析題目資訊
            String[] parts = line.split(" #Q:| #A:");
            int questionId = Integer.parseInt(parts[0].substring(3));
            String questionContent = parts[1];
            String answer = parts[2];
            questions.put(questionId, new Question(questionContent, answer));
        } else if (line.startsWith("#T:")) {
            // 解析試卷資訊
            String[] parts = line.substring(3).split(" ");
            int paperId = Integer.parseInt(parts[0]);
            Paper paper = new Paper(paperId);
            for (int i = 1; i < parts.length; i++) {
                String[] questionParts = parts[i].split("-");
                int questionId = Integer.parseInt(questionParts[0]);
                int score = Integer.parseInt(questionParts[1]);
                paper.addQuestion(questionId, score);
            }
            papers.put(paperId, paper);
        } else if (line.startsWith("#X:")) {
            // 解析學生資訊
            String[] studentInfos = line.substring(3).split("-");
            for (String studentInfo : studentInfos) {
                String[] parts = studentInfo.split(" ");
                String studentId = parts[0];
                String name = parts[1];
                students.put(studentId, new Student(name));
            }
        } else if (line.startsWith("#S:")) {
            // 解析答卷資訊
            String[] parts = line.split(" ");
            int paperId = Integer.parseInt(parts[0].substring(3));
            String studentId = parts[1];
            AnswerSheet answerSheet = new AnswerSheet(paperId, studentId);
            for (int i = 2; i < parts.length; i++) {
                if (parts[i].startsWith("#A:")) {
                    String[] answerParts = parts[i].substring(3).split("-");
                    int questionIndex = Integer.parseInt(answerParts[0]);
                    String answer = answerParts[1];
                    answerSheet.addAnswer(questionIndex, answer);
                }
            }
            answerSheets.add(answerSheet);
        } else if (line.startsWith("#D:N-")) {
            // 解析刪除題目資訊
            int questionId = Integer.parseInt(line.substring(5));
            deletedQuestions.add(questionId);
            if (questions.containsKey(questionId)) {
                questions.get(questionId).setValid(false);
            }
        } else {
            throw new IllegalArgumentException("wrong format:" + line);
        }
    } catch (Exception e) {
        System.out.println("wrong format:" + line);
    }
}

優點:
分支清晰:根據不同的輸入字首 (#N:, #T:, #X:, #S:, #D:N-),程式透過 if-else 結構對不同型別的輸入進行處理,邏輯簡單明瞭,便於理解。
資料解析合理:對於題目、試卷、學生資訊、答卷和刪除題目,使用字串拆分 (split) 的方式,從輸入中提取資料,結合具體的識別符號提取相關欄位,能夠有效處理複雜格式。
良好的容錯性:每個分支都使用 try-catch 捕獲異常,如果遇到格式錯誤的輸入,程式可以避免崩潰,並輸出提示,繼續處理後續輸入。
可擴充套件性強:基於輸入字首的模式(如 #N:, #T:),可以很容易新增新的輸入處理邏輯,增加系統功能。
缺點:
輸入格式依賴性高:程式碼對於輸入格式的假設比較嚴格,輸入格式的稍微變化(如少一個空格或格式不一致)可能會導致解析失敗並輸出 "wrong format" 提示,但不能提供詳細的錯誤資訊幫助除錯。
程式碼冗餘:多個 if-else 分支都有類似的字串解析操作,比如分割字串、取子串等,雖然功能不同,但某些部分可以進一步重構和最佳化,減少重複程式碼。
錯誤處理簡單:catch 中僅簡單地輸出錯誤提示,對於不同的異常型別(如空輸入、非法格式等)沒有詳細的區分,也沒有額外提示如何修復輸入錯誤。
硬編碼解析邏輯:解析邏輯透過直接字串切割和硬編碼索引來提取資料,雖然簡單但不靈活,特別是當輸入格式發生變化時(如題目資訊不止兩部分)會變得難以維護和擴充套件。

成績處理邏輯:processResults 方法

static void processResults() {
    // 計算每張試卷的總分並生成警示資訊
    for (Map.Entry<Integer, Paper> entry : papers.entrySet()) {
        Paper paper = entry.getValue();
        int totalScore = paper.getQuestions().values().stream().mapToInt(Integer::intValue).sum();
        if (totalScore != 100) {
            System.out.println("alert: full score of test paper" + entry.getKey() + " is not 100 points");
        }
    }

    // 處理每個學生的答卷
    for (AnswerSheet answerSheet : answerSheets) {
        Paper paper = papers.get(answerSheet.getPaperId());
        if (paper == null) {
            System.out.println("The test paper number does not exist");
            continue;
        }

        Student student = students.get(answerSheet.getStudentId());
        if (student == null) {
            System.out.println(answerSheet.getStudentId() + " not found");
            continue;
        }

        // 記錄每個題目的結果和得分
        List<String> questionResults = new ArrayList<>();
        List<String> scoreResults = new ArrayList<>();
        int totalScore = 0;

        for (Map.Entry<Integer, Integer> questionEntry : paper.getQuestions().entrySet()) {
            Integer questionId = questionEntry.getKey();
            Integer score = questionEntry.getValue();

            // 檢查題目是否存在於題庫中
            Question question = questions.get(questionId);
            if (question == null) {
                // 題目不存在的情況
                questionResults.add("non-existent question~0");
                scoreResults.add("0");
            } else if (!question.isValid()) {
                // 題目無效(已刪除)的情況
                questionResults.add("the question " + questionId + " invalid~0");
                scoreResults.add("0");
            } else {
                // 題目有效,繼續檢查學生作答情況
                String studentAnswer = answerSheet.getAnswers().getOrDefault(questionId, "answer is null").trim();
                
                if (studentAnswer.equals("answer is null")) {
                    // 學生未作答該題目
                    questionResults.add("answer is null");
                    scoreResults.add("0");
                } else {
                    // 學生作答,判斷是否正確
                    boolean correct = studentAnswer.equals(question.getAnswer());
                    int obtainedScore = correct ? score : 0;
                    totalScore += obtainedScore;
                    questionResults.add(question.getContent() + "~" + studentAnswer + "~" + (correct ? "true" : "false"));
                    scoreResults.add(String.valueOf(obtainedScore));
                }
            }
        }
        
        // 輸出題目的結果
        for (String result : questionResults) {
            System.out.println(result);
        }

        // 輸出學生總成績及題目得分,格式為: 學號 姓名: 每題得分 總分~總分
        String scoreString = String.join(" ", scoreResults);  // 將每題得分用空格連線
        System.out.println(answerSheet.getStudentId() + " " + student.getName() + ": " + scoreString + "~" + totalScore);
    }
}

優點:
試卷總分驗證:系統首先計算每張試卷的總分並檢查是否為 100 分,提供合理的警示機制,如果分值設定有誤,可以及時發現問題。
答卷處理細緻:處理每個學生的答卷時,針對不同情況提供詳細判斷,包括題目不存在、題目被刪除、學生未作答、學生答題錯誤等。這種細化的判斷使得程式對各種答題場景都有較好的處理能力。
實時輸出結果:程式在處理每個答卷時,會實時輸出每道題的答題情況以及每個學生的成績,這有助於快速獲取結果,便於除錯。
答案與分數分離:將學生的每題答題情況與得分分別儲存在兩個不同的列表 (questionResults 和 scoreResults),使得程式碼邏輯清晰,輸出時可以靈活組合展示資訊。
缺點:
複雜性增加:為了處理各種可能的輸入情況(題目不存在、題目無效、學生未作答等),程式碼中存在多層巢狀 if-else,導致程式碼的複雜度較高,後續維護難度可能較大。
硬編碼邏輯:對於題目的正確性判斷和分數計算,都採用了硬編碼的方式,沒有提供靈活的評分機制。如果以後需要擴充套件,例如引入部分正確、題目權重等,修改現有程式碼的成本會比較大。
缺少統一的錯誤處理機制:每種錯誤(如無效題目、未作答)都在分支內單獨處理,雖然能應對各種情況,但沒有統一的錯誤處理機制。如果增加更多種類的錯誤型別,程式碼將變得更難維護。
程式碼冗餘:對於題目結果和分數的記錄與輸出,雖然分離了答題結果和得分,但程式碼仍然存在一定冗餘,例如每個條件分支都需要分別處理 questionResults 和 scoreResults,可以考慮進一步簡化。

在提交原始碼的過程中,遇到了幾個常見的問題:
字串解析問題:在解析輸入資料時,由於輸入格式稍有差異或空格不規範,導致 split() 的結果不如預期。例如,輸入中的多餘空格或輸入的某些部分缺少必要的標誌符,導致解析異常。
解決方案:透過使用 trim() 方法清除多餘的空格,並新增更多的格式校驗和異常處理。
資料丟失問題:在解析學生答卷時,由於某些題目ID沒有正確對映到題庫,導致後續評分時出現空指標異常。
解決方案:增加對題目ID的合法性檢查,並在答卷處理時進行更嚴格的資料驗證。
邊界情況處理不足:例如,有些學生未作答某些題目時,沒有給出明確的處理邏輯,導致程式輸出出現不一致。
解決方案:完善了預設值的處理,對於未作答的題目,給予零分處理,並在輸出時增加了相應提示。

第二次作業:
第二次作業相比於第一次作業簡化了類設計、集中化了邏輯、靈活的輸入處理和對異常情況的處理。
類圖:

順序圖:

evaluatePapers方法
功能:遍歷所有答卷,根據對應試卷中的題目和標準答案進行判分,並輸出判題資訊和總分。

檢查試卷的滿分是否為100分,不滿足則給出警告資訊。
判斷學生作答是否正確,並根據試卷的分值進行累加,輸出每道題的判題結果及總分。
解釋:

public static void evaluatePapers() {
    // 檢查每張試卷的總分是否為100分
    for (TestPaper paper : testPaperMap.values()) {
        if (!paper.isFullScoreValid()) {
            System.out.println("alert: full score of test paper" + paper.id + " is not 100 points");
        }
    }

    // 判分處理
    for (AnswerSheet sheet : answerSheets) {
        if (!testPaperMap.containsKey(sheet.paperId)) {
            System.out.println("The test paper number does not exist");
            continue;
        }

        TestPaper paper = testPaperMap.get(sheet.paperId);
        int totalScore = 0;
        int answerIndex = 0;
        StringBuilder scoreOutput = new StringBuilder();

        for (int questionId : paper.questionPoints.keySet()) {
            Question question = questionMap.get(questionId);
            int points = paper.questionPoints.get(questionId);

            // 判斷是否有作答
            if (answerIndex < sheet.answers.size()) {
                String studentAnswer = sheet.answers.get(answerIndex);
                boolean isCorrect = question.correctAnswer.equals(studentAnswer);
                System.out.println(question.question + "~" + studentAnswer + "~" + isCorrect);
                totalScore += isCorrect ? points : 0;
                scoreOutput.append(isCorrect ? points : 0).append(" ");
            } else {
                // 如果沒有答案,輸出 null
                System.out.println("answer is null");
                scoreOutput.append(0).append(" ");
            }

            answerIndex++;
        }

        // 輸出各題得分及總分
        if (scoreOutput.length() > 0) {
            scoreOutput.setLength(scoreOutput.length() - 1);
        }
        System.out.println(scoreOutput + "~" + totalScore);
    }
}

優點:
清晰的邏輯結構:
函式的邏輯結構非常清晰,分為兩個步驟:首先檢查試卷的有效性,然後對每張答卷進行評分。這樣的方法邏輯劃分使得程式碼易於閱讀和理解。
輸入輸出管理得當:
透過 System.out.println,方法及時反饋了試卷的狀態、判題資訊和最終得分。這有助於除錯和輸出結果。
動態處理學生答卷:
針對學生答卷靈活處理,即便學生未作答(題目缺失),程式也能夠識別並輸出 "answer is null",避免出錯。
模組化設計:
questionMap、testPaperMap 和 answerSheets 分別儲存題目、試卷和答卷資訊。每個資料結構都很好地承擔了其功能,這種分離使得資料的管理更加清晰。
靈活的得分系統:
該方法透過逐題判斷學生的作答情況,並根據試卷中題目的分值動態調整總分,靈活應對不同試卷題目數量和分值分配。
缺點和改進建議:
錯誤處理不夠完善:
當學生的答卷中題目數量少於試卷中的題目時,只簡單輸出 "answer is null"。在實際應用中,可能需要更多的錯誤處理(例如,給出明確的錯誤提示或計入扣分等)。
可擴充套件性不足:
目前該方法只能處理固定格式的輸入,例如:試卷的滿分必須是100分。如果在實際應用中需要更復雜的規則(如允許不同試卷有不同滿分),此方法的擴充套件性較差。建議引入更加靈活的校驗機制,如允許不同試卷有不同的總分,或允許自定義滿分標準。
效能最佳化空間:
每次都遍歷整個 testPaperMap 和 answerSheets 進行評分,這種方式在試卷和答卷規模較大時可能會導致效能問題。可以考慮引入索引或其他資料結構最佳化評分流程。
程式碼重複性:
判題邏輯中,多個地方對答案的正確性進行判斷和操作,程式碼有些冗餘。可以提取一個獨立的判分方法,減少程式碼重複,提升程式碼的可維護性和可讀性。
未處理異常情況:
如果學生提交的答卷中的題目數超過試卷中的題目數,當前方法不會處理額外的題目。這種情況下,應該輸出明確的警告資訊,避免潛在的問題。
改進建議:
錯誤和異常處理:
針對未作答和多答等異常情況,建議給出更詳細的提示或定義更細緻的規則(如是否允許部分題目未作答,如何處理多答等)。
動態滿分機制:
允許不同試卷有不同的滿分。例如,可以在 TestPaper 類中增加一個 maxScore 屬性,並在 isFullScoreValid 方法中動態檢查滿分。
提高程式碼複用性:
提取重複的判題邏輯作為獨立方法,減少冗餘程式碼。這樣不僅提高了程式碼的複用性,也便於日後維護和擴充套件。
效能最佳化:
如果題目數量和答卷數量巨大,可以透過使用併發機制(如多執行緒)來提升判分速度。此外,可以考慮快取某些中間結果,避免重複計算。
遇到的問題(其中還有非零返回沒有處理)
問題1:處理輸入格式時出現解析錯誤:
問題描述:在處理輸入行時,有時字串切割不正確,導致題目、試卷、答卷資訊解析錯誤。
解決方案:使用更健壯的字串處理方式,如 split() 函式後檢查陣列長度是否正確,並使用正規表示式更加靈活地解析輸入。
問題2:評分邏輯中的空答案處理:
問題描述:當學生沒有作答時,程式仍然嘗試去比較答案,導致空指標異常。
解決方案:在評分時增加對空答案的判斷,確保沒有答案時直接記錄得分為0。
問題3:試卷分值驗證時的警告資訊:
問題描述:試卷分值不等於100分時程式只是輸出警告,未進行進一步的處理,可能導致使用者忽視這一重要資訊。
解決方案:在輸出警告資訊後,直接跳過該試卷的評分,避免後續錯誤的評分操作。

第三次作業:
更加全面,處理更加靈活,能夠處理題目刪除、不同順序作答等情況。設計上更考慮到多種情況,例如題目無效、學生未作答等邊界條件。
類圖:

順序圖:

計算每張試卷的總分並生成警示資訊
首先,程式碼遍歷 papers(代表試卷的集合),對每張試卷計算其總分並判斷是否符合滿分 100 分的要求。如果某張試卷的總分不等於 100,系統會輸出警示資訊。

for (Map.Entry<Integer, Paper> entry : papers.entrySet()) {
    Paper paper = entry.getValue();
    int totalScore = paper.getQuestions().values().stream().mapToInt(Integer::intValue).sum();
    if (totalScore != 100) {
        System.out.println("alert: full score of test paper" + entry.getKey() + " is not 100 points");
    }
}

分析:
papers 是一個對映 (Map),鍵為試卷編號,值為 Paper 物件。
Paper 物件包含試卷中所有題目及每個題目的分值。
透過 stream() 和 mapToInt() 方法對每張試卷的所有題目分值進行求和。
如果某張試卷的總分不等於 100,則輸出警告資訊。
問題心得:
處理每個學生的答卷
在處理學生答卷的功能中,曾遇到學生未作答導致的異常情況。具體表現為,當某題學生未作答時,answerSheet.getAnswers() 返回 null 或空字串,而後續的 trim() 操作丟擲 NullPointerException。在實際測試中,部分學生答卷不完整,導致系統崩潰並丟擲空指標異常。為了解決這個問題,我們需要在處理輸入時更加嚴謹,不能假設輸入總是正確的。改進建議是,在獲取學生作答資料後先進行 null 檢查,而不是直接呼叫方法。透過這樣的改進,能夠避免異常並提升程式碼的健壯性。

接下來,程式碼遍歷所有的學生答卷 answerSheets,對每個答卷進行評估。

for (AnswerSheet answerSheet : answerSheets) {
    Paper paper = papers.get(answerSheet.getPaperId());
    if (paper == null) {
        System.out.println("The test paper number does not exist");
        continue;
    }

    Student student = students.get(answerSheet.getStudentId());
    if (student == null) {
        System.out.println(answerSheet.getStudentId() + " not found");
        continue;
    }

    // 記錄每個題目的結果和得分
    List<String> questionResults = new ArrayList<>();
    List<String> scoreResults = new ArrayList<>();
    int totalScore = 0;

分析:
answerSheets 是包含所有學生答卷的集合,每個答卷透過 getPaperId() 找到對應的試卷。
如果試卷編號不在 papers 中,表示試卷不存在,輸出 "The test paper number does not exist"。
類似地,透過 getStudentId() 找到學生,如果該學生不存在,輸出學生未找到的錯誤資訊。
為了記錄題目的評估結果,程式碼使用了兩個列表 questionResults(記錄每個題目的詳情結果)和 scoreResults(記錄每題的得分情況)。totalScore 記錄學生的總得分。
處理每張答卷中的題目
問題心得:
在處理試卷總分時,程式碼原本使用整數計算試卷總分,並判斷是否為 100 分。然而在某些情況下,試卷的分數並非整數,而是浮動分值(如 99.5 或 100.0),這導致了系統錯誤地輸出警告資訊,儘管試卷的實際總分是正確的。透過修改為支援浮點數運算,並在判斷時允許一定的精度誤差,可以避免因浮點精度問題導致的誤報。這樣的改進使得系統在處理帶有浮動分值的試卷時更加靈活,並減少誤判。
此外,系統在匹配學生和試卷資料時,曾因學生提交了錯誤的試卷編號而提示試卷不存在。在模擬測試中,系統多次輸出 "test paper does not exist",儘管問題實際是由於學生輸入錯誤或試卷編號配置錯誤引起的。這說明外部輸入資料的驗證不夠嚴格,系統沒有足夠的機制去應對錯誤輸入。為了解決這一問題,改進建議是增加更詳細的錯誤提示,指出是哪位學生提交了無效試卷編號,並給出相應的除錯資訊。這一改進有助於管理員快速定位問題,並減少使用者誤操作帶來的負面影響。

for (Map.Entry<Integer, Integer> questionEntry : paper.getQuestions().entrySet()) {
    Integer questionId = questionEntry.getKey();
    Integer score = questionEntry.getValue();

    // 檢查題目是否存在於題庫中
    Question question = questions.get(questionId);
    if (question == null) {
        questionResults.add("non-existent question~0");
        scoreResults.add("0");
    } else if (!question.isValid()) {
        questionResults.add("the question " + questionId + " invalid~0");
        scoreResults.add("0");
    } else {
        String studentAnswer = answerSheet.getAnswers().getOrDefault(questionId, "answer is null").trim();
        
        if (studentAnswer.equals("answer is null")) {
            questionResults.add("answer is null");
            scoreResults.add("0");
        } else {
            boolean correct = studentAnswer.equals(question.getAnswer());
            int obtainedScore = correct ? score : 0;
            totalScore += obtainedScore;
            questionResults.add(question.getContent() + "~" + studentAnswer + "~" + (correct ? "true" : "false"));
            scoreResults.add(String.valueOf(obtainedScore));
        }
    }
}

分析:
paper.getQuestions() 返回該試卷中所有題目,鍵為題目編號,值為分數。
程式碼首先檢查題目是否在題庫中存在(questions.get(questionId)),如果不存在,記錄為 "non-existent question~0"。
如果題目存在但無效(如題目已被刪除或禁用),記錄為 "invalid"。
如果題目有效,程式碼獲取學生對該題目的作答。如果答案缺失,記錄為 "answer is null",否則進行答案對比:
若學生答案正確,給分,否則不給分。
totalScore 逐題累計學生的總分。
問題心得:
系統在處理無效題目和學生未作答的情況時,處理邏輯不夠清晰,導致這兩種情況的處理方式過於相似,難以區分。在系統輸出中,無法清楚辨別哪些題目是由於題目無效而無法評分,哪些題目是學生未作答。為此,改進建議是對無效題目和未作答的情況設定不同的標識,並在輸出中提供詳細的提示資訊,確保在後續的統計和除錯中能夠準確追蹤每種情況。這不僅提高了系統的可維護性,還能更好地進行問題排查。
透過以上幾項改進,系統在處理答卷時的穩定性、健壯性和可維護性得到了大幅提升。這些改進措施基於實際的測試結果和對原始碼的深度分析,確保系統能夠更好地應對各種邊緣情況和異常輸入。

總結:
在過去的三次Java大作業中,逐步掌握了Java程式設計的基礎語法以及物件導向程式設計的核心理念。這一過程中,我逐步解決了功能實現、程式碼最佳化和異常處理等問題,提升了程式設計能力和問題解決的綜合能力。
首先,透過第一次作業的基礎判分功能,我初步理解了Java的資料結構及物件導向程式設計的基本概念,如類的設計和方法的實現。透過建立 Question 類和 AnswerSheet 類,成功處理題目和答卷資訊,並透過字串解析實現了簡單的判分邏輯。在此過程中,我遇到了輸入格式的解析問題,但透過單元測試和容錯機制保證了系統的穩定性。
在第二次作業中,系統引入了 TestPaper 類,實現了試卷與題目的關聯管理以及總分校驗功能。這不僅加深了我對類設計的理解,還透過更復雜的字串處理和邏輯判斷,提升了程式碼的靈活性和健壯性。儘管遇到了試卷分值校驗和答卷異常處理方面的挑戰,但透過資料驗證和實時計算的方式,確保了系統的準確性和易用性。
第三次作業在前兩次基礎上進一步完善,增加了學生資訊管理、題目刪除功能以及健壯的錯誤處理機制。透過完善資料一致性管理和異常處理策略,我進一步掌握瞭如何處理複雜的資料關係和提高系統健壯性。這使得系統不僅能夠應對更多的異常輸入,還能在題目刪除等特殊場景下保持正確的輸出,增強了系統的魯棒性。
透過三次作業,我深刻理解了如何將物件導向的設計原則應用於專案開發中。雖然專案中仍存在程式碼冗餘、錯誤處理不夠細緻等問題,但透過不斷改進和最佳化,我逐步掌握瞭如何構建靈活、可擴充套件且健壯的系統。這些實踐經歷為我今後繼續深入學習Java程式設計和麵向物件設計打下了堅實的基礎。

相關文章