题目集7~8的总结性Blog

前言
题目集7重点考查了类与对象的设计能力、继承与多态的运用、封装的实现、组合与关联关系的建模,以及抽象类的设计和实现具体逻辑的能力。同时考查了递归解析复杂嵌套结构的能力、模块化设计的实践以及对动态扩展性的把握。题量较少,只有一道题。但是总体的难度较大。
题目集8考查了面向对象的抽象与设计能力,包括类的设计与实现、继承与多态的应用、封装和组合的使用,以及复杂电路结构的建模与递归解析能力。重点包括如何抽象设备的通用特性为基类,针对不同设备类型实现多态行为;如何通过继承和组合表达串联电路、并联电路及嵌套电路的复杂关系;以及处理新增设备(如二极管)的特性,扩展系统功能,同时需要综合考虑电流限制、短路检测等物理约束,实现模块化设计与灵活扩展。题量只有一题,但是难度很大。

设计与分析
题目集7

  1. Switch 类
    功能:
    模拟一个普通的开关设备,控制电路的通断状态。开关有两种状态:turned on(打开)和 closed(闭合)。根据状态决定输出电压。
    属性:
    private int state = 0;表示开关的状态,0 表示打开(turned on),1 表示闭合(closed)。
    private double inputVoltage = 0;开关的输入电压。
    private double outputVoltage = 0;开关的输出电压,取决于开关状态和输入电压。
    private final int resistance = 0;开关的电阻,默认为0(互斥开关除外)。
    方法:
    public void toggle()
    切换开关状态(从0到1或从1到0),并更新输出电压。
    public boolean isClosed()
    判断开关是否处于闭合状态(state == 1)。
    public void setInputVoltage(double inputVoltage)
    设置输入电压,并根据当前状态更新输出电压。
    public double getOutputVoltage()
    获取当前的输出电压。
    private void updateOutput()
    根据开关状态更新输出电压。如果状态为1,输出电压等于输入电压;否则,输出电压为0。
    public String getStateString()
    返回开关状态的字符串表示,"turned on" 或 "closed"。
    public int getDeviceResistance()
    返回开关的电阻值。

  2. SteppedController 类
    功能:
    模拟分档调速器,允许用户在离散档位间调节输出电压。每个档位对应不同的电压比例。
    属性:
    private int level = 0;
    当前档位,范围从0到3。
    private static final int MAX_LEVEL = 3;
    最大档位数。
    private static final double[] LEVEL_RATIOS = {0.0, 0.3, 0.6, 0.9};
    每个档位对应的电压比例。
    private double inputVoltage = 0;
    输入电压。
    private double outputVoltage = 0;
    输出电压,根据当前档位和输入电压计算得出。
    private final int resistance = 0;
    分档调速器的电阻,默认为0。
    方法:
    public int getDeviceResistance()
    返回分档调速器的电阻值。
    public void setInputVoltage(double inputVoltage)
    设置输入电压,并更新输出电压。
    public double getLevelRatios()
    获取当前档位对应的电压比例。
    public void updateOutput()
    根据当前档位和输入电压计算输出电压。
    public void increaseLevel()
    增加档位,最大不超过MAX_LEVEL,并更新输出电压。
    public void decreaseLevel()
    减少档位,最小不低于0,並更新输出电压。
    public int getLevel()
    获取当前档位。
    public double getOutputVoltage()
    获取当前输出电压。

  3. ContinuousController 类
    功能:
    模拟连续调速器,允许用户根据比例精确调节输出电压,档位参数为0.00到1.00之间的小数。
    属性:
    private double level = 0.0;
    当前档位比例,范围[0.00, 1.00]。
    private double inputVoltage = 0;
    输入电压。
    private double outputVoltage = 0;
    输出电压,根据档位比例和输入电压计算得出。
    private final int resistance = 0;
    连续调速器的电阻,默认为0。
    方法:
    public int getDeviceResistance()
    返回连续调速器的电阻值。
    public void setInputVoltage(double inputVoltage)
    设置输入电压,并更新输出电压。
    public double getLevel()
    获取当前档位比例。
    public void updateOutput()
    根据档位比例和输入电压计算输出电压。
    public void setLevel(double level)
    设置档位比例,确保在[0.00, 1.00]范围内,并更新输出电压。
    public String getFormattedLevel()
    获取格式化后的档位比例(保留两位小数)。
    public double getOutputVoltage()
    获取当前输出电压。

  4. IncandescentLamp 类
    功能:
    模拟白炽灯设备,亮度取决于电压差。电压差低于10V时亮度为0,电压差在10V到220V之间按比例增加,超过220V时亮度保持在200lux。
    属性:
    private double brightness = 0;
    灯的亮度,范围0到200lux。
    private final int resistance = 10;
    白炽灯的电阻,固定为10。
    方法:
    public void setVoltageDifference(double voltageDiff)
    设置电压差,根据电压差计算亮度:
    电压差 < 10V,亮度 = 0。
    10V ≤ 电压差 ≤ 220V,亮度按比例计算。
    电压差 > 220V,亮度 = 200lux。
    public int getBrightness()
    获取当前亮度值,取整。
    public int getDeviceResistance()
    返回白炽灯的电阻值。

  5. FluorescentLamp 类
    功能:
    模拟日光灯设备,亮度固定为180lux。当电压差为0时,亮度为0;电压差不为0时,亮度为180lux。
    属性:
    private int brightness = 0;
    亮度,0或180lux。
    private final int resistance = 5;
    日光灯的电阻,固定为5。
    方法:
    public void setVoltageDifference(double voltageDiff)
    设置电压差,根据电压差计算亮度:
    电压差 = 0V,亮度 = 0。
    电压差 ≠ 0V,亮度 = 180lux。
    public int getBrightness()
    获取当前亮度值。
    public int getDeviceResistance()
    返回日光灯的电阻值。

  6. CeilingFan 类
    功能:
    模拟吊扇设备,根据电压差计算转速。电压差低于80V时转速为0,80V到150V之间按比例计算,超过150V时转速保持在360转/分钟。
    属性:
    private double voltageDifference;
    输入电压差。
    private int speed;
    当前转速,范围0到360转/分钟。
    private final int resistance = 20;
    吊扇的电阻,固定为20。
    方法:
    public void setVoltageDifference(double voltage)
    设置电压差,并调用updateState()更新转速。
    private void updateState()
    根据电压差更新转速:
    电压差 < 80V,转速 = 0。
    80V ≤ 电压差 ≤ 150V,转速按线性比例计算。
    电压差 > 150V,转速 = 360转/分钟。
    public int getSpeed()
    获取当前转速。
    public int getDeviceResistance()
    返回吊扇的电阻值。

  7. FloorFan 类
    功能:
    模拟落地扇设备,根据电压差计算转速。电压差低于80V时转速为0,80V到100V对应80转/分钟,100V到120V对应160转/分钟,120V到140V对应260转/分钟,≥140V对应360转/分钟。
    属性:
    private double voltageDifference;
    输入电压差。
    private int speed;
    当前转速,范围0到360转/分钟。
    private final int resistance = 20;
    落地扇的电阻,固定为20。
    方法:
    public void setVoltageDifference(double voltage)
    设置电压差,并调用updateState()更新转速。
    private void updateState()
    根据电压差更新转速:
    电压差 < 80V,转速 = 0。
    80V ≤ 电压差 < 100V,转速 = 80转/分钟。
    100V ≤ 电压差 < 120V,转速 = 160转/分钟。
    120V ≤ 电压差 < 140V,转速 = 260转/分钟。
    电压差 ≥ 140V,转速 = 360转/分钟。
    public int getSpeed()
    获取当前转速。
    public int getDeviceResistance()
    返回落地扇的电阻值。

  8. MutexSwitch 类
    功能:
    模拟互斥开关,控制两个分支之间的连接状态。互斥开关有三个引脚:1(汇总引脚)、2和3(分支引脚)。开关在每次只能连接一个分支引脚,另一个分支断开。
    属性:
    private int state = 0;
    互斥开关的状态,0 表示连接1-2,引脚3断开;1 表示连接1-3,引脚2断开。
    private double inputVoltage = 0;
    输入电压。
    private double outputVoltage2 = 0;
    输出到引脚2的电压。
    private double outputVoltage3 = 0;
    输出到引脚3的电压。
    private final int resistance12 = 5;
    引脚1-2之间的电阻,固定为5。
    private final int resistance13 = 10;
    引脚1-3之间的电阻,固定为10。
    方法:
    public int getResistance12()
    获取引脚1-2之间的电阻值。
    public int getResistance13()
    获取引脚1-3之间的电阻值。
    public boolean isPathConnected(int pin)
    检查指定引脚(2或3)是否与汇总引脚1连接,依据当前状态。
    public void setInputVoltage(double voltage, int pin)
    设置输入电压,并根据状态更新输出电压。
    private void updateOutput()
    根据当前状态和输入电压,更新输出电压到引脚2或3。
    状态0:连接1-2,引脚3断开。
    状态1:连接1-3,引脚2断开。
    private double getCurrent()
    计算当前通过开关的电流,根据连接状态和电阻。
    public void setState(int state)
    设置互斥开关的状态,0或1,并更新输出电压。
    public double getOutputVoltage(int pin)
    获取指定引脚(2或3)的输出电压。
    public String getStateString()
    返回互斥开关的状态字符串,固定为"closed"。
    public int getDeviceResistance()
    根据当前状态返回对应的电阻值(5或10)。

  9. ControlledCurtain 类
    功能:
    模拟受控窗帘设备,根据电压差和总光照强度调整窗帘的开合比例。电压差低于50V时,窗帘默认为全开;电压达到或超过50V时,根据光照强度调整开合比例。
    属性:
    private double voltageDifference = 0;
    电压差。
    private double lightIntensity = 0;
    总光照强度。
    private double openPercentage = 1.0;
    窗帘的开合比例,1.0表示全开,0.0表示全关。
    private final int resistance = 15;
    窗帘的电阻,固定为15。
    private final double MIN_OPERATING_VOLTAGE = 50.0;
    最低工作电压,固定为50V。
    方法:
    public void setVoltageDifference(double voltage)
    设置电压差,并调用updateState()更新窗帘状态。
    public void setLightIntensity(double intensity)
    设置总光照强度,并调用updateState()更新窗帘状态。
    private void updateState()
    根据电压差和光照强度更新窗帘的开合比例:
    电压差 < 50V,窗帘全开(openPercentage = 1.0)。
    电压差 ≥ 50V,根据光照强度:
    [0,50) lux,窗帘全开(1.0)。
    [50,100) lux,窗帘开合比例为0.8。
    [100,200) lux,窗帘开合比例为0.6。
    [200,300) lux,窗帘开合比例为0.4。
    [300,400) lux,窗帘开合比例为0.2。
    ≥400 lux,窗帘关闭(0.0)。
    public String getStateString()
    返回窗帘开合比例的字符串表示,例如"80%"。
    public int getDeviceResistance()
    返回窗帘的电阻值。
    public double getVoltageDifference()
    获取当前电压差。

  10. SeriesCircuit 类
    功能:
    模拟串联电路,包含多个设备的连接。串联电路视为一个独立的电路设备,管理其内部设备的连接和电压分布。
    属性:
    private List connections;
    串联电路内的连接关系列表,每个连接以字符串形式存储,例如"K1-1 K3-2"。
    private double inputVoltage = 0;
    串联电路的输入电压。
    private double outputVoltage = 0;
    串联电路的输出电压。
    构造方法:
    public SeriesCircuit(List connections)
    初始化串联电路的连接列表。
    方法:
    public void setInputVoltage(double inputVoltage)
    设置输入电压,并调用updateOutput()更新输出电压。
    private void updateOutput()
    更新输出电压为输入电压(逻辑待完善,根据电路实际情况应包含电压分配)。
    public double getOutputVoltage()
    获取输出电压。
    public List getConnections()
    获取串联电路内的连接关系列表。
    public String getStartPin()
    获取串联电路的起始引脚(第一个连接的输出引脚)。
    public String getEndPin()
    获取串联电路的终止引脚(最后一个连接的输入引脚)。

  11. ParallelCircuit 类
    功能:
    模拟并联电路,包含多个串联电路。并联电路视为一个独立的电路设备,管理其内部串联电路的连接和电压分布。
    属性:
    private List seriesCircuits;
    并联电路内包含的多个串联电路列表。
    private double inputVoltage = 0;
    并联电路的输入电压。
    private double outputVoltage = 0;
    并联电路的输出电压,根据内部串联电路的情况计算得出。
    构造方法:
    public ParallelCircuit(List seriesCircuits)
    初始化并联电路内的串联电路列表。
    方法:
    public List getSeriesCircuits()
    获取并联电路内的串联电路列表。
    public void setInputVoltage(double inputVoltage)
    设置并联电路的输入电压,并调用updateOutputVoltage()更新输出电压。
    private void updateOutputVoltage()
    遍历所有内部串联电路,设置其输入电压,并根据各串联电路的输出电压计算并联电路的输出电压(取最大值,逻辑需进一步完善)。
    public double getOutputVoltage()
    获取并联电路的输出电压。
    public String getStartPin()
    获取并联电路的起始引脚(第一个串联电路的起始引脚)。
    public String getEndPin()
    获取并联电路的终止引脚(第一个串联电路的终止引脚)。

  12. EndpointDevice 类
    功能:
    用于表示电路的起始端和终止端(IN和OUT),没有具体的属性和行为,只包含电阻属性。
    属性:
    private final int resistance = 0;
    电阻,默认为0。
    方法:
    public int getResistance()
    返回电阻值。

  13. ConnectionManager 类
    功能:
    管理所有设备、电路和连接关系,负责解析输入命令、建立电路模型、计算电路状态(电阻、电流、电压)、检测短路和超流等错误,并输出设备状态。
    属性:
    private Map<String, Object> devices = new HashMap<>();
    存储所有设备对象,键为设备标识符(如"K1"、"F3"等),值为相应设备对象。
    private Map<String, List> connections = new HashMap<>();
    存储所有连接关系,键为引脚标识符,值为连接到该引脚的其他引脚列表。
    private Map<String, SeriesCircuit> seriesCircuits = new HashMap<>();
    存储所有串联电路对象,键为电路编号(如"T1"),值为对应的SeriesCircuit对象。
    private Map<String, ParallelCircuit> parallelCircuits = new HashMap<>();
    存储所有并联电路对象,键为电路编号(如"M1"),值为对应的ParallelCircuit对象。
    private Map<String, List> seriesCircuitDevices = new HashMap<>();
    存储每个串联电路包含的设备列表,键为电路编号,值为设备引脚列表。
    构造方法:
    public ConnectionManager()
    初始化设备映射,将VCC(220V)和GND(0V)添加到设备列表中。
    方法:
    命令处理相关方法:
    public void processCommand(String command)
    处理输入命令,根据命令类型(串联电路、并联电路、设备调整)调用相应的解析方法或调整设备状态。
    private void parseSeriesCircuit(String command)
    解析串联电路命令,提取电路编号和连接信息,创建SeriesCircuit对象,并将其添加到电路映射中。确保所有涉及的设备已被创建,并更新connections映射。
    private void parseParallelCircuit(String command)
    解析并联电路命令,提取电路编号和包含的串联电路编号,创建ParallelCircuit对象,并将其添加到电路映射中。确保所有包含的串联电路已存在。
    private void adjustDevice(String command)
    解析并应用设备调节命令,如切换开关状态、调整分档调速器档位、设置连续调速器档位参数等。
    private void createDeviceIfAbsent(String identifier, String deviceKey)
    根据设备标识符(如"K"、"F"等)和设备键(如"K1"、"F3"),如果设备不存在则创建相应的设备对象并添加到devices映射中。
    public void addConnection(String pin1, String pin2)
    在connections映射中添加两引脚之间的连接关系。
    public void initializeSeriesCircuitDevices()
    初始化所有串联电路的设备列表,遍历每个串联电路并记录其中的设备引脚。
    电阻和电压计算相关方法:
    private double getDeviceResistance(Object device)
    根据设备对象返回其电阻值。如果设备类型未知,默认返回0。
    public double calculateTotalResistanceForCircuit(String circuitId)
    计算指定电路(串联或并联)的总电阻,避免重复计算。
    private double calculateTotalResistanceForCircuitHelper(String circuitId, Set visitedDevices)
    递归辅助方法,用于计算电路的总电阻。处理嵌套的串联和并联电路,考虑设备状态(如开关是否闭合)。
    private boolean isConnectedTo(String deviceKey, String targetPin)
    检查设备引脚是否连接到目标引脚,用于检测互斥开关的状态。
    private boolean checkCircuitConnectivity(String startPin, String endPin, String circuitId)
    检查电路从起始引脚到终止引脚的连通性,避免断开的开关路径。
    private boolean dfsCheck(String currentPin, String targetPin, Set visited, String circuitId)
    深度优先搜索算法,递归检查电路连通性。
    private boolean isSwitchDisconnected(String currentPin, String nextPin, String circuitId)
    检查当前连接的两引脚是否由于开关状态而断开连接。
    private List findRelevantCircuitIds(String pin)
    查找指定引脚所在的电路编号列表。
    public String findMainCircuit()
    查找包含VCC和GND的主电路编号,用于计算整体电路的电阻和电流。
    public double calculateCurrentForCircuitFromVCCToGND()
    计算从VCC到GND的总电流,考虑调速器对电压的影响。
    public double calculateTotalResistanceFromVCCToGND()
    计算从VCC到GND的总电阻,基于主电路。
    private double calculateParallelResistance(ParallelCircuit parallelCircuit, Set visitedDevices)
    计算并联电路的总电阻,考虑多个串联分支的情况。
    private String findCircuitIdBySeriesCircuit(SeriesCircuit targetCircuit)
    根据SeriesCircuit对象查找对应的电路编号。
    private Map<String, List> getConnectionsForCircuit(String circuitId)
    获取指定电路的连接关系列表。
    public void calculateDeviceVoltagesForCircuit()
    计算每个设备的电压,根据总电流和设备电阻更新设备电压。
    private void calculateVoltagesForCircuit(String circuitId, double totalCurrent)
    递归计算指定电路及其内部设备的电压分布。
    public double calculateTotalLightIntensity()
    计算所有灯具的总光照强度,并根据光照强度更新窗帘的状态。
    连接与状态检查相关方法:
    public boolean checkSeriesCircuitConnectivity(String circuitId)
    检查指定串联电路的连通性。
    private boolean isSwitchDisconnected(String currentPin, String nextPin, String circuitId)
    检查两个引脚之间是否由于开关状态而断开。
    private boolean isConnectedTo(String deviceKey, String targetPin)
    检查设备引脚是否连接到目标引脚。
    输出相关方法:
    public void printDeviceStatus()
    按设备类型和编号顺序输出所有设备的状态,包括开关状态、调速器档位、灯的亮度、风扇的转速、窗帘的开合比例等。
    public void printConnections()
    调试用,打印所有设备的连接关系。

  14. Main 类
    功能:
    程序的入口点,负责读取用户输入的命令,初始化电路模型,计算电路状态(电阻、电流、电压),并输出设备状态。

方法:
public static void main(String[] args)
主方法的执行流程如下:
初始化:创建一个ConnectionManager对象,用于管理设备和电路连接。
读取输入:通过Scanner读取用户输入的命令,直到输入"end"为止。
处理命令:遍历所有命令,依次调用connectionManager.processCommand(command)处理每条命令,解析电路和设备的连接关系。
初始化电路设备:调用connectionManager.initializeSeriesCircuitDevices()初始化所有串联电路的设备列表。
查找主电路:调用connectionManager.findMainCircuit()找到包含VCC和GND的主电路。
检查连通性:调用connectionManager.checkCircuitConnectivity("VCC", "GND", Maincircuit)检查主电路的连通性。
计算电阻和电流:
如果主电路连通,调用calculateTotalResistanceFromVCCToGND()计算总电阻。
调用calculateCurrentForCircuitFromVCCToGND()计算总电流。
输出总电阻和总电流。
计算设备电压和光照强度:
调用calculateDeviceVoltagesForCircuit()计算各设备的电压分布。
调用calculateTotalLightIntensity()计算总光照强度并更新窗帘状态。
输出设备状态:调用printDeviceStatus()输出所有设备的状态。

相关类图如下

题目集8

  1. Switch 类
    功能:
    模拟一个普通的开关设备,控制电路的通断状态。开关有两种状态:turned on(打开)和 closed(闭合)。根据状态决定输出电压。
    属性:
    private int state = 0;
    表示开关的状态,0 表示打开(turned on),1 表示闭合(closed)。
    private double inputVoltage = 0;
    开关的输入电压。
    private double outputVoltage = 0;
    开关的输出电压,取决于开关状态和输入电压。
    private final int resistance = 0;
    开关的电阻,默认为0。
    方法:
    public void toggle()
    切换开关状态(从0到1或从1到0),并更新输出电压。
    public boolean isClosed()
    判断开关是否处于闭合状态(state == 1)。
    public void setInputVoltage(double inputVoltage)
    设置输入电压,并根据当前状态更新输出电压。
    public double getOutputVoltage()
    获取当前的输出电压。
    private void updateOutput()
    根据开关状态更新输出电压。如果状态为1,输出电压等于输入电压;否则,输出电压为0。
    public String getStateString()
    返回开关状态的字符串表示,"turned on" 或 "closed"。
    public int getDeviceResistance()
    返回开关的电阻值。

  2. SteppedController 类
    功能:
    模拟分档调速器,允许用户在离散档位间调节输出电压。每个档位对应不同的电压比例。
    属性:
    private int level = 0;
    当前档位,范围从0到3。
    private static final int MAX_LEVEL = 3;
    最大档位数。
    private static final double[] LEVEL_RATIOS = {0.0, 0.3, 0.6, 0.9};
    每个档位对应的电压比例。
    private double inputVoltage = 0;
    输入电压。
    private double outputVoltage = 0;
    输出电压,根据当前档位和输入电压计算得出。
    private final int resistance = 0;
    分档调速器的电阻,默认为0。
    方法:
    public int getDeviceResistance()
    返回分档调速器的电阻值。
    public void setInputVoltage(double inputVoltage)
    设置输入电压,并更新输出电压。
    public double getLevelRatios()
    获取当前档位对应的电压比例。
    public void updateOutput()
    根据当前档位和输入电压计算输出电压。
    public void increaseLevel()
    增加档位,最大不超过MAX_LEVEL,并更新输出电压。
    public void decreaseLevel()
    减少档位,最小不低于0,並更新输出电压。
    public int getLevel()
    获取当前档位。
    public double getOutputVoltage()
    获取当前输出电压。

  3. ContinuousController 类
    功能:
    模拟连续调速器,允许用户根据比例精确调节输出电压,档位参数为0.00到1.00之间的小数。
    属性:
    private double level = 0.0;
    当前档位比例,范围[0.00, 1.00]。
    private double inputVoltage = 0;
    输入电压。
    private double outputVoltage = 0;
    输出电压,根据档位比例和输入电压计算得出。
    private final int resistance = 0;
    连续调速器的电阻,默认为0。
    方法:
    public int getDeviceResistance()
    返回连续调速器的电阻值。
    public void setInputVoltage(double inputVoltage)
    设置输入电压,并更新输出电压。
    public double getLevel()
    获取当前档位比例。
    public void updateOutput()
    根据档位比例和输入电压计算输出电压。
    public void setLevel(double level)
    设置档位比例,确保在[0.00, 1.00]范围内,并更新输出电压。
    public String getFormattedLevel()
    获取格式化后的档位比例(保留两位小数)。
    public double getOutputVoltage()
    获取当前输出电压。

  4. IncandescentLamp 类
    功能:
    模拟白炽灯设备,亮度取决于电压差。电压差低于10V时亮度为0,电压差在10V到220V之间按比例增加,超过220V时亮度保持在200lux。
    属性:
    private double brightness = 0;
    灯的亮度,范围0到200lux。
    private final int resistance = 10;
    白炽灯的电阻,固定为10。
    方法:
    public void setVoltageDifference(double voltageDiff)
    设置电压差,根据电压差计算亮度:
    电压差 < 10V,亮度 = 0。
    10V ≤ 电压差 ≤ 220V,亮度按比例计算。
    电压差 > 220V,亮度 = 200lux。
    public int getBrightness()
    获取当前亮度值,取整。
    public int getDeviceResistance()
    返回白炽灯的电阻值。

  5. FluorescentLamp 类
    功能:
    模拟日光灯设备,亮度固定为180lux。当电压差为0时,亮度为0;电压差不为0时,亮度为180lux。
    属性:
    private int brightness = 0;
    亮度,0或180lux。
    private final int resistance = 5;
    日光灯的电阻,固定为5。
    方法:
    public void setVoltageDifference(double voltageDiff)
    设置电压差,根据电压差计算亮度:
    电压差 = 0V,亮度 = 0。
    电压差 ≠ 0V,亮度 = 180lux。
    public int getBrightness()
    获取当前亮度值。
    public int getDeviceResistance()
    返回日光灯的电阻值。

  6. CeilingFan 类
    功能:
    模拟吊扇设备,根据电压差计算转速。电压差低于80V时转速为0,80V到150V之间按比例计算,超过150V时转速保持在360转/分钟。
    属性:
    private double voltageDifference;
    输入电压差。
    private int speed;
    当前转速,范围0到360转/分钟。
    private final int resistance = 20;
    吊扇的电阻,固定为20。
    方法:
    public void setVoltageDifference(double voltage)
    设置电压差,并调用updateState()更新转速。
    private void updateState()
    根据电压差更新转速:
    电压差 < 80V,转速 = 0。
    80V ≤ 电压差 ≤ 150V,转速按线性比例计算。
    电压差 > 150V,转速 = 360转/分钟。
    public int getSpeed()
    获取当前转速。
    public int getDeviceResistance()
    返回吊扇的电阻值。

  7. FloorFan 类
    功能:
    模拟落地扇设备,根据电压差计算转速。电压差低于80V时转速为0,80V到100V对应80转/分钟,100V到120V对应160转/分钟,120V到140V对应260转/分钟,≥140V对应360转/分钟。
    属性:
    private double voltageDifference;
    输入电压差。
    private int speed;
    当前转速,范围0到360转/分钟。
    private final int resistance = 20;
    落地扇的电阻,固定为20。
    方法:
    public void setVoltageDifference(double voltage)
    设置电压差,并调用updateState()更新转速。
    private void updateState()
    根据电压差更新转速:
    电压差 < 80V,转速 = 0。
    80V ≤ 电压差 < 100V,转速 = 80转/分钟。
    100V ≤ 电压差 < 120V,转速 = 160转/分钟。
    120V ≤ 电压差 < 140V,转速 = 260转/分钟。
    电压差 ≥ 140V,转速 = 360转/分钟。
    public int getSpeed()
    获取当前转速。
    public int getDeviceResistance()
    返回落地扇的电阻值。

  8. MutexSwitch 类
    功能:
    模拟互斥开关,控制两个分支之间的连接状态。互斥开关有三个引脚:1(汇总引脚)、2和3(分支引脚)。开关在每次只能连接一个分支引脚,另一个分支引脚处于断开状态。
    属性:
    private int state = 0;
    互斥开关的状态,0 表示连接1-2,引脚3断开;1 表示连接1-3,引脚2断开。
    private double inputVoltage = 0;
    输入电压。
    private double outputVoltage2 = 0;
    输出到引脚2的电压。
    private double outputVoltage3 = 0;
    输出到引脚3的电压。
    private final int resistance12 = 5;
    引脚1-2之间的电阻,固定为5。
    private final int resistance13 = 10;
    引脚1-3之间的电阻,固定为10。
    方法:
    public int getResistance12()
    获取引脚1-2之间的电阻值。
    public int getResistance13()
    获取引脚1-3之间的电阻值。
    public boolean isPathConnected(int pin)
    检查指定引脚(2或3)是否与汇总引脚1连接,依据当前状态。
    public void setInputVoltage(double voltage, int pin)
    设置输入电压,并根据状态更新输出电压。
    private void updateOutput()
    根据当前状态和输入电压,更新输出电压到引脚2或3。
    状态0:连接1-2,引脚3断开。
    状态1:连接1-3,引脚2断开。
    private double getCurrent()
    计算当前通过开关的电流,根据连接状态和电阻。
    public void setState(int state)
    设置互斥开关的状态,0或1,并更新输出电压。
    public double getOutputVoltage(int pin)
    获取指定引脚(2或3)的输出电压。
    public String getStateString()
    返回互斥开关的状态字符串,"closed" 或 "turned on",根据引脚连接状态。
    public int getDeviceResistance()
    根据当前状态返回对应的电阻值(5或10)。

  9. ControlledCurtain 类
    功能:
    模拟受控窗帘设备,根据电压差和总光照强度调整窗帘的开合比例。电压差低于50V时,窗帘默认为全开;电压差达到或超过50V时,根据光照强度调整开合比例。
    属性:
    private double voltageDifference = 0;
    电压差。
    private double lightIntensity = 0;
    总光照强度。
    private double openPercentage = 1.0;
    窗帘的开合比例,1.0表示全开,0.0表示全关。
    private final int resistance = 15;
    窗帘的电阻,固定为15。
    private final double MIN_OPERATING_VOLTAGE = 50.0;
    最低工作电压,固定为50V。
    方法:
    public void setVoltageDifference(double voltage)
    设置电压差,并调用updateState()更新窗帘状态。
    public void setLightIntensity(double intensity)
    设置总光照强度,并调用updateState()更新窗帘状态。
    private void updateState()
    根据电压差和光照强度更新窗帘的开合比例:
    电压差 < 50V,窗帘全开(openPercentage = 1.0)。
    电压差 ≥ 50V,根据光照强度:
    [0,50) lux,窗帘全开(1.0)。
    [50,100) lux,窗帘开合比例为0.8。
    [100,200) lux,窗帘开合比例为0.6。
    [200,300) lux,窗帘开合比例为0.4。
    [300,400) lux,窗帘开合比例为0.2。
    ≥400 lux,窗帘关闭(0.0)。
    public String getStateString()
    返回窗帘开合比例的字符串表示,例如"80%"。
    public int getDeviceResistance()
    返回窗帘的电阻值。
    public double getVoltageDifference()
    获取当前电压差。

  10. Diode 类
    功能:
    模拟二极管元件,具有正向导通和反向截止的特性。二极管有两个引脚:1(左侧,引脚编号为1)和2(右侧,引脚编号为2)。
    属性:
    private double voltage1 = 0;
    引脚1的电压。
    private double voltage2 = 0;
    引脚2的电压。
    private final int resistanceForward = 0;
    正向导通时的电阻,固定为0。
    private final int resistanceReverse = Integer.MAX_VALUE;
    反向截止时的电阻,固定为无穷大。
    方法:
    public void setVoltages(double voltage1, double voltage2)
    设置两个引脚的电压,并根据电压差决定导通状态。
    public boolean isConduction()
    判断二极管是否处于导通状态。
    public double getOutputVoltage1()
    获取引脚1的输出电压(取决于导通状态)。
    public double getOutputVoltage2()
    获取引脚2的输出电压(取决于导通状态)。
    public String getStateString()
    返回二极管状态字符串,"conduction" 或 "cutoff"。
    public int getDeviceResistance()
    根据导通状态返回电阻值(0或无穷大)。

  11. SeriesCircuit 类
    功能:
    模拟串联电路,包含多个设备的连接。串联电路视为一个独立的电路设备,管理其内部设备的连接和电压分布。
    属性:
    private List connections;
    串联电路内的连接关系列表,每个连接以字符串形式存储,例如"K1-1 K3-2"。
    private double inputVoltage = 0;
    串联电路的输入电压。
    private double outputVoltage = 0;
    串联电路的输出电压。
    构造方法:
    public SeriesCircuit(List connections)
    初始化串联电路的连接列表。
    方法:
    public void setInputVoltage(double inputVoltage)
    设置输入电压,并调用updateOutput()更新输出电压。
    private void updateOutput()
    更新输出电压为输入电压(逻辑待完善,根据电路实际情况应包含电压分配)。
    public double getOutputVoltage()
    获取输出电压。
    public List getConnections()
    获取串联电路内的连接关系列表。
    public String getStartPin()
    获取串联电路的起始引脚(第一个连接的输出引脚)。
    public String getEndPin()
    获取串联电路的终止引脚(最后一个连接的输入引脚)。

  12. ParallelCircuit 类
    功能:
    模拟并联电路,包含多个串联电路。并联电路视为一个独立的电路设备,管理其内部串联电路的连接和电压分布。
    属性:
    private List seriesCircuits;
    并联电路内包含的多个串联电路列表。
    private double inputVoltage = 0;
    并联电路的输入电压。
    private double outputVoltage = 0;
    并联电路的输出电压,根据内部串联电路的情况计算得出。
    构造方法:
    public ParallelCircuit(List seriesCircuits)
    初始化并联电路内的串联电路列表。
    方法:
    public List getSeriesCircuits()
    获取并联电路内的串联电路列表。
    public void setInputVoltage(double inputVoltage)
    设置并联电路的输入电压,并调用updateOutputVoltage()更新输出电压。
    private void updateOutputVoltage()
    遍历所有内部串联电路,设置其输入电压,并根据各串联电路的输出电压计算并联电路的输出电压(取最大值,逻辑需进一步完善)。
    public double getOutputVoltage()
    获取并联电路的输出电压。
    public String getStartPin()
    获取并联电路的起始引脚(第一个串联电路的起始引脚)。
    public String getEndPin()
    获取并联电路的终止引脚(第一个串联电路的终止引脚)。

  13. EndpointDevice 类
    功能:
    用于表示电路的起始端和终止端(IN和OUT),没有具体的属性和行为,只包含电阻属性。
    属性:
    private final int resistance = 0;
    电阻,默认为0。
    方法:
    public int getResistance()
    返回电阻值。

  14. ConnectionManager 类
    功能:
    管理所有设备、电路和连接关系,负责解析输入命令、建立电路模型、计算电路状态(电阻、电流、电压)、检测短路和超流等错误,并输出设备状态。
    属性:
    private Map<String, Object> devices = new HashMap<>();
    存储所有设备对象,键为设备标识符(如"K1"、"F3"等),值为相应设备对象。
    private Map<String, List> connections = new HashMap<>();
    存储所有连接关系,键为引脚标识符,值为连接到该引脚的其他引脚列表。
    private Map<String, SeriesCircuit> seriesCircuits = new HashMap<>();
    存储所有串联电路对象,键为电路编号(如"T1"),值为对应的SeriesCircuit对象。
    private Map<String, ParallelCircuit> parallelCircuits = new HashMap<>();
    存储所有并联电路对象,键为电路编号(如"M1"),值为对应的ParallelCircuit对象。
    private Map<String, List> seriesCircuitDevices = new HashMap<>();
    存储每个串联电路包含的设备列表,键为电路编号,值为设备引脚列表。
    构造方法:
    public ConnectionManager()
    初始化设备映射,将VCC(220V)和GND(0V)添加到设备列表中。
    方法:
    命令处理相关方法
    public void processCommand(String command)
    处理输入命令,根据命令类型(串联电路、并联电路、设备调整)调用相应的解析方法或调整设备状态。
    private void parseSeriesCircuit(String command)
    解析串联电路命令,提取电路编号和连接信息,创建SeriesCircuit对象,并将其添加到电路映射中。确保所有涉及的设备已被创建,并更新connections映射。
    private void parseParallelCircuit(String command)
    解析并联电路命令,提取电路编号和包含的串联电路编号,创建ParallelCircuit对象,并将其添加到电路映射中。确保所有包含的串联电路已存在。
    private void adjustDevice(String command)
    解析并应用设备调节命令,如切换开关状态、调整分档调速器档位、设置连续调速器档位参数等。受控窗帘不通过直接命令控制,而是根据电路状态自动调整。
    private void createDeviceIfAbsent(String identifier, String deviceKey)
    根据设备标识符(如"K"、"F"等)和设备键(如"K1"、"F3"),如果设备不存在则创建相应的设备对象并添加到devices映射中。
    public void addConnection(String pin1, String pin2)
    在connections映射中添加两引脚之间的连接关系。
    public void initializeSeriesCircuitDevices()
    初始化所有串联电路的设备列表,遍历每个串联电路并记录其中的设备引脚。
    电阻和电压计算相关方法:
    private double getDeviceResistance(Object device)
    根据设备对象返回其电阻值。如果设备类型未知,默认返回0。
    public double calculateTotalResistanceForCircuit(String circuitId)
    计算指定电路(串联或并联)的总电阻,避免重复计算。
    private double calculateTotalResistanceForCircuitHelper(String circuitId, Set visitedDevices)
    递归辅助方法,用于计算电路的总电阻。处理嵌套的串联和并联电路,考虑设备状态(如开关是否闭合)。
    private boolean isConnectedTo(String deviceKey, String targetPin)
    检查设备引脚是否连接到目标引脚,用于检测互斥开关的状态。
    public boolean checkCircuitConnectivity(String startPin, String endPin, String circuitId)
    检查电路从起始引脚到终止引脚的连通性,避免断开的开关路径。
    private boolean dfsCheck(String currentPin, String targetPin, Set visited, String circuitId)
    深度优先搜索算法,递归检查电路连通性。
    private boolean isSwitchDisconnected(String currentPin, String nextPin, String circuitId)
    检查当前连接的两引脚是否由于开关状态而断开连接。
    private List findRelevantCircuitIds(String pin)
    查找指定引脚所在的电路编号列表。
    public String findMainCircuit()
    查找包含VCC和GND的主电路编号,用于计算整体电路的电阻和电流。
    public double calculateCurrentForCircuitFromVCCToGND()
    计算从VCC到GND的总电流,考虑调速器对电压的影响。
    public double calculateTotalResistanceFromVCCToGND()
    计算从VCC到GND的总电阻,基于主电路。
    private double calculateParallelResistance(ParallelCircuit parallelCircuit, Set visitedDevices)
    计算并联电路的总电阻,考虑多个串联分支的情况。
    private String findCircuitIdBySeriesCircuit(SeriesCircuit targetCircuit)
    根据SeriesCircuit对象查找对应的电路编号。
    private Map<String, List> getConnectionsForCircuit(String circuitId)
    获取指定电路的连接关系列表。
    public void calculateDeviceVoltagesForCircuit()
    计算每个设备的电压,根据总电流和设备电阻更新设备电压。
    private void calculateVoltagesForCircuit(String circuitId, double totalCurrent)
    递归计算指定电路及其内部设备的电压分布。
    public double calculateTotalLightIntensity()
    计算所有灯具的总光照强度,并根据光照强度更新窗帘的状态。
    连接与状态检查相关方法
    public boolean checkSeriesCircuitConnectivity(String circuitId)
    检查指定串联电路的连通性。
    private boolean isSwitchDisconnected(String currentPin, String nextPin, String circuitId)
    检查两个引脚之间是否由于开关状态而断开。
    private boolean isConnectedTo(String deviceKey, String targetPin)
    检查设备引脚是否连接到目标引脚。
    输出相关方法
    public void printDeviceStatus()
    按设备类型和编号顺序输出所有设备的状态,包括开关状态、调速器档位、灯的亮度、风扇的转速、窗帘的开合比例、二极管的状态等。
    public void printConnections()
    调试用,打印所有设备的连接关系。

  15. Main 类
    功能:
    程序的入口点,负责读取用户输入的命令,初始化电路模型,计算电路状态(电阻、电流、电压),并输出设备状态。
    方法:
    public static void main(String[] args)
    主方法的执行流程如下:
    初始化:创建一个ConnectionManager对象,用于管理设备和电路连接。
    读取输入:通过Scanner读取用户输入的命令,直到输入"end"为止。
    处理命令:遍历所有命令,依次调用connectionManager.processCommand(command)处理每条命令,解析电路和设备的连接关系。
    初始化电路设备:调用connectionManager.initializeSeriesCircuitDevices()初始化所有串联电路的设备列表。
    查找主电路:调用connectionManager.findMainCircuit()找到包含VCC和GND的主电路。
    检查连通性:调用connectionManager.checkCircuitConnectivity("VCC", "GND", Maincircuit)检查主电路的连通性。
    计算电阻和电流:
    如果主电路连通,调用calculateTotalResistanceFromVCCToGND()计算总电阻。
    调用calculateCurrentForCircuitFromVCCToGND()计算总电流。
    输出总电阻和总电流。
    计算设备电压和光照强度:
    调用calculateDeviceVoltagesForCircuit()计算各设备的电压分布。
    调用calculateTotalLightIntensity()计算总光照强度并更新窗帘状态。
    输出设备状态:调用printDeviceStatus()输出所有设备的状态。

相关类图如下

采坑心得
在题目集7中,最开始没有考虑到电路短路的情况,从而导致输出不正确,在思考过后,通过
// 检查指定串联电路的连通性
public boolean checkSeriesCircuitConnectivity(String circuitId) {
SeriesCircuit seriesCircuit = seriesCircuits.get(circuitId);
if (seriesCircuit == null) return false;

    String startPin = seriesCircuit.getStartPin();
    String endPin = seriesCircuit.getEndPin();
    return checkCircuitConnectivity(startPin, endPin, circuitId);
}

可以检查分电路的连通性,如果连通,再通过calculateTotalResistanceForCircuit函数计算这条电路的总电阻,从而根据电阻判断这条分电路是否为短路,成功解决了这个问题。

改进建议
1.电压分配逻辑:
SeriesCircuit和ParallelCircuit的电压分配逻辑虽然已经实现,但是还是应该再次完善,以应对各种电路情况,特别是在处理复杂嵌套电路时。
2.错误处理与提示:
应该增加更多的错误处理机制,如非法命令格式、设备未定义等情况的处理。
3.代码优化与扩展性:
可以通过引入接口或抽象基类,进一步优化设备类的设计,增强代码的可维护性和扩展性。

总结
通过这一系列的作业,我更加深入地理解了面向对象编程的核心思想,尤其是在设计复杂电路系统时如何运用继承、封装和多态来实现不同设备和电路的模拟。同时,我认识到在处理嵌套的串联和并联电路时,算法优化和代码可读性依然有较大提升空间。在课程中,我体会到理论结合实践的重要性,尤其是在设计和实现复杂功能时,清晰的逻辑思考和扎实的基础知识必不可少。我建议课程能在实验和课下活动中提供更多实际案例和代码优化指导,这将有助于更好地理解复杂系统的设计和实现。我期待在今后的学习中,能继续完善这些方面的能力。

posted @ 2024-12-27 00:48  高怀冉  阅读(56)  评论(0)    收藏  举报