前言:对于家居强电电路的3和4总结来说,考察了正则表达式,类的运用,程序与设计的基础使用,ArristList 类的使用等等知识点。相对于家居强电电路3来说,4的难度大得多。在3的基础上,加上了引脚的输出电压,对于输出通过引脚的对应电压。那么要判断更多的东西(比如说引脚是否是正序还是反序,对于互斥开关则是最难改动的。,同时还加入了在并联电路加入了并联电路,使情况更加复杂)也正是因为这样我才写不出来,因为4比前面3个的总体结构都感觉改变了,导致到后面都不知如何修改,出现了一系列问题。总以为如此题量也是相对大的。
设计与分析:
- 家居强电电路3:
加上了互斥开关和窗帘,那么就要加上对应的2个类了。和之前几个电器类差不多一样。以及正则表达式来读取互斥开关和窗帘的信息也是和之前几个电器一样的处理。
居然加入了互斥开关就要判断它连接在那个引脚(1-2)或者(1-3),因此就要有一个整体范围来判断。因此我就用ArrayList来创造了这一个变量,当出现了#H1这类似的东西就来将引脚连接交换一下,在电路判断时就来引用这个变量看看这个变量和电路的互斥开关是否是一样的情况。代码如下
if(Integer.parseInt(name2)==2||Integer.parseInt(name3)==2){mutexSwitches.flag2=1;mutexSwitches.flag3=0;}if(Integer.parseInt(name2)==3||Integer.parseInt(name3)==3){mutexSwitches.flag3=1;mutexSwitches.flag2=0;}mutexSwitches.Res();seriesConnection.mutexSwitches.add(mutexSwitches);MutexSwitches mutexSwitches1 = new MutexSwitches(name1);
这样就可以将这个互斥开关连接情况记录下来,到之后要开始运用时就可以直接使用了。
也对于新加入的窗帘也是相对来说比较简单的,就只有判断窗帘对应的电压和亮度就可以了,当然对于电压可以和之前几个电器一样来计算求出,但是又对于这个亮度就要先把日光灯和白炽灯的总亮度计算出来,最后相加得以求出,还好在输出结果时窗帘是最后一个输出的,那么就可以先来将发光的光度逐一求出,最后再来判断窗帘的开光程度。代码如下:
if (B > 0) {for (int i = 0; i < incandescentLamps.size(); i++) {a = a+incandescentLamps.get(i).bright();System.out.println("@B" + incandescentLamps.get(i).name + ":" + incandescentLamps.get(i).bright());}}if (R > 0) {for (int i = 0; i < fluorescentLamps.size(); i++) {a = a+fluorescentLamps.get(i).bright();System.out.println("@R" + fluorescentLamps.get(i).name + ":" + fluorescentLamps.get(i).bright());}}if(S>0){for (int i = 0; i < hsiangHsiens.size(); i++){System.out.println("@S"+hsiangHsiens.get(i).name+":"+(int)(hsiangHsiens.get(i).TurnOnScale( a)*100)+"%");}}
将a化成总亮度的话就可以最后的时候把a放进入就可以求出窗帘开关程度了。
最后一个点就是在串联电路中加入了串联电路,也就是可以将这个串联当作从一个可以出现断路情况并且包含电阻的电器了,在判断串联电路是否断路时加上它包含的串联电路是否出现了断路情况就可以了,以及在给电压时也要加上对应情况就可以了。
整体来说已经将这次迭代的这两个写完了。
而整体结构为:
- 家居强电电路4:
加上了5个点
1.在输出时加上了了每个电器引脚对应的流过电压,那么就会出现2总情况,1:引脚为正序接入的(1-2)2:引脚为逆序输入的(2-1),互斥开关还加上一个(3-1)可能性,那么就要先判断电器接口是否正序接入,所以说我用来判断引脚是1还是非1那么就可以判断是否正序,代码如下:
```plaintextif (!Y.substring(Y.indexOf('-') + 1).equals("OUT")) {math = Integer.parseInt(Y.substring(Y.indexOf('-') + 1));if (math == 1)flag1 = false;elseflag1 = true;//是一就是true正确的方向}
```
这样就可以解决是否正序接入了。然后把结果带入到每个电器order属性之中去就可以了。
解决了正序和逆序问题的话就可以接下来判断电器的电压了。首先就是要从主路开始计算,每一个分段点的电压再逐一记录分段点的电压大小。就可以知道电压进入电器之前的电压了,之后通过电器之后就可以用进入电器的电压减去电器占用电压的大小就可以求出电器另外的引脚的电压了。同时也要将并联和串联电路看作为一个有电阻的电器。同时还要判断是否并联电路是否出现了短路现象了,当出现了短路情况就要将并联看作为一个电阻为0的电器,其中并联电路的串联电器的引脚电压都为进入并联电路的电压,且没有电压差,就可以看做成一个短路情况了。注意还有一个重点,那就是串联电路的顺序也是非常重要的,所以说在读入数据的时候就要加入每一个电器对应的顺序问题了,因此我在串联类中加入了ArraryList类(String)order,将电器对应的名字和缩写给记录起来,到时候再来按顺序来找对应的数据就可以了。计入order顺序代码如下:
name1 = (split[0].substring(1, split[0].indexOf('-')));switch (c) {case 'H':MutexSwitches mutexSwitches = new MutexSwitches(name1);seriesConnection.order.add("H" + name1);```plaintextcase 'K':seriesConnection.order.add("K" + name1);
```
来使用order顺序的代码如下:
for (int i = 0; i < seriesConnection.order.size(); i++) {c = seriesConnection.order.get(i).charAt(0);name = (seriesConnection.order.get(i).substring(1));switch (c) {case 'F':if (differentialGovernors.get(0).order) {differentialGovernors.get(0).voltage1 = voltage;differentialGovernors.get(0).voltage2 = voltage;} else {differentialGovernors.get(0).voltage2 = voltage;differentialGovernors.get(0).voltage1 = voltage;}break;case 'L':if (continuousGovernors.get(0).order) {continuousGovernors.get(0).voltage1 = voltage;continuousGovernors.get(0).voltage2 = voltage;} else {continuousGovernors.get(0).voltage2 = voltage;continuousGovernors.get(0).voltage1 = voltage;}break;
以下代码都是部分情况。
2. 并联电路中可以加入并联了。
对于这个改变我的代码没有什么改变之处因为,在判断并联电路的电阻时,我也是按照并联电路ArraryList类来遍历的如果出现多个并联电路的话一样判断,因此没有什么可迭代之处。
3.短路监测:
当出现了短路情况就有两种可能:
1.串联电路出现了短路情况
2.并联电路出现了短路情况。
对于第一点的话就可以当作一个电阻为0的电器了,那么当主电路的电阻都为0的话就可以出现了短路现象,输出short circuit error。
对于第二点的话并联电路出现了短路情况,那些并联电路中的有电阻的串联就不会有电流流过,那么他们的左右引脚都为并联电路的电压,没有差值。那么当出现了并联电路大于1条串联电路的电阻为0,就会出现分流情况,就与超出电器最大电流有关了,都要考虑。
4.加入了二极管电器:
二极管就是一个比较特别的开关,就要观察引脚情况,如果引脚为正序就可以电流通过,但是反之即出现断路的情况。二极管的电阻和输出情况代码如下:
public void consult() {if (this.order)resistance = 0;elseresistance = 100;}public String ToString() {if (this.order) {if (this.current > 8)return "@P" + this.name + ":conduction" + " " + (int) this.voltage1 + "-" + (int) (this.voltage2 ) + " exceeding current limit error";elsereturn "@P" + this.name + ":conduction" + " " + (int) this.voltage1 + "-" + (int) (this.voltage2);} else {if (this.current > 8)return "@P" + this.name + ":cutoff" + " " + (int) (this.voltage1) + "-" + (int) this.voltage2 + " exceeding current limit error";elsereturn "@P" + this.name + ":cutoff" + " " + (int) (this.voltage1) + "-" + (int) this.voltage2;}}
相对来说非常简单。
5.电流限制:
家居强电电路4中加上了电器的最大电流情况,那么就只要判断一下串联电路的总电流就可以了,之后再按照order遍历一下。我在每一个类中都加上了一个current属性,当超过了这个对应的电流就输出另外一种情况,代码如下:
public String ToString() {if (this.order) {if (this.current > 8)return "@P" + this.name + ":conduction" + " " + (int) this.voltage1 + "-" + (int) (this.voltage2 ) + " exceeding current limit error";elsereturn "@P" + this.name + ":conduction" + " " + (int) this.voltage1 + "-" + (int) (this.voltage2);} else {if (this.current > 8)return "@P" + this.name + ":cutoff" + " " + (int) (this.voltage1) + "-" + (int) this.voltage2 + " exceeding current limit error";elsereturn "@P" + this.name + ":cutoff" + " " + (int) (this.voltage1) + "-" + (int) this.voltage2;}}
以上代码为部分代码。
那么家居强电电路4的迭代情况已经说明清楚设计了。整体结构如下:
踩坑心得:
1.在写家居强电电路3时出现了比较问题。当时在比较输出顺序的时候我使用的是名字的数字大小情况输出,那么11就会输出在2前面,然而不是的。正确的输出顺序应该是字符串排序,11应该在2的前面才正常。修改了一下排序的要求就可以了。部分代码如下:
Collections.sort(switches, new Comparator<Switch>() {@Overridepublic int compare(Switch o1, Switch o2) {return o1.name.compareTo(o2.name);}});
2.在家局强电电路3中当出现了并联断路的情况没有考虑,会直接当作正常来判断。因此我在判断串联电路是否断路的那个方法里加入了对于并联断路的情况就修改了这个问题。
3.在家居强电电路4中对于计算串联和并联电路的电阻问题一直会计算错误,不知为何数据传入不到那里。因此我改变了一种计算电阻的方式(又总到分),先从总串联电路开始算起,一点一点计算,当出现了并联就开始计算并联的电路,遍历并联电路的串联电路,对于并联电路的串联电路就来递归该函数就可以了。这样既可以一点一点吧全部的电阻计算出来。部分电器计算电阻代码如下:
public static void k(SeriesConnection seriesConnection) //计算串联的电阻{double sum = 0;if (seriesConnection.floorFans.size() > 0) {for (int i = 0; i < seriesConnection.floorFans.size(); i++) {sum = sum + seriesConnection.floorFans.get(i).resistance;}}if (seriesConnection.parallelConnections.size() > 0) {for (int i = 0; i < seriesConnection.parallelConnections.size(); i++) {l(seriesConnection.parallelConnections.get(i));sum = sum + seriesConnection.parallelConnections.get(i).resistance;}}seriesConnection.resistance = sum;seriesConnection.resistance = sum;for(int j=0;j<seriesConnections.size();j++){if(seriesConnection.name.equals(seriesConnections.get(j).name)){seriesConnections.get(j).resistance = sum;break;}}}}
改进建议:
1.在进行遍历时一直使用if(int i=0;i<size();i++)这样来一点点遍历的,不仅麻烦而且还费时费力,应该使用更加强的遍历方法,比如:
for (IncandescentLamp lamp : incandescentLamps) {sum = sum + lamp.resistance;}
这样就非常不错,不仅简单而且增强了for循环
2.在写代码之前没有好好分析各种情况,当时没有考虑到并联电路电路出现短路的情况就到后期修改了大量代码,而且还没有更改的非常完美,是非常不应该的。因此在以后进行程序设计时应该考虑清楚了之后再开始写。
3.培养良好的编程习惯:规范的代码缩进、统一的命名规范等,有助于提高代码质量。不断学习新的编程语言和技术,适应市场需求
总结:在家居强电电路3和4中我学习到了
1.在开始编写代码之前,对项目进行详细的规划和时间是至关重要的。这包括设定明确的目标、制定时间表、分配任务以及确定优先级。
2.我学会了如何正确处理异常情况,使用调试和监控应用程序。
要从一下地方需要进一步学习及研究:
1.多学习简便的算法和方法,使代码更加简洁,清晰。
2.多看别人的代码,从中汲取他人的有点并且用于自身。
3.多研究java的类,包等东西,到后面使代码更加高级。
学期总结:在平时作业中多加上一些注释,让题目更加清晰,更加容易理解,样例也不是就只对于一个方面一直修改,而是要对于多方面来提供样例。