JAVA第三次BLOG作业
目录
前言
设计与分析
PTA第七次作业
PTA第八次作业
踩坑心得
改进建议
总结
前言
在之前的家居强电电路模拟程序中,并联信息所包含的串联电路的信息都在并联信息之前输入,不考虑乱序输入的情况。不用计算电流,直接通过引脚辨别电压,如此对设计的要求比较严苛,综合考虑后决定加入电流的设计,通过✖电阻还原电压。
设计与分析
PTA第七次作业
类图:

整体系统流程:

1. 整体设计思路
该程序旨在模拟智能家居强电电路系统,通过定义不同类型的电路元件类(如开关、调速器、灯具、风扇、窗帘等),并利用抽象类和接口来规范和统一它们的行为。通过InputProcessor类读取用户输入,DeviceManager类管理设备的创建、连接、控制以及状态更新,并最终输出各设备的状态。同时,通过chuanglian和binglian类分别处理串联和并联电路的特性计算。
2. 类的设计与分析
- CircuitElement抽象类:作为所有电路元件的基类,定义了通用的属性(如设备ID、输入电压、输出电压、电压差、电阻)和方法(如更新状态、获取输出、设置输入等)。这样的设计使得所有具体的电路元件类可以继承这些属性和方法,减少代码冗余,体现了面向对象编程中的继承特性。
- Controllable接口:定义了
applyControl方法,用于控制设备的行为。实现该接口的类(如开关、调速器等控制设备类)必须实现此方法,从而规范了可控设备的控制行为,体现了接口的功能。 - 控制设备类:
- ToggleSwitch类:继承自
CircuitElement并实现Controllable接口。通过active布尔变量表示开关状态,applyControl方法切换开关状态并更新电阻值,update_state方法根据开关状态计算输出电压。 - ExclusiveSwitch类:同样继承并实现相应接口。使用
switchState整型变量表示互斥开关的连接状态(0表示1 - 2连接,1表示1 - 3连接),在applyControl方法中切换状态并更新电阻,update_state方法依据状态计算输出电压。 - DiscreteSpeedController类:通过
level变量表示档位,applyControl方法根据控制命令调整档位,update_state方法依据档位计算输出电压。 - ContinuousSpeedController类:以
position变量表示档位参数,applyControl方法设置档位参数并更新输出电压。
- ToggleSwitch类:继承自
- 受控设备类:
- IncandescentLightBulb类:根据电压差计算亮度,
update_state方法实现了亮度与电压差的关系计算。 - FluorescentLight类:依据电压差确定亮度状态(0或180lux)。
- CeilingFan类和FloorFan类:分别根据电压差计算转速,体现了不同风扇转速与电压差的特定关系。
- SmartCurtain类:根据总光照强度和电压确定打开程度,
update_state方法实现了这一逻辑。
- IncandescentLightBulb类:根据电压差计算亮度,
- 电路类:
- chuanglian类:表示串联电路,继承自
CircuitElement。通过devices存储串联的设备,connections记录引脚连接信息,Exclusive_connection记录互斥开关引脚连接。update_resistance方法计算串联电路总电阻,考虑了互斥开关不同连接状态对电阻的影响;update_state方法根据电压差和电阻计算电流,并更新各设备的电压差和状态。 - binglian类:表示并联电路,同样继承自
CircuitElement。使用chuanglians存储并联的串联子电路,update_resistance方法根据并联电路电阻计算公式计算总电阻,update_state方法根据总电压差更新各串联子电路的电压差和电流。
- chuanglian类:表示串联电路,继承自
- 辅助类:
- InputProcessor类:负责读取用户输入,通过
Scanner逐行读取输入信息,并根据输入的格式判断是连接信息(以#T或#M开头)还是控制命令(以#开头),然后调用DeviceManager类的相应方法进行处理。 - DeviceManager类:管理所有设备,包括设备的创建、连接处理、控制命令应用、状态更新以及状态打印。
createDevice方法根据设备标识符创建相应的设备对象;processConnection_chuanglian和processConnection_binglian方法分别处理串联和并联电路的连接信息,构建电路结构;applyControlCommand方法将控制命令应用到所有可控设备上;update_state方法更新所有设备的电压、电阻和电流状态,在处理串联电路时,考虑了调速器在首位时的特殊情况,并对断路情况进行了处理;printStatus方法对设备进行排序并打印其状态,对于智能窗帘,在打印前会根据其他灯具的亮度更新其打开程度。
- InputProcessor类:负责读取用户输入,通过
3. 关键功能实现分析
- 输入解析:通过正则表达式和字符串分割等方式对输入的连接信息和控制命令进行解析。例如,在处理串联电路连接信息时,使用正则表达式提取方括号内的内容,再对其进行分割处理,获取设备ID和引脚信息,从而构建设备连接关系。
- 电路计算:
- 电阻计算:在
chuanglian类的update_resistance方法中,累加各设备电阻,同时考虑互斥开关不同连接状态下的电阻值变化;在binglian类的update_resistance方法中,根据并联电阻公式计算总电阻。 - 电流计算:在
chuanglian类的update_state方法中,根据欧姆定律(电流 = 电压差 / 电阻)计算串联电路中的电流。 - 电压计算:同样在
chuanglian类的update_state方法中,根据电流和各设备电阻计算设备两端的电压差,并更新设备状态;在binglian类的update_state方法中,根据总电压差更新各串联子电路的电压差。
- 电阻计算:在
- 状态更新与输出:
DeviceManager类的update_state方法负责更新所有设备的状态,printStatus方法按照特定顺序(通过getTypeOrder方法确定设备类型顺序)和格式输出设备状态。对于智能窗帘,会综合考虑其他灯具的亮度来更新其打开程度后再输出。
4. 设计优点
- 模块化设计:将不同功能封装在各个类中,如输入处理、设备管理、电路计算等,每个类的职责明确,提高了代码的可读性和可维护性。
- 面向对象特性的充分应用:通过继承、接口和多态等特性,实现了代码的复用和扩展。例如,所有电路元件类继承自
CircuitElement抽象类,共享通用属性和方法;控制设备类实现Controllable接口,统一了控制行为。 - 考虑多种电路情况:能够处理复杂的串联和并联电路结构,包括互斥开关在电路中的特殊情况,并且在计算电阻、电流和电压时,充分考虑了各种设备的特性和连接方式。
5. 可能的改进方向
- 异常处理:当前代码对输入格式错误、设备标识符错误等异常情况处理不足。可以添加更多的输入验证和异常处理机制,使程序更加健壮。
- 代码优化:部分方法的实现较为复杂,例如
update_state方法中对串联电路的处理逻辑。可以进一步拆分方法,提高代码的可读性和可维护性。 - 功能扩展:可以增加更多的电路元件或功能,如增加传感器设备,实现更复杂的智能家居场景模拟。
PTA第八次作业
1. 需求分析
- 设备类型与特性
- 控制设备:开关、分档调速器、连续调速器、互斥开关各有不同的状态、引脚和调节方式。例如开关有0和1两种状态,通过引脚连接电源和接地端,状态决定输出电位;分档调速器按档位调整输出电位,连续调速器按位置比例得到档位参数来调整输出电位;互斥开关有3个引脚,两种连接状态,不同连接状态有不同电阻。
- 受控设备:包括灯(白炽灯、日光灯)、风扇(吊扇、落地扇)和受控窗帘。它们依据引脚间电压差工作,具有不同的工作状态和特性。如白炽灯亮度随电压差在0 - 200lux 间变化,日光灯只有0和180lux两种亮度状态;吊扇和落地扇根据不同电压区间有不同转速;受控窗帘根据室内灯光光照强度总和与电压决定打开比例。
- 新增设备 - 二极管:具有正向导通、反向截止特性,电阻根据电流方向变化,两端电压相等时,根据电压值和接入方向决定导通/截止状态。
- 输入信息
- 设备标识:使用特定标识符(如K、F、L等)与编号组合表示不同设备。
- 连接信息:通过
[]表示一组连接的设备引脚,引脚间用空格分隔,串联和并联电路信息有特定格式。例如串联电路以#T开头,并联电路以#M开头,且有相应的编号和连接描述方式。 - 控制信息:不同控制设备有不同的调节信息格式,如开关和互斥开关通过
# + 设备标识 + 设备编号切换状态,分档调速器通过# + 设备标识 + 设备编号 + "+"或"-"加档或减档,连续调速器通过# + 设备标识 + 设备编号 + ":" + 数值设置档位。
- 输出信息
- 按特定顺序(开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇、互斥开关、受控窗帘、二极管)输出设备状态或参数,包含设备状态值和各引脚电压值,若电流超过限定值需添加错误提示,若电路短路则只输出“short circuit error”。
- 特殊要求
- 电流限制:各电器有最大限定电流,实时电流超过时在输出信息中添加提示。
- 短路检测:电路出现短路时,不输出元器件信息,仅提示“short circuit error”。
- 并联嵌套:考虑并联电路中包含并联电路的情况。
2. 设计思路
类图:

- 类的设计
CircuitElement抽象类:作为所有电路设备的基类,包含设备通用属性(如id、inputVoltage、outputVoltage、voltageDiff、resistance)和方法(如update_state、getOutput、setInput等),为具体设备类提供统一框架。- 控制设备类:
ToggleSwitch(开关)、ExclusiveSwitch(互斥开关)、DiscreteSpeedController(分档调速器)、ContinuousSpeedController(连续调速器)继承自CircuitElement并实现Controllable接口,实现各自的控制逻辑和状态更新方法。 - 受控设备类:
IncandescentLightBulb(白炽灯)、FluorescentLight(日光灯)、CeilingFan(吊扇)、FloorFan(落地扇)、SmartCurtain(受控窗帘)继承自CircuitElement,根据自身特性实现update_state方法来更新状态。 Diode类:表示二极管,继承自CircuitElement,根据二极管特性实现其导通和截止状态的判断及相关操作。- 电路类:
chuanglian(串联电路)和binglian(并联电路)继承自CircuitElement,分别实现串联和并联电路的电阻计算、电流计算、电压分配以及状态更新逻辑。 InputProcessor类:负责读取用户输入,根据输入格式调用DeviceManager的相应方法处理连接信息、控制命令等。DeviceManager类:管理所有设备,包括设备的创建、连接处理、控制命令应用、状态更新和状态打印。通过Map存储设备和电路信息,方便查找和操作。
- 关键算法
- 输入解析:利用字符串分割和正则表达式匹配技术解析输入的连接信息、控制命令等。例如,通过
split方法按特定字符分割字符串,提取设备ID、引脚号、控制命令等信息;使用正则表达式匹配方括号内的连接信息。 - 电路计算:
- 电阻计算:串联电路中,累加各设备电阻,同时考虑互斥开关状态对电阻的影响;并联电路根据并联电阻公式计算总电阻。
- 电流计算:根据欧姆定律(电流 = 电压差 / 电阻)计算电流,同时判断电流是否超过各设备的最大限定电流。
- 电压计算:根据电流和电阻计算设备两端电压差,更新设备状态。
- 状态更新:根据控制命令更新控制设备状态,进而影响受控设备状态。例如,开关状态改变会影响后续设备的输入电压,调速器档位调整会改变输出电压,从而影响连接的灯具或风扇的工作状态。
- 输入解析:利用字符串分割和正则表达式匹配技术解析输入的连接信息、控制命令等。例如,通过
3. 实现难点与解决方案
- 复杂电路结构处理:处理串联和并联电路嵌套以及设备连接关系复杂的问题。通过合理设计
chuanglian和binglian类,使用Map存储设备连接信息,清晰管理设备间的连接关系,并在计算电阻、电流和电压时,按照电路原理进行分层计算和状态更新。 - 多种设备特性整合:不同类型设备具有不同的特性和工作逻辑,整合这些特性并确保它们在电路中正确协同工作。通过继承和多态性,在
CircuitElement抽象类基础上,每个具体设备类实现自身的update_state方法,根据设备特性进行状态更新。 - 错误处理:实现电流限制和短路检测功能。在计算电流时,将实时电流与各设备的最大限定电流比较,超过则添加错误提示;在计算电阻时,检测电阻是否为0(短路情况),若是则输出短路错误提示。
4. 代码优化方向
- 代码结构优化:进一步模块化代码,将复杂的逻辑(如电路计算、状态更新)封装成更小的方法,提高代码的可读性和可维护性。例如,将串联电路电阻计算逻辑封装成独立方法,便于理解和修改。
- 性能优化:在处理大量设备和复杂电路时,优化数据结构和算法以提高程序运行效率。例如,使用更高效的查找算法来定位设备,避免在大型
Map中进行线性查找。 - 代码复用:提取通用代码到父类或工具类中,减少重复代码。如某些设备在更新状态时可能有通用的计算逻辑,可提取到
CircuitElement抽象类中。
踩坑心得
复杂逻辑的梳理:处理串联和并联电路的连接与状态更新逻辑较为复杂。例如,在计算串联电路电阻时,需要考虑互斥开关的不同连接状态对电阻的影响,容易出现逻辑错误。特别是在多个条件嵌套判断时,代码的可读性和可维护性会受到挑战。
正则表达式的使用:使用正则表达式提取连接信息时,需要精确匹配各种可能的输入格式。如果输入格式发生变化,可能导致匹配失败或提取错误信息。例如,在匹配被方括号包围的内容时,需要确保正则表达式能够正确处理各种边界情况。
设备状态更新的顺序:在更新设备状态时,需要注意不同类型设备的更新顺序。例如,调速器的输出电压会影响后续设备的输入电压,因此需要先更新调速器的状态。如果更新顺序不当,可能导致计算结果错误。
代码结构的复杂性:随着功能的增加,类和方法的数量不断增多,代码结构变得复杂。不同类之间的依赖关系和交互逻辑需要仔细梳理,否则容易出现难以调试的错误。
改进建议
代码模块化与抽象:
将复杂的逻辑(如串联和并联电路的电阻计算、状态更新等)提取到独立的方法中,提高代码的可读性和可维护性。例如,将chuanglian类中update_resistance方法的逻辑进一步细化,每个判断条件可以封装成独立的方法。
对于设备创建的逻辑,可以考虑使用工厂模式,将不同类型设备的创建逻辑封装在工厂类中,使createDevice方法更加简洁。
输入验证与错误处理:
在处理输入时,增加对输入格式的严格验证。例如,在processConnection_chuanglian和processConnection_binglian方法中,对输入的连接信息进行更全面的格式检查,确保输入的合法性。
对于可能出现的异常情况(如输入的设备 ID 不存在、控制命令格式错误等),添加适当的错误处理机制,提高程序的稳定性。
优化代码结构:
考虑使用接口或抽象类来统一设备的某些行为,如update_state方法。这样可以减少代码冗余,提高代码的可扩展性。
对于DeviceManager类中管理设备集合的部分,可以考虑使用更合适的数据结构或设计模式来优化查找和操作设备的效率。例如,对于不同类型的设备,可以使用Map进行分类管理,提高查找设备的速度。
文档化:
为每个类和方法添加详细的注释,说明其功能、参数含义、返回值以及可能的异常情况。特别是对于复杂的逻辑方法,如update_state和processConnection_chuanglian,注释可以帮助其他开发者快速理解代码意图。
增加整体架构的文档说明,描述各个类之间的关系和交互流程,有助于维护和扩展代码。
测试与调试:
编写单元测试用例来验证各个类和方法的正确性。特别是对于复杂的逻辑方法,通过单元测试可以确保在修改代码时不会引入新的错误。
在关键代码段添加日志输出,方便调试和排查问题。例如,在状态更新和设备控制的关键步骤中输出相关信息,以便快速定位错误。
总结
继承:通过CircuitElement抽象类,多个具体设备类(如ToggleSwitch、IncandescentLightBulb等)继承其属性和方法,实现了代码的复用和扩展。例如,所有设备都具有id、inputVoltage等属性,以及update_state等方法,减少了重复代码的编写。
接口:Controllable接口定义了设备控制的统一行为,实现该接口的类(如各种开关和调速器)必须实现applyControl方法,使得不同类型的可控设备能够以一致的方式被控制,增强了代码的规范性和可扩展性。
多态性:在DeviceManager类中,通过total_devices存储不同类型的设备对象,当调用update_state或其他方法时,根据对象的实际类型执行相应的重写方法,体现了多态性。例如,对于ToggleSwitch和DiscreteSpeedController,它们的update_state方法实现不同,但都能在统一的调用中正确执行。
数据结构
Map的使用:在DeviceManager类中,使用Map(如total_devices、chuanglians、binglings等)来存储设备和电路信息,方便根据设备 ID 或电路 ID 快速查找和操作相关对象。在chuanglian类中,使用Map存储串联电路中的设备和连接信息,能够有效地管理设备之间的连接关系。
LinkedHashMap的使用:在存储设备和电路信息时,选择LinkedHashMap可以保持元素的插入顺序,这在处理串联电路中的设备顺序以及输出设备状态时可能会有用,确保了操作的顺序性与预期一致。
字符串处理与正则表达式
字符串分割:在解析输入信息时,频繁使用split方法将字符串按照特定字符(如:、-、空格等)进行分割,提取出关键信息,如设备 ID、引脚号、控制命令等。
正则表达式匹配:在处理串联电路连接信息时,使用正则表达式\[[^\]]+\]来匹配方括号内的内容,以便准确提取设备连接信息,提高了输入解析的灵活性和准确性。
集合操作与流处理(部分使用)
集合遍历与操作:在DeviceManager类的printStatus方法中,使用List来存储设备并进行排序操作,通过遍历List输出设备状态。在update_state方法中,遍历chuanglians和devices集合来更新电路和设备的状态。
流操作(stream):在applyControlCommand方法中,使用stream结合filter和forEach来筛选出可控设备并执行控制命令,使代码更加简洁和易读。
学到的经验与技能
复杂系统设计与实现
学会设计一个包含多种设备和电路结构的智能家居模拟系统,理解如何将不同类型的设备抽象为类,并通过合理的类关系和交互来实现系统功能。例如,通过定义设备类、电路类以及管理类之间的关系,实现了设备的连接、控制和状态更新等功能。
掌握了处理复杂逻辑的能力,如串联和并联电路中电阻、电流、电压的计算,以及设备状态更新的顺序和依赖关系。这需要对电路原理和系统行为有清晰的理解,并能够将其转化为代码实现。
问题解决与调试技巧
在编写代码过程中,遇到了各种逻辑错误和语法问题。通过仔细分析错误信息、调试代码和查阅相关文档,逐渐学会了定位和解决问题的方法。
学会使用调试工具(如在 IDE 中设置断点、查看变量值等)来跟踪代码执行过程,帮助理解程序的运行逻辑,特别是在处理复杂的电路计算和设备交互时,调试工具能够快速发现问题所在。
代码优化与改进思路
认识到代码结构对可维护性和扩展性的重要性,如通过模块化设计(将不同功能封装在独立的类和方法中)、优化数据结构(选择合适的集合类型)以及改进算法(如更清晰的电路计算逻辑)等

浙公网安备 33010602011771号