7~~8次大作业总结
前言
没有了测试点说明,真是非常的艰难,不知道有什么情况,也不知道哪里的答案错了,就很难找,也很难做出修改。测试样例也是,数量不多,情况不多,特别是最后一次的,测试样例也没错,试了几种情况,都没错,也不知道是哪里错了,最后就不了了之了。
第七次大作业
1.知识点:新增了互斥开关,就要考虑其内部管理两个对应的接口和通路状态。需要考虑不同接口间的电阻。可以为每个接口定义电阻值,并确保在开关状态变化时正确地模拟电路中的影响。抽象出具体的写法,考虑不同情况。串联并联环环相扣,智能窗帘。遍历电路,获取信息,排序调整
7-7 家居强电电路模拟程序-3
电路嵌套,多个并联电路串联在一起的情况,一条串联电路中包含其他串联电路,这并不想我想的那么简单,需要考虑很多细节,从输入开始都要调整,确保每个电路单元能够正确接收和处理输入信号,并将输出传递给下一个级联的电路单元。还有互斥开关,开始以为和普通的开关差不多,只是多了一个引脚,后来发现比这复杂得多。新元件智能窗帘,需要从电路中获取亮度再根据亮度调整窗帘的开闭程度
class Curtain extends Device//智能窗帘
{int open=100;//打开百分比public Curtain(String id) {super(id);this.r=15;}public int calculateOutput(SeriesCircuit series1,List<ParallelCircuit> parallels) {//所有设备集合int bright = 0;//遍历所有设备集合,计算总光照强度for (Device device : series1.devices) {if (device instanceof WhiteLight) {//BWhiteLight B = (WhiteLight) device;bright = bright + B.getbright();//白炽灯的亮度} else if (device instanceof SunLight) {//RSunLight R = (SunLight) device;bright = bright + R.getbright();//白炽灯的亮度}}for (ParallelCircuit parallel : parallels) {for (SeriesCircuit series : parallel.seriesCircuits) {List<Device> devices = series.getDevices();for (Device device : devices) {if (device instanceof WhiteLight) {//BWhiteLight B = (WhiteLight) device;bright = bright + B.getbright();//白炽灯的亮度} else if (device instanceof SunLight) {//RSunLight R = (SunLight) device;bright = bright + R.getbright();//白炽灯的亮度}}}//遍历总电路和两个电路//}if (diff >= 50) {if (bright >= 0 && bright < 50)open = 100;if (bright >= 50 && bright < 100)open = 80;if (bright >= 100 && bright < 200)open = 60;if (bright >= 200 && bright < 300)open = 40;if (bright >= 300 && bright < 400)open = 20;if (bright >= 400)open = 0;}return open;}
}
第八次大作业
1.知识点
获取,输出电压,判断条件,根据电压值的不同范围或其他条件来采取不同的处理措施。根据电路的类型或功能模块,将具有相似处理逻辑的电路单元分为不同的类或组。每个类可以有自己的处理方法,以确保每个电路单元都得到适当的处理。输出特别注意格式,子类对父类方法重写,使用时多态调用简化代码逻辑。
7-1 家居强电电路模拟程序-4
二极管,只能单向流通,在设计电路时考虑二极管的导通和截止状态,以及其在电路中的位置和作用。看起来很复杂的并联串联并联,重重叠叠。这次有了电流限制,也就是错误情况,还要区分电流过载和短路。这次真是很难啊,还没有测试点说明,甚至和我的物理知识不太一样了。
class Diode extends Device{boolean state;public Diode(String id,boolean state){//二极管是否正向super(id);this.state=state;//}public void judgeMaxI(double I){if(I>8){this.MaxI=true;}}
}case 'P': {String name = pats1[0];if (pats1[1].equals("1")) {//如果二极管是正向Diode P=new Diode(name, true);P.setForward(pats1[1]);//判断是否正接seriescircuitmain.addDevices(P);//创建正向二极管} else {Diode P=new Diode(name, false);P.setForward(pats1[1]);//判断是否正接seriescircuitmain.addDevices(P);//创建反向二极管}break;}
判断电流
public void judgeMaxI(double I){if(I>14){this.MaxI=true;}}
设计与分析
7-7 家居强电电路模拟程序-3
复杂电路支持: 目前的设计主要针对串联电路,未来可扩展并联电路、桥式电路等复杂电路的支持,以提高模拟的通用性和实用性。
性能与效率: 随着电路复杂度增加,当前逐个设备遍历更新的状态计算方式可能会效率低下。优化算法,如预先计算静态部分减少实时计算负担,将是重要的改进方向
7-1 家居强电电路模拟程序-4
时间复杂度
设备管理与更新: 对于单个设备的操作,如更新状态或判断电流是否超限,时间复杂度接近O(1),因为它们主要依赖于设备自身的属性操作,不涉及循环或递归。
串联电路处理: 在SeriesCircuit类中,judgestate和devicesdiff方法的时间复杂度主要取决于串联设备的数量。遍历设备列表以判断闭合状态或计算电压电流,时间复杂度为O(n),其中n是设备数量。如果电路中包含大量设备,这部分操作可能会影响性能。
空间复杂度
对象实例: 由于每个设备都是一个独立的对象,且可能存在多个串联电路实例,空间复杂度与电路中设备总数成正比,为O(m+n),m代表不同类型的设备实例数量,n表示串联电路实例数量。对于大规模电路模拟,内存占用会随着电路复杂度增加而显著增长。
可读性与可维护性
类结构清晰: 设备基类与派生类的划分使得代码结构清晰,易于理解各部分职责。继承和多态的使用提高了代码的复用性。
方法重写: 子类中重写了父类的方法,如updateState和judgeMaxI,这种设计使得每个设备的行为逻辑得以定制化,同时也保持了代码的整洁。
注释缺失: 代码中缺乏注释,特别是在一些逻辑处理的地方,这可能会影响代码的可读性和后续维护。添加详细注释,解释类、方法的作用及关键逻辑,会极大提高代码的可维护性。
扩展性
面向对象设计: 当前设计很好地利用了面向对象的特性,为未来添加更多类型的设备或电路类型提供了良好的扩展基础。新的设备只需继承Device并实现相应逻辑即可。
电路类型限制: 当前代码主要集中在处理串联电路,若需支持并联、混联等复杂电路,还需设计相应的电路类并实现其独特逻辑,这将增加系统的复杂度。
性能考量
递归与循环: 在处理复杂电路时,若存在多级嵌套(如串联电路中包含并联电路),目前的实现方式可能需要进一步优化,避免递归或深循环导致的栈溢出或性能瓶颈。
动态规划: 对于某些复杂电路状态的预计算和缓存,可以采用动态规划等策略减少重复计算,提高运行效率。
踩坑心得
细节!!!一定要注意细节,在复杂电路设计中,确实细节至关重要。在修改代码时,不仅要关注新增的部分,还要特别注意内部的小细节,因为即使是一个小改动,也可能对整体功能产生重大影响。如果不彻底修改相关部分,可能会导致难以找到的错误。毕竟,逐行检查成百上千行的代码是一项相当痛苦的任务。还不一定能找到!
此外,在电路连接方面也要特别注意清晰度,确保电流分配和电压计算的准确性。最后,输出格式问题通常源于细微的空格或换行错误,这些细节在复杂的代码和文档中尤为常见。
这是最后一次输出的格式错误,也许是少了空格,也许是多了换行
改进建议
先设计类,再进行代码的编写
在编写代码之前,首先进行良好的类设计。良好的抽象和模块化设计有助于提高代码的可重用性和可维护性。每个类应该清晰定义其责任和行为,以便未来的扩展和修改更为简便。
类的复用性:
通过良好的类设计,可以最大化代码的复用性。这对于在复杂电路中添加新的组件或功能模块是非常有帮助的,因为你可以构建通用的接口和方法来处理不同类型的开关、电路或控制逻辑,类设计好了,对代码的复用是很有帮助的,可以为我们省很多事
系统的扩展性:
通过良好的设计和抽象,确保系统具备足够的扩展性。这意味着能够轻松添加新类型的开关、电路或控制逻辑,而不需要对现有代码进行大规模修改。
通过良好的抽象和设计,系统应具备足够的扩展性,以便轻松添加新类型的开关、电路或控制逻辑。
设计时要考虑到不同情况下的变化和需求,例如异常情况处理、动态配置和用户定制功能。
尽可能覆盖各种可能的输入情况是一种策略。通过编写多个测试用例,包括各种情况下的输入数据和预期输出
测试用例的编写:
编写多个测试用例是一种有效的策略,尤其是覆盖各种可能的输入情况。这包括正常输入、异常输入以及边界情况(如最大和最小输入值、空输入等)。通过这些测试用例,可以发现和解决代码中的潜在问题,确保系统在各种情况下的稳定性和正确性。
总结
写代码的过程让我发现,失之毫厘差之千里。这次电路的设计不仅考验大学的编程知识还考之前的物理哈哈哈,不得不让我沉睡已久的记忆复苏了。有很多东西都是想得简单,实际操作起来难,思考的时候感觉也不过如此,真正上手的时候才发现困难重重。
尽量覆盖各种可能的输入情况,包括正常输入、异常输入以及边界情况
当测试样例无法通过时,使用调试工具逐步执行代码,检查每个步骤的执行情况和结果,找出潜在的问题。
特别关注边界条件,例如最大和最小输入值、空输入等,这些情况经常是导致问题的根源。
在处理复杂电路设计时,良好的类设计、模块化编程和全面的测试策略是确保成功的关键