Java题目集7~8
1.前言
本次博客围绕题目集7-8展开讨论,从基础的电路设备行为模拟出发,逐步扩展到复杂的电路连接、异常检测与状态输出,具体包括以下知识点
知识点总结
控制设备
1.开关:
两个引脚,状态为0或1,控制电路的通断。
可作为基本的电路单元,提供电压传导或切断功能。
2.互斥开关:
三个引脚,支持分支切换,状态在两个引脚间切换。
默认状态接通其中一个分支,断开另一个分支,引入了限流电阻以避免短路。
3.调速器:
分档调速器:以固定比例输出电压,支持0.3、0.6、0.9三档。
连续调速器:支持0.00-1.00范围内任意比例输出,模拟精确的电压控制。
受控设备
1.灯具:
白炽灯:亮度随电压差线性变化。
日光灯:亮度固定180lux,电压差非零即亮。
2.风扇:
吊扇和落地扇:根据不同电压范围调整转速,支持非线性和分段式控制。
3.窗帘:
根据光照强度调整开合比例,最低工作电压为50V。
4.新增设备:二极管:
支持正向导通和反向截止,增加了电路中单向导通的特性。
电路结构
1.从单一串联电路到复杂的串并联混合电路。
2.题目集8新增并联电路的嵌套功能,使电路结构更为复杂。
异常处理
1.电流限制:设备超出最大电流时输出提示。
短路检测:当出现无穷大电流时终止仿真,并输出错误信息。
题目集7:多个并联电路串联 - 串联电路包含其他串联电路 - 受控窗帘设备,主要是实现电路拓扑结构的基本功能,功能相对分散,逻辑复杂度中等,重点是掌握面向对象设计和电路算法。
题目集8:管脚电压显示 - 电流限制检测 - 短路检测 - 并联电路嵌套 - 二极管元件,进一步增强电路模型,加入电路保护和状态监控,设备种类更多,逻辑复杂度和代码量均大幅增加,测试用例更加多样化。
题目集7主要新增特性:
电路结构升级
支持多个并联电路串联
允许串联电路包含其他串联电路
复杂的电路拓扑结构处理
设备类型扩展
新增受控窗帘设备
窗帘控制逻辑与光照强度关联
多设备状态联动处理
计算逻辑完善
考虑电阻对电压的影响
引入并联支路电流计算
设备功率与效率计算
题目集8更进一步提升了难度:
监控与显示
管脚电压实时监测
设备状态全面展示
异常状态报警提示
保护机制
电流限制检测
短路保护
设备过载保护
新增功能
并联电路嵌套支持
二极管元件及其特性
复杂的电路状态处理
2.设计与分析
以题目集8为例进行详细分析
2.1 抽象设备基类
abstract static class Device {
String id;
double[] voltages;
double maxCurrent;
double current;
abstract String getStatus();
abstract void simulate();
}
使用抽象类定义通用属性和行为
电压使用数组存储,支持多引脚设备
统一的电流限制检查机制
2.2 设备状态模拟
以开关设备为例:
static class Switch extends Device {
boolean state;
@Override
void simulate() {
if (!state) {
voltages[1] = 0;
current = 0;
} else {
voltages[1] = voltages[0];
current = Math.abs(voltages[0] - voltages[1]) / 1;
}
}
}
实现特点:
状态转换逻辑清晰
电压和电流计算符合物理规律
错误状态处理完善
2.3电路管理实现
Circuit类负责整个电路的管理:
static class Circuit {
Map<String, Device> devices = new HashMap<>();
List<String[]> connections = new ArrayList<>();
void simulate() {
if (checkForShortCircuit()) {
shortCircuit = true;
return;
}
// 电压分配
distributeVoltages();
// 设备模拟
simulateDevices();
}
}
核心功能:设备管理,连接关系维护,短路检测,电压分配状态模拟。
2.4基类设计
Device作为抽象基类:
封装了设备的基本属性(id, voltages, current等)
定义了两个核心抽象方法:getStatus()和simulate()
提供了电流限制检查机制
2.5 继承体系
三个具体设备类通过继承实现差异化:
Switch:实现开关状态切换
WhiteLightBulb:实现亮度计算
Diode:实现导通/截止状态判断
2.6改进空间:缺少输入验证,电路计算可以更精确,并发处理能力有限,注释可以更详细。
3.采坑心得
- 短路检测问题
问题描述:初始版本在处理复杂电路时出现误判
原始代码:
boolean checkForShortCircuit() {
for (String[] connection : connections) {
if (connection.contains("VCC") && connection.contains("GND")) {
return true;
}
}
return false;
}
测试用例:
Input:
K1
L1
T[K1-1 VCC]
T[K1-2 L1-1]
T[L1-2 GND]
错误输出:short circuit error
预期输出:正常电路状态
修复后代码:
boolean checkForShortCircuit() {
// 构建连接图
Map<String, Set
// 深度优先搜索检测VCC到GND的直接路径
return hasDirectPath(graph, "VCC", "GND", new HashSet<>());
}
- 电流计算精度问题
问题描述:浮点数计算导致电流值误差
原始代码:
current = Math.abs(voltages[0] - voltages[1]) / resistance;
测试结果
输入电压:220V
计算电流:9.000000001A
电流限制:9A
错误触发电流保护
修复方案:
current = Math.round(Math.abs(voltages[0] - voltages[1]) / resistance * 1000) / 1000.0;
4.改进建议
(1) 改进短路检测机制
当前的短路检测过于简单,容易出现误判
增加节点访问记录,避免环路导致的死循环
添加电流阈值判断,提高检测准确性
(2) 优化电压分配算法
使用并查集合并相同电压节点,提高计算效率
采用BigDecimal处理浮点数计算,避免精度损失
增加电压分配的迭代次数限制,防止震荡
添加关键节点电压验证,确保计算结果合理
(3) 错误处理机制
细化异常类型,区分短路、过载等故障
增加详细的错误信息描述
添加关键操作的日志记录
实现基本的故障诊断功能
(4) 参数验证
增加设备参数范围检查
验证电路连接的合法性
检查电压/电流值的有效性
添加配置参数校验
5.总结
这次我做了两个关于智能家居电路模拟的作业(7和8),通过这两个作业,我不仅学会了面向对象编程的基本思路,也发现了自己在处理复杂系统时的一些不足。
在第一个作业(7)中,我尝试用面向对象的方法来模拟家里的电路系统。我把电路中的各种设备(比如开关、电灯)都设计成了独立的类,实现了最基础的串联电路模拟。但这个版本还比较简单,只能处理基本的开关控制,而且设备种类太少,不能反映真实家庭电路的复杂情况。做完这个作业后,我意识到要真正模拟家里的电路,还需要学习更多的电路知识和编程技巧。
在第二个作业(8)中,我给系统加入了更多功能,比如可以处理并联电路,还增加了风扇这样的复杂设备。我用递归的方法解决了电路嵌套的问题,但在处理并联电路时遇到了不少困难,比如不知道该如何准确计算电流分配,也没能很好地处理设备启动时的电流冲击等问题。这些问题让我明白,要做好这样的系统,不仅要懂编程,还要对电路原理有更深入的了解。
通过这两个作业,我学会了如何把复杂的问题拆分成小问题来解决,也理解了面向对象编程在实际项目中的应用。不过我也发现自己还有很多需要提升的地方,比如需要学习更多的设计模式,提高算法水平,特别是要多了解电路知识。未来我打算多学习这些内容,争取能写出更实用、更完善的程序。
标签:短路,voltages,BLOG,电路,电压,电流,设备 From: https://www.cnblogs.com/pppt/p/18637654