java4~6次大作業全面總結

爱编程的小菜鸟發表於2024-11-23

一:前言:

  1. 知識點總結:
  • 物件導向設計:
    • 智慧家居強電電路模擬系統:設計了多種控制裝置(開關、分檔調速器、連續調速器)和受控裝置(燈、風扇)的類,並透過繼承和多型實現裝置的特有行為。
    • 答題判題程式:設計了題目、試卷、學生、答卷等類,透過物件導向的方式管理考試資訊。
  • 資料結構:
    • 智慧家居強電電路模擬系統:使用圖或連結串列表示電路的連線關係,處理並聯和串聯電路的組合邏輯。
    • 答題判題程式:使用雜湊表(Map)儲存題目資訊、試卷資訊、學生資訊、答卷資訊和刪除題目資訊,使用列表(List)儲存試卷中的題目及其分值,以及學生的答題資訊。
  • 演算法:
    • 智慧家居強電電路模擬系統:計算電路中的電壓、電流、電阻等物理量,處理並聯和串聯電路的組合邏輯,確保計算結果正確。
    • 答題判題程式:判斷答案是否正確,處理多選題和填空題的特殊評分規則,計算總分。
  • 異常處理:
    • 智慧家居強電電路模擬系統:處理輸入資料的合法性檢查,如裝置編號、連線資訊等,處理邊界條件和特殊情況,如電壓超出範圍、裝置未連線等。
    • 答題判題程式:處理輸入格式錯誤的情況,處理題目被刪除、題目不存在、試卷總分不為100分等特殊情況。
  1. 題量分析:
  • 智慧家居強電電路模擬系統:
    • 類的設計:
      • 控制裝置類:開關、分檔調速器、連續調速器
      • 受控裝置類:白熾燈、日光燈、吊扇、落地扇
      • 電路類:串聯電路、並聯電路
    • 主控類或函式:
      • 處理輸入資訊,解析裝置和連線資訊。
      • 類比電路行為,計算各裝置的狀態。
      • 輸出裝置狀態和引數
    • 測試用例:
      • 編寫測試用例驗證程式的正確性和魯棒性。
  • 答題判題程式:
    • 類的設計:
      • Question 類:表示題目,包含題目編號、題目內容、標準答案等屬性。
      • TestPaper 類:表示試卷,包含試卷號、題目及其分值等屬性。
      • Student 類:表示學生,包含學號、姓名等屬性。
      • AnswerSheet 類:表示答卷,包含試卷號、學號、答題資訊等屬性。
    • 主控類或函式:
      • 處理輸入資訊,解析題目、試卷、學生、答卷、刪除題目等資訊。
      • 構建題目、試卷、學生、答卷等物件。
      • 模擬答題,計算成績,處理各種特殊情況。
      • 按照指定格式輸出結果。
  1. 難度分析:
  • 智慧家居強電電路模擬系統: 題目涉及多個裝置和複雜的電路連線,需要綜合運用物件導向設計、資料結構、演算法等知識。需要處理並聯和串聯電路的組合邏輯,確保計算結果正確。輸入輸出處理較為複雜,需要仔細解析和格式化輸出,題目難度較大。

  • 答題判題程式: 題目涉及多個資料結構和複雜的邏輯判斷,需要綜合運用字串處理、邏輯判斷、排序等知識。處理多選題和填空題的特殊評分規則,確保評分結果正確。處理各種特殊情況,如題目被刪除、題目不存在、試卷總分不為100分、輸入格式錯誤等。按照指定格式輸出結果,確保輸出資訊的完整性和正確性,題目難度較大。

  1. 綜合分析總結:
    這三道題目涵蓋了物件導向設計、資料結構、演算法、輸入輸出處理、異常處理等多個方面的知識。每道題目的設計和實現都需要綜合運用這些知識,解決實際問題。透過這些題目,可以提升程式設計能力和問題解決能力,特別是在處理複雜資料結構和邏輯判斷方面。

二:設計與分析

1. 第四道大作業:

  • 題目描述: 這道題要求我們設計並實現一個小巧的線上考試系統,能夠處理不同型別的問題,比如普通的問答題、選擇題和填空題。這個系統不僅要能夠接收題目資訊(包括題目的編號、內容和正確答案)、試卷資訊(包含哪些題目以及每個題目的分數)、學生資訊(學號和姓名),還要能夠接收學生的答題情況。特別的是,這個系統還需要支援刪除題目,即使這些題目已經被包含在試卷裡了,刪除後這些題目的分數就會變成0分。系統要能夠根據學生的答案自動評分,考慮到不同題型的評分規則,最後,系統要能夠輸出每個學生的答題詳情和總成績,同時還要檢查試卷的總分是否達到100分,如果沒有達到也要給出提示。此外,系統還需要能夠處理一些異常情況,比如輸入格式錯誤或者試卷號、學號引用錯誤等問題,確保系統的穩定性和準確性。整個過程中,所有的資訊都可以以任意順序輸入,系統需要能夠靈活應對。

  • 基本思路: 這道題要用Java實現一個小型線上考試系統。首先,用雜湊表儲存題目、試卷和學生資訊,列表儲存學生的答題資訊,集合記錄被刪除的題目。然後,讀取和解析輸入資訊,根據字首(如#N:#T:#X:等)將資訊存入相應的資料結構。接著,遍歷每個學生的答題資訊,檢查題目是否存在、是否被刪除,比對答案並根據題目型別計算得分。最後,按學號和試卷號排序,輸出每個學生的答題詳情和總分,檢查試卷總分是否為100分並給出提示,處理試卷號或學號引用錯誤的情況。

  • 畫類圖,縷清關係:


總共定義了以下幾個類:

  1. ExamQuestionInfo:主要負責儲存題目資訊,包括題目ID、內容、正確答案、是否有效、是否為多選題等
  2. DataManipulationClass:包含一些輔助方法,但目前的方法沒有實際用途,可以考慮移除或新增實際功能。
  3. ExamPaperDetails:儲存試卷資訊,包括試卷ID和每個題目的分數。
  4. MainClass:包含一些模擬方法,但目前的方法沒有實際用途,可以考慮移除或新增實際功能。
  5. StudentAnswerRecord:儲存學生的答題記錄,包括試卷ID、學生標識和每題的答案。
  6. Main:主類,包含主方法main,負責讀取輸入、處理輸入和生成輸出。
  • ExamQuestionInfo類核心程式碼:
class ExamQuestionInfo {
    private int questionId;
    private String questionContent;
    private String correctAnswerText;
    private boolean isValidStatus = true;
    private boolean isMultipleChoiceType;

    public ExamQuestionInfo(int id, String content, String answer, boolean isMultipleChoice) {
        this.questionId = id;
        this.questionContent = content;
        this.correctAnswerText = answer;
        this.isMultipleChoiceType = isMultipleChoice;
    }

    public boolean checkAnswerMatch(String studentAnswer) {
        return correctAnswerText.equalsIgnoreCase(studentAnswer);
    }

    public boolean isAnswerPartiallyCorrect(String studentAnswer) {
        if (isMultipleChoiceType) {
            Set<String> correctAnswerSet = new HashSet<>(List.of(correctAnswerText.split(" ")));
            Set<String> studentAnswerSet = new HashSet<>(List.of(studentAnswer.split(" ")));
            return !correctAnswerSet.equals(studentAnswerSet) && correctAnswerSet.containsAll(studentAnswerSet) && studentAnswerSet.size() < correctAnswerSet.size();
        } else {
            return correctAnswerText.contains(studentAnswer) && !studentAnswer.equals(correctAnswerText);
        }
    }

    public void setInvalidStatus() {
        isValidStatus = false;
    }

    public boolean isValid() {
        return isValidStatus;
    }

    public boolean isMultipleChoice() {
        return isMultipleChoiceType;
    }
}
  • ExamPaperDetails類核心程式碼:
class ExamPaperDetails {
    private int paperId;
    private Map<Integer, Integer> questionScoreMap = new HashMap<>();

    public ExamPaperDetails(int id) {
        this.paperId = id;
    }

    public void addQuestionScore(int questionId, int score) {
        questionScoreMap.put(questionId, score);
    }

    public boolean verifyTotalScore() {
        int totalScore = questionScoreMap.values().stream().mapToInt(Integer::intValue).sum();
        if (totalScore != 100) {
            System.out.println("alert: full score of test paper " + paperId + " is not 100 points");
            return false;
        }
        return true;
    }

    public boolean confirmQuestionExistence(Map<Integer, ExamQuestionInfo> allQuestions) {
        return questionScoreMap.keySet().stream().allMatch(allQuestions::containsKey);
    }

    public Map<Integer, Integer> getQuestionScoreMap() {
        return questionScoreMap;
    }
}
  • StudentAnswerRecord類核心程式碼:
class StudentAnswerRecord {
    private int relatedPaperId;
    private String studentIdentifier;
    private Map<Integer, String> studentAnswers = new HashMap<>();

    public StudentAnswerRecord(int paperId, String studentId) {
        this.relatedPaperId = paperId;
        this.studentIdentifier = studentId;
    }

    public void recordAnswer(int questionId, String answer) {
        studentAnswers.put(questionId, answer);
    }

    public String getStudentIdentifier() {
        return studentIdentifier;
    }

    public int getRelatedPaperId() {
        return relatedPaperId;
    }

    public Map<Integer, String> getStudentAnswers() {
        return studentAnswers;
    }
}
  • Main類核心程式碼:
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Map<Integer, ExamQuestionInfo> questions = new HashMap<>();
        Map<Integer, ExamPaperDetails> examPapers = new HashMap<>();
        Map<String, String> students = new HashMap<>();
        Map<String, List<StudentAnswerRecord>> answers = new HashMap<>();
        Set<Integer> deletedQuestions = new HashSet<>();

        processInput(scanner, questions, examPapers, students, answers, deletedQuestions);
        generateAndOutputResults(questions, examPapers, students, answers, deletedQuestions);
        scanner.close();
    }

    private static void processInput(Scanner scanner, Map<Integer, ExamQuestionInfo> questions, Map<Integer, ExamPaperDetails> examPapers,
                                     Map<String, String> students, Map<String, List<StudentAnswerRecord>> answers,
                                     Set<Integer> deletedQuestions) {
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine().trim();
            if ("end".equals(line)) break;
            if (line.startsWith("#N:") || line.startsWith("#Z:") || line.startsWith("#K:")) {
                handleQuestionInput(line, questions);
            } else if (line.startsWith("#T:")) {
                handleExamPaperInput(line, examPapers, questions);
            } else if (line.startsWith("#X:")) {
                handleStudentInput(line, students);
            } else if (line.startsWith("#S:")) {
                handleStudentAnswerInput(line, examPapers, students, answers);
            } else if (line.startsWith("#D:N-")) {
                handleDeletedQuestionInput(line, questions, deletedQuestions);
            } else {
                System.out.println("wrong format:" + line);
            }
        }
    }

    private static void handleQuestionInput(String line, Map<Integer, ExamQuestionInfo> questions) {
        // Handle question input and populate the questions map
    }

    private static void handleExamPaperInput(String line, Map<Integer, ExamPaperDetails> examPapers, Map<Integer, ExamQuestionInfo> questions) {
        // Handle exam paper input and populate the examPapers map
    }

    private static void handleStudentInput(String line, Map<String, String> students) {
        // Handle student input and populate the students map
    }

    private static void handleStudentAnswerInput(String line, Map<Integer, ExamPaperDetails> examPapers, Map<String, String> students,
                                                 Map<String, List<StudentAnswerRecord>> answers) {
        // Handle student answer input and populate the answers map
    }

    private static void handleDeletedQuestionInput(String line, Map<Integer, ExamQuestionInfo> questions, Set<Integer> deletedQuestions) {
        // Handle deleted question input and update the questions and deletedQuestions sets
    }

    private static void generateAndOutputResults(Map<Integer, ExamQuestionInfo> questions, Map<Integer, ExamPaperDetails> examPapers,
                                                 Map<String, String> students, Map<String, List<StudentAnswerRecord>> answers,
                                                 Set<Integer> deletedQuestions) {
        // Generate and output the results based on the processed data
    }
}
  • 踩坑心得:

    • 資料結構的選擇:

      • 使用 Map 來儲存題目、試卷、學生資訊等是非常合適的,因為這些資料通常需要透過唯一的識別符號(如題目ID、試卷ID、學生ID)快速查詢。
      • 使用 List 來儲存學生的答題記錄,因為一個學生可能多次參加同一份試卷的考試。
    • 效能最佳化:

      • 對於大資料量的輸入,需要考慮效能最佳化。例如,使用 HashMap 而不是 TreeMap 可以提高查詢速度。
      • 在生成結果時,對資料進行預處理和排序可以提高效率。
    • 邊界條件:

      • 處理好各種邊界條件,如空輸入、無效的題目ID、空答案等。這些邊界條件很容易被忽略,但在實際執行中可能會導致問題。
  • 改進建議:

    • 模組化設計:
      • 將每個功能模組化,每個模組負責一個特定的任務。這樣可以提高程式碼的可讀性和可維護性。
      • 例如,可以將 handleQuestionInput、handleExamPaperInput 等方法封裝成獨立的類或介面。
    • 異常處理改進:
      • 對異常處理進行細化,區分不同的異常型別,提供更具體的錯誤資訊。
      • 例如,可以區分輸入格式錯誤、資料不存在等不同型別的異常,並給出相應的提示。

2.第五道大作業:

  • 題目描述: 本題要求設計並實現一個智慧家居強電電路模擬系統,該系統能夠模擬控制裝置(包括開關、分檔調速器、連續調速器)和受控裝置(包括白熾燈、日光燈、吊扇)之間的連線和工作狀態。系統需要解析輸入的裝置資訊、連線資訊以及控制裝置的調節資訊,根據這些資訊構建電路模型,計算並更新各裝置的工作狀態或引數,如開關的開啟/關閉狀態、調速器的檔位、燈具的亮度以及風扇的轉速。特別地,系統需遵循特定的連線規則,如不考慮調速器之間的串聯、控制裝置的並聯或反饋接入,並且所有連線資訊按電路從電源到接地的順序依次輸入。最終,系統應按照指定格式輸出所有裝置的狀態或引數,包括控制裝置的檔位或狀態、燈具的亮度、風扇的轉速等。此外,系統還需處理輸入電壓或電壓差的計算,採用截尾規則保留整數部分,並確保所有計算過程中使用double型別以避免精度誤差。

  • 基本思路: 解題的核心思路是:首先,定義裝置類(開關、分檔調速器、連續調速器、白熾燈、日光燈、吊扇),每個類包含必要的屬性和方法來表示裝置的狀態和行為。接著,構建一個電路模型來管理裝置之間的連線關係,解析輸入的連線資訊,確保遵循連線規則,並處理電壓的逐級傳遞。然後,實現狀態更新機制,根據使用者對控制裝置的調節指令(如開關切換、調速器調整),更新裝置狀態並重新計算受控裝置的工作引數(如亮度、轉速)。最後,設計輸出模組,按照指定格式輸出所有裝置的當前狀態或引數,確保輸出順序和格式符合要求。主程式整合這些模組,處理使用者輸入,執行狀態更新,並生成最終輸出。

  • 畫類圖,縷清關係:


定義了以下類:
Test(主類):處理使用者輸入,註冊裝置和電路,執行控制命令,輸出裝置狀態。
CircuitDevice(抽象類):提供裝置的基本屬性和方法。
ControlledDevice(抽象類,繼承自 CircuitDevice):提供受控裝置的電壓計算和狀態輸出方法。
ControllingDevice(抽象類,繼承自 CircuitDevice):提供控制裝置的命令執行方法。
SwitchDevice(繼承自 ControllingDevice):實現開關裝置的開關狀態切換和電壓計算。
GearDevice(繼承自 ControllingDevice):實現分檔調速器的檔位調整和電壓計算。
ContinuousSpeedDevice(繼承自 ControllingDevice):實現連續調速器的檔位比例設定和電壓計算。
LightDevice(繼承自 ControlledDevice):實現燈具的亮度計算和狀態輸出
RelayDevice(繼承自 ControlledDevice):實現繼電器的亮度計算和狀態輸出。
MotorDevice(繼承自 ControlledDevice):實現風扇的轉速計算和狀態輸出。
SeriesCircuit(繼承自 ControlledDevice):實現串聯電路的電壓計算和狀態輸出。

  • Test類核心程式碼:
public class Test {
    private static final double VCC = 220.0;
    private static Map<String, CircuitDevice> devices = new HashMap<>();
    private static List<SeriesCircuit> circuits = new ArrayList<>();

    public static void main(String[] args) {
        // 主程式入口
    }

    private static void handleInput(String input) {
        // 處理輸入
    }

    private static void registerConnection(String connectionInfo) {
        // 註冊連線
    }

    private static boolean isDevice(String part) {
        // 判斷是否為裝置
    }

    private static CircuitDevice createDevice(String deviceId) {
        // 建立裝置
    }

    private static void executeCommand(String command) {
        // 執行命令
    }

    private static void printDeviceStatuses() {
        // 列印裝置狀態
    }

    private static int getDeviceOrder(char type) {
        // 獲取裝置排序順序
    }
}
  • CircuitDevice 類核心程式碼:
abstract static class CircuitDevice {
    protected final String id;
    protected final char type;

    CircuitDevice(String id) {
        this.id = id;
        this.type = id.charAt(0);
    }

    abstract String getStatus();
}
  • ControlledDevice 類核心程式碼:
abstract static class ControlledDevice extends CircuitDevice {
    ControlledDevice(String id) {
        super(id);
    }

    abstract double calculateVoltage();
}
  • ControllingDevice 類核心程式碼:
abstract static class ControllingDevice extends CircuitDevice {
    ControllingDevice(String id) {
        super(id);
    }

    abstract void executeCommand(String command);
}
  • SwitchDevice 類核心程式碼:
static class SwitchDevice extends ControllingDevice {
    private boolean closed;

    SwitchDevice(String id) {
        super(id);
    }

    @Override
    void executeCommand(String command) {
        // 執行開關命令
    }

    @Override
    String getStatus() {
        // 獲取開關狀態
    }

    double calculateVoltage() {
        // 計算電壓
    }
}
  • GearDevice 類
static class GearDevice extends ControllingDevice {
    private int gear;

    GearDevice(String id) {
        super(id);
    }

    @Override
    void executeCommand(String command) {
        // 執行檔位命令
    }

    @Override
    String getStatus() {
        // 獲取檔位狀態
    }

    double calculateVoltage() {
        // 計算電壓
    }
}
  • ContinuousSpeedDevice 類核心程式碼:
static class ContinuousSpeedDevice extends ControllingDevice {
    private double ratio;

    ContinuousSpeedDevice(String id) {
        super(id);
    }

    @Override
    void executeCommand(String command) {
        // 執行連續速度命令
    }

    @Override
    String getStatus() {
        // 獲取連續速度狀態
    }

    double calculateVoltage() {
        // 計算電壓
    }
}
  • LightDevice 類核心程式碼:
static class LightDevice extends ControlledDevice {
    private double voltage;

    LightDevice(String id) {
        super(id);
    }

    @Override
    double calculateVoltage() {
        // 計算電壓
    }

    @Override
    String getStatus() {
        // 獲取燈光狀態
    }
}
  • RelayDevice 類核心程式碼:
static class RelayDevice extends ControlledDevice {
    private double voltage;

    RelayDevice(String id) {
        super(id);
    }

    @Override
    double calculateVoltage() {
        // 計算電壓
    }

    @Override
    String getStatus() {
        // 獲取繼電器狀態
    }
}
  • MotorDevice 類核心程式碼:
static class MotorDevice extends ControlledDevice {
    private double voltage;

    MotorDevice(String id) {
        super(id);
    }

    @Override
    double calculateVoltage() {
        // 計算電壓
    }

    @Override
    String getStatus() {
        // 獲取電機狀態
    }
}
  • SeriesCircuit 類核心程式碼:
static class SeriesCircuit extends ControlledDevice {
    private final List<String> parts;

    SeriesCircuit(String[] parts) {
        super(parts[0].split("-")[0]);
        this.parts = Arrays.asList(parts);
    }

    @Override
    double calculateVoltage() {
        // 計算總電壓
    }* 

    @Override
    String getStatus() {
        // 獲取電路狀態
    }
}
  • 踩坑心得:
    • 電壓計算:
      • 電壓計算邏輯複雜,容易出錯。特別是在串聯電路中,多個裝置的電壓累加需要特別注意。
      • 具體表現:電壓計算結果與預期不符,導致裝置狀態顯示錯誤。
      • 解決過程:逐個裝置除錯電壓計算邏輯,確保每個裝置的電壓計算正確無誤。
    • 裝置狀態更新
      • 問題:裝置狀態更新邏輯複雜,容易遺漏或出錯。特別是多個裝置之間的互動。
      • 具體表現:裝置狀態更新不及時或更新錯誤,導致程式行為異常。
      • 解決過程:在每個裝置類中明確實現 executeCommand 方法,並確保狀態更新邏輯正確。新增日誌記錄,便於除錯。
  • 改進建議:
    • 模組化設計: 將不同的功能模組化,例如輸入解析、裝置管理、狀態輸出等,分別放在不同的類或方法中,提高程式碼的可讀性和可維護性。
    • 異常處理: 增強異常處理機制,確保程式在遇到非法輸入或錯誤時能夠優雅地處理,而不是直接崩潰。
      例如:
private static CircuitDevice createDevice(String deviceId) {
    try {
        char deviceType = deviceId.charAt(0);
        switch (deviceType) {
            case 'K': return new SwitchDevice(deviceId);
            case 'F': return new GearDevice(deviceId);
            case 'L': return new ContinuousSpeedDevice(deviceId);
            case 'B': return new LightDevice(deviceId);
            case 'R': return new RelayDevice(deviceId);
            case 'D': return new MotorDevice(deviceId);
            default: throw new IllegalArgumentException("Unknown device type: " + deviceType);
        }
    } catch (IllegalArgumentException e) {
        System.err.println("Failed to create device: " + deviceId);
        System.err.println(e.getMessage());
        return null; // 返回 null 表示建立失敗
    } catch (Exception e) {
        System.err.println("An unexpected error occurred while creating device: " + deviceId);
        System.err.println(e.getMessage());
        e.printStackTrace(); // 列印堆疊跟蹤,便於除錯
        return null; // 返回 null 表示建立失敗
    }
}

3. 第六道大作業:

  • 題目描述: 這道Java大作業題要求設計一個智慧家居強電電路模擬系統,模擬家庭中各種電器裝置的連線和控制邏輯,並輸出裝置的工作狀態。系統需要模擬的裝置包括開關、分檔調速器、連續調速器(控制裝置)和白熾燈、日光燈、吊扇、落地扇(受控裝置)。輸入資訊包括裝置資訊、連線資訊、控制裝置調節資訊、電源接地標識、串聯電路資訊和並聯電路資訊。輸出資訊按開關、分檔調速器、連續調速器、白熾燈、日光燈、吊扇、落地扇的順序依次輸出所有裝置的狀態或引數。計算過程中出現的小數部分用截尾規則處理,最終輸出時保留整數部分。所有連線資訊按從電源到接地的順序輸入,調速器的輸入端只能直連VCC,且整個電路最多隻有一個調速器。本次迭代只考慮一條包含並聯電路的主電路。
  • 基本思路:難度太大,做不出來.

三:總結:

  • 第一道題目:答題程式

    • 學習收穫:

      • 程式設計實踐能力方面:透過這次答題程式的開發,我不僅鞏固了對Java程式語言的理解,還提升了處理複雜輸入輸出的能力。題目涉及多種資訊的輸入(題目資訊、試卷資訊、學生資訊、答卷資訊、刪除題目資訊),需要對這些資訊進行解析、處理和輸出。這讓我學會了如何使用Map、List等資料結構來管理和處理複雜的資料關係,確保程式的高效執行。

      • 問題解決技巧方面:在實現答題程式的過程中,遇到了許多具體的技術問題,例如如何高效地查詢和刪除題目資訊,如何處理不同型別的題目評分等。這些問題促使我深入學習了Java集合框架的相關知識,以及如何合理設計類和介面來提高程式碼的複用性和可擴充套件性。同時,我也更加熟練地使用了除錯工具,提高了程式碼除錯效率。

      • 軟體工程思想方面:這次作業讓我深刻體會到了模組化設計的重要性。透過對題目的分析,我將程式分解為多個模組,如題目管理模組、試卷管理模組、學生資訊管理模組等,每個模組負責處理特定的功能,使得整個程式結構清晰,易於維護。此外,我還學會了如何在程式碼中新增詳細的註釋和日誌,這對於團隊協作和後期維護都非常重要。

    • 需要進一步學習及研究的地方:

      • 設計模式的應用:雖然在這次作業中嘗試使用了一些簡單的設計模式,如單例模式和工廠模式,但在更復雜的設計模式應用上仍然存在不足。例如,如何在大型專案中有效地使用策略模式、觀察者模式等,這些都需要在未來的實踐中不斷學習和積累。

      • 效能最佳化:這次作業的規模相對較小,但在處理大量資料時,程式的效能表現就顯得尤為重要。未來需要加強對演算法和資料結構的學習,掌握更多的效能最佳化技巧,以應對更大規模的資料處理需求。

      • 測試驅動開發(TDD):雖然這次作業中也有一定的測試要求,但整體上對TDD的理解還不夠深入。未來需要更多地學習和實踐TDD的思想,學會如何編寫高質量的單元測試,確保程式碼的質量。

    • 對教師、課程、作業、實驗、課上及課下組織方式等方面的改進建議及意見

      • 課程內容:建議增加一些實戰專案的練習,讓我們在實際專案中應用所學知識,增強實戰經驗。同時,增加一些軟體工程方法論的內容,幫助我們瞭解軟體開發的整體流程。

      • 作業和實驗:希望作業可以設計得更具有挑戰性和實用性,鼓勵我們在完成任務的同時,也能發揮創意,探索不同的解決方案。實驗環節希望能提供更多指導和支援,特別是在遇到難題時,能夠有更多資源可供參考。

      • 課上組織方式:希望課堂上能增加一些互動環節,比如小組討論,讓大家有機會互相交流學習心得,促進共同進步。教師可以分享一些個人經驗和行業動態,拓寬我們的視野。

  • 第二道題目:智慧家居強電電路模擬系統

    • 學習收穫:

      • 程式設計實踐能力方面:透過這次智慧家居強電電路模擬系統的開發,我深入瞭解了物聯網技術在家庭自動化中的應用。特別是對控制裝置(開關、分檔調速器、連續調速器)和受控裝置(燈、風扇)的模擬,使我掌握瞭如何使用Java來建模和處理複雜的電路邏輯。透過處理不同裝置的連線和狀態變化,我學會了如何使用物件導向的方法來設計和實現系統,使程式碼更加模組化和可維護。

      • 問題解決技巧方面:在實現智慧家居電路模擬系統的過程中,遇到了許多具體的技術問題,例如如何處理不同裝置之間的連線關係,如何計算電壓和輸出狀態等。這些問題促使我深入學習了Java中的資料結構和演算法,以及如何合理設計類和方法來提高程式碼的複用性和可擴充套件性。同時,我也更加熟練地使用了除錯工具,提高了程式碼除錯效率。

      • 軟體工程思想方面:這次作業讓我深刻體會到了模組化設計的重要性。透過對電路裝置的分類和建模,我將程式分解為多個模組,如控制裝置模組、受控裝置模組、連線資訊模組等,每個模組負責處理特定的功能,使得整個程式結構清晰,易於維護。此外,我還學會了如何在程式碼中新增詳細的註釋和日誌,這對於團隊協作和後期維護都非常重要。

    • 需要進一步學習及研究的地方

      • 設計模式的應用:雖然在這次作業中嘗試使用了一些簡單的設計模式,如單例模式和工廠模式,但在更復雜的設計模式應用上仍然存在不足。例如,如何在大型專案中有效地使用策略模式、觀察者模式等,這些都需要在未來的實踐中不斷學習和積累。

      • 效能最佳化:這次作業的規模相對較小,但在處理大量資料時,程式的效能表現就顯得尤為重要。未來需要加強對演算法和資料結構的學習,掌握更多的效能最佳化技巧,以應對更大規模的資料處理需求。

      • 測試驅動開發(TDD):雖然這次作業中也有一定的測試要求,但整體上對TDD的理解還不夠深入。未來需要更多地學習和實踐TDD的思想,學會如何編寫高質量的單元測試,確保程式碼的質量。

    • 對教師、課程、作業、實驗、課上及課下組織方式等方面的改進建議及意見
      課程內容:建議增加一些實戰專案的練習,讓我們在實際專案中應用所學知識,增強實戰經驗。同時,增加一些軟體工程方法論的內容,幫助我們瞭解軟體開發的整體流程。

      • 作業和實驗:希望作業可以設計得更具有挑戰性和實用性,鼓勵我們在完成任務的同時,也能發揮創意,探索不同的解決方案。實驗環節希望能提供更多指導和支援,特別是在遇到難題時,能夠有更多資源可供參考。

    透過這兩道題目的總結,我認識到自己在程式設計實踐和理論知識方面都有了進步,但也看到了自己還需要努力的地方。希望在未來的學習中,能夠繼續提升自己的技能,並將所學應用於實際專案中。

相關文章