PTA7-8次作业
1.前言:
第七次作业是在第六次作业基础上的拓展,新增互斥开关与受控窗帘(要求:互斥开关有3个引脚:1个是汇总引脚,另两个是分支引脚。开关电路示意图如图1所示,左边是汇总引脚,编号为1;右边两个是分支引脚,右上的输出引脚为2,右下输出引脚为3。图中1、2、3引脚均可以是输入引脚,当1为输入引脚时,2、3引脚为输出引脚;1为输出引脚时,2、3引脚为输入引脚。互斥开关只有两种状态:开关接往上面的2号引脚、接往下面的3号引脚。开关每次只能接通其中一个分支引脚,而另一个分支引脚处于断开状态。互斥开关的默认状态为1、2引脚接通,1、3引脚断开。图1中所示的互斥开关可以反过来接入电路,即汇总引脚接往接地端,两个分支引脚接往电源端。)
受控窗帘的电路符号为S,其最低工作电压为50V,电压达到或超过50V,窗帘即可正常工作,不考虑室外光照强度和室内空间大小等因素,窗帘受室内灯光的光照强度控制。
当电路中所有灯光的光照强度总和在[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,窗帘处于全开状态。)
图一:
为保证开关安全,在互斥开关处添加电阻,使其并不太适合控制装备的子类,窗帘的条件也偏多,先判断是否有足够电压,在判断总光照(关灯情况使其光照强度为0)。
第八次作业是最后的迭代,难度加大很多,添加电流限制和输出管脚电压,还添加有短路检验,使得优先级有较大改变,添加有二极管元件,且并联电路中包含有并联电路,较考验前期类的完整性和兼容性。最后这两次作业不包含测试点提示,使得难度进一步增大。
2.设计与分析:
第七次作业:
第七次作业在第六次作业基础上的拓展,新增互斥开关与受控窗帘,关键在于互斥开关的处理和对窗帘优先级的判定。为保证开关安全,在互斥开关处的添加电阻,使其并不太适合控制装备的子类,我直接让他成为控制装置,使得使用起来并不方便,频频出错,也没有很好处理优先级问题,我的这次作业显然是个失败品。注释问题依然存在,时间线长到可以让人模糊类中方法的作用,添加注释才可以更好的修改,此次作业使用了许多类,但是并没有遵守或运用单一职责原则、开闭原则、迪米特法则,且许多判定过程写在了主方法中,而不是写在类中作为类的方法,更没有代理类。因为在敲之前,很多逻辑部分并没有思考清楚,导致代码出现了许多的冗余及不必要的代码,我意识到了写注释的重要性。写注释不仅有益于在写代码过程中清晰自己的逻辑,更有益于改代码过程中读懂自己之前写的代码。在主函数中的输出和修改状态部分,未找到简便快捷的方法,过多的全循环使得代码过于浪费空间且耗时,无效循环非常多。因接口与抽象类不熟练,未使用。
添加了互斥开关类,部分代码如下:
点击查看代码
private Switch switch1=new Switch(0,"switch_1");
private Switch switch2=new Switch(0,"switch_2");
public double getResistance(){
return resistance;
}
public Switch getsw1(){
return switch1;
}
public Switch getsw2(){
return switch2;
}
public void setOutputV(double current){
if(this.state==0){
this.switch1.setinputV(this.inputV-current*this.resistance);
this.switch2.setinputV(0);
this.outputV=this.inputV-current*this.resistance;
}
else if(this.state==1){
this.switch2.setinputV(this.inputV-current*this.resistance);
this.switch1.setinputV(0);
this.outputV=this.inputV-current*this.resistance;
}
}
添加有受控窗帘类,部分代码如下:
点击查看代码
public void setOpenrate(double brightness){
if(this.deviation<50){
this.openrate=1;
}
else if(brightness<50||brightness>=0){
this.openrate=1;
}
else if(brightness<100||brightness>=50){
this.openrate=0.8;
}
else if(brightness<200||brightness>=100){
this.openrate=0.6;
}
else if(brightness<300||brightness>=200){
this.openrate=0.4;
}
else if(brightness<400||brightness>=300){
this.openrate=0.2;
}
else if(brightness>=400){
this.openrate=0;
}
}
由主要的三个函数和总体来看,不足还是有很多。可以看出:各文件的代码行数差异较大,项目中不同模块或功能的代码量差异大;部分文件的分支比例显示为0.0%,意味着这些文件没有包含条件语句;不同文件的方法数量也差异较大,高方法数量可能意味着该文件或类承担了较多的功能,需要关注其内聚性和可维护性;平均复杂度和最大复杂度大,某些方法可能较为复杂,需要特别注意以避免潜在的错误或性能问题。
类图如下:
第八次作业:
第八次作业是最后的迭代,难度加大很多,添加电流限制和输出管脚电压,还添加有短路检验,使得优先级有较大改变,添加有二极管元件,且并联电路中包含有并联电路,较考验前期类的完整性和兼容性。最后这两次作业不包含测试点提示,使得难度进一步增大。管脚电压我用输入电压和输出电压分别表示1,2处,互斥开关的2,3处用switch1,switch2的输出电压,1处用其输入电压。二极管设计为特殊的开关,根据管脚判定开关。短路添加旗帜,检测到直接跳过输出。添加对象最大电流。
二极管部分代码如下:
点击查看代码
public class Diode extends Control{
public void setState(int flag){
this.state=flag;
}
}
同上次作业一样,存在问题。分支语句百分比正常,为41.0%;类和接口分布偏低。
类图如下:
采坑心得:
第七次作业:
传递电流部分出错,会使得数据全部错误。
要注意互斥开关的电阻计算,它更类似于用电器,会分走一部分电流。
窗帘的判定要放在所有灯判定的后面,否则会数据错误。
第八次作业:
二极管的管脚需额外放在一个对象中,根据管脚判断旗帜是0/1,再判断其state。
短路判断不可放在太前面,可在最后面添加判定,否则前面还未通电过一遍元件就会直接判定短路。
改进建议:
写代码时提前画好类图以减少遗漏。
排序优先于修改状态更好。
多考虑优先级问题,先将预定状态确定后再传电压。
套用串并联时额外写方法更不易出错。
部分类不可太专。
总结:
1.学到了:
Java基础语法
封装、继承、多态的实现(结构体实现封装,组合实现继承,接口实现多态)。
接口的定义和实现(一个类可以实现多个接口 使用关键字interface来定义接口)。
抽象类和接口的区别。
ArrayList、LinkedList、HashMap的使用方法。
类之间的调用与复用。
数组的建立到运用。
2.需要进一步学习及研究:
提高类的带注释的行百分比。
在写代码之前,要将整个代码的逻辑部分设计好,避免出现写到中途手忙脚乱的现象。
提升代码的可复用性,注重设计中的开闭原则。
每次写完代码都会出现数组越界的情况,原因大概是思考逻辑时,无法面面俱到。多敲代码以提升自己的思考能力以及逻辑能力。画设计图、类图是个不错的选择。
在对象传递与赋值时找错对象,画出空间概念图可避免。
3.建议:
希望能有完整的思路和过程展示,以供观摩
希望测试点点明测试方向。
希望挑出常用方法的难点讲。