22207203-陈思思
一、前言
(一)第7次题目集(家居强电电路模拟程序-3)
- 知识点:
- 串联电路:电流相同,电压分配。
- 并联电路:电压相同,电流分配。
- 类的设计:电路设备类、受控设备类、控制设备类、串联电路类、并联电路类。
- 数据结构:使用列表或字典存储电路信息、设备状态。
- 算法:递归或迭代计算电压、电流和设备状态。
- 输入输出:读取并解析输入信息,按指定格式输出设备状态。
- 题量:
- 输入信息涉及多个串联和并联电路,每条信息可能包含多个设备。
- 设备种类较多,包括开关、调速器、灯、风扇、窗帘等。
- 每种设备都有不同的工作原理和状态展示方式。
- 难度中等:
- 需要理解电路基本原理,并正确模拟不同设备的行为。
- 需要设计合理的类结构和算法,以处理复杂的电路连接关系。
- 根据输入信息动态调整设备状态,并输出结果,要求有一定的逻辑处理能力。
- 挑战点:
- 互斥开关的状态管理和电流分配。
- 调速器的档位控制和计算其输出电压。
- 窗帘的开启比例计算依赖于电路中所有灯的亮度总和。
- 多条串联电路的并联关系处理,确保电压和电流分配正确。
- 输入信息的解析和电路结构的构建,需要细致的编码和调试。
(二) 第8次题目集(家居强电电路模拟程序-4)
- 知识点:
- 面向对象编程:需要设计多个类来表示不同的设备(如开关、调速器、灯、风扇、窗帘和二极管)及其公共特征。
- 电路模拟:理解基本电路原理,如串联和并联电路的工作方式、电压分配和电流计算。
- 状态管理:每个设备有不同的状态和参数,需要管理这些状态的变化。
- 输入解析:从输入文本中解析出设备信息、连接信息以及控制命令。
- 异常处理:包括电流限制和短路检测。
- 电压计算:根据输入电压和各设备的特性计算各引脚的电压。
- 数据结构:使用合适的数据结构(如字典、列表)来存储设备信息和电路连接关系。
- 题量:
- 输入信息中包括设备信息、连接信息、控制信息等多个方面,需要解析和处理这些信息。
- 输出信息要求详细记录各个设备的状态和参数,以及每个引脚的电压。
- 示例提供了不同类型的电路配置,从简单的到复杂的,可以用于测试程序的鲁棒性。
- 难度高:
- 难度高:题目虽然涉及电路模拟,但没有涉及复杂的物理模型或电路特性,非常适合用于学习和练习面向对象设计。
- 逻辑复杂度:需要设计复杂的逻辑来处理电路中的串联和并联关系,以及设备之间的相互影响。
- 异常检测:需要实现电流限制和短路检测,增加了程序的复杂性。
- 细节处理:题目对输出格式要求很详细,需要仔细处理每个设备的状态和参数的输出。
二、 设计与分析
(一) 第7次题目集
-
类图
家居强电电路模拟程序-2的基础上增加了受控类和控制类,分担基类的功能,增添了控制设备互斥开关类和受控设备窗帘类。
Electric类:作为所有设备的基类,定义了设备的基本属性和方法。
Switch、ME_Switch、FenDangSwitch、LianXuSwitch、Lump、Riguang、Diaoshan、LuodiFan、DayLight类:继承自Electric类,实现了具体设备的功能。
Bi和Chuan类:用于实现串联电路与并联电路。
Complain类:负责根据输入信息创建相应的电路设备。
Main类:程序的入口,负责整个流程的控制,包括读取输入、解析输入、计算电压、更新电压和输出结果。 -
SourceMonitor报表分析
复杂度:AnswerSheet.gradeAnswers() 方法的复杂度最高,为19,这表明该方法可能需要进一步优化以提高可维护性。
注释:只有7.7%的代码行包含注释,建议增加注释以提高代码的可读性和可维护性。
分支语句:13.2%的语句是分支语句,这表明代码中存在一定的逻辑分支,但整体上处于合理范围内。
方法调用:共有255个方法调用语句,表明代码具有较好的模块化和重用性。
(二) 第8次题目集
-
类图
在家居强电电路模拟程序-3的基础上增加了电子设备二极管
-
SourceMonitor报表分析
基瓦特图 (Kiviat Graph):显示了不同指标的分布情况,包括平均复杂度、平均深度、最大深度等。
块直方图 (Block Histogram):显示了代码块的分布情况,有助于理解代码结构。
复杂度:Calculate_shuV.calculate_shuV() 方法的复杂度最高,为28,这表明该方法可能需要进一步优化以提高可维护性。
注释:只有5.6%的代码行包含注释,建议增加注释以提高代码的可读性和可维护性。
分支语句:27.8%的语句是分支语句,这表明代码中存在较多的逻辑分支,但整体上处于合理范围内。
方法调用:共有340个方法调用语句,表明代码具有较好的模块化和重用性。
三、 踩坑心得
(一) 第7次题目集
- 受控开关的实现
题目要求互斥开关有3个引脚,并且只有两种状态:接通2号引脚或接通3号引脚。初始状态为接通2号引脚。
解决方法:需要为互斥开关创建一个新的类ME_Switch,并实现其状态切换和电压计算逻辑。
定义3个属性及状态的切换:
public int state = 0; // 0: 接通2号引脚, 1: 接通3号引脚
public int resistance12 = 5; // 1、2引脚之间的电阻
public int resistance13 = 10; // 1、3引脚之间的电阻
public void regulate(String vs) {if (vs.equals("+")) {state = 1 - state; // 切换状态}}
//计算电压
public void reshuV(double shuop) {if (state == 0) {shuV = shuop * resistance12 / (resistance12 + resistance13); // 计算电压} else {shuV = shuop * resistance13 / (resistance12 + resistance13);}}
- 窗帘的实现
(二) 第8次题目集 - 题目要求二极管有正向导通和反向截止两种状态。
解决方法:需要为二极管创建一个新的类Diode,并实现其导通和截止逻辑。
定义一个属性来判断二极管的导通还是截止:
public boolean conduction = true; // true: 导通, false: 截止
//计算二极管的电压并判断
public void reshuV(double shuop, double shuop2) {if (shuop == shuop2) {conduction = (shuop != 0); // 两端电压相等时,如果电压不为0,则导通} else {conduction = true; // 两端电压不相等时,导通}if (conduction) {shuV = shuop;} else {shuV = 0;}}
- 短路检测
短路检测
总电阻计算:遍历电路中的所有设备,累加每个设备的电阻值。
短路判断:如果总电阻为0,则电路发生短路,返回true;否则返回false。
应用场景:在计算电压之前调用此方法,如果检测到短路,则输出错误信息并终止程序。
public static boolean isShortCircuit(Map<String, Electric> circuit) {double totalResistance = 0;for (Electric dev : circuit.values()) {totalResistance += dev.resistance;}return totalResistance == 0;}
四、 改进建议
在题目集7中,有很多异常处理,我是用的是在相应的类中自行处理,之后可以引入自定义异常类来处理不同类型的错误。例如:InputFormatException:处理输入格式错误的情况。QuestionNotFoundException:处理试卷中引用了不存在题号的情况。StudentNotFoundException:处理学生信息中不存在的学号。在处理题型的整理时,有些逻辑是重复的。之后改进可以将重复的逻辑提取成辅助方法或函数。例如,处理输入的逻辑可以整合到一个方法中,通过参数区分不同的处理方式,减少代码的冗余。当前支持的题型是选择题、填空题、多选题,可以考虑实现其他题型,如:简答题、排序题等。
题目集7和8中,一些类(如 Electric 类)包含多个职能,可能会造成类的职责不明确,之后会考虑改进将设备的每个功能(如状态管理、电压调整)进一步抽象为小的类。可以创建接口或抽象类,以提供设备状态和行为的一致框架。当前题目只支持开关、调速器、灯具和风扇。如果需要增加新设备,需大幅修改现有代码。之后会使用工厂模式来创建电器对象,以便能够轻松添加新的电器类型而不需更改现有代码结构。
五、总结
在本次实验中,我们完成了两个题目集的任务,分别是家居强电电路模拟程序-3和家居强电电路模拟程序-4。这些任务涵盖了类与对象、继承与多态、集合、正则表达式、业务逻辑处理和设计模式的应用。
首先,在答题判题程序中,我们定义了多个类来封装不同类型的题目,如单选题、多选题和填空题。通过使用Map、Set和List等集合类,实现了对题目、考试卷和学生信息的高效管理。策略模式和命令模式的应用使评分逻辑和输入处理更加灵活。不过,代码中存在一些复杂方法和较低的注释覆盖率,需要增加注释并优化这些方法。
其次,在家居强电电路模拟程序7中,我们在原有基础上增加了混合电路,使系统的逻辑更加复杂。我们设计了一个基类Electric和多个子类,如开关、分档、连续、白炽灯、日光灯和吊扇。通过继承关系,复用了基类的代码,避免了重复。输入处理方面,通过正则表达式和字符串解析技术,成功处理了多种格式的输入,并实现了设备的连接和状态管理。尽管如此,主函数的复杂度较高,需要进行功能拆分,降低复杂度。
最后,在家居强电电路模拟程序8中,通过引入不同的前缀字符和标签化的方式,区分了串联和并联电路,简化了电路管理。尽管如此,代码中仍存在重复的逻辑和复杂的控制结构,计划引入工厂模式来创建电器对象,并进一步抽象设备功能。
在整个实验过程中,我深刻体会到设计模式的重要性。合理运用设计模式可以提高代码的灵活性和可扩展性,降低系统复杂度。此外,异常处理也不可忽视。在答题判题程序中,通过自定义异常类处理各种错误情况,提高了系统的健壮性和错误处理的清晰度。
总之,通过这次实验,我在面向对象编程和设计模式方面有了更深的理解和实践。未来,我将继续优化代码结构,提高代码的可读性和可维护性,争取在实际项目中应用所学知识,解决更复杂的问题。