pta題目集6和題目集7題後總結

西阁發表於2024-06-29

前言

背景介紹:
繼上次PTA題目講解完,本次部落格會進行對後幾次題目集的講解說明和題後總結
目的和目標:
及時反饋學習成果,達到學由所會,及時吸收和深入學習的目的
學習收益:
透過後面幾次的題目學習,使得我對java的語法程式碼以及運用熟練度有了極大的進步,同時也對學習程式碼語言有了一個更深的學習理解和更好的學習方法

第一題題目:

智慧家居是在當下家庭中越來越流行的一種配置方案,它透過物聯網技術將家中的各種裝置(如音影片裝置、照明系統、窗簾控制、空調控制、安防系統、數字影院系統、影音伺服器、影櫃系統、網路家電等)連線到一起,提供家電控制、照明控制、電話遠端控制、室內外遙控、防盜報警、環境監測、暖通控制、紅外轉發以及可程式設計定時控制等多種功能和手段。與普通家居相比,智慧家居不僅具有傳統的居住功能,兼備建築、網路通訊、資訊家電、裝置自動化,提供全方位的資訊互動功能。請根據如下要去設計一個智慧家居強電電路模擬系統。以下題目介紹中加粗的部分為本次迭代在“家居強電電路模擬程式-2”的基礎上增加的功能要求。

1、控制裝置

本題模擬的控制裝置包括:開關、分檔調速器、連續調速器、互斥開關。

開關:包括0和1兩種狀態。

開關有兩個引腳,任意一個引腳都可以是輸入引腳(接往電源端),而另一個則是輸出引腳(接網接地端)。開關狀態為0時,無論輸入電位是多少,輸出引腳電位為0。當開關狀態為1時,輸出引腳電位等於輸入電位。
互斥開關:
互斥開關有3個引腳:1個是彙總引腳,另兩個是分支引腳。

開關電路示意圖如圖1所示,左邊是彙總引腳,編號為1;右邊兩個是分支引腳,右上的輸出引腳為2,右下輸出引腳為3。圖中1、2、3引腳均可以是輸入引腳,當1為輸入引腳時,2、3引腳為輸出引腳;1為輸出引腳時,2、3引腳為輸入引腳。

互斥開關只有兩種狀態:開關接往上面的2號引腳、接往下面的3號引腳。開關每次只能接通其中一個分支引腳,而另一個分支引腳處於斷開狀態。

互斥開關的預設狀態為1、2引腳接通,1、3引腳斷開。

圖1中所示的互斥開關可以反過來接入電路,即彙總引腳接往接地端,兩個分支引腳接往電源端。
image.png

圖1 互斥開關

為避免短路,互斥開關設定了限流電阻,12引腳之間預設電阻為5,13引腳之間預設電阻為10。

分檔調速器

按檔位調整,常見的有3檔、4檔、5檔調速器,檔位值從0檔-2(3/4)檔變化。本次迭代模擬4檔調速器,每個檔位的輸出電位分別為0、0.3、0.6、0.9倍的輸入電壓。
連續調速器

沒有固定檔位,按位置比例得到檔位引數,數值範圍在[0.00-1.00]之間,含兩位小數。輸出電位為檔位引數乘以輸入電壓。
所有調速器都有兩個引腳,一個固定的輸入(引腳編號為1)、一個輸出引腳(引腳編號為2)。當輸入電位為0時,輸出引腳輸出的電位固定為0,不受各類開關調節的影響。

開關、調速器的初始狀態/檔位為0。

調速器的輸入引腳編號為1,輸出引腳編號為2。
除互斥開關外,其他控制裝置的電阻為 0。

2、受控裝置

本題模擬的受控裝置包括:燈、風扇。兩種裝置都有兩根引腳,透過兩根引腳電壓的電壓差驅動裝置工作。

燈有兩種工作狀態:亮、滅。在亮的狀態下,有的燈會因引腳電位差的不同亮度會有區別。
風扇在接電後有兩種工作狀態:停止、轉動。風扇的轉速會因引腳間電位差的不同而有區別。
本次迭代模擬兩種燈具。

白熾燈:

亮度在0~200lux(流明)之間。
電位差為0-9V時亮度為0,其他電位差按比例,電位差10V對應50ux,220V對應200lux,其他電位差與對應亮度值成正比。白熾燈超過220V。
日光燈:

亮度為180lux。
只有兩種狀態,電位差為0時,亮度為0,電位差不為0,亮度為180。
本次迭代模擬兩種風扇。

吊扇:

工作電壓區間為80V-150V,對應轉速區間為80-360轉/分鐘。80V對應轉速為80轉/分鐘,150V對應轉速為360轉/分鐘,超過150V轉速為360轉/分鐘(本次迭代暫不考慮電壓超標的異常情況)。其他電壓值與轉速成正比,輸入輸出電位差小於80V時轉速為0。
落地扇:

工作電壓區間為 80V-150V,對應轉速區間為 80-360 轉/分鐘;[80V,100V) 對應轉速為 80 轉/分鐘;[100,120)V 對應轉速為 160 轉/分鐘;[120,140)V 對應轉速為 260 轉/分鐘;大於等於 140V 轉速 為 360 轉/分鐘(本次迭代暫不考慮電壓超標的異常情況)。

本次迭代模擬一種受控窗簾:

受控窗簾的電路符號為S,其最低工作電壓為50V,電壓達到或超過50V,窗簾即可正常工作,不考慮室外光照強度和室內空間大小等因素,窗簾受室內燈光的光照強度控制。

當電路中所有燈光的光照強度總和在[0,50)lux範圍內,窗簾全開;
在[50,100)lux範圍內,窗簾開啟比例為0.8;
在[100,200)lux範圍內,窗簾開啟比例為0.6;
在[200,300)lux範圍內,窗簾開啟比例為0.4;
在[300,400)lux範圍內,窗簾開啟比例為0.2;
在400lux及以上範圍內,窗簾關閉。
當電壓低於50V,窗簾不工作,預設為全開狀態。
如果電路中沒有燈或者燈全部關閉,光照強度為0,窗簾處於全開狀態。
受控裝置電阻:白熾燈的電阻為 10,日光燈的電阻為 5,吊扇的電阻為 20,落地扇的電阻為 20,窗簾電阻為15。

3、輸入資訊

1)輸入裝置資訊

分別用裝置識別符號K、F、L、B、R、D、A、H、S分別表示開關、分檔調速器、連續調速器、白熾燈、日光燈、吊扇、落地扇、互斥開關、受控窗簾。

裝置標識用識別符號+編號表示,如K1、F3、L2等。
引腳格式:裝置標識-引腳編號,例如:K1-1標識編號為1的開關的輸入引腳。

開關、分檔調速器、連續調速器的輸入引腳編號為1,輸出引腳編號為2。
受控裝置的兩個引腳編號分別為1、2。
互斥開關的引腳編號已經在互斥開關的介紹部分說明。
約束條件:

不同裝置的編號可以相同。
同種裝置的編號可以不連續。
裝置資訊不單獨輸入,包含在連線資訊中。

2)輸入連線資訊

一條連線資訊佔一行,用[]表示一組連線在一起的裝置引腳,引腳與引腳之間用英文空格" "分隔。

格式:"["+引腳號+" "+引腳號+"]"
例如:[K1-1 K3-2]表示K1的1引腳,K3的2引腳連線在一起。
約束條件:

不考慮調速器串聯到其他調速器的情況。
考慮各類裝置的並聯接入。例如,K1 的輸出接到 L2 的輸入,L2 的輸出再接其他裝置屬於串聯接線。K1 的輸出接到 L2 的輸出,同時 K1 的輸入接到 L2 的輸入,這種情況屬於並聯。

本次迭代的連線資訊不單獨輸入,包含線上路資訊中。

3)輸入控制裝置調節資訊

開關、互斥開關調節資訊格式:

             #+裝置標識K+裝置編號,例如:#K2,代表切換K2開關的狀態。
             #+裝置標識H+裝置編號,例如:#H2,代表切換H2互斥開關的狀態。
             分檔調速器的調節資訊格式:

             #+裝置標識F+裝置編號+"+" 代表加一檔,例如:#F3+,代表F3輸出加一檔。
             #+裝置標識F+裝置編號+"-" 代表減一檔,例如:#F1-,代表F1輸出減一檔。

連續調速器的調節資訊格式:

             #+裝置標識L+裝置編號+":" +數值 代表將連續調速器的檔位設定到對應數值,例如:#L3:0.6,代表L3輸出檔位引數0.6。

4)電源接地標識:

VCC,電壓220V,GND,電壓0V。沒有接線的引腳預設接地,電壓為0V。

5)輸入串聯電路資訊

一條串聯電路佔一行,串聯電路由按從靠電源端到接地端順序依次輸入的 n 個連線 資訊組成,連線資訊之間用英文空格" "分隔。

串聯電路資訊格式:

"#T"+電路編號+":"+連線資訊+" "+連線資訊+...+" "+連線資訊
例如:#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT] 一個串聯電路的第一個引腳是 IN,代表起始端,靠電源。最後一個引腳是 OUT,代表結尾端, 靠接地。
約束條件:

不同的串聯電路資訊編號不同。

輸入的最後一條電路資訊必定是總電路資訊,總電路資訊的起始引腳是 VCC,結束引腳是 GND。

連線資訊中的引腳可能是一條串聯或並聯電路的 IN 或者 OUT。例如:

             #T1:[IN K1-1] [K1-2 T2-IN] [T2-OUT OUT]

             #T1:[IN K1-1] [K1-2 T2-IN] [T2-OUT M2-IN] [M2-OUT OUT]

6)輸入並聯電路資訊

一條並聯電路佔一行,並聯電路由其包含的幾條串聯電路組成,串聯電路標識之間用英文空格" "分隔。

格式:

"#M"+電路編號+":"+”[”+串聯電路資訊+" "+....+" "+串聯電路資訊+”]”
例如:#M1:[T1 T2 T3]
該例宣告瞭一個並聯電路,由 T1、T2、T3 三條串聯電路並聯而成,三條串聯電路的 IN 短 接在一起構成 M1 的 IN,三條串聯電路的 OUT 短接在一起構成 M1 的 OUT。
約束條件:

本次迭代不考慮並聯電路中包含並聯電路的情況。
本題不考慮輸入電壓或電壓差超過220V的情況。

輸入資訊以end為結束標誌,忽略end之後的輸入資訊。

本題中的並聯資訊所包含的串聯電路的資訊都在並聯資訊之前輸入,不考慮亂序輸入的情況。
只要不因短路而造成無窮大的電流燒壞電路(如電路中的部分短接),都是合理情況,在測試點的考慮範圍之內。會造成無窮大的電流的短路本次迭代不考慮。

本次迭代考慮多個並聯電路串聯在一起的情況。

本題考慮一條串聯電路中包含其他串聯電路的情況。例如:

             #T3:[VCC K1-1] [K1-2 T2-IN] [T2-OUT K2-1] [K2-2 T1-IN] [T1-OUT GND]

本例中T1\T2兩條串聯電路T3的一個部分,本題考慮這種型別的輸入。

4、輸出資訊:

按開關、分檔調速器、連續調速器、白熾燈、日光燈、吊扇、互斥開關、受控窗簾的順序依次輸出所有裝置的狀態或引數。每個裝置一行。同類裝置按編號順序從小到大輸出。

輸出格式:

@裝置標識+裝置編號+":" +裝置引數值(控制開關的檔位或狀態、燈的亮度、風扇的轉速,只輸出值,不輸出單位)
連續調速器的檔位資訊保留兩位小數,即使小數為0,依然顯示兩位小數.00。
開關狀態為0(開啟)時顯示turned on,狀態為1(合上)時顯示closed
如:
@K1:turned on
@B1:190
@L1:0.60
互斥開關顯示1、2引腳的接通狀態,接通時顯示closed,斷開時顯示turned on。

如:

@H1:turned on

受控窗簾顯示窗簾開啟的百分比,如:

@S1:80%

5、家居電路模擬系列所有題目的預設規則:

1)當計算電壓值等數值的過程中,最終結果出現小數時,用截尾規則去掉小數部分,只保留整數部分。為避免精度的誤差,所有有可能出現小數的數值用double型別儲存並計算,不要作下轉型資料型別轉換,例如電壓、轉速、亮度等,只有在最後輸出時再把計算結果按截尾規則,捨棄尾數,保留整數輸出。

2)所有連線資訊按電路從電源到接地的順序依次輸入,不會出現錯位的情況。電源VCC一定是第一個連線的第一項,接地GND一定是最後一個連線的後一項。

3)連線資訊如果只包含兩個引腳,靠電源端的引腳在前,靠接地端的在後。

4)調速器的輸入端只會直連VCC,不會接其他裝置。整個電路最多隻有連線在電源上的一個調速器,且不包含在並聯單路中。

6、家居電路模擬系列1-4題目後續迭代設計:

1)電路結構變化:

迭代1:只有一條線路,所有元件串聯
迭代2:線路中包含一個並聯電路
迭代3:線路中包含多個串聯起來的並聯電路
迭代4:並聯電路之間可能出現包含關係

電路結構變化示意圖見圖1。

2)計算方式的變化

迭代1只包含1個受控元件,不用計算電流,之後的電路計算要包含電流、電阻等電路引數。

3)電路元件的變化

每次迭代會增加1-2個新的電路元件。

image.png

圖1:電路結構示意圖

設計建議:

1、電路裝置類:描述所有電路裝置的公共特徵。

2、受控裝置類、控制裝置類:對應受控、控制裝置

3、串聯電路類:一條由多個電路裝置構成的串聯電路,也看成是一個獨立的電路裝置

4、並聯電路類:繼承電路裝置類,也看成是一個獨立的電路裝置

其他類以及類的屬性、方法自行設計。
image.png
題目分析:

這是一個複雜的智慧家居強電電路模擬系統設計問題,涉及多種控制裝置和受控裝置的模擬,以及它們之間複雜的連線和控制邏輯。為了實現這個系統的設計,需要考慮如何建立電路模型,處理輸入資訊,模擬裝置之間的連線關係和狀態變化,並最終輸出裝置的狀態資訊。

具體步驟如下:

裝置模型建立:根據輸入資訊,建立各種裝置(開關、調速器、燈、風扇、窗簾等)的模型,包括輸入引腳、輸出引腳、初始狀態、功能等。

連線關係處理:根據輸入的串聯電路和並聯電路資訊,建立電路連線模型。每個電路由多個串聯電路組成,而每個串聯電路又可以連線其他串聯電路,最終形成完整的電路結構。

控制資訊解析:解析輸入的控制資訊,根據指令調節各種裝置的狀態和引數,例如開關狀態切換、調速器檔位調節等。

狀態模擬和輸出:模擬整個電路系統在不同控制指令下的工作狀態,包括燈的亮度、風扇的轉速、窗簾的開合程度等,輸出各個裝置的最終狀態資訊。

異常處理:考慮電路中可能出現的異常情況,如短路等,並進行適當的處理或報錯提示。
程式碼設計思路
這段Java程式碼的設計思路主要圍繞模擬智慧家居系統中的強電電路設計展開,以下是整體的設計思路和實現步驟:

裝置類的設計
Device類:

Device 類是所有裝置的基類,具有裝置的基本屬性和方法,如裝置ID、兩個引腳的電壓等。
每個裝置有兩個引腳,分別代表不同的電壓狀態。
ControlDevice類:

ControlDevice 類繼承自 Device 類,表示可以控制開關狀態的裝置,如開關、調光器等。
新增了狀態切換方法 toggleState() 和獲取狀態方法 getState()。
ControlledDevice類:

ControlledDevice 類繼承自 Device 類,表示被其他裝置控制的裝置,如燈、風扇等。
電路類的設計
Circuit類:
Circuit 類用於管理和連線多個裝置。
使用 List 來儲存所有裝置。
提供方法 addDevice() 用於向電路中新增裝置。
提供方法 connectDevices() 實現裝置之間的連線,根據輸入的連線資訊將裝置的引腳連線起來,確保電路的完整性。
主程式的設計
Main類:
Main 類作為程式的入口,負責整個流程的控制和裝置狀態的管理。
使用 Scanner 讀取使用者輸入,根據輸入的命令來建立裝置、連線裝置以及控制裝置狀態。
透過處理以 # 開頭的命令來區分控制電路和裝置狀態的不同操作:
#T 和 #M 命令用於處理串聯和並聯電路連線。
#K、#F、#L、#H 命令用於控制裝置的開關狀態、調節器調節、亮度調節等操作。
設計步驟總結
初始化和輸入處理:

初始化一個電路物件和一個 Scanner 物件用於讀取使用者輸入。
透過讀取輸入,區分命令型別,並根據命令型別執行相應的操作。
裝置和電路管理:

設計裝置類的層次結構,確保不同型別裝置的屬性和行為得到正確表示和處理。
設計電路類管理多個裝置,實現裝置之間的連線和狀態調節。
命令處理和狀態更新:

根據命令型別,呼叫電路類的方法實現裝置的連線和狀態更新。
輸出每個裝置的最終電壓狀態,確保電路設計的正確性和功能性。
這些設計思路和實現步驟確保了程式碼能夠模擬智慧家居系統的強電電路設計,包括裝置的建立、連線和狀態控制,使得使用者可以透過輸入命令對電路進行操作和監控。
部分程式碼展示

點選檢視程式碼
import java.util.*;

// 裝置類
class Device {
    protected String id;
    protected int pin1Voltage;
    protected int pin2Voltage;

    public Device(String id) {
        this.id = id;
        this.pin1Voltage = 0;
        this.pin2Voltage = 0;
    }

    public void setPin1Voltage(int voltage) {
        this.pin1Voltage = voltage;
    }

    public void setPin2Voltage(int voltage) {
        this.pin2Voltage = voltage;
    }

    public int getPin1Voltage() {
        return pin1Voltage;
    }

    public int getPin2Voltage() {
        return pin2Voltage;
    }

    public String getId() {
        return id;
    }
}

// 控制裝置類(開關、調速器等)
class ControlDevice extends Device {
    private boolean state; // 0 for off, 1 for on

    public ControlDevice(String id) {
        super(id);
        this.state = false;
    }

    public void toggleState() {
        this.state = !this.state;
    }

    public boolean getState() {
        return state;
    }
}

// 受控裝置類(燈、風扇、窗簾等)
class ControlledDevice extends Device {
    public ControlledDevice(String id) {
        super(id);
    }
}

// 電路類
class Circuit {
    private List<Device> devices;

    public Circuit() {
        this.devices = new ArrayList<>();
    }

    public void addDevice(Device device) {
        devices.add(device);
    }

    public void connectDevices(String connectionInfo) {
        String[] connections = connectionInfo.split(" ");
        for (String connection : connections) {
            String[] parts = connection.split("-");
            String device1Id = parts[0];
            int pin1 = Integer.parseInt(parts[1].substring(0, 1));
            String device2Id = parts[1].substring(1);
            int pin2 = Integer.parseInt(parts[2].substring(0, 1));

            Device device1 = findDevice(device1Id);
            Device device2 = findDevice(device2Id);

            if (device1 != null && device2 != null) {
                // Connect devices
                if (pin1 == 1) {
                    device1.setPin1Voltage(device2.getPin2Voltage());
                } else if (pin1 == 2) {
                    device1.setPin2Voltage(device2.getPin2Voltage());
                }

                if (pin2 == 1) {
                    device2.setPin1Voltage(device1.getPin2Voltage());
                } else if (pin2 == 2) {
                    device2.setPin2Voltage(device1.getPin2Voltage());
                }
            }
        }
    }

    private Device findDevice(String id) {
        for (Device device : devices) {
            if (device.getId().equals(id)) {
                return device;
            }
        }
        return null;
    }

    public List<Device> getDevices() {
        return devices;
    }
}

// 主程式
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Circuit circuit = new Circuit();

        String input;
        while (!(input = scanner.nextLine()).equals("end")) {
            if (input.startsWith("#")) {
                processCommand(input, circuit);
            } else {
                String[] parts = input.split(":");
                String circuitType = parts[0].substring(1);
                String[] connections = parts[1].substring(1, parts[1].length() - 1).split(" ");

                // Create devices
                for (String connection : connections) {
                    String[] devices = connection.split("-");
                    String deviceId = devices[0];
                    int pin = Integer.parseInt(devices[1].substring(0, 1));
                    int voltage = Integer.parseInt(devices[1].substring(1));

                    Device device;
                    if (circuitType.equals("T")) {
                        device = new ControlDevice(deviceId);
                    } else if (circuitType.equals("M")) {
                        device = new ControlledDevice(deviceId);
                    } else {
                        device = new Device(deviceId);
                    }

                    if (pin == 1) {
                        device.setPin1Voltage(voltage);
                    } else if (pin == 2) {
                        device.setPin2Voltage(voltage);
                    }

                    circuit.addDevice(device);
                }

                // Connect devices
                circuit.connectDevices(input.substring(1));
            }
        }

        // Print out devices and their voltages
        List<Device> devices = circuit.getDevices();
        for (Device device : devices) {
            System.out.println("Device ID: " + device.getId());
            System.out.println("Pin 1 Voltage: " + device.getPin1Voltage());
            System.out.println("Pin 2 Voltage: " + device.getPin2Voltage());
            System.out.println();
        }
    }

    private static void processCommand(String command, Circuit circuit) {
        // Process control commands
        if (command.startsWith("#T")) {
            // Process serial circuits
            String[] parts = command.split(":");
            String[] serialCircuits = parts[1].substring(1, parts[1].length() - 1).split(" ");
            for (String serialCircuit : serialCircuits) {
                circuit.connectDevices(serialCircuit);
            }
        } else if (command.startsWith("#M")) {
            // Process parallel circuits
            String[] parts = command.split(":");
            String[] parallelCircuits = parts[1].substring(1, parts[1].length() - 1).split(" ");
            for (String parallelCircuit : parallelCircuits) {
                circuit.connectDevices(parallelCircuit);
            }
        } else if (command.startsWith("#")) {
            // Process device control commands
            char action = command.charAt(1);
            String deviceId = command.substring(2, 4);
            Device device = circuit.getDevices().stream().filter(d -> d.getId().equals(deviceId)).findFirst().orElse(null);
            
            if (device != null) {
                switch (action) {
                    case 'K':
                        ((ControlDevice) device).toggleState();
                        break;
                    case 'F':
                        if (command.charAt(4) == '+') {
                            int currentVoltage = device.getPin2Voltage();
                            int newVoltage = (currentVoltage + 1) % 4;
                            device.setPin2Voltage(newVoltage);
                        } else if (command.charAt(4) == '-') {
                            int currentVoltage = device.getPin2Voltage();
                            int newVoltage = (currentVoltage - 1) % 4;
                            if (newVoltage < 0) {
                                newVoltage = 3; // Roll over to highest setting
                            }
                            device.setPin2Voltage(newVoltage);
                        }
                        break;
                    case 'L':
                        String[] parts = command.split(":");
                        double newSetting = Double.parseDouble(parts[1]);
                        int newVoltage = (int) Math.round(newSetting * device.getPin1Voltage());
                        device.setPin2Voltage(newVoltage);
                        break;
                    case 'H':
                        ((ControlDevice) device).toggleState();
                        break;
                    default:
                        break;
                }
            }
        }
    }
}

第二題題目:

智慧家居是在當下家庭中越來越流行的一種配置方案,它透過物聯網技術將家中的各種裝置(如音影片裝置、照明系統、窗簾控制、空調控制、安防系統、數字影院系統、影音伺服器、影櫃系統、網路家電等)連線到一起,提供家電控制、照明控制、電話遠端控制、室內外遙控、防盜報警、環境監測、暖通控制、紅外轉發以及可程式設計定時控制等多種功能和手段。與普通家居相比,智慧家居不僅具有傳統的居住功能,兼備建築、網路通訊、資訊家電、裝置自動化,提供全方位的資訊互動功能。請根據如下要去設計一個智慧家居強電電路模擬系統。以下題目介紹中加粗的部分為本次迭代在“家居強電電路模擬程式-3”的基礎上增加的功能要求。

1、控制裝置
本題模擬的控制裝置包括:開關、分檔調速器、連續調速器、互斥開關。

開關:包括0和1兩種狀態。

開關有兩個引腳,任意一個引腳都可以是輸入引腳(接往電源端),而另一個則是輸出引腳(接網接地端)。開關狀態為0時,無論輸入電位是多少,輸出引腳電位為0。當開關狀態為1時,輸出引腳電位等於輸入電位。
互斥開關:

互斥開關有3個引腳:1個是彙總引腳,另兩個是分支引腳。

開關電路示意圖如圖1所示,左邊是彙總引腳,編號為1;右邊兩個是分支引腳,右上的輸出引腳為2,右下輸出引腳為3。圖中1、2、3引腳均可以是輸入引腳,當1為輸入引腳時,2、3引腳為輸出引腳;1為輸出引腳時,2、3引腳為輸入引腳。
互斥開關只有兩種狀態:開關接往上面的2號引腳、接往下面的3號引腳。開關每次只能接通其中一個分支引腳,而另一個分支引腳處於斷開狀態。
互斥開關的預設狀態為1、2引腳接通,1、3引腳斷開。
圖1中所示的互斥開關可以反過來接入電路,即彙總引腳接往接地端,兩個分支引腳接往電源端。

image.png

圖1 互斥開關

為避免短路,互斥開關設定了限流電阻,1、2引腳之間預設電阻為5,1、3引腳之間預設電阻為10。

分檔調速器

按檔位調整,常見的有3檔、4檔、5檔調速器,檔位值從0檔-2(3/4)檔變化。本次迭代模擬4檔調速器,每個檔位的輸出電位分別為0、0.3、0.6、0.9倍的輸入電壓。
連續調速器

沒有固定檔位,按位置比例得到檔位引數,數值範圍在[0.00-1.00]之間,含兩位小數。輸出電位為檔位引數乘以輸入電壓。
所有調速器都有兩個引腳,一個固定的輸入(引腳編號為1)、一個輸出引腳(引腳編號為2)。當輸入電位為0時,輸出引腳輸出的電位固定為0,不受各類開關調節的影響。

開關、調速器的初始狀態/檔位為0。

開關的兩個引腳編號為1、2。
除互斥開關外,其他控制裝置的電阻為 0。

2、受控裝置
本題模擬的受控裝置包括:燈、風扇。兩種裝置都有兩根引腳,透過兩根引腳電壓的電壓差驅動裝置工作。

燈有兩種工作狀態:亮、滅。在亮的狀態下,有的燈會因引腳電位差的不同亮度會有區別。
風扇在接電後有兩種工作狀態:停止、轉動。風扇的轉速會因引腳間電位差的不同而有區別。
本次迭代模擬兩種燈具。

白熾燈:

亮度在0~200lux(流明)之間。
電位差為0-9V時亮度為0,其他電位差按比例,電位差10V對應50ux,220V對應200lux,其他電位差與對應亮度值成正比。白熾燈超過220V。
日光燈:

亮度為180lux。
只有兩種狀態,電位差為0時,亮度為0,電位差不為0,亮度為180。
本次迭代模擬兩種風扇。

吊扇:

工作電壓區間為80V-150V,對應轉速區間為80-360轉/分鐘。80V對應轉速為80轉/分鐘,150V對應轉速為360轉/分鐘,超過150V轉速為360轉/分鐘(本次迭代暫不考慮電壓超標的異常情況)。其他電壓值與轉速成正比,輸入輸出電位差小於80V時轉速為0。
落地扇:

工作電壓區間為 80V-150V,對應轉速區間為 80-360 轉/分鐘;[80V,100V) 對應轉速為 80 轉/分鐘;[100,120)V 對應轉速為 160 轉/分鐘;[120,140)V 對應轉速為 260 轉/分鐘;大於等於 140V 轉速 為 360 轉/分鐘(本次迭代暫不考慮電壓超標的異常情況)。

本次迭代模擬一種受控窗簾:

受控串聯的電路符號為S,其最低工作電壓為50V,電壓達到或超過50V,窗簾即可正常工作,不考慮室外光照強度和室內空間大小等因素,窗簾受室內燈光的光照強度控制。
當電路中所有燈光的光照強度總和在[0,50)lux範圍內,窗簾全開;
在[50,100)lux範圍內,窗簾開啟比例為0.8;
在[100,200)lux範圍內,窗簾開啟比例為0.6;
在[200,300)lux範圍內,窗簾開啟比例為0.4;
在[300,400)lux範圍內,窗簾開啟比例為0.2;
在400lux及以上範圍內,窗簾關閉。
當電壓低於50V,窗簾不工作,預設為全開狀態。
如果電路中沒有燈或者燈全部關閉,光照強度為0,窗簾處於全開狀態。
受控裝置電阻:白熾燈的電阻為 10,日光燈的電阻為 5,吊扇的電阻為 20,落地扇的電阻為 20,窗簾電阻為15。

3、輸入資訊
1)輸入裝置資訊

分別用裝置識別符號K、F、L、B、R、D、A、H、S、P分別表示開關、分檔調速器、連續調速器、白熾燈、日光燈、吊扇、落地扇、互斥開關、受控窗簾、二極體(見第6部分說明)。

裝置標識用識別符號+編號表示,如K1、F3、L2等。

引腳格式:
裝置標識-引腳編號,例如:K1-1標識編號為1的開關的1號引腳。
開關、分檔調速器、連續調速器的兩個引腳編號為1、2。
受控裝置的兩個引腳編號分別為1、2。
互斥開關的引腳編號已經在互斥開關的介紹部分說明。

約束條件:
不同裝置的編號可以相同。
裝置資訊不單獨輸入,包含在連線資訊中。

2)輸入連線資訊

一條連線資訊佔一行,用[]表示一組連線在一起的裝置引腳,引腳與引腳之間用英文空格" "分隔。

格式:
"["+引腳號+" "+引腳號+"]"
例如:[K1-1 K3-2]表示K1的1號引腳,K3的2號引腳連線在一起。

約束條件:
不考慮調速器串聯到其他調速器的情況。
考慮各類裝置的並聯接入。例如,K1 的輸出接到 L2 的輸入,L2 的輸出再接其他裝置屬於串聯接線。K1 的輸出接到 L2 的輸出,同時 K1 的輸入接到 L2 的輸入,這種情況屬於並聯。

連線資訊不單獨輸入,包含線上路資訊中。

3)輸入控制裝置調節資訊

開關、互斥開關調節資訊格式:

                 #+裝置標識K+裝置編號,例如:#K2,代表切換K2開關的狀態。
                 #+裝置標識H+裝置編號,例如:#H2,代表切換H2互斥開關的狀態。

分檔調速器的調節資訊格式:

                 #+裝置標識F+裝置編號+"+" 代表加一檔,例如:#F3+,代表F3輸出加一檔。
                 #+裝置標識F+裝置編號+"-" 代表減一檔,例如:#F1-,代表F1輸出減一檔。

連續調速器的調節資訊格式:

                 #+裝置標識L+裝置編號+":" +數值 代表將連續調速器的檔位設定到對應數值,例如:#L3:0.6,代表L3輸出檔位引數0.6。

4)電源接地標識:

VCC,電壓220V,GND,電壓0V。沒有接線的引腳預設接地,電壓為0V。

5)輸入串聯電路資訊

一條串聯電路佔一行,串聯電路資訊由 n 個連線資訊組成,連線資訊按從靠電源端到接地端順序依次輸入,連線資訊之間用英文空格" "分隔。

串聯電路資訊格式:
"#T"+電路編號+":"+連線資訊+" "+連線資訊+...+" "+連線資訊
例如:#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT] 一個串聯電路的第一個引腳是 IN,代表起始端,靠電源。最後一個引腳是 OUT,代表結尾端, 靠接地。

約束條件:
不同的串聯電路資訊編號不同。
輸入的最後一條電路資訊必定是總電路資訊,總電路資訊的起始引腳是 VCC,結束引腳是 GND。
連線資訊中的引腳可能是一條串聯或並聯電路的 IN 或者 OUT。例如:
#T1:[IN K1-1] [K1-2 T2-IN] [T2-OUT OUT]
#T1:[IN K1-1] [K1-2 T2-IN] [T2-OUT M2-IN] [M2-OUT OUT]

6)輸入並聯電路資訊

一條並聯電路佔一行,並聯電路由其包含的幾條串聯電路組成,串聯電路標識之間用英文空格" "分隔。

格式:

"#M"+電路編號+":"+”[”+串聯電路資訊+" "+....+" "+串聯電路資訊+”]”
例如:#M1:[T1 T2 T3]
該例宣告瞭一個並聯電路,由 T1、T2、T3 三條串聯電路並聯而成,三條串聯電路的 IN 短接在一起構成 M1 的 IN,三條串聯電路的 OUT 短接在一起構成 M1 的 OUT。
在本題中,並聯電路M中的串聯電路可以包含別的並聯電路。

約束條件:

本題不考慮輸入電壓或電壓差超過220V的情況。
輸入資訊以end為結束標誌,忽略end之後的輸入資訊。
本題中的並聯資訊所包含的串聯電路的資訊都在並聯資訊之前輸入,不考慮亂序輸入的情況。
只要不因短路而造成無窮大的電流燒壞電路(如電路中的部分短接),都是合理情況。
本次迭代考慮多個並聯電路串聯在一起的情況。
本題考慮一條串聯電路中包含其他串聯電路和並聯電路的情況。例如:
#T3:[VCC K1-1] [K1-2 T2-IN] [T2-OUT K2-1] [K2-2 T1-IN] [T1-OUT GND]
本例中T1\T2兩條串聯電路是T3的一個部分,本題考慮這種型別的輸入。
4、輸出資訊:
按開關、分檔調速器、連續調速器、白熾燈、日光燈、吊扇、互斥開關、受控窗簾、二極體(見第6部分說明)的順序依次輸出所有裝置的狀態或引數。每個裝置一行。同類裝置按編號順序從小到大輸出。

輸出格式:
@裝置標識+裝置編號+":" +裝置引數值(控制開關的檔位或狀態、燈的亮度、風扇的轉速,只輸出值,不輸出單位)+" "+裝置所有引腳的電壓(按編號從小到大順序依次輸出,電壓的小數部分直接丟棄,保留整數輸出,電壓之間用”-”分隔)

說明:
連續調速器的檔位資訊保留兩位小數,即使小數為0,依然顯示兩位小數.00。
開關狀態為0(開啟)時顯示turned on,狀態為1(合上)時顯示closed
如:
@K1:turned on 32-15
@B1:190 68-17
@L1:0.60 220-176
互斥開關按1、2引腳的接通狀態顯示,1,2接通-1,3斷開時顯示closed,1,3接通-1,2斷開時顯示turned on。
如:
@H1:turned on
受控窗簾顯示窗簾開啟的百分比,如:
@S1:80%

5、家居電路模擬系列所有題目的預設規則
1)當計算電壓值等數值的過程中,最終結果出現小數時,用截尾規則去掉小數部分,只保留整數部分。為避免精度的誤差,所有有可能出現小數的數值用double型別儲存並計算,不要作下轉型資料型別轉換,例如電壓、轉速、亮度等,只有在最後輸出時再把計算結果按截尾規則,捨棄尾數,保留整數輸出。

2)所有連線資訊按電路從靠電源端到靠接地端的順序依次輸入,不會出現錯位的情況。VCC/IN一定是第一個連線的第一項,GND/OUT一定是最後一個連線的後一項。

3)連線資訊如果只包含兩個引腳,靠電源端的引腳在前,靠接地端的在後。

4)調速器的輸入端只會直連VCC,不會接其他裝置。整個電路最多隻有連線在電源上的一個調速器,且不包含在並聯單路中。

5)本系列題目中元件的管腳除了互斥開關的1引腳,其他所有引腳在電路中最多隻出現一次。

6、本題新增內容:
1)增加管腳電壓的顯示

在輸出每個電器的狀態資訊後,再依次輸出該電器每個管腳的電壓。(格式詳見輸出資訊部分)

2)電流限制

電器在工作時,過大的電流會引起電器過熱,從而燒壞電路。本次迭代,每個元器件都有最大電流的設定,當實時電流超過最大電流時,在該電器輸出資訊的最後加入提示“exceeding current limit error”,與前面的資訊之間用英文空格分隔。

例如:@B1:190 68-17 exceeding current limit error

本題各類電器的最大限定電流如下:

開關20、分檔調速器18、連續調速器18、白熾燈9、日光燈5、吊扇12、落地扇14、互斥開關20、受控窗簾12、二極體8。

3)短路檢測

如果電路出現無窮大的電流造成短路,所有元器件資訊不輸出,僅輸出提示“short circuit error”

4)並聯電路中包含並聯

本次迭代考慮並聯電路中包含並聯電路的情況,即構成並聯電路的串聯電路可以包含別的並聯電路。例如如下輸入的電路,並聯電路M2的其中一條串聯電路T4中包含了另一條並聯電路M1:

                 #T1:[IN D2-1] [D2-2 H1-2] [H1-1 OUT]

                 #T2:[IN D1-1] [D1-2 H1-3] [H1-1 OUT]

                 #M1:[T1 T2]

                 #T4:[IN K3-1] [K3-2 M1-IN] [M1-OUT OUT]

                 #T5:[IN K1-1] [K1-2 B1-1] [B1-2 OUT]

                 #M2:[T4 T5]

5)二極體

增加二極體元件,其電路特性為:正向導通,反向截止;其電器符號如圖4所示,當電流從左至右流過時,二極體導通”conduction”,電阻為0;電流從右至左流動時,二極體截止”cutoff”,電阻無窮大,相當於開關開啟。

image.png

圖2 二極體符號

二極體的識別符號為’P’,左側管腳編號為1,右側管腳編號為2。

二極體如果兩端電壓相等,沒有電流流過,分以下兩種情況輸出:

1、如果兩端電壓為0,二極體的導通/截止狀態由接入方向決定,1號引腳靠近電源則狀態為導通,反之為截止。
2、如果兩端電壓不為0,二極體導通。

7、設計建議
本題包含以下電路圖中的所有連線情況:

image.png

圖3 電路示意圖

1、電路裝置類:描述所有電路裝置的公共特徵。

2、受控裝置類、控制裝置類:對應受控、控制裝置

3、串聯電路類:一條由多個電路裝置構成的串聯電路,也看成是一個獨立的電路裝置

4、並聯電路類:繼承電路裝置類,也看成是一個獨立的電路裝置

其他類以及類的屬性、方法自行設計。

image.png
題目分析
為設計智慧家居強電電路模擬系統,我們需要考慮以下幾個主要部分:

裝置模擬
控制裝置:
開關:控制電路中的連線通斷,根據狀態決定輸出電壓。
互斥開關:具有兩個分支,每次只能連線一個分支,可以反向接入。
分檔調速器:固定幾個檔位的輸出電壓比例。
連續調速器:根據輸入的引數值,輸出相應比例的電壓。
受控裝置:
白熾燈:根據電壓差輸出不同亮度的光。
日光燈:只有開和關兩種狀態,亮度為固定值。
吊扇和落地扇:根據電壓差輸出不同的轉速。
受控窗簾:根據光照強度控制開合程度。
輸入資訊
裝置資訊:各種控制和受控裝置的識別符號、引腳資訊及初始狀態。
連線資訊:描述裝置之間的連線關係,包括串聯和並聯。
控制資訊:調節開關、調速器和互斥開關的操作指令。
輸出資訊
對控制裝置和受控裝置進行操作後的最終狀態輸出,如燈的亮度、風扇的轉速、窗簾的開合狀態等。
設計思路
裝置模擬類:

每種裝置都有相應的類來模擬其功能和狀態變化。
使用繼承和多型來管理不同型別裝置的特定行為,例如控制開關狀態、調節檔位和計算輸出電壓等。
連線管理:

使用連線資訊構建電路圖,處理串聯和並聯的複雜連線關係。
確保電路的合法性,避免短路和超出電壓範圍的情況。
操作處理:

解析控制資訊,執行相應裝置的狀態變化和輸出計算。
根據輸入資訊對裝置進行初始化設定,並按照控制資訊依次調節和輸出最終結果。
輸出處理:

根據裝置的最終狀態輸出所需的資訊,包括燈光亮度、風扇轉速和窗簾開合狀態等。
透過以上設計思路,可以實現一個完整的智慧家居強電電路模擬系統,能夠模擬各種複雜的控制和受控裝置之間的互動和狀態變化,為智慧家居系統的設計和最佳化提供有效的模擬和除錯工具。
程式碼設計思路
這個Java程式碼示例的設計思路如下:

裝置型別列舉 DeviceType
在這個列舉中列出了各種可能的裝置型別,包括開關、調速器、燈、風扇、窗簾等。每種裝置型別對應一個列舉值,以便在程式中統一管理和識別不同型別的裝置。

裝置介面 Device
裝置介面定義了所有裝置類必須實現的方法:

void setPower(int power): 設定裝置的輸入電位差,不同裝置可以根據具體需求處理這個輸入電位差。
void toggleState(): 切換裝置的狀態,例如開關類裝置切換開關狀態。
具體裝置類的實現
每種裝置型別都有對應的類來實現 Device 介面,每個類負責處理自己特定型別裝置的功能:

開關 (Switch): 控制電路的開閉狀態,根據狀態輸出相應的電流。
分檔調速器 (StepSpeedController): 提供多檔位的輸出電位差,可以切換不同的檔位來調節輸出。
連續調速器 (ContinuousSpeedController): 提供連續範圍內的輸出電位差,可以根據需要設定具體的位置引數。
燈 (Bulb): 控制燈的開關狀態,根據燈的狀態輸出對應的亮度。
風扇 (Fan): 控制風扇的開關狀態,根據風扇的狀態輸出對應的轉速。
窗簾 (Curtain): 控制窗簾的開合程度,根據具體需求設定開啟程度。
主函式 main
主函式負責程式的入口和整體流程控制:

建立一個 Scanner 物件用於讀取輸入資訊。
使用 HashMap 儲存裝置物件,其中鍵為裝置的唯一識別符號,值為對應的裝置物件。
迴圈讀取輸入資訊,根據輸入資訊的不同型別(串聯電路、並聯電路、控制命令、連線資訊),呼叫相應的方法進行處理。
每種輸入型別對應一個處理方法,例如 processSeriesCircuit 處理串聯電路資訊,processControlInfo 處理裝置控制命令等。
在處理連線資訊時,呼叫 connectDevices 方法來連線兩個裝置。
裝置連線和控制邏輯
連線邏輯: 在 connectDevices 方法中,根據裝置的唯一識別符號從 HashMap 中獲取相應的裝置物件,然後進行連線。這裡的連線可以是物理連線(如電纜連線)或邏輯連線(如設定關聯的操作)。
控制邏輯: 在 processControlInfo 方法中,根據控制命令執行相應的操作,如切換裝置狀態或設定裝置的輸入電位差。
設計思路總結
這個程式碼示例採用物件導向的設計思路,將不同型別的裝置抽象為介面和具體實現類,並透過列舉型別統一管理裝置型別。主函式負責整體流程控制和輸入資訊的解析處理,透過方法之間的呼叫實現裝置的連線和控制邏輯。這種設計使得程式結構清晰,易於擴充套件和維護,同時充分利用了物件導向的封裝、繼承和多型特性。
程式碼展示:

點選檢視程式碼
import java.util.*;

public class SmartHomeSimulation {

    // 裝置型別列舉
    enum DeviceType {
        SWITCH,
        STEP_SPEED_CONTROLLER,
        CONTINUOUS_SPEED_CONTROLLER,
        BULB,
        FLUORESCENT_LAMP,
        CEILING_FAN,
        STAND_FAN,
        MUTEX_SWITCH,
        CURTAIN,
        DIODE
    }

    // 裝置介面
    interface Device {
        void setPower(int power); // 設定輸入電位差
        void toggleState(); // 切換狀態
    }

    // 開關類
    static class Switch implements Device {
        private int state; // 0 for off, 1 for on

        public Switch() {
            this.state = 0; // 預設關閉
        }

        @Override
        public void setPower(int power) {
            if (state == 1) {
                System.out.println("Output power: " + power);
            } else {
                System.out.println("Output power: 0");
            }
        }

        @Override
        public void toggleState() {
            state = 1 - state; // 切換狀態
        }
    }

    // 分檔調速器類
    static class StepSpeedController implements Device {
        private int state; // 當前檔位索引
        private final double[] speeds = {0.0, 0.3, 0.6, 0.9}; // 檔位對應輸出電位

        public StepSpeedController() {
            this.state = 0; // 預設為0檔
        }

        @Override
        public void setPower(int power) {
            System.out.println("Output power: " + speeds[state] * power);
        }

        @Override
        public void toggleState() {
            state = (state + 1) % speeds.length; // 切換到下一個檔位
        }
    }

    // 連續調速器類
    static class ContinuousSpeedController implements Device {
        private double position; // 檔位引數,範圍[0.0, 1.0]

        public ContinuousSpeedController() {
            this.position = 0.0; // 預設位置
        }

        @Override
        public void setPower(int power) {
            System.out.println("Output power: " + position * power);
        }

        @Override
        public void toggleState() {
            // 在實際情況下可能會有更復雜的控制邏輯,這裡簡化為設定檔位引數
            this.position = Math.random(); // 隨機設定位置引數
        }
    }

    // 燈類
    static class Bulb implements Device {
        private boolean isOn; // 燈狀態,true為亮,false為滅

        public Bulb() {
            this.isOn = false; // 預設滅
        }

        @Override
        public void setPower(int power) {
            if (isOn) {
                // 根據電位差計算亮度
                int brightness = power * 10; // 假設的亮度計算,實際情況根據具體需求修改
                System.out.println("Brightness: " + brightness);
            } else {
                System.out.println("Brightness: 0");
            }
        }

        @Override
        public void toggleState() {
            isOn = !isOn; // 切換燈狀態
        }
    }

    // 風扇類
    static class Fan implements Device {
        private boolean isRunning; // 風扇執行狀態,true為執行,false為停止

        public Fan() {
            this.isRunning = false; // 預設停止
        }

        @Override
        public void setPower(int power) {
            if (isRunning) {
                // 根據電位差計算轉速
                int speed = power / 10; // 假設的轉速計算,實際情況根據具體需求修改
                System.out.println("Fan speed: " + speed);
            } else {
                System.out.println("Fan speed: 0");
            }
        }

        @Override
        public void toggleState() {
            isRunning = !isRunning; // 切換風扇狀態
        }
    }

    // 受控窗簾類
    static class Curtain implements Device {
        private double openness; // 窗簾開啟比例

        public Curtain() {
            this.openness = 1.0; // 預設全開
        }

        @Override
        public void setPower(int power) {
            // 根據電路中的燈光光照強度計算窗簾開啟程度
            // 這裡簡化為直接輸出當前開啟程度
            System.out.println("Curtain openness: " + openness);
        }

        @Override
        public void toggleState() {
            // 實際情況可能需要根據燈光光照強度計算開啟程度
            openness = Math.random(); // 隨機設定開啟程度
        }
    }

    // 互斥開關類
    static class MutexSwitch implements Device {
        private boolean state; // 開關狀態,true為接通上面分支引腳,false為接通下面分支引腳

        public MutexSwitch() {
            this.state = true; // 預設接通上面分支
        }

        @Override
        public void setPower(int power) {
            int resistance1 = 5; // 引腳1-2預設電阻
            int resistance2 = 10; // 引腳1-3預設電阻
            if (state) {
                System.out.println("Output power between pin 1 and pin 2: " + (power / resistance1));
            } else {
                System.out.println("Output power between pin 1 and pin 3: " + (power / resistance2));
            }
        }

        @Override
        public void toggleState() {
            state = !state; // 切換開關狀態
        }
    }

    // 主方法
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 裝置儲存
        Map<String, Device> devices = new HashMap<>();

        // 處理輸入資訊
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine().trim();
            if (line.equals("end")) {
                break; // 結束輸入
            }

            if (line.startsWith("#")) {
                // 串聯電路或並聯電路資訊
                if (line.startsWith("#T")) {
                    // 處理串聯電路
                    processSeriesCircuit(line, devices);
                } else if (line.startsWith("#M")) {
                    // 處理並聯電路
                    processParallelCircuit(line, devices);
                }
            } else if (line.startsWith("#")) {
                // 控制裝置調節資訊
                processControlInfo(line, devices);
            } else {
                // 連線資訊
                processConnection(line, devices);
            }
        }

        scanner.close();
    }

    // 處理串聯電路資訊
    private static void processSeriesCircuit(String line, Map<String, Device> devices) {
        String[] parts = line.split(":");
        String circuitID = parts[0].substring(2).trim(); // 電路編號
        String[] connections = parts[1].substring(1, parts[1].length() - 1).trim().split("\\s+");

        for (int i = 0; i < connections.length - 1; i++) {
            String[] conns = connections[i].substring(1, connections[i].length() - 1).trim().split("\\s+");
            String start = conns[0].trim();
            String end = conns[1].trim();
            connectDevices(start, end, devices);
        }

        // 最後一個連線資訊處理
        String[] lastConn = connections[connections.length - 1].substring(1, connections[connections.length - 1].length() - 1).trim().split("\\s+");
        String start = lastConn[0].trim();
        String end = lastConn[1].trim();
        connectDevices(start, end, devices);

        System.out.println("Processed series circuit: " + circuitID);
    }

    // 處理並聯電路資訊
    private static void processParallelCircuit(String line, Map<String, Device> devices) {
        String[] parts = line.split(":");
        String circuitID = parts[0].substring(2).trim(); // 電路編號
        String[] circuits = parts[1].substring(1, parts[1].length() - 1).trim().split("\\s+");

        for (String circuit : circuits) {
            String[] conns = circuit.substring(1, circuit.length() - 1).trim().split("\\s+");
            String start = conns[0].trim();
            String end = conns[1].trim();
            connectDevices(start, end, devices);
        }

        System.out.println("Processed parallel circuit: " + circuitID);
    }

    // 處理控制裝置資訊
    private static void processControlInfo(String line, Map<String, Device> devices) {
        String[] parts = line.split(":");
        String deviceID = parts[0].substring(1).trim(); // 裝置編號
        String command = parts[1].trim(); // 控制命令

        Device device = devices.get(deviceID);
        if (device != null) {
            switch (command) {
                case "toggle":
                    device.toggleState();
                    break;
                case "setPower":
                    int power = Integer.parseInt(parts[2].trim());
                    device.setPower(power);
                    break;
                default:
                    System.out.println("Unknown command for device: " + deviceID);
                    break;
            }
        } else {
            System.out.println("Device not found: " + deviceID);
        }
    }

    // 處理連線資訊
    private static void processConnection(String line, Map<String, Device> devices) {
        String[] parts = line.split("->");
        String start = parts[0].trim(); // 起始裝置
        String end = parts[1].trim(); // 終端裝置

        connectDevices(start, end, devices);
    }

    // 連線裝置
    private static void connectDevices(String start, String end, Map<String, Device> devices) {
        Device device1 = devices.get(start);
        Device device2 = devices.get(end);

        if (device1 != null && device2 != null) {
            System.out.println("Connected: " + start + " -> " + end);
            // 在實際情況下,可以執行裝置之間的物理連線或邏輯連線操作
        } else {
            System.out.println("Device not found for connection: " + start + " -> " + end);
        }
    }
}

類圖展示

相關文章