一:前言:
- 知識點總結:
- 物件導向設計:
- 智慧家居強電電路模擬系統:設計了多種控制裝置(開關、分檔調速器、連續調速器)和受控裝置(燈、風扇)的類,並透過繼承和多型實現裝置的特有行為。
- 答題判題程式:設計了題目、試卷、學生、答卷等類,透過物件導向的方式管理考試資訊。
- 資料結構:
- 智慧家居強電電路模擬系統:使用圖或連結串列表示電路的連線關係,處理並聯和串聯電路的組合邏輯。
- 答題判題程式:使用雜湊表(Map)儲存題目資訊、試卷資訊、學生資訊、答卷資訊和刪除題目資訊,使用列表(List)儲存試卷中的題目及其分值,以及學生的答題資訊。
- 演算法:
- 智慧家居強電電路模擬系統:計算電路中的電壓、電流、電阻等物理量,處理並聯和串聯電路的組合邏輯,確保計算結果正確。
- 答題判題程式:判斷答案是否正確,處理多選題和填空題的特殊評分規則,計算總分。
- 異常處理:
- 智慧家居強電電路模擬系統:處理輸入資料的合法性檢查,如裝置編號、連線資訊等,處理邊界條件和特殊情況,如電壓超出範圍、裝置未連線等。
- 答題判題程式:處理輸入格式錯誤的情況,處理題目被刪除、題目不存在、試卷總分不為100分等特殊情況。
- 題量分析:
- 智慧家居強電電路模擬系統:
- 類的設計:
- 控制裝置類:開關、分檔調速器、連續調速器
- 受控裝置類:白熾燈、日光燈、吊扇、落地扇
- 電路類:串聯電路、並聯電路
- 主控類或函式:
- 處理輸入資訊,解析裝置和連線資訊。
- 類比電路行為,計算各裝置的狀態。
- 輸出裝置狀態和引數
- 測試用例:
- 編寫測試用例驗證程式的正確性和魯棒性。
- 類的設計:
- 答題判題程式:
- 類的設計:
- Question 類:表示題目,包含題目編號、題目內容、標準答案等屬性。
- TestPaper 類:表示試卷,包含試卷號、題目及其分值等屬性。
- Student 類:表示學生,包含學號、姓名等屬性。
- AnswerSheet 類:表示答卷,包含試卷號、學號、答題資訊等屬性。
- 主控類或函式:
- 處理輸入資訊,解析題目、試卷、學生、答卷、刪除題目等資訊。
- 構建題目、試卷、學生、答卷等物件。
- 模擬答題,計算成績,處理各種特殊情況。
- 按照指定格式輸出結果。
- 類的設計:
- 難度分析:
-
智慧家居強電電路模擬系統: 題目涉及多個裝置和複雜的電路連線,需要綜合運用物件導向設計、資料結構、演算法等知識。需要處理並聯和串聯電路的組合邏輯,確保計算結果正確。輸入輸出處理較為複雜,需要仔細解析和格式化輸出,題目難度較大。
-
答題判題程式: 題目涉及多個資料結構和複雜的邏輯判斷,需要綜合運用字串處理、邏輯判斷、排序等知識。處理多選題和填空題的特殊評分規則,確保評分結果正確。處理各種特殊情況,如題目被刪除、題目不存在、試卷總分不為100分、輸入格式錯誤等。按照指定格式輸出結果,確保輸出資訊的完整性和正確性,題目難度較大。
- 綜合分析總結:
這三道題目涵蓋了物件導向設計、資料結構、演算法、輸入輸出處理、異常處理等多個方面的知識。每道題目的設計和實現都需要綜合運用這些知識,解決實際問題。透過這些題目,可以提升程式設計能力和問題解決能力,特別是在處理複雜資料結構和邏輯判斷方面。
二:設計與分析
1. 第四道大作業:
-
題目描述: 這道題要求我們設計並實現一個小巧的線上考試系統,能夠處理不同型別的問題,比如普通的問答題、選擇題和填空題。這個系統不僅要能夠接收題目資訊(包括題目的編號、內容和正確答案)、試卷資訊(包含哪些題目以及每個題目的分數)、學生資訊(學號和姓名),還要能夠接收學生的答題情況。特別的是,這個系統還需要支援刪除題目,即使這些題目已經被包含在試卷裡了,刪除後這些題目的分數就會變成0分。系統要能夠根據學生的答案自動評分,考慮到不同題型的評分規則,最後,系統要能夠輸出每個學生的答題詳情和總成績,同時還要檢查試卷的總分是否達到100分,如果沒有達到也要給出提示。此外,系統還需要能夠處理一些異常情況,比如輸入格式錯誤或者試卷號、學號引用錯誤等問題,確保系統的穩定性和準確性。整個過程中,所有的資訊都可以以任意順序輸入,系統需要能夠靈活應對。
-
基本思路: 這道題要用Java實現一個小型線上考試系統。首先,用雜湊表儲存題目、試卷和學生資訊,列表儲存學生的答題資訊,集合記錄被刪除的題目。然後,讀取和解析輸入資訊,根據字首(如
#N:
、#T:
、#X:
等)將資訊存入相應的資料結構。接著,遍歷每個學生的答題資訊,檢查題目是否存在、是否被刪除,比對答案並根據題目型別計算得分。最後,按學號和試卷號排序,輸出每個學生的答題詳情和總分,檢查試卷總分是否為100分並給出提示,處理試卷號或學號引用錯誤的情況。 -
畫類圖,縷清關係:
總共定義了以下幾個類:
ExamQuestionInfo
:主要負責儲存題目資訊,包括題目ID、內容、正確答案、是否有效、是否為多選題等DataManipulationClass
:包含一些輔助方法,但目前的方法沒有實際用途,可以考慮移除或新增實際功能。ExamPaperDetails
:儲存試卷資訊,包括試卷ID和每個題目的分數。MainClass
:包含一些模擬方法,但目前的方法沒有實際用途,可以考慮移除或新增實際功能。StudentAnswerRecord
:儲存學生的答題記錄,包括試卷ID、學生標識和每題的答案。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的思想,學會如何編寫高質量的單元測試,確保程式碼的質量。
-
-
對教師、課程、作業、實驗、課上及課下組織方式等方面的改進建議及意見
課程內容:建議增加一些實戰專案的練習,讓我們在實際專案中應用所學知識,增強實戰經驗。同時,增加一些軟體工程方法論的內容,幫助我們瞭解軟體開發的整體流程。- 作業和實驗:希望作業可以設計得更具有挑戰性和實用性,鼓勵我們在完成任務的同時,也能發揮創意,探索不同的解決方案。實驗環節希望能提供更多指導和支援,特別是在遇到難題時,能夠有更多資源可供參考。
透過這兩道題目的總結,我認識到自己在程式設計實踐和理論知識方面都有了進步,但也看到了自己還需要努力的地方。希望在未來的學習中,能夠繼續提升自己的技能,並將所學應用於實際專案中。
-