1,前言:最后两次大作业都是只有一道题,就是前面的家庭电路模拟题的迭代,题目量虽然看起来很少只有一道题目,但是这一道题目也比前面出几道题目的时候花的时间还要长,第七次大作业的迭代主要考虑的是单刀双置开光,单刀双置开关为了避免短路,他连接不同的电路还会有不同的电阻,串并联的套用,以及新加了一个窗帘电器,这个窗帘电器的输出还需要与电路中的其他能发光的电器有关,所以还要考虑到类与类之间的关系,例如继承,依赖等关系而,串并联的实现要用到类与类之间的循环服用,电流经过每一条电路时都需要判断是否有其他的并联电路。第八次大作业的难度就更加大了,因为之前我认为引脚没有发挥什么用处就之间将引脚删除了,而这次的大作业需要将管脚两边的电压都输出,所以这难度比前几次难度都要大,而且这次还加了一个二极管,二极管是单向电流通过的,所以我们还需要判断二级管的方向,这次还加上了电器的电流限制,如果电流过大,电器输出“exceeding current limit error”。还有电路短路的检测,如果电路的电流无穷大那么所有元器件信息不输出,仅输出提示“short circuit error”。
2,设计与分析:第七次大作业主要还是单刀双置开关,单刀双置开关有三个引脚,但是我还是只设置了两个,我把单刀双置开关的另外两个引脚分别放入两条电路的对象中,然后再在单刀双置开关的类中加上一个索引,用于判断单刀双置开关的另一端与哪一条电路相连。而对于单刀双置开关连接不同的电路对于不同的电阻这个问题,我是通过在开关中设置不同索引时,就把对应的电阻给赋值上去,这样就可以实现单刀双置开关对于不同的电路有着不一样的电阻,串并联的实现可以通过电路类中的方法里面判断是否有其他的串并联电路,在每一个电路类中的都可以调用其他电路的对象,还有对于窗帘电器的设计与分析,这个电器主要是在于他开闭大小判断,我是直接在我的工具类中先判断整个电路是否有窗帘,如果有就直接调用一个方法将整个电路的亮度总和计算出来,然后再传入窗帘类中的方法计算出来窗帘开闭的大小。
这是我对于单刀双置开关的设计,用了state作为他的另一边所连接的电路的索引,默认为2引脚,然后再通过setState方法来改变单刀双置开关所连接的引脚,电阻也会随着连接的电路改变而改变,默认的电阻值为5,输出单刀双置开关信息的时候需要判断他的索引是否是与2引脚电路相连,如果相连就输出turn on,否则就输出closed。
点击查看代码
class ExclusiveSwitch extends Electric {int state=2;public ExclusiveSwitch(String name) {super(name);super.r=5;}public int getState() {return state;}public void setState() {if(state==2){state=3;super.r=10;}else {state=2;super.r=5;}}@Overridepublic void display() {if(state==2){System.out.println("@"+this.name+":closed");}else {System.out.println("@"+this.name+":turned on");}}
}
点击查看代码
public static void setTotalBright(){for(int i=0;i<electrics.size();i++){if(electrics.get(i).name.charAt(0)=='B'){((WhiteLight)electrics.get(i)).setBrightness();totalBright=((WhiteLight)electrics.get(i)).getBrightness()+totalBright;}if(electrics.get(i).name.charAt(0)=='R'){((DayLight)electrics.get(i)).setBrightness();totalBright=((DayLight)electrics.get(i)).getBrightness()+totalBright;}}}
点击查看代码
class Curtain extends Electric{public Curtain(String name) {super(name);super.r=15;}@Overridepublic void display() {}public void display(int totalBrightness) {double x;if(super.v<50){x=1;}else{if(totalBrightness<50){x=1;}else if(totalBrightness<100){x=0.8;}else if (totalBrightness<200) {x=0.6;}else if (totalBrightness<300) {x=0.4;}else if (totalBrightness<400) {x=0.2;}else{x=0;}}System.out.println("@"+super.name+":"+(int)(100*x)+"%");}
}
点击查看代码
public static void shows(char a){ArrayList<Electric> k=new ArrayList<>();for (int i = 0; i< electrics.size(); i++) {if (electrics.get(i).name.charAt(0) == a){k.add(electrics.get(i));}}if(k.size()>1) {Sort.selectSort(k);}for(int i=0;i<k.size();i++){if(k.get(i).name.charAt(0)=='S') {((Curtain) k.get(i)).display(totalBright);}else if(k.get(i).name.charAt(0)=='H') {if(i==0){k.get(i).display();}else {int lk = 0;for (int j = 0; j < i; j++) {if (k.get(i).name.compareTo(k.get(j).name) == 0) {lk = 1;}}if (lk == 0) {k.get(i).display();}}}else {k.get(i).display();}}}
还是有些问题的,有些类的圈复杂度太高了。
3,踩坑心得:还是对于串并联电路的分析有问题,还有这个单刀双置开关,刚开始只考虑了他一定是有两个选择的引脚,没有考虑当他为普通开关时的作用,导致数据计算出现误差,
还有最大的问题是多并联电路的输出结果,感觉自己构建的没有问题,题目所给的多并联的输出样例用我的代码输出也是没有问题的,但是就是有这么多样例没有通过.
还有之前考虑窗帘时,一直在想如何才能将整条电路的亮度总和,最开始是想着这个亮度总和只会在窗帘对象中才会用到,所以我打算将亮度总和的属性放在窗帘类中,但后面想想,亮度只有在整个电路都通过电流时才能够计算,所以感觉放在窗帘类中不太好,再加上我将所有的电器都用了一个集合存储起来,放在工具类中,所以我最后打算将亮度总和这个属性放在工具类中,然后再用一个方法找出所有的电灯,算出总来亮度,等到窗帘输出时再将这个亮度总和传入窗帘类中,所以窗帘类的输出方法就会与电器父类中的输出方法有部分不一样,需要一个传参的过程,所以就导致窗帘类不能同其他的类一样输出,只能把窗帘类拿出来单独输出。
还有就是单刀双置开关的问题,我的想法是直接重新构建一个类,来用于单刀双置开关的输出,里面所有的信息都重新构建,我把单刀双置开关的另外两个引脚分别放入两条电路的对象中,然后再在单刀双置开关的类中加上一个索引,用于判断单刀双置开关的另一端与哪一条电路相连。而对于单刀双置开关连接不同的电路对于不同的电阻这个问题,我是通过在开关中设置不同索引时,就把对应的电阻给赋值上去,不过我的一个室友提出了他的见解,他是将两个普通开关放入单刀双置开关类中,一个开关专门对应单刀双置开关的一端,这样就不需要在电路中设置索引了。而且我自己的方法有一个弊端,那就是当这条线路中出现两个单刀双置开关时,索引就无法使用了,因为我的线路中只会存储一个索引,不能对应两个单刀双置开关,但是用他的思路就不会出问题,不过我当时理解不了他的想法,所以就没有使用他提出来的想法。
4,改进建议:第一个就是我的单刀双置开关的问题,这里需要改进,可以使用我上述我室友的想法,将两个普通开关放入单刀双置开关中,避免并联出现多个单刀双置开关而紊乱导致输出的数据出现问题,还有就是多并联套并联的情况,我认为问题还是出现在支路上,可能是支路出现并联时,电压没有很好的传入,而导致里面的分压出现了问题,亦或者是支路里面的并联的总电阻没有计算正确,我可以在支路里面再判断一下是否有并联电路,再做单独处理。
5,总结:我对于一些属性与类的放置更加熟练以及进一步强化了我对修饰符的理解,更加合理运用数组与集合,对于错误分析,以及找错的能力还有待加强,经常找不到自己的错误,只能够通过样例测试点来寻找,一旦不给测试点提示,我就只能通过所给的样例来找错误,疯狂试样例。来不断测试代码。
6,对于大作业的实行我觉得非常好。这样就可以每周都能锻炼到代码能力,有一点不足的是有时候大作业发放不及时,虽然最后也给了我们充足的时间来完成大作业,但还是会浪费很多时间,就会导致一学期下来大作业的次数变少了。还有就是实验的发放的问题,希望可以上一次实验课就在当周就发放提交的系统,这样就不会最后全部被堆积在一起了,而且提交时间也没有人通知,这样会导致实验提交不及时,实验提交还是不要再用实验提交系统了,bug太多了。