南昌航空大学 22207209-侯智慧 第三次blog作业
一、前言
在过去的一个月中,我全身心地投入到了Javapta课程的学习中,尤其是三次极具挑战性的大作业。这些作业不仅是对我Java编程技能的考验,也是我在计算机科学领域不断探索和成长的重要里程碑。
最近的一次大作业是关于家庭电路管理系统的开发。最初接触这个项目时,我感到有些不知所措。这个项目要求我们运用不同的Java特性,从基本的面向对象编程到复杂的数据结构和算法优化,以实现一个能够模拟和管理家庭电路的应用程序。
在这个项目中,我需要设计一个系统来模拟家庭电路的各种组件,比如开关、插座、灯泡等,并实现它们之间的交互。面对这些挑战,我逐渐意识到,学习编程不仅仅是掌握语法和工具,更是培养一种解决问题的思维方式。
在项目进行过程中,我不断遇到各种技术难题和逻辑陷阱。有时候,一个小小的错误可能会花费数小时甚至数天去调试和修复。然而,正是在这些反复试错和不断迭代的过程中,我的编程能力得到了显著提升。我学会了如何更有效地调试代码,如何优化算法以提高程序效率,以及如何在团队协作中利用版本控制工具来管理项目。
此外,这个作业也让我深刻体会到理论与实践相结合的重要性。在课堂上学到的概念,只有通过实际编码和项目应用,才能真正内化为自己的技能。每次成功解决一个棘手的问题,或者在项目中实现一个新功能,都会让我感受到极大的成就感和满足感。
在这篇博客中,我将详细分享这个家庭电路项目的背景、我所采用的解决方案,以及在过程中积累的经验和教训。我希望这些分享不仅能帮助其他正在学习Java的同学,也能为那些对编程充满好奇和热情的人提供一些有用的启示。编程之路漫漫,但每一步的努力和探索都值得我们珍惜和回味。让我们一起继续这段充满挑战的学习旅程吧!
二、设计与分析
1.第七次作业7-1 家居强电电路模拟程序-3
(1)难度分析:
-
设备类型和控制功能复杂性
多种设备类型:系统涉及多个设备类型,包括开关、互斥开关、调速器、灯具、风扇等。每种设备都具有不同的功能和行为模型。例如,开关的状态切换、调速器的档位调整以及风扇转速的线性变化,要求系统能够模拟不同设备的特性和操作。
调速器和互斥开关:尤其是调速器和互斥开关这类设备,其控制逻辑较为复杂。调速器的不同档位与输入电压的比例关系,以及互斥开关的状态变化都需要精确建模。
受控设备(如风扇、窗帘等):需要根据输入信号精确计算这些设备的行为(如风扇的转速变化和窗帘的开合程度)。这些设备的表现是基于输入电压的差值或者光照强度的不同,这要求系统能够实时监测和调整设备状态。 -
电路连接与模拟的复杂性
串联与并联电路的模拟:本系统涉及多个设备的连接,特别是串联和并联电路的组合。电路中设备的连接方式对模拟结果有直接影响,因此,模拟系统需要具备处理复杂电路结构的能力,包括电路中设备的并联与串联关系的分析和计算。
互联电路的分析:例如一个串联电路中包含多个连接元件,这就要求电路分析系统不仅能识别设备的连接,还能合理处理串联电路中的设备组合,保证电流、电压等物理量计算的准确性。 -
控制指令的解析与执行
输入指令的解析:系统需要能够正确解析来自用户的控制命令,例如改变开关状态、调节调速器档位、调节风扇转速等。控制指令需要按格式进行输入,并能正确地映射到相应的设备控制功能。
调节信息的计算与更新:调节信息如调速器档位的调整、开关的状态改变等,需要根据设备的状态和输入命令来更新,并实时计算设备的电气状态(如电压、电流、功率等)。
互斥开关的状态管理:互斥开关的控制逻
(2)知识点分析: -
代码结构与设计模式
抽象类与接口:代码使用了抽象类和继承的设计模式,使得不同类型的电路设备(如开关、灯、风扇等)可以共享相同的接口。这种设计使得代码具有良好的可扩展性和可维护性,但对于初学者来说,理解抽象类和继承的概念可能需要一定的时间。
多态性:通过多态性,代码能够动态地处理不同类型的电路设备。这要求开发者理解多态的概念及其在Java中的实现。 -
复杂性
电路模型:代码实现了一个复杂的电路模型,包括串联电路和并联电路的处理。这种电路模型的实现需要对电路理论有一定的理解,特别是电阻、电压和电流之间的关系。
状态管理:每个设备都有其状态(例如开关的开/关状态、调光器的档位等),管理这些状态并确保它们在整个电路中正确反映是一个复杂的任务。 -
功能实现
设备控制逻辑:设备控制逻辑(如调光器的档位控制、开关的切换等)需要对设备的状态进行精确的管理,并在状态变化时更新输出。这涉及到事件驱动的编程思想。
输出计算与分配:计算每个设备的输出电压和亮度等值的逻辑相对复杂,尤其是在处理串联和并联电路时,涉及到电压分配和电阻计算的逻辑。 -
输入解析
输入处理:代码中有一个专门的输入处理模块,负责解析输入字符串并创建相应的电路设备。输入格式的定义和解析逻辑可能对初学者构成挑战。
(3)类图
![]()
(4)踩坑心得
关于对互斥开关的处理:
class ToggleSwitch extends ControlDevice {
private boolean isConnectedTo2; // 标记当前连接状态
private double resistance12; // 1-2引脚之间的电阻
private double resistance13; // 1-3引脚之间的电阻
private String pin2Circuit = "T"; // 记录引脚2所在的分路
private String pin3Circuit = "T"; // 记录引脚3所在的分路
public ToggleSwitch(String id) {
super(id, 5); // 默认1-2引脚之间的电阻为5
this.isConnectedTo2 = true; // 默认状态为1-2接通
this.resistance12 = 5.0;
this.resistance13 = 10.0;
}
public double calculateResistance(String id) {
if (pin2Circuit.equals(id)) {
if (isConnectedTo2) {
return resistance12;
}
}else if (pin3Circuit.equals(id)) {
if (!isConnectedTo2){
return resistance13;
}
}
return 0.0;
}
@Override
public void calculateOutPut() {
// 根据当前连接状态设置输出电压和电阻
if (isConnectedTo2) {
resistance = resistance12;
OutputVoltage = 220.0; // 假设电源电压为220V
} else {
resistance = resistance13;
OutputVoltage = 0.0; // 断开状态下电压为0V
}
}public void toggle() {
isConnectedTo2 = !isConnectedTo2; // 切换连接状态
calculateOutPut(); // 重新计算输出
}public boolean isConnectedToPin2() {
return isConnectedTo2;
}public String getPin2Circuit() {
return pin2Circuit;
}
public void setPin2Circuit(String pin2Circuit) {
this.pin2Circuit = pin2Circuit;
}public String getPin3Circuit() {
return pin3Circuit;
}public void setPin3Circuit(String pin3Circuit) {
this.pin3Circuit = pin3Circuit;
}
}
这是互斥开关的实现类:
我的思路是对串联电路的id号进行记录,例如记录T1和T2,判断互斥开关的二号引脚和三号引脚分别在哪一个串联支路。
具体分析:
calculateResistance(String id):
根据传入的引脚ID,计算并返回该引脚的电阻。
如果引脚ID为pin2Circuit且当前连接到引脚2,则返回resistance12。
如果引脚ID为pin3Circuit且当前连接到引脚3,则返回resistance13。
如果不满足以上条件,则返回0.0。
calculateOutPut():
根据当前连接状态计算输出电压和电阻。
如果连接到引脚2,则输出电压为220V,电阻为resistance12。
如果连接到引脚3,则输出电压为0V,电阻为resistance13。
toggle():
切换连接状态,调用calculateOutPut()重新计算输出电压和电阻。
//检查是否是互斥开关的引脚
if (device instanceof ToggleSwitch) {
ToggleSwitch toggleSwitch = (ToggleSwitch) device;
String pinPart = pins[1].trim();
if (pinPart.equals("2")) {
toggleSwitch.setPin2Circuit(id); // 记录引脚2所在的分路
//System.out.println("Pin 2 circuit set to " + id);
} else if (pinPart.equals("3")) {
toggleSwitch.setPin3Circuit(id); // 记录引脚3所在的分路
//System.out.println("Pin 3 circuit set to " + id);
}
}
这一段代码去处理输入信息记录到引脚2和引脚3所在的分路
1.第七次作业7-1 家居强电电路模拟程序-3
(1)难度分析: -
设备类型和控制功能复杂性
多种设备类型:系统涉及多个设备类型,包括开关、互斥开关、调速器、灯具、风扇等。每种设备都具有不同的功能和行为模型。例如,开关的状态切换、调速器的档位调整以及风扇转速的线性变化,要求系统能够模拟不同设备的特性和操作。
调速器和互斥开关:尤其是调速器和互斥开关这类设备,其控制逻辑较为复杂。调速器的不同档位与输入电压的比例关系,以及互斥开关的状态变化都需要精确建模。
受控设备(如风扇、窗帘等):需要根据输入信号精确计算这些设备的行为(如风扇的转速变化和窗帘的开合程度)。这些设备的表现是基于输入电压的差值或者光照强度的不同,这要求系统能够实时监测和调整设备状态。 -
电路连接与模拟的复杂性
串联与并联电路的模拟:本系统涉及多个设备的连接,特别是串联和并联电路的组合。电路中设备的连接方式对模拟结果有直接影响,因此,模拟系统需要具备处理复杂电路结构的能力,包括电路中设备的并联与串联关系的分析和计算。
互联电路的分析:例如一个串联电路中包含多个连接元件,这就要求电路分析系统不仅能识别设备的连接,还能合理处理串联电路中的设备组合,保证电流、电压等物理量计算的准确性。 -
控制指令的解析与执行
输入指令的解析:系统需要能够正确解析来自用户的控制命令,例如改变开关状态、调节调速器档位、调节风扇转速等。控制指令需要按格式进行输入,并能正确地映射到相应的设备控制功能。
调节信息的计算与更新:调节信息如调速器档位的调整、开关的状态改变等,需要根据设备的状态和输入命令来更新,并实时计算设备的电气状态(如电压、电流、功率等)。
互斥开关的状态管理:互斥开关的控制逻
(2)知识点分析: -
代码结构与设计模式
抽象类与接口:代码使用了抽象类和继承的设计模式,使得不同类型的电路设备(如开关、灯、风扇等)可以共享相同的接口。这种设计使得代码具有良好的可扩展性和可维护性,但对于初学者来说,理解抽象类和继承的概念可能需要一定的时间。
多态性:通过多态性,代码能够动态地处理不同类型的电路设备。这要求开发者理解多态的概念及其在Java中的实现。 -
复杂性
电路模型:代码实现了一个复杂的电路模型,包括串联电路和并联电路的处理。这种电路模型的实现需要对电路理论有一定的理解,特别是电阻、电压和电流之间的关系。
状态管理:每个设备都有其状态(例如开关的开/关状态、调光器的档位等),管理这些状态并确保它们在整个电路中正确反映是一个复杂的任务。 -
功能实现
设备控制逻辑:设备控制逻辑(如调光器的档位控制、开关的切换等)需要对设备的状态进行精确的管理,并在状态变化时更新输出。这涉及到事件驱动的编程思想。
输出计算与分配:计算每个设备的输出电压和亮度等值的逻辑相对复杂,尤其是在处理串联和并联电路时,涉及到电压分配和电阻计算的逻辑。 -
输入解析
输入处理:代码中有一个专门的输入处理模块,负责解析输入字符串并创建相应的电路设备。输入格式的定义和解析逻辑可能对初学者构成挑战。
(3)类图
![]()
三、总结
在这次家庭电路管理系统的开发过程中,我不仅深入理解了Java编程的核心概念,还在实践中锻炼了自己的问题解决能力和团队协作能力。通过对不同设备类型的建模、复杂电路连接的处理以及控制指令的解析与执行,我逐步掌握了如何将理论知识应用于实际项目中。
首先,在设备类型和控制功能的复杂性方面,我认识到每种设备都有其独特的行为模型。这要求我在设计时充分考虑设备之间的交互和状态管理,特别是互斥开关和调速器的逻辑实现。同时,我也体会到细致的需求分析对于系统设计的重要性,只有明确每个设备的功能和预期行为,才能构建出一个高效且准确的模拟系统。
其次,电路连接与模拟的复杂性让我深刻理解了串联与并联电路的基本原理。在实现电路模型时,我不仅需要考虑设备的连接方式,还要确保电流和电压的计算准确无误。这一过程让我对电路理论有了更深入的理解,尤其是在处理复杂电路结构时,如何合理分析和计算电气参数成为了我必须掌握的技能。
在控制指令的解析与执行方面,我学习了如何设计一个灵活的输入处理模块,以便能够快速响应用户的操作。这不仅提高了系统的交互性,也增强了用户体验。通过不断的测试和调试,我逐渐提升了代码的可读性和可维护性,确保系统在面对不同输入时能够稳定运行。
最后,这个项目让我意识到编程不仅是技术的堆砌,更是逻辑思维的体现。面对各种技术难题,我学会了如何有效地进行调试和优化,如何利用版本控制工具进行团队协作。这些经验不仅提升了我的编程能力,也为我今后的学习和工作打下了坚实的基础。
四、学期总结
在这个学期的Java学习中,我深入掌握了基本语法、面向对象编程及数据结构与算法的核心概念。使用IntelliJ IDEA作为开发环境,使我能够高效地编写和管理代码,同时利用其强大的调试工具提升了我的调试能力。通过完成八次大作业,我不仅巩固了理论知识,还在实践中不断提高编程技巧。其中,四次判题程序的迭代让我体验到了从需求分析到功能实现的完整开发流程,逐步优化算法和提高程序性能的过程极大地锻炼了我的逻辑思维能力。此外,我还参与了家庭电路管理系统的开发,通过使用PowerDesigner绘制类图,帮助我更清晰地理解系统结构和组件之间的关系。这一系列的项目实践让我深刻体会到理论与实践的结合,也让我认识到团队协作的重要性。面对各种挑战,我逐渐培养了耐心与坚持,期待在未来的学习中继续探索更深层次的编程知识与技术,提升自己的综合能力。


浙公网安备 33010602011771号