一:前言
第五次作业明显比之前的难了许多,大作业是模拟家居强电电路模拟程序,本次题目集只考虑了电路只为串联的情况,但是有多个开关接入电路,同时也有电压调节器。这次作业需要我们对电器实现继承关系,即所有的用电器都需要继承与电器这个父类。
所给题目设计建议:
1、电路设备类:描述所有电路设备的公共特征。
2、受控设备类、控制设备类:对应受控、控制设备
3、串联电路类:一条由多个电路设备构成的串联电路,也看成是一个独立的电路设备
其他类以及类的属性、方法自行设计。
并且提供了四次迭代的区别:
迭代1:只有一条线路,所有元件串联
迭代2:线路中包含一个并联电路
迭代3:线路中包含多个串联起来的并联电路
迭代4:并联电路之间可能出现包含关系,
二:设计思路
首先,我们判断电路开端是否含有VCC信息,如果有,就设置电路初始电压为220V,反之为0V
然后读取所有设备信息,包括控制器和被控制器。按照从电路开端到电路接地端的方向一步一步进行处理,并且令下一个设备的输出电压等于上一个设备的输出电压。这样就能得到所有设备的输入电压和输出电压。
其次,获取了输入电压和输出电压后,就能用前者与后者的差计算出该设备的电压,再根据该设备的状态计算方式计算出它的转速或者亮度等状态信息。
最后,对设备信息进行排序输出。到此,这道题目我们就解决了。
uml类图
其中也有许多坑点,比如并联电路的等效电阻为0欧姆,就不会产生分压之类的,我们需要一次次进行调式,最后才能得到正确的代码。
CircuitDevice 类:这是所有电路设备的基类,包含设备名称、输入引脚、输出引脚和状态属性。它还定义了control方法,但这个方法没有具体实现。
ControlDevice 类:这是CircuitDevice的子类,表示控制设备。它有一个额外的ratio属性,表示控制比例。ControlDevice类重写了control方法,提供了具体的控制逻辑。
ControlledDevice 类:这是CircuitDevice的另一个子类,表示受控设备。它根据不同的设备类型(以设备名称的首字母区分)和传入的状态值来改变设备的状态。
SeriesCircuit 类:这是一个特殊的电路设备类,表示串联电路。它包含一个设备列表和设备映射,用于存储串联电路中的设备。SeriesCircuit类提供了添加设备、解析控制指令和改变设备状态的方法。
Main 类:这是程序的入口点。它使用Scanner类来读取用户输入,并根据输入的类型(连接信息、控制设备、串联电路信息、并联电路信息)调用SeriesCircuit类的方法。最后,它输出每个设备的状态。
public CircuitDevice() {
}
public CircuitDevice(String name, int inputPin, int outputPin) {
this.name = name;
this.inputPin = inputPin;
this.outputPin = outputPin;
this.status = 0; // 默认关闭状态
}
public void control(double status) {
}
public void control(String status) {
}
}
// 控制设备类
class ControlDevice extends CircuitDevice {
double ratio = 0.0;
public ControlDevice(String name, int inputPin, int outputPin) {
super(name, inputPin, outputPin);
}
private void d4(String op) {
List<Double> ranges = asList(0.0, 0.3, 0.6, 0.9);
int curIdx = ranges.indexOf(this.ratio);
if (op.equals("+") && curIdx < 3) {
this.status += 1;
this.ratio = ranges.get(++curIdx);
} else if (op.equals("-") && curIdx > 0) {
this.status -= 1;
this.ratio = ranges.get(--curIdx);
}
}
public void control() {
this.status = 1 - this.status; // 切换状态
}
public void control(double status) {
this.status = status; // 切换状态
}
public void control(String status) {
if (name.startsWith("K")) {
this.control();
} else if (name.startsWith("F")) {
this.d4(status);
} else if (name.startsWith("L")) {
this.control(Double.parseDouble(status));
}
}
}
三:总结
通过这几次的作业,我也已经从刚开始的吃力慢慢变得适应,这几次的作业让我学习到一个程序的好坏既要有代码的简洁也要有代码的标准,要让自己的程序好看,功能全,同时我也学习到了java中类的继承,以及集合存储中的map.当然也有很多细节:要给代码注释,要注意代码可能出现的问题,以及如何将代码的复用性提高.