8次大作业通过情况
新增设备:
互斥开关:
解释互斥开关有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,窗帘处于全开状态。
新增电路情况:
多个并联电路串联在一起的情况。
考虑一条串联电路中包含其他串联电路的情况。
本质上,互斥开关可以等效为两条并联支路上的两个状态互异的正常开关,两个开关只能有一个处于闭合状态。当改变互斥开关的状态时,就分别改变两个开关的状态。并且对这两个开关进行电阻赋值。
当互斥开关的信息为:H+"序号"+"-"+"引脚号"时
等效开关的名称便被我定义为:K+"互斥开关的序号+100"+"-"+"当前电路上的互斥开关的引脚号"。
例如:
H1-2等效为K101-2,并且对此电阻赋值为5
这个再简单不过了,我只需要在输出受控窗帘的信息之前把所有的能产生光亮的设备的亮度进行相加求和就好了,再判断一下是不是达到了最低工作电压。
这个我认为是所有特殊的电路情况里面最好解决的。因为我的所有电路类都继承于设备类,我只需要在遍历每一条串联电路的设备信息时,将其中含有的串联电路的所有设备依次添加到该串联电路中去。因为串联电路中包含串联电路的情况,本质上还是一条串联电路。所以是很好解决的。
这个也算不上很难的点,很多人的代码都不需要或者经过少量的更改就能处理这个情况。本质上还是在主电路上添加一个并联电路信息,然后得到所有并联电路的等效电阻后一起计算分压就好了。
UML类图
Method | CogC | ev(G) | iv(G) | v(G) |
---|---|---|---|---|
ControlledDevice.ControlledDevice() | 0 | 1 | 1 | 1 |
ControlledDevice.ControlledDevice(String, int) | 0 | 1 | 1 | 1 |
Controller.Controller(String, int) | 0 | 1 | 1 | 1 |
Controller.Controller(double) | 0 | 1 | 1 | 1 |
Controller.getGear() | 0 | 1 | 1 | 1 |
Controller.setGear(double) | 0 | 1 | 1 | 1 |
CurtainOfS.CalculateOpenScale(double) | 10 | 1 | 7 | 8 |
CurtainOfS.CurtainOfS(String, int) | 0 | 1 | 1 | 1 |
CurtainOfS.getOpenScale() | 0 | 1 | 1 | 1 |
CurtainOfS.setOpenScale(double) | 0 | 1 | 1 | 1 |
Device.Device() | 0 | 1 | 1 | 1 |
Device.Device(String, int) | 0 | 1 | 1 | 1 |
Device.getInputPin() | 0 | 1 | 1 | 1 |
Device.getInputV() | 0 | 1 | 1 | 1 |
Device.getName() | 0 | 1 | 1 | 1 |
Device.getNumber() | 0 | 1 | 1 | 1 |
Device.getOutPin() | 0 | 1 | 1 | 1 |
Device.getOutV() | 0 | 1 | 1 | 1 |
Device.getPartialPressure() | 0 | 1 | 1 | 1 |
Device.getResistance() | 0 | 1 | 1 | 1 |
Device.setInputPin(int) | 0 | 1 | 1 | 1 |
Device.setInputV(double) | 0 | 1 | 1 | 1 |
Device.setName(String) | 0 | 1 | 1 | 1 |
Device.setNumber(int) | 0 | 1 | 1 | 1 |
Device.setOutPin(int) | 0 | 1 | 1 | 1 |
Device.setOutV(double) | 0 | 1 | 1 | 1 |
Device.setPartialPressure(double) | 0 | 1 | 1 | 1 |
Device.setResistance(double) | 0 | 1 | 1 | 1 |
Fan.Fan(String, int) | 0 | 1 | 1 | 1 |
Fan.Fan(double) | 0 | 1 | 1 | 1 |
Fan.getSpeed() | 0 | 1 | 1 | 1 |
Fan.setSpeed(double) | 0 | 1 | 1 | 1 |
FanOfA.FanOfA(String, int) | 0 | 1 | 1 | 1 |
FanOfA.FanOfA(double) | 0 | 1 | 1 | 1 |
FanOfA.calculateSpeed() | 5 | 1 | 4 | 5 |
FanOfA.setSpeed(double) | 0 | 1 | 1 | 1 |
FanOfD.FanOfD(String, int) | 0 | 1 | 1 | 1 |
FanOfD.FanOfD(double) | 0 | 1 | 1 | 1 |
FanOfD.calculateSpeed() | 3 | 1 | 3 | 3 |
FanOfD.setSpeed(double) | 0 | 1 | 1 | 1 |
FilamentLamp.CalculateBrightness() | 3 | 1 | 3 | 3 |
FilamentLamp.FilamentLamp(String, int) | 0 | 1 | 1 | 1 |
FilamentLamp.setBrightness(double) | 0 | 1 | 1 | 1 |
FluorescentLamp.CalculateBrightness() | 2 | 1 | 1 | 2 |
FluorescentLamp.FluorescentLamp(String, int) | 0 | 1 | 1 | 1 |
FluorescentLamp.setBrightness(double) | 0 | 1 | 1 | 1 |
Lamp.Lamp(String, int) | 0 | 1 | 1 | 1 |
Lamp.getBrightness() | 0 | 1 | 1 | 1 |
Lamp.setBrightness(double) | 0 | 1 | 1 | 1 |
ParallelCircuit.ParallelCircuit(String, int, ArrayList |
0 | 1 | 1 | 1 |
ParallelCircuit.ParallelCircuit(double, double) | 0 | 1 | 1 | 1 |
ParallelCircuit.getPartialPressure() | 0 | 1 | 1 | 1 |
ParallelCircuit.getSeriesNames() | 0 | 1 | 1 | 1 |
ParallelCircuit.setPartialPressure(double) | 0 | 1 | 1 | 1 |
ParallelCircuit.setSeriesNames(ArrayList |
0 | 1 | 1 | 1 |
SeriesCircuit.SeriesCircuit(String, int, ArrayList |
0 | 1 | 1 | 1 |
SeriesCircuit.SeriesCircuit(double, double) | 0 | 1 | 1 | 1 |
SeriesCircuit.getEquipments() | 0 | 1 | 1 | 1 |
SeriesCircuit.setEquipments(ArrayList |
0 | 1 | 1 | 1 |
SwitchOfF.SwitchOfF(String, int) | 0 | 1 | 1 | 1 |
SwitchOfF.SwitchOfF(double) | 0 | 1 | 1 | 1 |
SwitchOfF.calculateState() | 4 | 1 | 1 | 6 |
SwitchOfF.getState() | 0 | 1 | 1 | 1 |
SwitchOfF.setState(double) | 0 | 1 | 1 | 1 |
SwitchOfH.IsClose() | 2 | 2 | 1 | 2 |
SwitchOfH.SwitchOfH(String, int) | 0 | 1 | 1 | 1 |
SwitchOfH.SwitchOfH(double) | 0 | 1 | 1 | 1 |
SwitchOfH.getState() | 0 | 1 | 1 | 1 |
SwitchOfH.setState(double) | 0 | 1 | 1 | 1 |
SwitchOfK.IsClose() | 2 | 2 | 1 | 2 |
SwitchOfK.SwitchOfK(String, int) | 0 | 1 | 1 | 1 |
SwitchOfK.SwitchOfK(double) | 0 | 1 | 1 | 1 |
SwitchOfK.isClose() | 0 | 1 | 1 | 1 |
SwitchOfK.setClose(boolean) | 0 | 1 | 1 | 1 |
SwitchOfL.SwitchOfL(String, int) | 0 | 1 | 1 | 1 |
SwitchOfL.SwitchOfL(int, double) | 0 | 1 | 1 | 1 |
SwitchOfL.calculateState() | 0 | 1 | 1 | 1 |
SwitchOfL.getState() | 0 | 1 | 1 | 1 |
SwitchOfL.setState(double) | 0 | 1 | 1 | 1 |
TotalCircuit.TotalCircuit(String, int) | 0 | 1 | 1 | 1 |
TotalCircuit.TotalCircuit(double, double) | 0 | 1 | 1 | 1 |
TotalCircuit.getInputV() | 0 | 1 | 1 | 1 |
TotalCircuit.getIsOk() | 0 | 1 | 1 | 1 |
TotalCircuit.getName() | 0 | 1 | 1 | 1 |
TotalCircuit.getNumber() | 0 | 1 | 1 | 1 |
TotalCircuit.getOutV() | 0 | 1 | 1 | 1 |
TotalCircuit.getResistance() | 0 | 1 | 1 | 1 |
TotalCircuit.setInputV(double) | 0 | 1 | 1 | 1 |
TotalCircuit.setIsOk(int) | 0 | 1 | 1 | 1 |
TotalCircuit.setName(String) | 0 | 1 | 1 | 1 |
TotalCircuit.setNumber(int) | 0 | 1 | 1 | 1 |
TotalCircuit.setOutV(double) | 0 | 1 | 1 | 1 |
TotalCircuit.setResistance(double) | 0 | 1 | 1 | 1 |
这张图是一个Kiviat(雷达)图,用来展示Java程序的多项度量指标。以下是对各个指标的分析:
平均复杂度 (Avg Complexity):
平均深度 (Avg Depth):
最大深度 (Max Depth):
最大复杂度 (Max Complexity):
每类方法数 (Methods/Class):
每个方法的平均语句数 (Avg Stmts/Method):
注释百分比 (% Comments):
总体来说,图中的某些指标如平均复杂度、每类方法数和每个方法的平均语句数都处于理想范围内,但最大深度、最大复杂度和注释百分比需要特别关注和改进,以提高代码质量。
新增设备:
二极管:
增加二极管元件,其电路特性为:正向导通,反向截止;其电器符号如图4所示,当电流从左至右流过时,二极管导通”conduction”,电阻为0;电流从右至左流动时,二极管截止”cutoff”,电阻无穷大,相当于开关打开。
1、如果两端电压为0,二极管的导通/截止状态由接入方向决定,1号引脚靠近电源则状态为导通,反之为截止。 2、如果两端电压不为0,二极管导通。
新增电路情况:
并联电路中包含并联:
本次迭代考虑并联电路中包含并联电路的情况,即构成并联电路的串联电路可以包含别的并联电路。例如如下输入的电路,并联电路M2的其中一条串联电路T4中包含了另一条并联电路M1:
#T1:[IN D2-1] [D2-2 H1-2] [H1-1 OUT] #T2:[IN D1-1] [D1-2 H1-3] [H1-1 OUT] #M1:[T1 T2] #T4:[IN K3-1] [K3-2 M1-IN] [M1-OUT OUT] #T5:[IN K1-1] [K1-2 B1-1] [B1-2 OUT] #M2:[T4 T5]
新增处理情况:
管脚电压的显示:
在输出每个电器的状态信息后,再依次输出该电器每个管脚的电压。
@B1:200 220-0
电流限制:
电器在工作时,过大的电流会引起电器过热,从而烧坏电路。本次迭代,每个元器件都有最大电流的设置,当实时电流超过最大电流时,在该电器输出信息的最后加入提示“exceeding current limit error”,与前面的信息之间用英文空格分隔。
@B1:190 68-17 exceeding current limit error
分析一下,二极管正向电阻为0,逆向电阻为无穷大。我可以根据引脚的出现顺序来判断二极管的电流方向。
当引脚1先出现时,我将二极管的电阻设置为0,否则通过:
Integer.MAX_VALUE
设置二极管电阻为一个很大的值。
分析一下,如何输出引脚电势:
因为大多数人选择的都是通过计算电阻来直接获取设备分压的,而不是通过引脚的电势差来获取设备分压,这样并不能直接计算出引脚的电势,所以存在很大的缺陷。
但是也不是没有方法去处理这样的情况:
我从主电路开始遍历,将主电路的输入引脚的电压计算出来,按照遇到设备(这里的设备包括可能遇到的并联电路/串联电路)便将设备的输入引脚的电压赋值为前一个输出引脚的电压(第一个设备的输入引脚的电压等于主电路的输入引脚的电压)。然后每得到一个设备的输入引脚的电压,就用这个值减去当前设备的分压,后赋值给其输出引脚的电压。
这样,主电路被处理好了。
接下来处理并联电路就好了:
按照从后往前的顺序去处理并联电路,类似地,将并联电路的每一条支路的输入电压赋值为该并联电路的输入电压,再遍历这些支路上的设备,接下来的操作和刚才一样,不再赘述。
这个是最好处理的,因为在此之前我已经获取了每个设备的分压以及电阻,只需要通过:
电流=分压/电阻
就可以得到该设备当前的电流。
但是值得注意的是,这种方法只对有电阻的设备有效,开关是无法通过这种方法得到的。
那么开关电流就需要通过计算开关当前所在串联电路的电流来得到,只需要用开关所在串联电路的分压/总电阻就好了。这些数据我都是已经提前获取好的了。
UML类图
Method | CogC | ev(G) | iv(G) | v(G) |
---|---|---|---|---|
ControlledDevice.ControlledDevice() | 0 | 1 | 1 | 1 |
ControlledDevice.ControlledDevice(String, int) | 0 | 1 | 1 | 1 |
Controller.Controller(String, int) | 0 | 1 | 1 | 1 |
Controller.Controller(double) | 0 | 1 | 1 | 1 |
Controller.getGear() | 0 | 1 | 1 | 1 |
Controller.setGear(double) | 0 | 1 | 1 | 1 |
CurtainOfS.CalculateOpenScale(double) | 10 | 1 | 7 | 8 |
CurtainOfS.CurtainOfS(String, int) | 0 | 1 | 1 | 1 |
CurtainOfS.getOpenScale() | 0 | 1 | 1 | 1 |
CurtainOfS.setOpenScale(double) | 0 | 1 | 1 | 1 |
Device.Device() | 0 | 1 | 1 | 1 |
Device.Device(String, int) | 0 | 1 | 1 | 1 |
Device.getExceedingLimitMax() | 0 | 1 | 1 | 1 |
Device.getFirstPin() | 0 | 1 | 1 | 1 |
Device.getInputPin() | 0 | 1 | 1 | 1 |
Device.getInputV() | 0 | 1 | 1 | 1 |
Device.getName() | 0 | 1 | 1 | 1 |
Device.getNumber() | 0 | 1 | 1 | 1 |
Device.getOutPin() | 0 | 1 | 1 | 1 |
Device.getOutV() | 0 | 1 | 1 | 1 |
Device.getPartialPressure() | 0 | 1 | 1 | 1 |
Device.getPin1() | 0 | 1 | 1 | 1 |
Device.getPin2() | 0 | 1 | 1 | 1 |
Device.getResistance() | 0 | 1 | 1 | 1 |
Device.isExceedingLimit() | 0 | 1 | 1 | 1 |
Device.setExceedingLimit(boolean) | 0 | 1 | 1 | 1 |
Device.setExceedingLimitMax(double) | 0 | 1 | 1 | 1 |
Device.setFirstPin(int) | 0 | 1 | 1 | 1 |
Device.setInputPin(int) | 0 | 1 | 1 | 1 |
Device.setInputV(double) | 0 | 1 | 1 | 1 |
Device.setName(String) | 0 | 1 | 1 | 1 |
Device.setNumber(int) | 0 | 1 | 1 | 1 |
Device.setOutPin(int) | 0 | 1 | 1 | 1 |
Device.setOutV(double) | 0 | 1 | 1 | 1 |
Device.setPartialPressure(double) | 0 | 1 | 1 | 1 |
Device.setPin1(double) | 0 | 1 | 1 | 1 |
Device.setPin2(double) | 0 | 1 | 1 | 1 |
Device.setResistance(double) | 0 | 1 | 1 | 1 |
Fan.Fan(String, int) | 0 | 1 | 1 | 1 |
Fan.Fan(double) | 0 | 1 | 1 | 1 |
Fan.getSpeed() | 0 | 1 | 1 | 1 |
Fan.setSpeed(double) | 0 | 1 | 1 | 1 |
FanOfA.FanOfA(String, int) | 0 | 1 | 1 | 1 |
FanOfA.FanOfA(double) | 0 | 1 | 1 | 1 |
FanOfA.calculateSpeed() | 5 | 1 | 4 | 5 |
FanOfA.setSpeed(double) | 0 | 1 | 1 | 1 |
FanOfD.FanOfD(String, int) | 0 | 1 | 1 | 1 |
FanOfD.FanOfD(double) | 0 | 1 | 1 | 1 |
FanOfD.calculateSpeed() | 3 | 1 | 3 | 3 |
FanOfD.setSpeed(double) | 0 | 1 | 1 | 1 |
FilamentLamp.CalculateBrightness() | 3 | 1 | 3 | 3 |
FilamentLamp.FilamentLamp(String, int) | 0 | 1 | 1 | 1 |
FilamentLamp.setBrightness(double) | 0 | 1 | 1 | 1 |
FluorescentLamp.CalculateBrightness() | 2 | 1 | 1 | 2 |
FluorescentLamp.FluorescentLamp(String, int) | 0 | 1 | 1 | 1 |
FluorescentLamp.setBrightness(double) | 0 | 1 | 1 | 1 |
Lamp.Lamp(String, int) | 0 | 1 | 1 | 1 |
Lamp.getBrightness() | 0 | 1 | 1 | 1 |
Lamp.setBrightness(double) | 0 | 1 | 1 | 1 |
ParallelCircuit.ParallelCircuit(String, int) | 0 | 1 | 1 | 1 |
ParallelCircuit.ParallelCircuit(String, int, ArrayList |
0 | 1 | 1 | 1 |
ParallelCircuit.getSeriesNames() | 0 | 1 | 1 | 1 |
ParallelCircuit.getUpName() | 0 | 1 | 1 | 1 |
ParallelCircuit.setSeriesNames(ArrayList |
0 | 1 | 1 | 1 |
ParallelCircuit.setUpName(String) | 0 | 1 | 1 | 1 |
SeriesCircuit.SeriesCircuit(String, int, ArrayList |
0 | 1 | 1 | 1 |
SeriesCircuit.getEquipments() | 0 | 1 | 1 | 1 |
SeriesCircuit.setEquipments(ArrayList |
0 | 1 | 1 | 1 |
SwitchOfF.SwitchOfF(String, int) | 0 | 1 | 1 | 1 |
SwitchOfF.SwitchOfF(double) | 0 | 1 | 1 | 1 |
SwitchOfF.calculateState() | 4 | 1 | 1 | 6 |
SwitchOfF.getState() | 0 | 1 | 1 | 1 |
SwitchOfF.setState(double) | 0 | 1 | 1 | 1 |
SwitchOfH.IsClose() | 2 | 2 | 1 | 2 |
SwitchOfH.SwitchOfH(String, int) | 0 | 1 | 1 | 1 |
SwitchOfH.SwitchOfH(double) | 0 | 1 | 1 | 1 |
SwitchOfH.getPin_1_v() | 0 | 1 | 1 | 1 |
SwitchOfH.getPin_2_v() | 0 | 1 | 1 | 1 |
SwitchOfH.getPin_3_v() | 0 | 1 | 1 | 1 |
SwitchOfH.getState() | 0 | 1 | 1 | 1 |
SwitchOfH.setPin_1_v(double) | 0 | 1 | 1 | 1 |
SwitchOfH.setPin_2_v(double) | 0 | 1 | 1 | 1 |
SwitchOfH.setPin_3_v(double) | 0 | 1 | 1 | 1 |
SwitchOfH.setState(double) | 0 | 1 | 1 | 1 |
SwitchOfK.IsClose() | 2 | 2 | 1 | 2 |
SwitchOfK.SwitchOfK(String, int) | 0 | 1 | 1 | 1 |
SwitchOfK.SwitchOfK(double) | 0 | 1 | 1 | 1 |
SwitchOfK.isClose() | 0 | 1 | 1 | 1 |
SwitchOfK.setClose(boolean) | 0 | 1 | 1 | 1 |
SwitchOfL.SwitchOfL(String, int) | 0 | 1 | 1 | 1 |
SwitchOfL.SwitchOfL(int, double) | 0 | 1 | 1 | 1 |
SwitchOfL.calculateState() | 0 | 1 | 1 | 1 |
SwitchOfL.getState() | 0 | 1 | 1 | 1 |
SwitchOfL.setState(double) | 0 | 1 | 1 | 1 |
SwitchOfP.SwitchOfP(String, int) | 0 | 1 | 1 | 1 |
SwitchOfP.SwitchOfP(double) | 0 | 1 | 1 | 1 |
SwitchOfP.isConduction() | 0 | 1 | 1 | 1 |
SwitchOfP.setConduction(boolean) | 0 | 1 | 1 | 1 |
SwitchOfP.setR() | 2 | 1 | 2 | 2 |
TotalCircuit.TotalCircuit(String, int) | 0 | 1 | 1 | 1 |
TotalCircuit.getIsOk() | 0 | 1 | 1 | 1 |
TotalCircuit.setIsOk(int) | 0 | 1 | 1 | 1 |
Class | OCavg | OCmax | WMC |
---|---|---|---|
ControlledDevice | 1 | 1 | 2 |
Controller | 1 | 1 | 4 |
CurtainOfS | 2.5 | 7 | 10 |
Device | 1 | 1 | 28 |
Fan | 1 | 1 | 4 |
FanOfA | 2 | 5 | 8 |
FanOfD | 1.5 | 3 | 6 |
FilamentLamp | 1.67 | 3 | 5 |
FluorescentLamp | 1.33 | 2 | 4 |
Lamp | 1 | 1 | 3 |
ParallelCircuit | 1 | 1 | 6 |
SeriesCircuit | 1 | 1 | 3 |
SwitchOfF | 2.2 | 7 | 11 |
SwitchOfH | 1.09 | 2 | 12 |
SwitchOfK | 1.2 | 2 | 6 |
SwitchOfL | 1 | 1 | 5 |
SwitchOfP | 1.2 | 2 | 6 |
TotalCircuit | 1 | 1 | 3 |
平均复杂度 (Avg Complexity)
平均深度 (Avg Depth)
最大深度 (Max Depth)
最大复杂度 (Max Complexity)
每类方法数 (Methods/Class)
每个方法的平均语句数 (Avg Stmts/Method)
注释百分比 (% Comments)
与之前的分析相比,这张图的指标略有不同,但总体情况类似。你的Java程序在平均复杂度、每类方法数和每个方法的平均语句数方面表现良好,但在代码深度和复杂度方面需要改进,特别是最大深度和最大复杂度,需要优先考虑重构和优化。
8次大作业到此也就结束了,象征着本学期的学习已经来到了尾声。感谢老师们的辛苦付出,敬礼!