面向对象大作业总结(三)
一.前言:本次博客是对第七到八次大作业进行总结。我认为第七次大作业相比于同一道题来说,并没有进行太大的改变,因为它不需要考虑每个元件左右两端到底电位状态如何,也就是在前两次的基础上增加了一些并联电路,这个时候我们只要在MainLine类里新增并联以及串联电路的判断就可以,当然,新增的判断要考虑到这条线路是不是联通的,若是联通,电流不为零,能够进行状态的调整。所以怎么判断电路的状态成为关键。我采用的方法就是从大到小的思路,即从主线路开始,先遍历主线路上的元件,当遍历到并联线路时,用一个getsituation方法获取此条并联电路的状态,当然,在此之前会对每一条线路进行连接以及获取状态,判断方法也就是遍历这条线路,如遇到开关或者互斥开关时,进行状态的判断,此次我认为难点其实在于互斥开关的判断。因为我对线路的连接其实仅仅只读取了每个方框的后半部分,但很明显,互斥开关就是会出现在方框的前后部分,所以这种方法不能用,所以我才用了遍历整个方框的算法,当检测到其为互斥开关时,同时进行引脚的检测,如果引脚不为1,那么表面检测到一个互斥开关,同时将其new如Line中,以方便之后使用,这只是初版方案,在第八次大作业中会有修改。在第七次大作业时的另一个问题就是该如何确定互斥开关的连接状态,因为互斥开关也像开关一样会进行调整,所以我也会在读取输入信息时将矫正行为放入我的Action类中,有了这个调整,接下来就要确定哪条线是2号引脚,那条线是3号引脚。这个问题,我是通过增加Line类中的leg属性完成实现的,即在检测输入引脚时,将其赋值给Line类,之后只要检测该互斥开关的状态是否与这条线的leg属性的值一致即可。我本以为就这么简单结束,但实际上,有一个样例给了我启发,那就是在主线路中也存在互斥开关,只使用其中的一条线路,而且在并联中也可以存在反接的情况,这也让我对原有状态进行修改,我将leg视为一个数组,如果检测成功便新增一个数值,然后再对后续的线路进行判断取出对应的leg值进行对比即可。第七次大作业最后的一个问题是我的排序算法,因为我用的ArrayList自身并不具备排序算法,而我把Num当成数字来比较,而老师的样例是用的TreeMap自带排序算法,而且是按照字典排序的,后用ToString方法将num进行字符串化之后排序才通过测试点。与第七次大作业又不同的是,第八次大作业要求输出各个设备引脚的电压,然而,在加入多个并联电路之后,由于断路的出现,这就让断路之后的设备的输出出现问题,我以为断路之后它们的输出电压与输入电压都为零,实际上不是的,因为后部分电路若与另外一条正常电路相连,那么这个电压就要反流,而且设备的电压差为零,这个问题我是通过并联电路的检测并再赋值解决的,但是,这也只是其中的一种情况,如果两条电路都断,难道它们的输入输出都是零吗?显然不是,还得看它们后面接入的电路电压,所以到目前为止我都没有解决这个问题,测试点也仅仅通过一半,而且,根据老师新发布的样例来看,设备还存在反接的情况,输入变输出,虽然在我意识到这个问题后进行修改,每次检测时判断它们的引脚情况,也仅仅多了几分而已,所以说第八次大作业确实很困难。
二.设计与分析:
(1)第七次大作业分析:
类图设计过于乱给出简单类图:
此次设计如前言所说,相较于第五六次大作业来说,难度变化不算特别大,就是在互斥开关的检测与判断上可能需要思考,对线进行赋值,从而判断这条线是否与互斥开关是否相通,以下给出部分代码。
String[] temp1=m1.group(2).split("\[|\]");
int cp=0,ch=0;
for(int q=0;q<temp1.length;q++)
{
if(temp1[q].equals("")false&&temp1[q].equals(" ")false)
{
String[] temp=temp1[q].split(" ");
for(int q1=0;q1<temp.length;q1++)
{
int flag1=Explain(temp[q1]);
int num1=getNum(temp[q1]);
if(flag1==10)
{
ch++;
int num2=getleg(temp[q1]);
if(num2!=1)
{
Huchi h=new Huchi(num1);
if(ch%2==1) {
h.getplace(0);
}
else {
h.getplace(1);
}
line.getleg(num2);
line.getLine(h);
}
}
}
}
这部分我的代码就是在给输入信息检测出来之后的赋值,可以看到线被我视作一种大的电路元件,同样也可以看到,我还判断了它的所处位置,这是因为互斥开关时可以反转的,而反转接入电路的话所产生的效果是不一样的,所以我在电路元件类里均加入place属性以判断它们的方向。同时,在遍历line的过程中采用计数的方法进行引脚的获取,用switch类中的reject方法进行判断。还有一个新增的点在于窗帘的处理,这个窗帘的控制我是放在最后的show类中,因为我的show类中包含所有受控设备以及控制设备的信息,所以在此获取光照强度进行赋值,这并不是很难。依旧是将电路看成好几个元件进行拆分。
第八次大作业设计分析:
第八次大作业的难点在于各个引脚的输出,普通的串联线路很好判断,难就难在并联电路,因为并联里包含并联的话,如果断路了就必须找到与其相连的线路从而获取他们的输出,我在遍历线路时,对并联电路进行处理时,代码如下:
for(int i=0;i<line.size();i++)
{
double t=u;
double dian=t/(line.get(i).getR());
line.get(i).setforward(forward);
line.get(i).setI(dian);
line.get(i).setdevice(object,linelist);
if(line.get(i).getsituation()1){
end=line.get(i).getend();
}
}
for(int i=0;i<line.size();i++){
if(line.get(i).getsituation()0){
line.get(i).setend(end);
line.get(i).setforward(forward);
line.get(i).setdevice(object,linelist);
}
}
在这里我就是考虑到并联电路在断路之后的断开部分的输入和输出电压的处理,但是我这样是由弊端的,因为是与最终并联的电路进行赋值,用高中的话就是要找到等效电路,但我确实想不到该怎么解决这个问题,可能后续问一些优秀同学的代码。这次大作业还有一个问题在于输入。输入时我如果按照先前的写法,我是在遍历完全部的信息后才进行线路的连接,也就是说,如果支线路中出现了并联电路,我这个连接顺序会导致我的数据丢失。所以,我在先遍历完行为以及主线路消息后,我再进行串联和并联的连接,并且是每检测到一条信息便进行一次连接,这也就解决完那个数据丢失的问题。
三.踩坑心得:
(1)对于第七次大作业,我认为踩坑的地方在于我的排序算法和整体结构以及采用的储存方式问题,用arraylist进行储存,寻找设备只能通过遍历的方式,这种方式费时而且站复杂度,还不能用直接本身的排序算法,这点用treemap便可解决,而且避免了最后那个排序是按字典排序的问题,总之代码会进行后续的调整,我在考虑的是如何优化这个连接的方式,受到第八次大作业的提醒,或者后续去学习该如何模拟电路的其它算法。
(2)对于第八次大作业,踩的坑也就和代码本身的结构相关,再加入第八次大作业的内容后,代码长度已经来到2300多行,这种复杂度应该被优化,尤其是遍历这个问题。这次还有个问题就是在输入。输入时我如果按照先前的写法,我是在遍历完全部的信息后才进行线路的连接,也就是说,如果支线路中出现了并联电路,我这个连接顺序会导致我的数据丢失。所以,我在先遍历完行为以及主线路消息后,我再进行串联和并联的连接,并且是每检测到一条信息便进行一次连接。原来没注意到这个问题的时候一直不理解为什么输出信息全为零。后来发现这个问题及时进行修改。还有就是前面提到的无法判断并联的连接输入输出,目前还在询问其他同学。
四 ·改进建议:
首先经过这几次迭代,我认为我需要对第六次大作业进行修改的地方有如下几点:1.对输入格式的修改,可借鉴他人正则表达式用法,尽可能降低判断复杂度。2.提前进行类的设计,好的设计能有效避免后续缝缝补补的过程。3.尽量避免计算过于复杂,使其精度丢失。4.将存储数据的容器改为treemap,不仅可以直接使用排序方法,还能在查找设备时不用循环,降低复杂度。
五 ·总结:
经过这两次的练习,让我更加熟练的运用类,从一开始“过程化”的思维在慢慢转变为“对象化”的思维,也让我更加理解到类与类之间的调用关系,以及考虑问题的严谨性,我也可以去参考别人更加短小精悍的思路,从而降低代码的复杂度,在做题之前可以先将自己的思路写出,合理规划类,画出类图以便后续类之间关系的调用。不断优化程序的设计,多了解一些高级语法,对正则表达式的使用还不够纯熟,还需要进一步的研究。并且在计算机这门学科中其实还要求我们掌握像物理电学这样的基本知识,并且加以运用,目前还需要考虑如何在目前的类中加入继承与多态,还需要通过网上资料以及云课堂的进一步学习。我认为这样的大作业组织方式是能正真提升我的编程水平的,并且能让我在学习中有恰到好处的紧迫感。在学习过程中向老师们提问也能有及时的反馈,老师也很热情地帮助我解决问题,总而言之,虽然此次第八次大作业表现不好,但总体让我学到很多,感觉良好。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)