PTA題目集7~8的總結性Blog
· 前言
本次的兩個作業,由家居強電電路模擬程序- 3、家居強電電路模擬程序 -4組成。
家居強電電路模擬程序-3模擬強電電路的運行,支持各種控制設備、受控設備的運行邏輯、計算各設備的電壓、電流、亮度、轉速等參數、支持電路的串聯與并聯結構。;最后家居強電電路模擬程序-4則在前一題的基礎上增加了并聯中包含并聯的內容,擴展了系統的功能和適用場景,新增內容如下:電器增加管腳電壓的顯示、增加電流限制功能,輸出超流錯誤提示、短路檢測功能,短路時僅輸出“short circuit error”、支持并聯電路中包含并聯電路的嵌套結構、增加二極管元件,模擬正向導通、反向截止的電路特性。
· 題目集概述
· 家居強電電路模擬程序 - 3
1. 題目核心分析
功能點分解
-
控制設備:
- 模擬開關(0/1狀態)、互斥開關、分檔調速器(固定檔位)、連續調速器(范圍檔位)。
- 開關和調速器根據狀態影響電壓傳輸,互斥開關根據電阻實現雙分支。
-
受控設備:
- 燈具(白熾燈、日光燈):根據電壓差計算亮度。
- 風扇(吊扇、落地扇):根據電壓差計算轉速。
- 受控窗簾:根據總光照強度控制窗簾的開合比例。
-
電路連接與狀態計算:
- 串聯電路:按輸入到輸出順序連接設備,計算電壓分布、電流。
- 并聯電路:實現各分支共享電壓,不同支路的電流疊加。
- 串聯和并聯電路間嵌套組合。
-
輸入輸出格式:
- 支持控制設備的操作指令。
- 模擬電路參數輸出,包括設備狀態、亮度、轉速、窗簾開合比例等。
2. 流程設計
- 輸入解析:
- 解析設備、線路、操作指令信息。
- 建立所有設備的實例并保存設備連接關系。
- 電路組裝:
- 根據線路信息構建串聯和并聯電路。
- 按連接關系計算設備電壓、電流分布。
- 狀態更新與計算:
- 執行控制設備的狀態調整。
- 重新計算受控設備的亮度、轉速和窗簾狀態。
- 輸出生成:
- 按設備類型和編號順序輸出最終狀態或參數。
3. 計算邏輯設計
3.1. 電壓與電流計算
- 串聯電路:
- 總電阻 R_total= R_i求和。
- 總電流 I = V_cc / R_total。
- 每個設備的電壓 V_i = I * R_i。
- 并聯電路:
- 總電流 I_total = I_i求和。
- 每個分支的電流 I_branch = V_branch / R_branch。
3.2. 設備狀態計算
- 燈具亮度:按電壓差比例線性增長或固定輸出。
- 風扇轉速:按電壓差分段增長或線性增長。
- 窗簾開合:根據光照強度范圍設置比例。
運行邏輯分析
1. 系統的運行流程圖
-
輸入解析階段:
- 解析輸入中的設備定義、線路拓撲和指令操作。
- 構建設備和線路對象實例。
-
電路組裝階段:
- 按串聯或并聯連接設備,組裝電路。
- 初始化輸入電壓、電阻,并計算初始狀態。
-
狀態更新階段:
- 執行輸入的控制設備指令。
- 根據指令更新電壓分布、電流及設備狀態。
-
輸出生成階段:
- 輸出所有設備的最新狀態參數,如開關狀態、亮度、轉速、窗簾比例等。
2. 運行邏輯詳細步驟
2.1 輸入解析階段
輸入格式:
# [線路定義]
# [設備定義]
# [操作指令]
end
-
線路定義解析:
- 以
[A-B]格式描述的電路段,每段為一條連接。- 示例:
[VCC K1-1] [K1-2 F1-1] [F1-2 B1-1] [B1-2 GND] - 解析為:從
VCC→K1-1→K1-2→F1-1→F1-2→B1-1→B1-2→GND。
- 示例:
- 以
-
設備定義解析:
- 設備的屬性通過編號定義。
- 示例:
K1: Switch,F1: CeilingFan。 - 解析為設備對象,并保存到設備映射表。
- 示例:
- 設備的屬性通過編號定義。
-
操作指令解析:
- 控制設備的狀態切換。
- 示例:
#F1+:控制風扇F1增加檔位。#K1:打開或關閉開關K1。
- 操作結果更新到設備屬性。
- 示例:
- 控制設備的狀態切換。
2.2 電路組裝階段
基于線路定義,構建電路的邏輯連接關系。
-
按電路段連接設備:
- 按解析結果,連接每個設備的輸入、輸出引腳。
- 構建串聯電路或并聯電路對象。
-
電路初始化:
- 電阻計算:
- 串聯:總電阻$R_{total} = \sum R_i$。
- 并聯:總電阻$1 / R_{total} = \sum (1 / R_i)$。
- 電壓、電流分布:
- 根據電源電壓,初始化設備的電壓、電流分布。
- 電阻計算:
2.3 狀態更新階段
當收到控制指令后,更新設備和電路狀態。
-
更新控制設備狀態:
- 開關類設備:
- 如
Switch的狀態切換on/off。
- 如
- 調速器類設備:
- 如
StepRegulator的檔位調整。
- 如
- 狀態變化會影響后續設備的輸入電壓。
- 開關類設備:
-
重新計算電壓與電流分布:
- 串聯電路:
- 計算總電流 $I = V_{total} / R_{total}$。
- 逐設備分配電壓 $V_i = I \cdot R_i$。
- 并聯電路:
- 各分支共享相同電壓 $V_{branch}$。
- 逐分支計算電流 $I_{branch} = V_{branch} / R_{branch}$。
- 串聯電路:
-
更新受控設備狀態:
- 燈具:
- 根據電壓差,計算亮度(白熾燈線性,日光燈恒亮)。
- 風扇:
- 根據電壓差,計算轉速或檔位(線性或分段增長)。
- 窗簾:
- 根據總光強計算開合比例(光強與電壓相關)。
- 燈具:
2.4 輸出生成階段
生成格式化的輸出結果,包括設備最新狀態。
-
輸出格式:
- 按設備編號順序輸出狀態參數。
- 開關:
@K1: turned on/off。 - 風扇:
@F1: 1(表示當前檔位)。 - 窗簾:
@B1: 50(表示當前開合比例)。
- 開關:
- 示例:
@K1: turned on @F1: 2 @B1: 80
- 按設備編號順序輸出狀態參數。
-
結果排序:
- 按設備編號進行排序,確保輸出順序與輸入一致。
3. 模塊間交互邏輯
以下是系統主要模塊的交互關系:
-
輸入模塊:
- 解析設備和線路信息。
- 解析操作指令并傳遞給電路模塊。
-
電路模塊:
- 根據設備連接構建電路。
- 計算電流、電壓分布并傳遞給設備模塊。
-
設備模塊:
- 接收電壓、電流信息更新狀態。
- 根據控制設備的指令調整受控設備參數。
-
輸出模塊:
- 格式化設備狀態,生成最終輸出。
4. 邏輯實現細節
4.1. 核心算法
-
電路電流與電壓分布計算:
- 串聯:
R_total = sum([R1, R2, ...]) I = V_total / R_total V_i = I * R_i - 并聯:
R_total = 1 / sum([1/R1, 1/R2, ...]) V_branch = V_total I_branch = V_branch / R_branch
- 串聯:
-
燈具亮度計算:
Brightness = (V_input / V_max) * 100 # 線性比例 -
風扇轉速計算:
Speed = (V_input / V_max) * Max_Speed # 分段或線性 -
窗簾開合比例:
Open_Rate = (Light_Intensity / Max_Intensity) * 100
4.2. 輸入指令處理
- 示例指令:
#K1- 查找設備編號為
K1的設備對象。 - 切換狀態
on/off,并通知相關電路重新計算狀態。
- 查找設備編號為
5. 總結與優化點
-
分層設計:
- 輸入解析 → 電路組裝 → 狀態更新 → 輸出生成,清晰解耦各個模塊職責。
-
高內聚低耦合:
- 設備和電路模塊獨立,狀態變化通過接口通信,方便擴展。
-
高效計算:
- 串聯與并聯計算邏輯清晰,高效分配電壓和電流。
-
兼容性:
- 輸入支持多樣化控制指令,輸出支持按需擴展格式。
知識點總結
1. 面向對象編程 (OOP)
核心思想:
-
抽象與封裝:
- 根據設備功能,將電路中的開關、調速器、燈具、風扇等抽象為不同類,提取通用特性至基類
CircuitDevice。 - 封裝每個設備的屬性(如電壓、電阻、狀態)和方法(如
calculate_output)。
- 根據設備功能,將電路中的開關、調速器、燈具、風扇等抽象為不同類,提取通用特性至基類
-
繼承與多態:
- 子類(如
Switch、Lamp)繼承基類,通過多態實現特定設備的行為,例如:- 白熾燈和日光燈的亮度計算邏輯不同,但均通過
Lamp類的接口調用。
- 白熾燈和日光燈的亮度計算邏輯不同,但均通過
- 調速器的分檔調速和連續調速通過多態接口
set_level()實現。
- 子類(如
-
耦合與解耦:
- 通過電路類(
SeriesCircuit、ParallelCircuit)管理設備的連接與電壓計算,減少設備類之間的直接依賴,降低耦合度。
- 通過電路類(
2. 電路知識與模擬
電路模擬原理
-
電壓、電流分布:
- 串聯電路中逐設備分配電壓。
- 并聯電路中各分支共享電壓,分別計算電流。
-
動態調整:
- 當開關狀態或調速器檔位發生變化時:
- 重新計算總電路的電阻。
- 更新電壓分布,改變受控設備的亮度、轉速等狀態。
- 當開關狀態或調速器檔位發生變化時:
3. 軟件設計方法
系統模塊劃分
-
設備模塊:
- 每種設備為一個類,封裝特定行為:
- 開關控制:切斷/接通電路。
- 燈具亮度:根據輸入電壓計算亮度。
- 風扇轉速:根據電壓分配計算檔位或轉速。
- 窗簾比例:根據光強控制開合。
- 設備類的接口設計:
- 例如,
update_voltage(input_voltage)用于傳遞設備輸入電壓。
- 例如,
- 每種設備為一個類,封裝特定行為:
-
電路模塊:
- 包括串聯和并聯電路:
- 串聯電路:
- 計算總電阻 $R_{total}$。
- 按設備分配電壓。
- 并聯電路:
- 計算等效電阻。
- 分支共享電壓,獨立計算電流。
- 串聯電路:
- 電路的接口設計:
calculate_circuit():執行電流、電壓分布的計算。add_device():支持動態添加設備。
- 包括串聯和并聯電路:
-
輸入/輸出模塊:
- 輸入:
- 解析設備定義(如設備類型、編號)。
- 解析連接關系(串聯/并聯拓撲)。
- 解析控制指令(如開關切換、檔位調整)。
- 輸出:
- 格式化設備狀態,包括開關狀態、亮度、轉速等。
- 輸入:
6. 知識點總結關鍵表
| 知識點分類 | 涉及內容 |
|---|---|
| 面向對象編程 | 抽象類、繼承、多態、接口設計 |
| 電路物理原理 | 串聯與并聯電路、電壓電流分布、電功率公式 |
| 軟件模塊設計 | 分層設計、設備模塊與電路模塊的解耦、輸入輸出解析 |
源碼結構分析
1. 源碼功能概述
該程序實現了一個模擬電路系統,支持各種電氣設備(如開關、燈、風扇、窗簾等)的控制、連接、狀態切換以及計算相關的電路參數(如電阻、電壓、亮度等)。程序核心部分包括電路模型定義、設備的抽象及其具體實現、電路分析和操作命令解析。
2. 程序核心結構
主要組成部分:
-
設備類層次結構:
Device:設備基類。ControlDevice和ControlledDevice:分別表示控制設備和被控制設備。- 具體設備類型繼承自這兩個抽象類,包括開關、燈、風扇等。
-
電路模型:
Circuit:電路類,包含設備管理、連接信息管理、電路分析和狀態計算的邏輯。SimulationCircuit:用于模擬復雜的子電路和并聯電路。
-
命令解析:
- 主程序
Main解析輸入的命令,調用相關類處理設備的狀態和電路的分析。
- 主程序
3. 核心方法解析
3.1 calculateResistance 方法
功能:計算整個電路的總電阻,包括串聯和并聯部分。
- 實現原理:
- 遍歷電路中的每條連接(從
connections獲取)。 - 判斷該連接是否屬于并聯電路。
- 對于串聯電路,直接累加電阻;對于并聯電路,計算其等效電阻。
- 遍歷電路中的每條連接(從
- 作用: 提供電阻總值以進一步計算電壓分配。
3.2 calculateVoltages 方法
功能:分配電路中各設備的電壓。
- 實現原理:
- 通過總電阻計算電路中主電壓分布。
- 根據設備電阻占總電阻的比例分配電壓。
- 特殊邏輯處理調速器、燈、窗簾等設備的狀態。
3.3 parseDevices 方法
功能:將輸入的電路設備信息解析并實例化設備對象。
- 實現原理:
- 遍歷電路定義(
Circuits)的設備清單。 - 根據設備類型(通過前綴識別)實例化具體的設備對象。
- 將設備對象添加到
Circuit.devices中,供后續操作使用。
- 遍歷電路定義(
3.4 executeCommands 方法
功能:根據輸入命令,操作設備的狀態。
- 實現原理:
- 區分命令類型(如開關、調速器等)。
- 調用設備的特定方法執行相應的狀態切換。
- 更新設備狀態后觸發電路重新計算。
3.5 printStatus 方法
功能:輸出當前電路中所有設備的狀態。
- 實現原理:
- 遍歷
Circuit.devices。 - 按設備類型分類打印狀態(如亮度、轉速等)。
- 格式化輸出,按設備編號排序。
- 遍歷
4. 類圖設計

關鍵類說明:
- Device:設備基類,包含設備通用屬性和方法(如電壓、電阻等)。
- ControlDevice:控制設備(如開關、調速器),負責影響被控設備。
- ControlledDevice:被控設備(如燈、風扇等),根據控制信號調整自身狀態。
- Circuit:管理所有設備及連接,負責電路的分析、計算和操作。
- SimulationCircuit:模擬子電路,用于處理并聯電路的特殊邏輯。
5. 順序圖設計
以下展示了程序在解析輸入命令并計算電路狀態的執行過程:
用戶輸入 -> Main.main() -> parseDevices()
|
v
Circuit.addDevice()
|
v
Circuit.calculateResistance()
|
v
Circuit.calculateVoltages()
|
v
Circuit.printStatus()
關鍵步驟:
- 用戶輸入設備和電路連接信息。
parseDevices方法解析并實例化設備對象。calculateResistance方法計算電路的總電阻。calculateVoltages方法分配電壓并更新設備狀態。printStatus方法輸出設備的最終狀態。
6. 踩坑心得
-
輸入解析:
- 設備類型和電路連接格式多樣,容易解析出錯。
- 需注意命令格式的邊界條件,如空行或非法字符。
-
設備連接:
- 并聯電路的等效電阻計算較復雜,需考慮短路和開路的情況。
- 開關與多狀態開關(
ExclusiveSwitch)的連接狀態判斷較為繁瑣。
-
電壓分配:
- 需準確區分串聯和并聯設備的電阻占比。
- 燈光亮度和風扇轉速等非線性關系需單獨處理。
-
狀態更新:
- 設備狀態更新需保證實時性,不能遺漏對其他設備的影響。
-
命令執行:
- 設備狀態切換的命令執行順序對最終輸出有重要影響。
· 家居強電電路模擬程序 - 4
1. 題目分析
核心任務:
設計并實現一個能夠模擬智能家居強電電路的系統,支持控制設備、受控設備的狀態變化、電路電壓和電流計算、短路檢測、電流限制、管腳電壓顯示等功能。本次迭代重點增加以下功能:
- 管腳電壓顯示。
- 電流限制與超限檢測。
- 短路檢測。
- 并聯電路中包含并聯的支持。
- 二極管的特性實現。
2. 源碼結構分析
模塊劃分:
-
設備類:
- 所有設備(如開關、調速器、燈、風扇等)的基類和子類。
- 新增二極管
Diode類,模擬正向導通、反向截止特性。
-
電路類:
- 串聯電路類
SerialCircuit。 - 并聯電路類
ParallelCircuit。 - 支持嵌套并聯和串聯電路的處理。
- 串聯電路類
-
電路模擬核心:
- 電阻計算:考慮串聯和并聯規則。
- 電壓分配:基于設備的電阻比例。
- 短路檢測與處理。
- 電流限制和超限檢測。
-
輸入輸出模塊:
- 輸入解析:設備、連接信息和控制命令。
- 輸出狀態:支持按要求格式輸出設備狀態及管腳電壓。
類圖設計如下:

2.功能與實現的新增難點
1. 管腳電壓顯示
難點分析:
-
精度要求嚴格:
- 管腳電壓需保留整數部分,截尾處理可能引入精度誤差。
- 各設備引腳電壓顯示需按編號排序。
-
嵌套電路的管腳電壓傳遞:
- 串聯和并聯電路的管腳電壓需要逐級計算和傳遞。
- 并聯電路中包含子電路時,需確定每條子電路輸入輸出電壓。
解決方案:
- 在設備類中新增
getPinVoltages方法,每個設備計算并返回引腳電壓。 - 對于并聯和串聯電路,通過遞歸調用獲取所有子電路的管腳電壓。
2. 電流限制與超限檢測
難點分析:
-
設備電流計算復雜:
- 電流由設備兩端電壓差和設備電阻決定。
- 并聯電路中,各分支電流需要單獨計算。
-
多設備電流檢測邏輯:
- 每個設備有不同的最大電流限制。
- 需在輸出狀態時動態檢測并標記超限設備。
解決方案:
- 在
Device類中增加checkCurrentLimit方法,根據實時電流與限制值比較。 - 在電路計算后統一檢測所有設備是否超限,并標記輸出信息。
3. 短路檢測
難點分析:
-
短路的多樣性:
- 串聯電路中直接短接。
- 并聯電路中某分支短接導致整體短路。
-
短路對電路計算的影響:
- 短路后電路電阻為0,可能導致無法分配電壓和電流。
解決方案:
- 在電阻計算階段,若總電阻為0,立即標記短路。
- 在狀態輸出階段,優先檢測短路并終止其他輸出,顯示 "short circuit error"。
4. 并聯電路中包含并聯
難點分析:
-
多層嵌套解析復雜度:
- 并聯電路中包含子并聯電路,可能無限遞歸。
- 各子電路需獨立解析并返回等效電阻和電壓。
-
電流分配復雜性:
- 嵌套并聯電路中,每層電路電流需按等效電阻分配。
解決方案:
- 在
ParallelCircuit類中,遞歸處理嵌套的子并聯電路,逐級計算等效電阻。 - 在電壓分配階段,按各分支電阻比例分配電壓和電流。
5. 二極管的特性實現
難點分析:
-
正向導通與反向截止邏輯復雜:
- 二極管需實時判斷電流方向。
- 若兩端電壓相等,需根據連接方向決定導通或截止狀態。
-
影響電路整體計算:
- 二極管導通時電阻為0,影響電路總電阻。
- 二極管截止時電阻為無窮大,影響電路的連接有效性。
解決方案:
- 在
Diode類中實現updateState方法,判斷電流方向并設置電阻。 - 在電路解析時,單獨處理二極管的正反向連接,確保電阻計算準確。
6. 輸出格式的要求
難點分析:
-
格式化輸出:
- 設備狀態和參數需要按類型和編號排序輸出。
- 管腳電壓需嚴格按照要求顯示整數值。
-
異常信息的插入:
- 超限和短路信息需動態插入,不破壞整體輸出結構。
解決方案:
- 在
outputStatus方法中,按設備類型分組并排序。 - 檢測異常后,動態修改輸出格式,插入錯誤信息。
3.核心方法講解及源碼分析
以下是代碼中的幾個核心方法,它們是整個電路模擬邏輯實現的關鍵部分:
1. calculateCircuitVoltage 方法
功能:
- 負責整個電路的電壓分配和電流計算。
- 短路檢測、電壓分配和設備特性更新均在此實現。
源碼分析:
public void calculateCircuitVoltage() {
SeriesCircuit maincircuit = (SeriesCircuit)devices.get(Main.Maincircuit);
if (maincircuit.isDuanlu) {
System.out.println("short circuit error");
return;
}
if (maincircuit.isSeriesOpen()) {
maincircuit.setInputVoltage(220.0); // 設置主電路電壓
return;
}
maincircuit.setInputVoltage(220.0); // 設置主電路輸入電壓
maincircuit.setDianshicha(220.0); // 設置主電路電位差
// 遍歷設備,更新每個設備的狀態
for (String deviceName : devices.keySet()) {
Device device = devices.get(deviceName);
if (device instanceof Curtain) {
Curtain curtain = (Curtain) device;
curtain.setLightIntensity(maincircuit.getLightIntensity()); // 設置光強影響窗簾狀態
}
}
}
分析:
-
短路檢測:
- 檢查主電路
isDuanlu狀態。如果短路(電阻為 0),直接輸出錯誤信息。
- 檢查主電路
-
斷路檢測:
- 如果電路未完全閉合(如某處開關斷開),直接設置電壓,但不進行進一步計算。
-
電壓分配:
- 設置主電路輸入電壓為 220V,同時傳遞電位差給子電路和設備。
-
設備狀態更新:
- 對如窗簾等受環境(如光照強度)影響的設備進行狀態更新。
2. calculateSeriesResistance 方法
功能:
- 遞歸計算串聯電路的總電阻,考慮設備斷路和短路的情況。
源碼分析:
public void calculateSeriesResistance() {
for (Map.Entry<String, Device> entry : SmCircuit.entrySet()) {
if (isSeriesOpen()) { // 檢查斷路
this.resistance = 0.0;
return;
} else {
Device device = entry.getValue();
if (device instanceof ExclusiveSwitch) {
ExclusiveSwitch exclusiveSwitch = (ExclusiveSwitch) device;
if (exclusiveSwitch.isConnectedToCircuit(name)) {
this.resistance += exclusiveSwitch.getResistance(name);
}
} else if (device instanceof ControlledDevice) {
ControlledDevice controlledDevice = (ControlledDevice) device;
if (controlledDevice.inputPin.equals("1")) {
this.resistance += controlledDevice.getResistance();
}
} else if (device instanceof SimulationCircuit) {
if (device instanceof SeriesCircuit) {
SeriesCircuit serialCircuit = (SeriesCircuit) device;
serialCircuit.calculateSeriesResistance();
this.resistance += serialCircuit.getresistance();
} else if (device instanceof ParallelCircuit) {
ParallelCircuit parallelCircuit = (ParallelCircuit) device;
parallelCircuit.calculateParallelResistance();
this.resistance += parallelCircuit.getresistance();
}
}
}
}
}
分析:
-
斷路檢測:
- 如果電路中任何設備斷開(開關未閉合、燈泡斷路等),總電阻直接設為 0。
-
逐個設備電阻計算:
- 對電路中每個設備,根據其類型(如開關、受控設備、子電路)分別計算電阻,并累加到總電阻。
-
遞歸處理嵌套子電路:
- 對于子電路(串聯或并聯),遞歸調用其對應的電阻計算方法,完成多層嵌套電路的處理。
3. calculateParallelResistance 方法
功能:
- 計算并聯電路的等效電阻,考慮短路和斷路情況。
源碼分析:
public void calculateParallelResistance() {
double totalResistance = 0;
this.isDuanlu = false;
if (isParallelOpen()) { // 并聯電路斷路檢測
return;
}
for (Map.Entry<String, List<SeriesCircuit>> entry : parallelList.entrySet()) {
List<SeriesCircuit> subCircuits = entry.getValue();
for (SeriesCircuit subCircuit : subCircuits) {
subCircuit.calculateSeriesResistance();
double subResistance = subCircuit.getresistance();
if (subCircuit.isDuanlu) { // 如果某支路短路
this.isDuanlu = true;
}
if (subResistance != 0) {
totalResistance += 1.0 / subResistance; // 并聯電阻計算公式
}
}
}
if (this.isDuanlu) {
this.resistance = 0.0; // 短路時總電阻為 0
} else {
this.resistance = totalResistance == 0 ? 0 : 1.0 / totalResistance;
}
}
分析:
-
斷路處理:
- 如果并聯電路所有支路均斷開,則不計算總電阻。
-
支路遞歸計算:
- 對每個支路調用其串聯電路的電阻計算方法,獲取支路電阻。
-
短路處理:
- 如果任一支路短路,則并聯電路整體短路,總電阻設為 0。
-
等效電阻計算:
- 根據并聯電路公式 $ \frac{1}{R} = \sum \frac{1}{R_i} $ 計算總電阻。
4. setInputVoltage 方法
功能:
- 遞歸設置電路中各設備的輸入電壓,并傳遞電壓到下游設備。
源碼分析:
public void setInputVoltage(double inputVoltage) {
this.inputVoltage = inputVoltage;
if (!isSeriesOpen() && !isDuanlu) { // 只有在電路未斷路或短路時傳遞電壓
return;
}
for (Map.Entry<String, List<String[]>> entry : connections.entrySet()) {
String key1 = entry.getKey();
List<String[]> values = entry.getValue();
for (String[] parts : values) {
String device1 = parts[0].split("-")[0];
String device2 = parts[1].split("-")[0];
Device device = SmCircuit.get(device2);
device.setInputVoltage(inputVoltage);
}
}
}
分析:
-
遞歸電壓傳遞:
- 將主電路的輸入電壓遞歸分配到子設備和子電路。
-
斷路/短路跳過:
- 如果電路短路或斷路,不再繼續傳遞電壓。
-
子設備電壓更新:
- 對于下游設備或子電路,遞歸調用其
setInputVoltage方法完成更新。
- 對于下游設備或子電路,遞歸調用其
5. isSeriesOpen 和 isParallelOpen 方法
功能:
- 檢測串聯或并聯電路是否斷路。
源碼分析:
串聯電路
public boolean isSeriesOpen() {
if (SmCircuit.isEmpty()) {
this.isDuanlu = true; // 電路為空,標記短路
}
for (Map.Entry<String, Device> entry : SmCircuit.entrySet()) {
Device device = entry.getValue();
if (device instanceof Switch && !((Switch) device).status) {
lineOpen = true; // 開關斷開
break;
}
}
return lineOpen;
}
并聯電路
public boolean isParallelOpen() {
for (Map.Entry<String, List<SeriesCircuit>> entry : parallelList.entrySet()) {
List<SeriesCircuit> subCircuits = entry.getValue();
for (SeriesCircuit subCircuit : subCircuits) {
if (!subCircuit.isSeriesOpen()) {
this.parallelOpen = false; // 只要有一條支路閉合,則并聯電路有效
return false;
}
}
}
this.parallelOpen = true; // 所有支路均斷開
return true;
}
分析:
-
串聯電路斷路檢測:
- 檢查是否有開關斷開或其他設備狀態導致電路不閉合。
-
并聯電路斷路檢測:
- 檢查是否所有支路均斷開。
總結
- 核心方法實現了電路模擬的電壓、電流分配,以及短路、斷路的動態檢測。
- 通過遞歸調用,支持嵌套的復雜電路模型。
- 各類設備的狀態更新(如燈亮度、風扇轉速)與電路行為緊密關聯,形成完整的模擬流程。
4. 踩坑心得
-
嵌套電路解析:
- 復雜嵌套并聯和串聯電路容易導致解析錯誤。
- 解決:采用遞歸解析,確保層次清晰。
-
短路檢測:
- 電路中存在短路情況,可能導致總電阻為0。
- 解決:在電阻計算過程中實時檢查是否存在短路。
-
電流限制:
- 需要動態計算設備電流并與限制值比較。
- 解決:在狀態更新時統一檢查。
-
二極管實現:
- 需要考慮兩端電壓相等時的特殊狀態。
- 解決:根據接入方向和電壓差處理。
-
管腳電壓顯示:
- 精度和格式要求嚴格(舍去小數部分)。
- 解決:統一在輸出時截尾,避免誤差。
總結
這次題目集的完成讓我收獲頗豐,特別是在分析和解決復雜問題的能力上有了顯著提升。最初面對題目時感到有些棘手,但隨著逐步拆解和深入思考,發現解決問題的關鍵在于結構化的思路和系統化的解決方式。通過將復雜問題分解為多個獨立的子模塊,并針對每個模塊逐一突破,不僅降低了問題的難度,也提升了整體效率。在電路設計相關的題目中,起初我更多依賴公式直接求解,但隨著深入研究,逐漸認識到動態特性的本質需要更高層次的抽象建模以及狀態管理和邏輯設計,而不僅僅是套用公式。這種從被動計算到主動建模的轉變是我最大的收獲之一。
整個學習過程中,模塊化設計的優勢讓我印象深刻。通過將功能邏輯與狀態管理進行清晰的分離,代碼結構變得更加清晰直觀,也為后續調試和擴展提供了極大的便利。例如,在處理電阻、電壓和電流的關系時,使用統一的邏輯框架動態處理變化情況,比起一開始“邊寫邊改”的凌亂方式高效且嚴謹得多。這讓我更加理解了遞歸方法和動態更新算法的意義,它們不僅能夠高效處理復雜問題,還讓我在編程思維上更加貼近系統化設計。不過,我也發現了自己的不足,特別是在算法優化和性能分析上還有提升的空間。對于更大規模、更復雜的系統,效率問題將是需要優先解決的重點。
在課程設計方面,整體內容扎實且層次分明,但我認為如果能夠融入更多實際案例會更有助于理解。比如,在復雜電路設計的題目中,若能完整剖析一個具體案例并分析其從建模到實現的全過程,學生對模塊化設計和邏輯搭建的核心思想會有更直觀的體會。此外,若作業中能附帶基礎測試用例,不僅能夠快速驗證代碼邏輯的正確性,還能節省學生在基礎調試上的時間,提高學習效率。
總體來說,這次題目集的完成過程讓我對模塊化設計、遞歸方法和動態模型的理解更加深入,同時在編程與實際物理模型的結合方面也得到了顯著提升。不過,未來學習中我計劃更加關注算法的性能優化以及復雜系統模擬的實現,這對于解決更深層次的問題尤為關鍵。此外,我建議課程可以增加更多的團隊協作和交流機會,例如通過小組討論或案例分享來碰撞新的思路,這種方式能夠在合作中提升解決問題的深度,也能培養綜合設計能力,為應對更復雜的挑戰打下良好的基礎。

浙公網安備 33010602011771號