题目集7~8总结与分析

news/2024/12/28 17:59:04/文章来源:https://www.cnblogs.com/dazaomengjia/p/18636844

一.题目集七,7-1 家居强电电路模拟程序-3
1.前言
知识点考查和难度:
本题在上次迭代基础上增加了互斥开关和受控窗帘,以及电路的多并联。主要难度体现在互斥开关的引脚问题和通断特性。
更综合考查对设备的开关理解,和电路的逻辑结构。以及对电路设备的建立方式有些许的不同,加强了设备间的交互性。

2.设计分析
由于互斥开关相较于前几次的控制设备来说,互斥开关特点在于它有两个引脚用来控制两条分路。切换状态时不仅要切换原有闭合的电路中状态,还要切换另一个引脚的通路。为此,我设计互斥开关类有自己的独立引脚。对互斥开关设备的建立也做了独特的处理。检测建立时的引脚,并通过引脚区分互斥开关设备。然后也可以根据是否切换状态,来匹配建立时的引脚达到控制分路通断的作用。

受控窗帘部分,受控窗帘作为受控设备来说,它与灯设备有了交互。它受光照的影响来控制窗帘的开放。为此,我设计受控窗帘前需要在电路中新增计算总亮度的函数。在设备列表中查询灯设备的建立,并获取灯设备的状态。随后得到总亮度。受控窗帘更新状态时则需要获取计算的总亮度,根据不同的亮度挡位得到不同的开放量。
并联电路里有串联电路这个迭代点则需要我们在创建并联电路设备时向里面添加串联电路设备。与之前代码的逻辑结构大体相同,所以并没有做过多的设计修改。

总类图如下:

该程序的时序图如下:

3.踩坑心得
在计算受控窗帘的设备状态时总是得到错误的计算结果。

于是我从设备的电压开始检验。用简单的串联电路进行测试。发现并没有问题。电压没有问题,于是考虑光照,经过计算光照结果,发现是光照的问题。这里的错误在于我是按设备建立顺序逐步更新设备的状态。但电路中受控窗帘收到光照的影响。所以我必须先将电路里的总光照先进行更新其次再对受控窗帘进行更新。

点击查看代码
private double getTotalLightIntensity() {double totalIntensity = 0;for (Device device : devices.values()) {if (device instanceof LightBulb) {LightBulb lightBulb = (LightBulb) device;double brightness = Double.parseDouble(lightBulb.getState()); // 将字符串表示的亮度转换为数值totalIntensity += brightness;} else if (device instanceof FluorescentLight) {FluorescentLight fluorescentLight = (FluorescentLight) device;double brightness = Double.parseDouble(fluorescentLight.getState());totalIntensity += brightness;}}return totalIntensity;}
做完上述更新顺序优先级后,可得正确的受控窗帘状态。

互斥开关问题。我最开始的设计思路是把互斥开关引脚12,引脚13作为两个不同名的设备。发现这与我代码中的输入信息就有冲突了。然后转变思路同一设备名但是用不同的引脚信息来区分。
其次是互斥开关开断问题。一开始的设计思路只能处理开关样式,我一直搞不通如何切换另一个引脚的联通状态。经过和同学的讨论我才用判断方法。建立或者改变互斥开关的状态时,去获取建立时的引脚信息,根据引脚信息和状态是否一致来更新自己的电阻状态和通路状态。问题得以解决。

点击查看代码
public boolean tonglu(){if (state){if("1".equals(yinjiao1) && "2".equals(yinjiao2) || "2".equals(yinjiao1) && "1".equals(yinjiao2)){setResistance("1","2");return true;}}else if(!state){if("1".equals(yinjiao1) && "3".equals(yinjiao2) || "3".equals(yinjiao1) && "1".equals(yinjiao2)){setResistance("1","3");return true;}}return false;}

4.改进思路
为了判断电路的联通,我在组建电路完成后寻找每个开关设备的状态,并一步步寻找是否闭合或断开然后统计电路的开路情况。但是每次这样循环遍历的操作十分需要资源。
设想是否可以在调用控制设备状态时做好标记,然后根据标记直接判断电路联通状态。

二.题目集八,7-1 家居强电电路模拟程序-4
1.前言
知识点考查和难度:
本题在上次迭代基础上增加了二极管,以及电路的多并联(并联包含并联)。并且需要输出各设备的各个引脚状态。还新增了电流限额,超过电流限额不工作。主要难度体现在引脚问题和并联嵌套电路的处理,以及限额电流的计算。

2.设计分析
对于每个电器类(如开关、分档调速器、白炽灯等),需要新增一个数据结构来存储管脚电压信息。
在每个电器类中新增一个属性 maxCurrent,用于存储该电器的最大限定电流。根据题目中给出的各类电器最大限定电流,在电器类的初始化或构造函数中设置相应的 maxCurrent 值。
短路检测应在其他功能(如管脚电压显示、电流限制检查等)之前进行,一旦检测到短路,立即终止后续的计算和输出流程,以确保程序的正确性和效率。
原有的电路数据结构可能需要进行扩展,以支持并联电路中包含并联电路的情况。
创建一个新的 Diode 类来表示二极管元件,继承自通用的电器元件基类,在电路计算过程中,根据二极管两端的电压和电流方向来确定其导通 / 截止状态,并设置相应的电阻值。
如果电流从左至右流过(即 pin1 电压大于 pin2 电压),将 state 设置为 "conduction",电阻设置为 0;如果电流从右至左流动(即 pin2 电压大于 pin1 电压),将 state 设置为 "cutoff",电阻设置为无穷大

设计类图如下:

时序图如下:

3.踩坑心得
短路检测问题:
短路判断条件的准确性,在电路中,短路由于多种原因引起的,如导线直接连接、电器内部故障等,准确判断短路情况可能比较困难,尤其是在复杂电路中,出现误判或漏判的情况。
当检测到短路时,需要及时停止后续的计算和输出操作,以避免不必要的计算和可能出现的错误。但这可能会导致程序流程的突然中断,可能会影响程序的稳定性和可维护性。
我的短路检测样例就没有全部通过,经过对整个电路每条分路一步步判断才找出未判断的短路情况。非常的麻烦。所以我感觉我需要对电路连接优化一下代码。

点击查看代码
 if(!manager.getshortdevice()){System.out.println(manager.getStatus());}else {System.out.println("short circuit error");}

并联电路中包含并联问题:
嵌套的并联和串联电路数据结构可能会变得非常复杂,导致代码的可读性和可维护性降低。在处理这种复杂数据结构时,容易出现索引错误、数据访问错误等问题。
我一开始没有考虑到并联中还有并联而无穷之。单纯就是循环嵌套的去处理,导致错误。
解决:
需要将计算电阻的函数进行封装,然后采用递归的方法进行计算,递归地处理嵌套的电路结构。

4.改进思路:
整体架构与设计
模块化设计:
将电路计算、电器元件类、输出显示等功能进一步模块化。例如,创建专门的模块来处理电路的拓扑结构分析、电学参数计算、二极管状态处理、错误检测(短路、电流超限等)以及输出格式化等。这样可以使代码结构更加清晰,每个模块职责明确,便于维护和扩展。
对于复杂的电路计算算法,可以考虑使用设计模式,如策略模式来处理不同类型的电路计算(串联、并联、包含二极管的电路等),使得代码更具灵活性和可扩展性。

数据结构与算法
优化数据结构:
对于表示电路的数据结构,可以考虑使用图数据结构(如邻接表或邻接矩阵)来更直观地表示电路元件之间的连接关系,特别是对于复杂的并联嵌套电路。这样可以方便地进行电路的遍历和分析,提高计算效率和准确性。
在存储电器元件的属性时,除了基本的数值类型,可以使用枚举类型来表示一些状态信息,如二极管的导通 / 截止状态、电器的工作状态等,这样可以提高代码的可读性和可维护性,同时减少因状态表示不一致导致的错误。

三.总结
本次博客是最后一次,整个大作业也结束了。对于本次大作业我觉得我有很多不足,首先是功能不能够达到测试点的要求,得分不高。表示我的代码逻辑能力和水平都有很多不足,需要我多学习多练习进行弥补。其次是代码设计问题。在课堂上学习过很多设计模式方法,但是我在设计过程中总是从功能出发,没有考虑设计性。导致每次代码迭代需要修改很多甚至是推倒重来。
整个电路系统按照功能划分为多个层次和模块。最底层是电器元件类,负责自身属性和行为的定义;往上一层是电路连接与计算模块,专注于处理电路的拓扑结构分析、电学参数计算等核心逻辑;再往上是用户交互与输出模块,负责接收用户输入的电路信息、展示计算结果以及错误提示等。
这种分层架构使得各层之间职责分明,降低了耦合度。当修改底层电器元件的实现细节,如优化二极管的导通截止判断算法时,只要接口保持不变,上层的电路计算和用户交互模块几乎不需要改动。模块化开发同样功不可没,将不同的功能封装在独立的 Java 包中,例如 device 包存放电器元件类,circuit 包负责电路相关逻辑,ui 包处理用户界面交互。每个包内的类协同工作,对外提供统一的功能接口,方便团队协作开发,不同成员可以专注于不同模块,减少代码冲突,提高开发效率。我想我需要学习这样的思想与眼光。在解决一些复杂问题时,我需要设计模式提供优雅的解决方案。
此次大作业是一次理论与实践深度结合的宝贵经历。通过运用 Java 设计方法构建电路系统,不仅让我使用了面向对象编程、数据结构与算法、设计模式等核心技术在实际项目中的应用,更培养了自己从软件架构层面思考问题、解决问题的能力。
展望未来,我意识到还有很多可以改进的空间。在代码质量上,可以进一步引入代码静态分析工具,查找潜在的代码异味和错误,持续优化代码结构;在功能拓展方面,考虑结合图形化界面库,为用户提供更加直观、便捷的设计与分析工具;在性能优化上,不断提升先进性。
总之,这次大作业为我打开了一扇通往软件设计的大门,让我在编程道路上迈出了坚实的一大步,也为今后的学习和研究积累了丰富的经验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/860465.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再战博客园美化(七)

上回说到。。。我的博客总算有了一个亮色一个暗色主题可以切换了 里面也有一个forFlow?找不到文章列表,没有进行替换。 也行吧,以后再修,先埋雷先,反正我不是专业前端。(能跑不动原则) 今天玩——背景图!欧,不,丑死了。白天黑夜的图片需要不同 卡片半透明磨砂 标头、…

宋词300首获取

宋词三百首获取 近来一段时间无聊,突然被古诗词吸引,之后就有了后续的一系列操作 作为计算机专业,对于批量获取内容肯定首选🕷(仅供个人学习) 首先要有个目标,去哪个网站获取数据,这里就选择了页面简化的唐诗宋词.这里选择里面的宋词分支就好了 通过调用F12控制台会发现所有的…

416_前端工程化精讲

416_前端工程化精讲 //合并文档ds script 4357 || 已发布 || 开篇词 | 建立上帝视角,全面系统掌握前端效率工程化 || d6b0ec03a4374536a361909923c61bee 从事前端开发十余年 曾先后在多家大型互联网公司从事前端架构工作 讲师:李思嘉 贝壳找房前端架构组任资深工程师,…

java三阶段总结(家用电路模拟)

前言第六次题目集知识点:抽象类,抽象类不能被直接实例化!有抽象方法,抽象方法没有方法体,由继承它的子类提供具体实现。抽象类可以看作是一种模板,子类在实现接口方法时,必须实现接口中的所有抽象方法,除非子类也是抽象类在抽象类和接口中,多态体现为父类引用变量可以…

Material Design风格纯js确认框和对话框插件

material-modal是一款Material Design风格纯js确认框和对话框插件。该插件通过简单的CSS和JavaScript代码来构建确认框和对话框,是替代浏览器原生确认框和对话框的不错选择。在线预览 下载使用方法 在页面中引入material-modal.css和material-modal.js文件。< link rel=&…

PTA家居电路模拟3到家居模拟电路4

目录 一、答题判题程序第四次迭代 1、题目分析 2、题目类图 3、题目时序图 4、题目思路 二、家居强电电路模拟程序第一次迭代 1、题目分析 2、题目类图 3、题目时序图 4、题目思路 三、家居强电电路模拟程序第二次迭代 1、题目分析 2、题目类图 3、题目时序图 4、题目思路 四、…

Java难绷知识01——IO流的对象流

Java难绷知识01之对象流 本篇文章会探讨一些JavaIO流中比较容易被忽视的对象流,而且会相对的探讨其中的一些细节 其中对于对象流的操作讲解会少一些,主要讨论的是一些细节 在 Java IO 流中,对象流(ObjectInputStream对象输入流 和 ObjectOutputStream对象输出流)用于将对象…

题目集7-8总结

前言题目集的知识点、题量、难度 1.知识点总结:类的定义与实例化: 概念:定义类的属性和方法,创建对象 示例:public class Device { private String id; } 应用:定义各种电气设备类并创建实例继承关系: 概念:子类继承父类特征 示例:class Switch extends Device 应用:所…

Rust和C/C++相关调用总结

一.Windows下Rust与C/C++互相调用 1.C/C++调用rust 1.1动态库调用 1.1.1以LoadLibrary方式显示调用 add.rs #[no_mangle] // 防止 Rust 修改函数名 pub extern "C" fn hello_world() {println!("Hello from Rust!"); }#[no_mangle] pub extern "C&quo…

24.11.20 磁盘管理

磁盘外部结构 磁盘分类:固态硬盘:内部是主板和U盘类似机械硬盘:盘片 主轴 传动手臂 做机械运动 类似DVDNvme硬盘 PCI-E接口大小分类:3.5英寸:台式机2.5英寸:服务器 笔记本接口类型:IDE接口 # 淘汰SCSI接口 # 淘汰SATA接口 # 台式机 笔记本SAS接口 # 企业服务器标配固…

Julia疑难杂症专栏 | 安装问题汇总及其解决方案,从环境配置到结果验证,深度学习、科学计算、数据处理、大模型、并行处理,让你的代码飞起来

1. 下载慢的问题 使用端口问题 2. 下载慢的问题 ,设置镜像源加快速度 3. 一般的安装问题 4. STATA+julia 5. Vscode+julia 6. Jupyter+julia 7. Julia引入PyCall或者PyPlot报错卡顿 8. 彻底删除包的方法 9. Pkg.add("某个包")出现权限问题 permission denied (EACCE…

再战博客园美化(六)

连续剧更新了佬提了一嘴,于是我发现我替换没替换完,现在好了。 这是什么bug明明存在forFlow,但是不让我查询? 弄错了,用.就好light dark回来了,vue没有检查我默认有没有赋值,他只会自己贴一个上去。 算了,那就用vue的切换!不会吧。 在call后出现已被定义,有问题。被重…