一、前言:
这两次的PTA作业第一次是以前两次家居强电电路模拟程序为基础所扩展的,在上一次作业的基础上增加了一个新的互斥开关,互斥开关的电路符号为H,其12引脚之间电阻为5欧,13引脚之间电阻为10欧,还增加了一个新的受控窗帘,受控窗帘的电路符号为S,窗帘电阻为15欧,其最低工作电压为50V,电压达到或超过50V,窗帘即可正常工作,不考虑室外光照强度和室内空间大小等因素,窗帘受室内灯光的光照强度控制,且本次迭代考虑多个并联电路串联在一起的情况,对于加入新的受控设备以及互斥开关,难度不大,但考虑多个并联电路需要画更长时间去思考如何正确的计算电流以及电压。
第二次作业在第一次作业的基础上增加管脚电压的显示,在输出每个电器的状态信息后,再依次输出该电器每个管脚的电压。电流限制,电器在工作时,过大的电流会引起电器过热,从而烧坏电路。本次迭代,每个元器件都有最大电流的设置,当实时电流超过最大电流时,在该电器输出信息的最后加入提示“exceeding current limit error”,与前面的信息之间用英文空格分隔。最大限定电流如下:开关20、分档调速器18、连续调速器18、白炽灯9、日光灯5、吊扇12、落地扇14、互斥开关20、受控窗帘12、二极管8。短路检测:如果电路出现无穷大的电流造成短路,所有元器件信息不输出,仅输出提示“short circuit error”,增加二极管元件,其电路特性为:正向导通,反向截止;其电器符号如图4所示,当电流从左至右流过时,二极管导通”conduction”,电阻为0;电流从右至左流动时,二极管截止”cutoff”,电阻无穷大,相当于开关打开。并联电路中包含并联:本次迭代考虑并联电路中包含并联电路的情况,即构成并联电路的串联电路可以包含别的并联电路。例如如下输入的电路,并联电路M2的其中一条串联电路T4中包含了另一条并联电路M1:难度直接飙升。
总体来说这最后两次的作业非常难,再加上前面前两次的代码适用性没有那么强,最后两次迭代使我写起来困难重重,步履维艰,一方面虽然老师提示可以采用递归去完成代码,我虽然理解到了老师的意思,但下起手来还是感觉无从下手,另一方面写这样逻辑性比较强的代码,我需要画长时间不被打断去完成,但又临近期末又要准备复习,付出的时间也没有那么多。所以对于这两次作业,我完成的十分不理想。
二、设计与分析
7-1 家居强电电路模拟程序-3
对于这次的大作业需要添加一个互斥开关互斥开关:
互斥开关有3个引脚:1个是汇总引脚,另两个是分支引脚。
开关电路示意图如图1所示,左边是汇总引脚,编号为1;右边两个是分支引脚,右上的输出引脚为2,右下输出引脚为3。图中1、2、3引脚均可以是输入引脚,当1为输入引脚时,2、3引脚为输出引脚;1为输出引脚时,2、3引脚为输入引脚。
互斥开关只有两种状态:开关接往上面的2号引脚、接往下面的3号引脚。开关每次只能接通其中一个分支引脚,而另一个分支引脚处于断开状态。
互斥开关的默认状态为1、2引脚接通,1、3引脚断开。
互斥开关类:
点击查看代码
class MutuallyExclusiveSwitch extends Electric {
private boolean connectedToTop; // 当前是否连接到上方引脚
public MutuallyExclusiveSwitch(String id) {
super("H",id);
this.connectedToTop = true; // 默认连接到上方引脚
}
@Override
public int getResistance() {
return (int) (connectedToTop ? 5 : 10);
}
public void toggle() {
connectedToTop = !connectedToTop;
}
public String getOfopen() {
return connectedToTop ? "closed" : "turned on";
}
public void reshuV(double shuop) {
if (getOfopen().equals("turned on")) {
setShuV(0);
} else if (getOfopen().equals("closed")) {
setShuV(shuop);
}
}
}
当电路中所有灯光的光照强度总和在[0,50)lux范围内,窗帘全开;
在[50,100)lux范围内,窗帘打开比例为0.8;
在[100,200)lux范围内,窗帘打开比例为0.6;
在[200,300)lux范围内,窗帘打开比例为0.4;
在[300,400)lux范围内,窗帘打开比例为0.2;
在400lux及以上范围内,窗帘关闭。
当电压低于50V,窗帘不工作,默认为全开状态。
如果电路中没有灯或者灯全部关闭,光照强度为0,窗帘处于全开状态。
为了更好加入窗帘受控设备,设置一个接收光照强度的类来管理窗帘打开比例
点击查看代码
// 用于管理所有灯的光照强度
class LightIntensityManager {
private static List<Double> lightIntensities = new ArrayList<>();
// 添加一个新的光照强度到列表中
public static void addLightIntensity(double intensity) {
lightIntensities.add(intensity);
}
// 更新指定光照强度
public static void updateLightIntensity(double oldIntensity, double newIntensity) {
int index = lightIntensities.indexOf(oldIntensity);
if (index != -1) {
lightIntensities.set(index, newIntensity);
}
}
// 获取所有光照强度的总和
public static double getTotalLightIntensity() {
return lightIntensities.stream().mapToDouble(Double::doubleValue).sum();
}
}
点击查看代码
class chuanglian extends Electric {//窗帘
public chuanglian(String id) {
super("S", id);
}
public void print() {
double light = LightIntensityManager.getTotalLightIntensity();
int a=0;
if(getShuV()<50){
a=100;
}
else{
if(light<50)
a=100;
else if (light<100&&light >= 50)
a=80;
else if(light<200&&light>=100)
a=60;
else if(light<300&&light>=200)
a=40;
else if(light>=400)
a=0;
}
System.out.printf("@S%s:%d", getId(), a);
System.out.println("%");
}
public void reshuV(double shuop) {
setShuV(shuop);
}
}
下面是时序图
7-1 家居强电电路模拟程序-4
对于最后一次大作业我写起来非常困难,几乎不怎么会写,相比与前几次,这种特殊情况更加的复杂,需要考虑线路之间电压的多重传递,难度骤然加大;除此以外,新增的需求输出管脚电压也很麻烦,由于之前没有考虑到出现这种需求,因此并未设置一种用于记录电压在各个管脚之间变化的参数和方法,警告判断方面还是比较好处理,
由于没有写出什么就只是增加了二极管以及引脚类,但引脚类写的不是很切合题意就不展示代码了,类图和时序图与前面的类似。
下面是类图
下面是时序图
三、采坑心得:
1.写代码需要多写注释
由于我对Java编程能力没有那么强,每次完成大作业的最后一题都要花费长时间,通常不能够一次完成作业,都需要花费好几天,这个过程写注释就非常需要了,通常调侃说:不写注释的代码只有自己本人和上帝看得懂。但只要三天后就只有上帝看到的懂了。这句话虽然有点玄学,但确实是编程人的实际情况,每次我写写代码把战线拉长的时候,一旦忘了写注释就一朝回到解放前,又要重新开始捋捋思路。也会浪费长时间,导致代码不连贯,最好还是能够一口气将代码完成。写注释的时候最好的是能将每一个变量的作用,每一个方法的作用,每一个代码块的作用都要给出注释,因为当代码量大起来后,你可以通过注释去了解过去的自己写这些代码的目的,而不用去逐条逐条的看代码,逐条逐条看代码是非常恐怖了。所以写代码加注释是非常重要的。
2.画一下顺序图与类图的必要性
画顺序图能帮助我们更好理清思路,你写代码的时候可以先构造一个大概的框架,便于你进行逻辑理解,然后在这个框架的基础上进行画顺序图,通过画顺序图的过程能够发现很多自己欠缺 考虑的方面,能让自己对框架逐渐完善,对于程序流转步骤会有更加清晰,有利于编写代码。然后再通过顺序图完成相应的类图,最后进行编写代码。虽然画顺序图和类图会比较花费时间,但如果时间充足的话,能对自己写代码有很好的帮助。
3.审题不仔细,第三次大作业是考虑了多个并联电路的情况,我开始没有仔细审题没看见,导致提交对于多并联情况测试点一直不通过
4.要留有足够的修改空间,后续新功能加入困难
在最后一次的大作业中需要加入的管脚电压,由于没有考虑过并且函数设计相对死板,没法直接加入计算的方法,只能修修补补才勉强实现管脚电压的计算,并且在管脚电压的计算中还会出错。而上一次由于考虑了并联电路的情况,因此在家居强电电路模拟-3中就可以简单修改后即可实现功能。在今后的代码设计中,也要充分考虑未来新需求增加的可能性,实现功能的随时增加。
四、改进建议:
1.由于每次的大作业都需要加以修改,因此有部分的代码可能原先有用,而修改后该方法可能不再被使用或者方法被修改后不再适用原来的用法,会导致思路突然的中断。当这种情况发生时,原先精心设计的类结构、实现的方法可能在新的需求下变得冗余或过时。这种突然的变化不仅会影响我们的编写效率,还可能导致代码质量的下降,增加维护成本。为了应对这种情况,我需要培养良好的代码管理和重构习惯。保持代码的模块化设计,确保每个模块都有清晰的职责和边界。这样,在需要修改或删除某个功能时,我们可以只关注相关模块,减少对其他部分的影响。
2.家居强电电路模拟程序是全新的题目类型,其大量涉及到继承和多态的应用,而我对于这方面的使用还不熟练,致使代码中含有大量冗杂的部分,不便于后续修改。后续应当合理地设计类结构,有效地利用这些特性来简化代码、提高代码的可读性和可维护性。减少我的代码中充满了冗杂的部分,方便阅读,更难以进行后续的修改和扩展。
3.对于我设计的类,他们之间的关系没有设计清楚,我应该根据给出迭代的最终电路重新设计,考虑好电路之间的连接关系,以及更新设备的状态,运用OOP的设计模式来实现我的代码。对于电路系统-3和4要改进Main类中几个方法处理数据的情况以及正确打印设备状态信息的代码。
五、总结:
本次实验旨在模拟家庭电路中各种控制设备和受控设备的运作,包括开关、分档调速器、连续调速器、互斥开关、白炽灯、日光灯、吊扇、落地扇以及受控窗帘。实验要求我们理解这些组件的工作原理,并通过编程实现对它们状态或参数的调整。此外,实验还引入了二极管元件,增加了电流限制和短路检测等功能,以确保电路的安全性和可靠性。
实验不仅涉及多个类型的控制设备,还包括复杂的串联和并联电路配置。特别是当并联电路中包含其他并联电路时,分析电路变得异常复杂。对于初次接触这类问题的我感觉好难,逻辑总是理不顺,写代码磕磕绊绊,理解和处理这样的多层嵌套结构是一个巨大的挑战。虽然理论上理解了各个组件的功能,但在实际编写代码去控制这些组件的状态时,发现很多细节并不如想象中那么简单。例如,如何准确地计算每个节点的电压值,以及如何根据输入指令正确调整调速器的输出等,都需要大量的调试工作。实验内容丰富,任务繁重,而给定的时间相对有限。要在规定时间内完成所有要求的任务几乎是不可能的,尤其是在面对一些棘手的问题时,花费了大量的时间去查找资料和尝试不同的解决方案。
尽管未能完全按照计划完成实验,但这次经历仍然让我学到了很多宝贵的经验,纸上得来终觉浅,绝知此事要躬行。通过亲手搭建电路模型,我深刻体会到将理论知识应用于实际问题解决中的难度。这使我认识到,不仅要学习课本上的理论,还要注重动手能力和实践技能的培养。遇到困难时不轻易放弃,实验过程充满了挫折感,但我学会了坚持到底,不断尝试新的方法,直到找到解决问题的最佳途径。这种坚韧不拔的精神将会对我今后的学习和工作产生积极的影响。
总之,尽管此次实验未能达到预期的目标,但它无疑是一次非常有意义的学习经历。
6.学期总结
这个学期的Java学习实践性很强,大部分时间都是通过完成作业来进行学习,学习过程也是十分的艰苦,从开始的什么都不会到网上和老师教导慢慢理解了面向对象编程的思想,慢慢的从面向过程编程转换成面向对象的编程,以及通过对编程写代码前完成类图和顺序图来对代码逻辑结构的梳理,对编写代码具有很大的帮助,Java编程也具有很多相对应的类以及函数库,对于编写代码有很多的帮助。通过这么久的Java学习,我理解了类的定义、对象的创建与使用,学会了如何封装数据和行为。继承与多态:掌握了类的继承关系,学会了如何通过继承实现代码复用,理解了多态的概念及其应用。抽象类与接口:理解了抽象类和接口的定义和使用,学会了通过接口实现多重继承的效果。学习了Java标准类库中的常用类,如String, Math, Date, ArrayList等等,学习到了很多新的知识
最后感谢老师在整个学期里耐心细致的教学,您的指导和支持是我们前进的动力源泉。每当我们遇到难题时,您总是能够给予及时的帮助,并鼓励我们勇敢面对挑战。正是因为有了您的辛勤付出,我们才能够顺利度过这段充实而又难忘的学习旅程。
同时也要感谢同学们之间的相互帮助和支持。在这个过程中,我们一起探讨问题、分享经验,形成了良好的学习氛围。正是这种团结互助的精神,使得我们的班级充满了活力和温暖。
最后,我想对自己说一句:无论前方道路多么曲折,只要坚持努力,就一定能够实现心中的梦想。未来的路还很长,希望我能始终保持这份热情与好奇心,勇敢地迎接每一个新的挑战。感谢所有陪伴我走过这一学期的人们,愿我们在各自的道路上越走越宽广,共同创造更加美好的明天。
标签:家居,引脚,代码,互斥,电路,并联,模拟程序,强电,窗帘 From: https://www.cnblogs.com/fxwql/p/18636773