7-8次大作业总结
前言
这两次对我这种水平的学生来说很难写,只能搭建大致的框架和思路。
还是要对对第七和第八次大作业里所学进行一个总结,从多方面来分析这两次作业之间的联系和差异,并从中了解自己的不足与缺点。
第七次作业添加了互斥开关和窗帘,窗帘还好,只是一个简单的电路的受控设备,只需要在电路里计算整个电路的电压,但互斥开关卡了我很久很久,因为我的输入问题,在添加受控设备和控制设备及电路设备时,不是先创建电路设备,然后将控制或受控设备添加进去,导致我在创建互斥开关对象时,需要创建相同的一个对象很多次。这就导致了最后代码变得非常的混乱和复杂,并且有些地方的代码是用来凑答案的。例如算电阻时,单独用了一个if来判断互斥开关的电压,如果是互斥开关,则将电阻除以二。但在电路中有些地方会出现BUG。
第八次大作业是最难的一次,添加了很多的东西,因为前几次的迭代中的混乱的思路,导致我的代码需要对输入和输出进行大改,新的输入和输出能够很好的对前一次的互斥开关和这一次的二极管创建对象,从先创建控制和受控设备改为了先创建电路设备,然后往里面添加新创建的控制和受控设备,这样子互斥开关和二极管就只和有一个对象,代码的简洁程度也大大提高。此外,本次添加的短路测试没有多难,但这次新增的设备输出里,输出设备两端的电势以及输出电路电流是否超过设备的额定电流,这两个在我大改了我的输入及输出后,还是需要递归函数来运行,但我的电路设备中,串联和并联是两个单独的类,所以在这一次作业中,我新定义了一个抽象的电路类继承设备类,里面有设置设备电压和电流的抽象方法,再让并联类和串联类继承电路类,这样子代码的简洁性和复用性就更高了。
设计与分析
开关
开关有0和1两种状态。
开关有两个引脚,一个是输入引脚,一个是输出引脚。
当开关状态为0时,输出电位为0;当开关状态为1时,输出电位等于输入电位。
分档调速器
有多个档位,档位值从0到最大档位(如0-3档)。
每个档位的输出电位为输入电位的某个比例。
连续调速器
按位置比例得到档位参数,范围在[0.00-1.00]之间。
输出电位为档位参数乘以输入电压。
互斥开关 (MutexSwitch)
有三个引脚,一个汇总引脚,两个分支引脚。
互斥开关每次只能接通一个分支引脚,另一个分支引脚断开。
2. 受控设备
受控设备包括灯、风扇、窗帘等,通过两根引脚电压的电压差驱动设备工作。
灯
白炽灯:亮度在0-200lux之间,根据电压差变化。
日光灯:亮度固定为180lux。
风扇
吊扇和落地扇根据电压差有不同的转速范围。
窗帘
3. 电路结构
电路结构由串联和并联组成,需要根据输入信息构建电路图,并进行电压、电流和设备状态的计算
抽象设备类
由这里可知,本次作业在创建对象的代码这里问题很大,导致了下一次迭代花了近两天时间去改代码的思路和整体的结构。对于互斥开关,记录不下来每个引脚在哪一条串联电路上,这对代码的思路产生了很大的影响,导致了整体代码的复杂。例如不好判断到底哪两条含有同一互斥开关的串联电路的哪一条断开,哪一条是通路。
次代码中在排序中添加了字母P,以及新增了二极管类,还有所有电路设备的的构造方法不在只有一个名字id参数,新增了引脚参数,以便于在设置电路设备两端的电势电压时,能够在最后正确输出。在本次迭代中将之前几次迭代里main函数中的输入和输出全部修改,之前的输入和输出方式不能够完成本次作业,所以我花费了大量时间在修改之前的代码上。
踩坑心得
在7-1 家居强电电路模拟程序-3中还改变了输入信息的方法,所以正则表达式也要所有改变,而要注意的是输入的信息中有可能是一整个的串联电路
if(Tgroup_M.group(4).equals("T")){
for(Integer i:seriesCircuits.keySet()){
if((Tgroup_M.group(4)+Tgroup_M.group(5)).equals(seriesCircuits.get(i).getName())){
seriesCircuit.getCircuitEquipments().add(seriesCircuits.get(i));
}
}
}
所以在进行总的电路的分压的时候还要考虑对串联电路这个特殊设备的分压
for(int i=0;i<seriesCircuits.get(seriesCircuits.size()).getCircuitEquipments().size();i++){
seriesCircuits.get(seriesCircuits.size()).getCircuitEquipments().get(i).setVoltage(seriesCircuits.get(seriesCircuits.size()).getCircuitEquipments().get(0).outputVoltage()*(seriesCircuits.get(seriesCircuits.size()).getCircuitEquipments().get(i).getResistance()/seriesCircuits.get(seriesCircuits.size()).getResistance()));
seriesCircuits.get(seriesCircuits.size()).getCircuitEquipments().get(i).Distribute();
}
迭代的难度不是阶梯式的,而是跨越式的,当上一次代码没有打好基底而勉强通过时,大概率会使这个源码无法用于下次,此时及时更改源码重写远比硬改要好得多,否则第三次迭代会让你根本无从下手。
改进建议
代码风格和结构优化:
确保代码缩进和格式统一,增加代码的可读性。
为类、方法和变量取有意义的名称,以提高代码可理解性。
将不同功能的代码块拆分成更小的方法,以提高代码的模块化和可维护性。
添加必要的注释来解释代码的作用和实现细节。
在这几次大作业中我认为可以对代码的格式进行进一步的美化,提高可读性。
异常处理:
在这几次大作业中,可以在几个关键位置添加异常处理来增强代码的健壮性:
文件读取:在读取输入文件或其他外部资源时,可能会发生文件不存在、权限问题或其他读取错误。可以使用try-catch块来捕获这些异常,并进行适当的处理,例如输出错误消息或采取默认行为。
格式判断:在第四次大作业bolformat方法中进行格式判断时,如果正则表达式匹配失败,可能会抛出异常。可以在try-catch块中捕获这些异常,并处理格式错误的情况,例如记录错误信息或提示用户重新输入。
数据处理:在处理数据时,可能会遇到各种异常情况,都可以进行相应的异常处理。
通过在关键位置添加异常处理,可以更好地处理各种异常情况,提高代码的稳定性和可靠性。同时,根据实际需求,可以自定义异常类来更具体地处理不同类型的异常情况。
3. 代码注释:
添加更多的代码注释,以解释代码的功能和逻辑。这将有助于提高代码的可读性和可维护性。
4. 命名规范:
遵循一致的命名规范,使代码更易于理解。例如,类名使用大写字母开头,方法名使用小写字母开头,变量名使用有意义的名称等。
总结
在这几次的大作业中,我可以学到以下几个方面的知识和技能:
面向对象编程(OOP):代码中使用了类和对象以及继承和多态,体现了 OOP 的思想。通过定义类和创建对象,可以更好地组织和管理代码,提高代码的可读性和可维护性。
数据结构和算法:代码中使用了各种数据结构,如ArrayList来存储问题、试卷和答案等。同时,还使用了一些算法来处理和操作这些数据,如遍历ArrayList、查找匹配的问题等。
文件操作:代码中通过读取文件来获取输入数据,并将处理后的数据写入文件。这涉及到文件的打开、读取、关闭等操作,以及对文件内容的解析和处理。
异常处理:代码中使用了异常处理机制来处理可能出现的错误情况,如文件读取错误、格式错误等。通过捕获和处理异常,可以使程序更加健壮和可靠。
代码组织和模块化:代码将不同的功能模块封装在不同的类中,如Sca类用于格式判断,Data类用于数据存储等。这种模块化的代码组织方式有助于提高代码的可读性和可维护性。
设计模式:虽然代码中没有明显使用设计模式,但可以从中体会到一些设计原则,如单一职责原则、开闭原则等。通过合理地设计类和方法,使得代码更加灵活和易于扩展。
数据处理和逻辑判断:代码需要对输入的数据进行处理和判断,如判断格式是否正确、将数据分类存储等。这涉及到对数据的解析、逻辑判断和处理能力。
测试和调试:在实际开发中,测试和调试是非常重要的环节。通过对代码进行测试,可以发现潜在的问题并及时修复,确保代码的正确性和稳定性。
总之,这几次的大作业涵盖了多个方面的知识和技能,通过学习和理解,可以提升自己的编程能力和解决问题的能力。同时,也可以根据实际需求对代码进行改进和扩展,以满足更多的功能需求。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)