一.前言
1.题目集7~8的知识点:
(1)类与对象:各个电路设备类型被建模为类,每个类封装了设备的状态和行为。
(2)继承与多态:使用继承来建立设备类之间的关系,并通过方法重写实现多态性,确保同一方法针对不同类型的设备表现出不同行为。
(3)接口与排序:接口被用于定义设备类的排序规则,确保设备对象可以按照特定的属性进行比较和排序。
(4)封装与访问控制:使用封装技术保护设备类的内部状态,通过公共方法提供对设备状态和行为的控制和访问。
(5)构造函数:每个设备类都包含构造函数,用于初始化设备对象的初始状态和属性。
(6)递归:串联电路包含所有电器设备子类,运用递归的方法计算每个设备的电压以及电流情况。
(7)正则表达式:运用正则表达式对输入文本进行匹配,以精准地读出输入设备的属性。
(8)异常情况的处理:通过将题目输入的大块字符串分割成一段一段的字符串进行逐个处理,并对异常情况进行输出,保证程序的稳定性。
2.题量
(1)在第七次大作业中,有大量的设计需要完成,因此需要投入相当多的时间和精力。
(3)而在第八次大作业中,设计虽然也很多,但与第七次相比,它需要更多的时间来完成整个作业,因为其中的每个知识点都更加复杂,需要更深入的思考和分析。
3.难度
(1)第七次大作业的难度:较高。由于有大量的设计需要完成,并且需要花费大量的时间和精力,因此这个作业的难度较高。
(3)第八次大作业的难度:高。设计思路也很多,难度比第七次大作业难,需要投入大量的时间和精力来完成。
二.设计与分析
1.第七次大作业
(1)设计与分析
CircuitEquipment 类:
属性包括设备编号 deviceNumber、设备类型 deviceType、两个引脚 pin1 和 pin2、使用状态 useState 和电压 voltage。
实现了 Comparable 接口,通过 compareTo 方法按照设备类型和设备编号进行比较。
提供了构造函数和一些基本的 getter 和 setter 方法。
包含了一个抽象方法 endVoltage,用于计算设备终端的电压。
包含了一个 display 方法用于显示设备信息,以及一个 usable 方法用于判断设备是否可用。
Switch 类:
继承自 CircuitEquipment 类,表示开关设备。
属性包括开关状态 state。
构造函数初始化开关状态,并设置设备类型。
重写了 endVoltage 方法,根据开关状态返回电压值。
实现了 setState 方法用于改变开关状态。
重写了 display 方法用于显示开关状态。
BinningGovernor 类:
继承自 CircuitEquipment 类,表示分档调速器设备。
属性包括档位 binningGears。
构造函数初始化档位,并设置设备类型。
重写了 usable 方法,根据引脚连接情况判断设备是否可用。
重写了 endVoltage 方法,根据档位和可用性返回电压值。
实现了 shiftUp 和 shiftDown 方法用于调节档位。
重写了 display 方法用于显示档位信息。
ContinuousGovernor 类:
继承自 CircuitEquipment 类,表示连续调速器设备。
属性包括连续档位 continuousGears。
构造函数初始化连续档位,并设置设备类型。
重写了 usable 方法,根据引脚连接情况判断设备是否可用。
重写了 endVoltage 方法,根据连续档位和可用性返回电压值。
重写了 display 方法用于显示连续档位信息。
IncandescentLamp 类:
继承自 CircuitEquipment 类,表示白炽灯设备。
属性包括白炽灯亮度 incandescentLampBrightness。
构造函数初始化白炽灯类型。
重写了 endVoltage 方法,根据电压计算白炽灯的亮度。
重写了 display 方法用于显示白炽灯亮度。
FluorescentLamp 类:
继承自 CircuitEquipment 类,表示日光灯设备。
属性包括日光灯亮度 fluorescentLampBrightness。
构造函数初始化日光灯类型。
重写了 endVoltage 方法,根据电压计算日光灯的亮度。
重写了 display 方法用于显示日光灯亮度。
CeilingFan 类:
继承自 CircuitEquipment 类,表示吊扇设备。
属性包括吊扇转速 rotateSpeed。
构造函数初始化吊扇类型。
重写了 endVoltage 方法,根据电压计算吊扇的转速。
重写了 display 方法用于显示吊扇转速。
SeriesCircuits 类:
用于管理一组电路设备的集合。
属性包括 circuitEquipments,存储 CircuitEquipment 对象的 ArrayList。
构造函数初始化 circuitEquipments。
实现了 displayAll 方法用于显示所有电路设备的信息。
实现了 setVoltage 方法用于设置电路中的电压,并根据电压计算每个设备的状态。
ParallelCircuit 类:
代表并联电路。
属性包括一个存储 SeriesCircuits 对象的列表 seriesCircuits。
构造函数接受设备数量,初始化 seriesCircuits 列表。
重写了 getResistance 方法来计算并联电路的总电阻。
包括 getCircuitEquipments 方法来获取并联电路中的设备列表。
(2)心得
优化了上次迭代过程中写的循环语句,在判断设备读入结束时添加了break,将部分for循环改为了for-each循环简化了过程中的变量。
第一次提交错了部分,根据提示查看代码发现是本次迭代新加入了串联电路包含串联电路,而在串联电路类中添加设备时没考虑添加串联电路,并且在检查时发现没有处理互斥开关只有一个的情况,新加入了循环遍历动态数组将有关互斥开关的部分修改,单独列出互斥开关只出现一次时的情况,与互斥开关出现两次的情况区分开,最后还是只有91分,27、28、29测试点怎么都过不了,最终询问同学不断测试各种奇怪的输入发现错在输出排序,我将设备编号的数据类型设为int,在调取comparable接口时对同种设备的输出按照编号的数字大小输出,而实际却应该将编号设为String类型,按照字典序输出各个设备。
2.第八次大作业
(1)设计与分析
这次大作业在第七次的基础上修改了SeriesCircuits类、ParallelCircuit类和主函数,以及按照题目要求增加了二极管类。
构造函数初始化了 Diode 类的实例。它调用了父类 CircuitEquipment 的构造函数,传递设备编号 deviceNumber。
使用 setDeviceType(10) 设置设备类型为 10,是二极管的特定类型。
调用 setResistance(0) 将电阻设为 0,表示这个二极管模型在这里忽略了电阻的影响。
方法重写 (display() 方法):
@Override 标注表明 display() 方法重写了父类 CircuitEquipment 的 display() 方法。
System.out.print("@P"+getDeviceNumber()+":")输出设备编号前缀,格式为 @P 加上设备编号。
检查 getVoltage1() 和 getVoltage2(),如果它们相等且都为 0,则打印 "cutoff";如果不为 0,则打印 "conduction"。
如果 getVoltage1() 和 getVoltage2() 不相等,则再次检查 usable() 方法的返回值,如果可用,则打印 "conduction",否则打印 "cutoff"。
输出电压范围,格式为 (voltage1-voltage2)。
最后,根据当前电流是否大于 8,决定是否输出 "exceeding current limit error"。
其中串联电路类的setResult方法修改最大如下:
@Override
public void setResult(double voltage)
{
this.voltage=getVoltage1();
if(circuitEquipments.get(0).getDeviceType()2||circuitEquipments.get(0).getDeviceType()3)
{
voltage = circuitEquipments.get(0).endVoltage(220);
this.voltage=voltage;
}
double totalResistance = calculateTotalResistance();
double current=voltage/totalResistance;
if(!seriesCircuitsState())
current=0;
if(currentDouble.POSITIVE_INFINITY)
setCurrent(0);
else if (totalResistance0&&voltage0)
setCurrent(getCurrent());
else
setCurrent(current);
if(!seriesCircuitsState())
{
boolean opening=false;
for (CircuitEquipment circuitEquipment1 : circuitEquipments)
{
if(circuitEquipment1circuitBreaker())
opening=true;
circuitEquipment1.setResult(0);
if(!opening)
{
circuitEquipment1.setVoltage1(this.voltage);
circuitEquipment1.setVoltage2(this.voltage);
}
else
{
circuitEquipment1.setVoltage1(getVoltage2());
circuitEquipment1.setVoltage2(getVoltage2());
}
}
if(circuitBreaker().usable())
circuitBreaker().setVoltage1(this.voltage);
else
circuitBreaker().setVoltage2(this.voltage);
circuitEquipments.get(circuitEquipments.size()-1).setVoltage2(this.voltage-voltage);
circuitBreaker().setResult(voltage-circuitBreaker().getVoltage2());
return;
}
for (CircuitEquipment circuitEquipment : circuitEquipments)
{
double deviceVoltage = voltage * circuitEquipment.getResistance() / totalResistance;
if(totalResistance0)
deviceVoltage=0;
if (circuitEquipment.usable())
{
circuitEquipment.setVoltage1(this.voltage);
circuitEquipment.setVoltage2(this.voltage - deviceVoltage);
}
else
{
circuitEquipment.setVoltage1(this.voltage - deviceVoltage);
circuitEquipment.setVoltage2(this.voltage);
}
circuitEquipment.setResult(deviceVoltage);
this.voltage-=deviceVoltage;
}
if(circuitEquipments.get(0).getDeviceType()2||circuitEquipments.get(0).getDeviceType()==3)
{
if (circuitEquipments.get(0).usable())
circuitEquipments.get(0).setVoltage1(220);
else
circuitEquipments.get(0).setVoltage2(220);
}
double brightness=getTotalBrightness();
for(CircuitEquipment circuitEquipment:getAllDevice())
if(circuitEquipment instanceof Curtain)
((Curtain) circuitEquipment).setOpenScale(brightness);
}
在这个方法中根据当前串联电路的通路情况以及各个设备引脚的接通情况设置了非常多的if条件判断,导致整段代码非常累赘,但是受限于时间,没有想到更好的办法优化这个方法,使得在后面修改的过程中越来越复杂,以至于完全不知道从何下手
(2)心得
这次大作业发布时临近各科期末考试,导致大部分时间花在考试上,只用了很短的时间去迭代代码,最终在最后一天晚上写到十二点才得了72分。这次大作业本身就比之前的更加有挑战性,但我却花了更少的时间去写,问题还是在于思路不够清晰,在设计串联电路类中的方法时没有很好的逻辑性,以后在写编程作业时必须花更多的精力以达到更好的效果。
三.总结
通过完成这两次大作业,我深入理解了面向对象编程的核心概念。我掌握了类、对象、封装等基本概念,并学会了如何在实际编程中应用它们。这些作业不仅帮助我掌握了编程语言的语法和特性,还提升了我的实际编程能力和解决问题的技巧。在处理作业和实验时,我学会了如何提高代码的复用性和可维护性,例如将功能封装成方法或类,并注重代码的可读性和注释,以便于团队协作和未来的维护。在这次编程作业中,我还系统地学习了正则表达式的应用。正则表达式是一种强大的文本处理工具,我学会了如何使用它来搜索、提取和替换特定模式的字符串,以及验证输入的格式。这种技能使我能够更高效地处理文本数据,提升了我的编程实践能力和解决问题的灵活性。我通过深入学习继承的概念和实际应用,进一步扩展了我的编程知识。我学会了如何创建和使用子类来扩展和重用代码功能,从而使我的代码更加模块化和可扩展。这种方法不仅减少了重复编码的工作量,还使代码更易于维护和升级。在未来,我将继续运用继承原理,设计和实现更加灵活和可维护的代码结构,以应对各种复杂项目的需求和挑战。在今后的学习中可以将相似的功能封装成方法或者类,可以提高代码的复用性和可维护性。以后在实现代码的过程中可以适当加入一些注释,代码应该易于理解,包括给变量和方法起一个有意义的名字,添加注释来解释代码的作用和逻辑。这样可以让其他人更容易理解代码,也方便自己日后的维护和修改。