Java题目集7-8实现总结
前言
本文介绍了家居强电电路模拟程序的第3-4次迭代:
第3次迭代在原有的家居强电电路模拟程序基础上,新增了互斥开关(标识符H)和受控窗帘(标识符S)。互斥开关可以在两个分支电路间选择性接通,并设有默认状态和限流电阻;受控窗帘根据室内灯光强度自动调整开合比例,最低工作电压为50V。
第4次迭代引入了二极管(标识符P),允许电流单向通过,增加了电路的真实性和复杂性。同时,增强了对复杂电路结构的支持,允许并联和串联电路中嵌套其他类型的电路,提高了设计灵活性。输出信息格式也进行了优化,每个设备后附加引脚电压值,使用户更直观了解电路状态,并确保同类设备按编号顺序输出。
综上,这两次迭代显著扩展了可模拟设备的种类,增强了电路结构的复杂性支持,以及优化了输出信息展示,提升了系统的实用性和精确度。
家居强电电路模拟程序:
在智能家居强电电路模拟系统中,通过定义一系列类来模拟不同类型的电气设备及其行为。
‘Electric’类作为所有电气设备的基类,封装了基本属性如设备标识符、唯一ID和默认电压,并提供了显示状态和更新电压的方法。
继承自’Electric’的’ControlDevice’和’ControlledDevice’分别用于表示可调节的控制设备(如开关、调速器)和受控设备(如灯具、风扇),并实现了特定的调节和显示逻辑。
具体设备如开关 (Kaiguan)、分档调速器 (Fendang)、连续调速器 (Lianxu)、白炽灯 (Baichi)、日光灯 (Riguang) 和吊扇 (Diaoshan) 都继承自相应的基类,并实现了各自特有的功能。
‘Circuit’类管理整个电路中的多个电气设备,负责添加设备、更新电压及显示设备状态。主程序逻辑通过创建输入流读取用户指令,初始化变量和电路对象,处理连接信息和控制指令,计算最终电压,更新设备状态,并最终展示所有设备的状态,确保系统的灵活性和扩展性,精确模拟智能家居电路的工作情况。
核心类图:

一、 设计与分析
第三次迭代的主要改动包括:
(1) 新增了互斥开关类 HuxiKaiguan 和受控窗帘类 ShoukongChuanglian。
(2) 在 complain 方法中支持互斥开关和受控窗帘的创建。
(3) 在 main 方法中新增了对互斥开关和受控窗帘的调节逻辑。
(4) 计算光照强度并更新窗帘的状态。
(5) 输出互斥开关和受控窗帘的状态。
1.新增类定义
(1) 互斥开关类 HuxiKaiguan
功能:模拟互斥开关的行为,有三个引脚(1、2、3),默认状态为1、2引脚接通,1、3引脚断开。
属性:
isOn:表示1、2引脚是否接通。
resistance12:1、2引脚之间的电阻(默认值为5)。
resistance13:1、3引脚之间的电阻(默认值为10)。
方法:
toggle():切换开关状态。
getResistance(int pin1, int pin2):根据引脚状态返回电阻值。
display():输出开关状态。
(2) 受控窗帘类 ShoukongChuanglian
功能:模拟受控窗帘的行为,根据光照强度调整窗帘的打开比例。
属性:
openRatio:窗帘的打开比例(0.0到1.0)。
resistance:窗帘的电阻(默认值为15)。
方法:
updateOpenRatio(double totalBrightness):根据光照强度更新窗帘的打开比例。
display():输出窗帘的打开比例。
(3) 添加类:

2.主程序逻辑改动
(1) 设备创建与初始化
改动部分:
在 complain 方法中新增了对互斥开关(HuxiKaiguan)和受控窗帘(ShoukongChuanglian)的处理逻辑。
逻辑描述:
功能:根据设备类型和编号创建相应的设备对象,并将其添加到设备映射中。
实现:
如果设备类型为 H,则创建一个互斥开关对象,并设置其电阻为 0。
如果设备类型为 S,则创建一个受控窗帘对象,并设置其电阻为 15。
将创建的对象添加到 map1 中,键为设备标识符(dkey),值为设备对象。
(2) 设备状态调节
改动部分:
在 main 方法中新增了对互斥开关的调节逻辑。
逻辑描述:
功能:根据输入的控制信息,切换互斥开关的状态。
实现:
遍历控制信息列表 chw,找到以 H 开头的设备标识符。
根据设备编号从设备映射中获取对应的互斥开关对象。
调用 toggle() 方法切换开关状态。
(3) 光照强度计算与窗帘状态更新
改动部分:
在 main 方法中新增了计算光照强度并更新窗帘状态的逻辑。
逻辑描述:
功能:计算电路中所有灯光的光照强度总和,并根据光照强度更新窗帘的打开比例。
实现:
遍历设备列表 arraylist6,计算白炽灯和日光灯的光照强度总和。
白炽灯的光照强度根据电压比例计算(shuV / 220.0 * 200)。
日光灯的光照强度固定为 180。
再次遍历设备列表,找到受控窗帘对象,并调用 updateOpenRatio() 方法更新其打开比例。
(4) 设备状态输出
改动部分
在 main 方法中新增了输出互斥开关和受控窗帘状态的逻辑。
3.代码评价:

(1) 分析上图:
行数:425行
语句数:221条
分支语句百分比:18.6%
方法调用语句数:103条
注释行百分比:9.9%
类和接口数:0个
每类方法数:0.00(这可能意味着所有方法都在一个类中)
平均每方法语句数:8.11,表示方法相对简洁
Kiviat 图:
Kiviat 图显示了多个维度的分布情况,包括注释比例、方法数量、复杂度等。从图上看,注释比例较低,方法数量较少,复杂度也较低。
Block Histogram:
Block Histogram 显示了不同深度的代码块的数量。从图中可以看出,大部分代码块的深度在1到3之间,深度较高的代码块较少。
(2) 代码评价
每方法平均语句数为8.11,说明方法较为简洁,易于理解和维护。
平均复杂度和最大复杂度都较低,表明代码逻辑相对简单,不易出错。
注释行百分比仅为9.9%,说明代码注释较少,可能会影响代码的可读性和维护性。
分支语句百分比为18.6%,处于合理范围内,表明代码有一定的条件判断逻辑,但不至于过于复杂。
方法调用语句数较多,表明代码中有较多的函数调用,这有助于模块化和代码复用。
(3) 总结分析
总体来看,这段代码具有较好的简洁性和低复杂度,适合维护和扩展。然而,注释较少可能会降低代码的可读性和维护性。建议增加必要的注释以提高代码的可读性,并确保关键逻辑部分有详细的解释。此外,虽然方法调用较多,但每个方法保持了较小的规模,有助于代码的模块化和清晰性。
第四次迭代新增了二极管类 Diode,并在主程序逻辑中增加了以下功能:
(1) 支持二极管的创建和状态更新。
(2) 支持电流限制和短路检测。
(3) 支持并联电路中包含并联电路的情况。
(4) 新增了计算电流、获取引脚电压和处理并联电路的方法。
1.新增类定义
二极管类 Diode
功能:模拟二极管的行为,正向导通,反向截止。
属性:
state:表示二极管的状态(conduction 或 cutoff)。
maxCurrent:二极管的最大电流限制(默认值为8)。
方法:
updateState(double voltage1, double voltage2):根据两端电压更新二极管状态。
display(double voltage1, double voltage2):输出二极管状态和引脚电压。

2.主程序逻辑改动
(1) 修改 complain 方法以支持二极管
改动部分:
在 complain 方法中新增了对二极管(Diode)的处理逻辑。
逻辑描述:
功能:根据设备类型和编号创建二极管对象,并将其添加到设备映射中。
实现:
如果设备类型为 P,则创建一个二极管对象,并设置其电阻为 0。
将创建的对象添加到 map1 中,键为设备标识符(dkey),值为设备对象。
(2) 修改 main 方法以支持电流限制和短路检测
改动部分:
在 main 方法中新增了电流计算、短路检测和电流限制检查的逻辑。
(3) 修改 main 方法以支持并联电路中包含并联
改动部分:
在 main 方法中新增了对并联电路中包含并联电路的处理逻辑。
逻辑描述:
功能:支持并联电路中嵌套其他并联电路的情况。
实现:
遍历并联电路列表 parallelCircuits,解析每条并联电路。
如果某条串联电路以 M 开头,则递归调用 processParallelCircuit() 方法处理嵌套的并联电路。
(4) 修改 main 方法以支持二极管状态更新
改动部分:
在 main 方法中新增了对二极管状态更新的逻辑。
逻辑描述:
功能:根据二极管两端的电压更新其状态(导通或截止),并输出状态和引脚电压。
实现:
遍历设备列表 arraylist6,找到所有二极管对象。
调用 getVoltage() 方法获取二极管两端的电压。
调用 updateState() 方法更新二极管状态。
调用 display() 方法输出二极管状态和引脚电压。
3.新增方法
(1) 计算电流的方法 calculateCurrent
private static double calculateCurrent(Map<String, Map<String, Electric>> maps, Map<String, Electric> zhu) { double totalResistance = 0; for (Map<String, Electric> map : maps.values()) { for (Electric electric : map.values()) { totalResistance += electric.resistance; } } for (Electric electric : zhu.values()) { totalResistance += electric.resistance; } return (totalResistance == 0) ? Double.POSITIVE_INFINITY : 220 / totalResistance; }
(2) 获取引脚电压的方法 getVoltage
private static double calculateCurrent(Map<String, Map<String, Electric>> maps, Map<String, Electric> zhu) { double totalResistance = 0; for (Map<String, Electric> map : maps.values()) { for (Electric electric : map.values()) { totalResistance += electric.resistance; } } for (Electric electric : zhu.values()) { totalResistance += electric.resistance; } return (totalResistance == 0) ? Double.POSITIVE_INFINITY : 220 / totalResistance; }
(3) 处理并联电路的方法 processParallelCircuit
private static void processParallelCircuit(String parallelCircuit) { // 递归处理嵌套的并联电路 // 具体实现需根据电路连接情况 }
4.代码评价:

(1) 分析上图:
行数: 719行
语句数: 458条
分支语句百分比: 29.3%
方法调用语句数: 233条
注释行百分比: 8.1%
类和接口数: 8个
每类方法数: 4.12
平均每方法语句数: 13.18,表示方法相对较为复杂
最复杂方法行号: 220
Kiviat 图
Kiviat 图显示了多个维度的分布情况:
注释比例较低(8.1%)
方法数量适中(4.12个/类)
Block Histogram
Block Histogram 显示了不同深度的代码块的数量:
大部分代码块的深度在1到6之间
深度较高的代码块(如深度为5、6)也有一定数量
深度超过6的代码块较少
(2) 代码评价
每方法平均语句数: 13.18,说明方法相对较长,可能需要进一步拆分以提高可读性和维护性。
平均复杂度: 较低,表明大部分方法逻辑简单。
最大复杂度: 较高,表明存在一些较为复杂的逻辑,需要注意这部分代码的可读性和测试覆盖。
平均深度: 中等,表明嵌套层次适中。
最大深度: 较高,表明存在较深层次的嵌套,可能影响代码的可读性和维护性。
注释行百分比: 8.1%,说明注释较少,可能会影响代码的可读性和维护性。建议增加必要的注释以提高代码的可读性。
分支语句百分比: 29.3%,处于合理范围内,表明代码有一定的条件判断逻辑,但不至于过于复杂。
方法调用语句数: 233条,表明代码中有较多的函数调用,这有助于模块化和代码复用。
(3) 总结分析
总体来看,这段代码具有一定的复杂度,尤其是在某些方法中的逻辑较为复杂。虽然大部分方法保持了较低的复杂度,但存在一些较为复杂的部分需要特别关注。注释较少可能会降低代码的可读性和维护性,建议增加必要的注释。此外,虽然方法调用较多,但每个方法保持了一定的规模,有助于代码的模块化和清晰性。
二、踩坑心得
在第四次迭代的代码中,虽然已经实现了功能需求,但仍有一些优化空间可以提升代码的可读性、可维护性和性能。以下是具体的优化建议:
1. 代码结构优化
模块化
将电流计算、电压计算、短路检测等功能封装到独立的工具类中,减少 main 方法的复杂度。
将设备的状态更新和显示逻辑封装到设备类中,遵循单一职责原则。
2. 性能优化
减少重复计算:
在计算电流和电压时,将中间结果存入数组,避免重复计算。
并行计算:
对于独立的电路分支,可以使用多线程并行计算电流和电压,提升性能。
3. 代码可读性优化
命名规范:
使用更具描述性的变量名和方法名,例如 calculateTotalResistance 代替 calculateCurrent。
避免使用缩写,例如 voltage1 改为 pin1Voltage。
添加注释:
为关键方法和复杂逻辑添加注释,解释其作用和实现原理。
三、改进建议改进建议
1.优化输入处理:
可以考虑简化输入处理流程,使用更直接的方法来处理输入格式,即使避免使用正则表达式,改用简单的字符串拆分,可以提高代码效率和可读性。
2.提取公共逻辑:
将电压和电阻的相关计算逻辑提取为单独的方法,中心化处理,避免在各个类中重复实现相同的逻辑。
3.模块化设计:
目前所有的逻辑都在main方法中处理,可以考虑将其拆分成更小的方法或者独立的类来提高可维护性和可测试性。
四、实验总结
通过本次实验,我学到了以下几个方面:
1.类的扩展与继承机制:
深入理解了面向对象编程中的继承和多态性。在第三次迭代中,新增了互斥开关(HuxiKaiguan)和受控窗帘(ShoukongChuanglian),它们分别继承自ControlDevice和ControlledDevice,实现了特定的功能。这不仅增强了代码的可复用性,也提高了系统的灵活性。
2.复杂电路结构的支持:
在第四次迭代中,系统引入了二极管(Diode),并增强了对复杂电路结构的支持,如允许并联电路中包含其他并联电路。这一改进显著提升了模拟程序处理实际电路的能力,使它能够更精确地反映现实世界中的电路行为。
3.输出信息格式优化:
学习到如何优化输出信息格式,使得每个设备的状态展示更加直观。例如,在输出中附加引脚电压值,并确保同类设备按编号顺序输出,大大提高了用户对电路状态的理解。
4.代码模块化与可维护性:
体会到了模块化设计的重要性。将复杂的逻辑拆分为多个小方法或独立的类,不仅提高了代码的可读性和可测试性,还简化了错误排查过程。例如,创建了一个专门的工具类ElectricityUtils来集中处理所有与电压和电阻有关的计算,避免了重复代码。
5.输入处理与异常检测:
掌握了如何简化输入处理流程以及实现电流限制和短路检测等功能。通过改进输入解析方式,使用简单的字符串拆分代替正则表达式,提高了效率;同时添加了电流计算、短路检测和电流限制检查逻辑,增强了系统的健壮性。
6.单元测试的重要性:
明白了编写单元测试对于确保代码质量的关键作用。为ElectricityUtils类编写了一系列单元测试,验证了每个计算方法的正确性,保证了代码的可靠性,并为未来的修改提供了保障。
7.代码文档与注释:
认识到良好的代码文档和注释是提高代码可读性的有效手段。为关键逻辑部分添加详细的注释,帮助其他开发者快速理解代码功能,同时也便于自己日后回顾。
8.问题解决与优化策略:
在实验过程中遇到了一些挑战,比如电压和电阻计算逻辑分散的问题。通过引入统一的计算类、提取公共逻辑等措施成功解决了这些问题,进一步提升了系统的整体性能和可维护性。
综上所述,本次实验不仅加深了我对智能家居强电电路模拟系统的理解,还锻炼了我的编程技能和解决问题的能力,为今后参与更复杂的项目打下了坚实的基础。
学期总结:本学期的Java课程对我来说是一段充满挑战但也无比充实的经历。刚开始接触Java时,面对陌生的语法和概念感到有些吃力,但随着课程的推进,逐渐找到了学习的乐趣。我不仅掌握了Java的基础语法和面向对象编程的核心概念,还通过PTA和实验课程提升了问题解决能力。在学习过程中,我熟悉了开发工具与环境,初步接触了算法与数据结构,并对软件工程思想有了基本的认识,了解了需求分析、设计、编码、测试和维护等各个阶段的任务和流程。遇到困难时,也不再害怕尝试新的方法和技术,逐渐养成了独立思考的习惯,提高了解决问题的能力。展望未来,我希望能够在编程这条道路上继续前行,不断探索新技术,提升自己的专业素养。相信这次的学习经历将为我打开一扇通往更广阔世界的大门,期待在未来能够运用所学知识创造出有价值的作品,为社会贡献自己的一份力量。

浙公网安备 33010602011771号