前言
这篇博客是完成《面向对象程序设计》(java)课程的中三次PTA作业后的总结。主要内容有:
- 家居强电电路模拟程序 - 3
- 家居强电电路模拟程序 - 4
题目分析
家居强电电路模拟程序 - 3 分析
这是第三次的家居强电电路模拟程序,这次的强度变高了,题目有点难。
设备包括:控制设备(开关、调速器)和受控设备(如灯具、风扇)。模拟电路的连接关系及电压、电位差对设备状态的影响。电路中包含多个控制设备、受控设备以及它们之间的连接。控制设备调整受控设备的状态(如灯的亮度、风扇的转速)。电路连接信息提供了设备之间的电气连接关系。电源(VCC)提供220V电压,接地(GND)为0V电压。
那对于这种设备的模拟,比较合适的面向对象的设计的方法是继承。继承关系体现了面向对象的多态性,不同的设备可以有不同的行为和属性。最基本的类有两个:
设备类包含设备的基本属性,如设备名、输入引脚、输出引脚、状态等。
引脚类包含连接信息。
设备类和引脚类采用组合模式,设备类内含有输入和输出引脚的变量(应该没有三个脚的)。设备的行为(如开关、调速器等)是由这些引脚的电位差来决定的。
主要是增加了受控窗帘、互斥开关。互斥开关还有电阻。还增加了串联电路的一些计算条件,例如可以有串联电路中有串联电路的情况。
受控窗帘的开关程度是通过所有灯具的亮度和来控制的。
互斥开关相比起其他元件来说多了一个引脚,也就是说需要修改“元件”这个东西的设计。他不能只有两个引脚了,电流可以选择其一通过。而且,互斥开关的电阻也是可变,实现变得复杂了。
线路中包含多个串联起来的并联电路。多个并联电路需要串联在一起计算了。思路也可以改变一下。之前可能只有一个并联,现在可能会有多个并联。
因此,我确定了我这次的优化思路:输入之后,根据电路的拓扑结构,使用适当的计算来计算电压和电流的分布。
对于串联电路,电流不变,电压分配;对于并联电路,电压不变,电流分配。
在每个节点上更新电压、电流和电阻值,并根据互斥开关或受控窗帘等条件进行相应的状态变更。对于串联电路和并联电路的组合,需要准确计算电流和电压的分布。在串联电路中,电流保持不变,而电压在各个电阻上按比例分配。在并联电路中,电压保持不变,而电流会根据电阻的不同进行分配。程序中需要能够实时更新电流和电压的值,并反映到电路的状态中。
这是我的类图设计。
对于最核心的,就是electricDevice类
类的依赖关系如下:
运行流程:
- 按顺序,将输入存储。
- 从存储的输入里面解析数据,根据输入的连接信息创建设备electricDevice对象并连接它们,并连接和创建junction 类用于存储和设备间的电压。
- 通过 processCommands() 方法解析并执行控制命令(例如开关设备、调节档位等)
- 通过 propagateVoltage() 方法,程序将初始电压通过电路传递到各个设备,并根据设备类型计算输出结果(如亮度、转速等)。
- 最后,outputStatus() 方法输出所有设备的当前状态。
最后一次的分析
这一次是最难的,比较难得分。主要区别就在于:增加了二极管这种东西。电流流向需要注意了。但其实我没有做出来这道题,只是做了一些工作。
还有一些增加的描述,如:受控设备电阻。白炽灯的电阻为 10,日光灯的电阻为 5,吊扇的电阻为 20,落地扇的电阻为 20,窗帘电阻为15。 在本题中,并联电路M中的串联电路可以包含别的并联电路。
我增加了一个二极管类。
class Diode extends electricDevice {Diode(String name) {super(name);}// 重写 calOutVoltage 方法,导通电压为 0V@Overridepublic void calOutVoltage() {if (getInVoltage() > 0) {// 输入电压大于 0 时,二极管导通,输出电压等于输入电压setOutVoltage(getInVoltage());} else {// 输入电压为 0 或负时,二极管不导通,输出电压为零setOutVoltage(0);}}// 检测电流方向等public void showCurrentBehavior() {if (getInVoltage() > 0) {System.out.println(getName() + " is conducting with voltage: " + getInVoltage());} else {System.out.println(getName() + " is not conducting.");}}
}
由于没做出来,所以我的分享也不太有用,似乎计算方向上还需要额外进行添加。
一些学到的调试方法分享
多存信息,方便打印
面向对象程序设计中,类很方便的可以帮我们进行资源管理。因此,我们可以把很多东西放心的存在里面。比如:我们可以给很多东西命个名。
在这次的家庭电路模拟程序中,非常复杂的电路计算往往需要打印(System.out.print...)。这时候如果我们把创建对象的名字存起来,就很方便打印了。
我还添加了一个类,专门用于存储是否打开调试信息,
class debug
{static public int is_debug=1;
}
这样,我就可以只更改一个“1”就可以控制debug信息打印了,提交时候更方便,不用注释了(虽然可能用不到了)