一、前言:
-
家居强电电路模拟程序-3:
1.知识点:考察类间关系的设计。
2.题量:1道迭代难题。
3.难度:这次在上次的基础上添加了互斥开关和窗帘,有一定难度,需要考虑互斥开关的设计。 -
家居强电电路模拟程序-4:
1.知识点:考察类间关系的设计。
2.题量:1道迭代难题。
3.难度:这次在上次的基础上添加了二极管,输出管脚电压,输出电流限制,输出短路检测以及并联电路中包含并联电路,在这些里面,最难的主要是输出管脚电压,这方面要结合一些物理特性来设计就会比较困难,添加的其他内容就还好,不至于太难。
二、设计分析
- 家居强电电路模拟程序-3:
-
Electric 类:表示一个电路设备,该类包含的属性有:
input(double):表示该电路设备的输入电压;
output(double):表示该电路设备的输出电压;
voltage(double):表示该电路设备的电压差;
包含的方法: -
SeriesElectric 类:表示一个串联电路,该类包含的属性:
elements(ArrayList):表示该串联电路中所包含的电路设备;
包含的方法: -
ParallelElectric 类:表示一个并联电路,该类包含的属性:
elements(ArrayList):表示该串联电路中所包含的串联电路;
包含的方法: -
ElectricEquip 类:该类是抽象类,表示一个电子元件,该类继承自Electric类,包含的属性:
type(String):表示该电子元件的种类;
num(String):表示该电子元件的编号;
power(double):表示该电子元件的输出功率(eg:电灯输出的是亮度,风扇输出的是转速);
包含的方法: -
Power 接口:该接口用来给个各种电子元件设置输出功率,包含一个抽象方法:
-
K 类:表示一个开关,该类继承自ElectricEquip类,包含的属性:
open(boolean):表示该开关的状态,true表示开关闭合,false表示开关断开;
包含的方法: -
F 类:表示一个分档调速器,该分档调速器有4个档位,每个档位的输出电位分别为0、0.3、0.6、0.9倍的输入电压,包含的属性:
pos(int):表示该分档调速器的档位;
包含的方法: -
L 类:表示一个连续调速器,该连续调速器按位置比例得到档位参数,包含的属性:
parameter(double):表示该连续调速器的档位参数;
包含的方法: -
H 类:表示一个互斥开关,引脚1一定会与引脚2或者引脚3其中一个连接,可以将一个互斥开关设计成两个普通开关和两个电阻,这个两个开关和电阻分别在其所在的电路中,包含的属性:
connect (boolean):表示该互斥开关引脚1和引脚2是否连接;
k2(K):表示该互斥开关引脚2对应的开关;
k3 (K) :表示该互斥开关引脚3对应的开关。
resistance2(Resistance):表示该互斥开关引脚2对应的电阻,电阻为5;
resistance3(Resistance):表示该互斥开关引脚2对应的电阻,电阻为10; -
LightB 类:表示一个白炽灯,包含的方法:
-
LightR 类:表示一个日光灯,包含的方法:
-
Fan 类:表示一个吊扇,包含的方法:
-
A 类:表示一个落地扇,包含的方法:
-
Resistance 类:表示一个电阻,只包含一个构造方法:
-
S 类:表示一个受控窗帘,包含的方法:
-
ParseInput 类:该类用来解析输入的字符串,将字符串中的电器以及电路解析出来,该类没有属性,只有静态方法:
- 家居强电电路模拟程序-4:
-
Electric 类:表示一个电路设备,该类包含的属性有:
input(double):表示该电路设备的输入电压;
output(double):表示该电路设备的输出电压;
voltage(double):表示该电路设备的电压差;
包含的方法: -
SeriesElectric 类:表示一个串联电路,该类包含的属性:
elements(ArrayList):表示该串联电路中所包含的电路设备;
包含的方法: -
ParallelElectric 类:表示一个并联电路,该类包含的属性:
elements(ArrayList):表示该串联电路中所包含的串联电路;
包含的方法: -
ElectricEquip 类:该类是抽象类,表示一个电子元件,该类继承自Electric类,包含的属性:
type(String):表示该电子元件的种类;
num(String):表示该电子元件的编号;
power(double):表示该电子元件的输出功率(eg:电灯输出的是亮度,风扇输出的是转速);
包含的方法: -
Power 接口:该接口用来给个各种电子元件设置输出功率,包含一个抽象方法:
-
K 类:表示一个开关,该类继承自ElectricEquip类,包含的属性:
open(boolean):表示该开关的状态,true表示开关闭合,false表示开关断开;
包含的方法: -
F 类:表示一个分档调速器,该分档调速器有4个档位,每个档位的输出电位分别为0、0.3、0.6、0.9倍的输入电压,包含的属性:
pos(int):表示该分档调速器的档位;
包含的方法: -
L 类:表示一个连续调速器,该连续调速器按位置比例得到档位参数,包含的属性:
parameter(double):表示该连续调速器的档位参数;
包含的方法: -
H 类:表示一个互斥开关,引脚1一定会与引脚2或者引脚3其中一个连接,可以将一个互斥开关设计成两个有电阻的开关,这个两个开关分别在其所在的电路中,包含的属性:
connect (boolean):表示该互斥开关引脚1和引脚2是否连接;
k2(K):表示该互斥开关引脚2对应的开关;
k3 (K) :表示该互斥开关引脚3对应的开关。
包含的方法: -
P 类:表示一个二极管,二极管的正向为引脚1到引脚2,如果电流方向与二极管方向相同则二极管电阻为0,如果电流方向和二极管方向相反则这条串联电路可视为断开,包含的属性有:
k(K):表示一个开关,这个开关根据电流的方向决定是开还是关;
包含的方法: -
LightB 类:表示一个白炽灯,包含的方法:
-
LightR 类:表示一个日光灯,包含的方法:
-
Fan 类:表示一个吊扇,包含的方法:
-
A 类:表示一个落地扇,包含的方法:
-
S 类:表示一个受控窗帘,包含的方法:
-
ParseInput 类:该类用来解析输入的字符串,将字符串中的电器以及电路解析出来,该类没有属性,只有静态方法:
三、踩坑心得
- 家居强电电路模拟程序-3:
- 在case9-10中,我的窗帘设计的是默认是0%,也就是默认是关闭的,但题目要求是默认全开,也就是默认是100%;
- 在case27-29中,因为排序问题而导致出错,之前这些电器都是用HashMap来存,比如开关:public static HashMap<String, K> Ks = new HashMap<>(),每一个编号(String)对应着这个编号的开关,但是HashMap的排序是不对的,不完全是按照字典序来排的,可以将HashMap改成TreeMap,TreeMap是按照key的顺序来排的,而这里的编号是字符串,也就是按照字典序来排的;
- 家居强电电路模拟程序-4:
-
互斥开关因为有3个引脚,所以互斥开关引脚的电势要Override父类的计算引脚电势的方法,这时候互斥开关再设计成开关和电阻的形式就比较麻烦了,可以直接设计成一个有电阻的开关,互斥开关引脚的电势就可以直接等于这两个开关引脚的电势。
-
再就是这种情况,只闭合K1;K2和K3断开;K2两端的电势分别为220和0,改完这种情况就有84分了。
-
最后是这种情况,但是我处理了这种情况之后,分数反而变低了,之后就没有再写了,不清楚是思路有问题还是设计的有问题。
四、改进建议
- 家居强电电路模拟程序-3:
- 这次的互斥开关中的开关和电阻可以合在一起设计成有电阻的开关,比如下一次pta作业中就会用到。
- 家居强电电路模拟程序-4:
- 二极管如果两端电压相等并且没有电流流过可以分以下两种情况输出:如果两端电压为0,二极管的导通/截止状态由接入方向决定,1号引脚靠近电源则导通,反之截止。如果两端电压不为0,二极管导通。这是老师给出的建议。
五、总结
- 最后一次pta的题目比较难,主要还是之前说的那个原因,要输出管脚电压,这里面有太多的情况,还有物理原理,导致出现了许多的问题,就比如老师给出的建议中,二极管如果两端电压相等没有电流流通且两端电压不为0,二极管就一定导通吗?如果这个二极管是截止的,但是被一根电线短路了呢?两端电压是相等的且不为0,并且这个二极管也是没有电流流过的。所以在写最后一次pta的时候,越写越乱,写到后面就不想写了。
- 不过感觉第7次的题目设计的还好,不算难,也不算简单,需要去发现一些细节,发现一些小问题,并对这些问题进行修改调试,修改完成之后会拿到满意的分数。
- 总的来说,这一系列的pta在不断的迭代,自己的水平应该也是随着pta的迭代不断的提高的,虽然这东西感觉不到,但写了题目肯定是会效果的,至少积累了经验,积累了知识,积累了能力。