oop 7~8总结
前言
-
知识点
整体的知识点与前几次的题目没有太多的不同,每次迭代因为题目要求都有增加,所以会新增一些做法,但是像是继承、集合框架、正则表达式、抽象类、多态以及接口等知识点依然会重复使用,只是用法会不同。
越写到后面我越是意识到算法的重要性。在题目里面需要考虑遍历算法(用于遍历电路中的设备,执行控制的命令以及计算电压和电流等)、状态更新的算法(根据控制命令来更新设备的状态)、计算具体数值的算法(用来计算电压、电流、亮度、转速等)等等。这些算法贯穿整个题目,是重要的逻辑。好的算法可以将复杂的问题简单化,减轻我们思考的压力。
另外我觉得这道题目一样非常重要的是字符串的处理。需要解析输入的字符串,提取设备的标识符、编号、引脚等信息。还需要构建连接信息的字符串来表示电路的结构。
-
题量
题量不多,但是很难。
-
反思
迭代的题目环环相扣,自从有一次因为字符串的解析有问题,数据不能成功存储进集合中之后,后面举步维艰,写的非常的痛苦并且没有起色。我深刻意识到自己在动手能力这方面的欠缺之大。学习软件工程不能只是纸上谈兵,要有扎实的基础和强硬的动手能力才能学好这门课程。PTA的题目对我来说难度比较大,但是每次写出来得到高分的同学大有人在,这也说明了不是题目太难,是能力不够。但是对于我自己来说走到这一步已经是我努力后的结果,虽有遗憾但是不可惜,今后需要努力提升自己的动手能力。
设计与分析
家居强电电路模拟程序-3
新增内容
互斥开关
互斥开关有3个引脚:1个是汇总引脚,另两个是分支引脚。 开关电路示意图如图1所示,左边是汇总引脚,编号为1;右边两个是分支引脚,右上的输出引脚为2,右下输出引脚为3。图中1、2、3引脚均可以是输入引脚,当1为输入引脚时,2、3引脚为输出引脚;1为输出引脚时,2、3引脚为输入引脚。 互斥开关只有两种状态:开关接往上面的2号引脚、接往下面的3号引脚。开关每次只能接通其中一个分支引脚,而另一个分支引脚处于断开状态。 互斥开关的默认状态为1、2引脚接通,1、3引脚断开。 图1中所示的互斥开关可以反过来接入电路,即汇总引脚接往接地端,两个分支引脚接往电源端。
为避免短路,互斥开关设置了限流电阻,12引脚之间默认电阻为5,13引脚之间默认电阻为10。
受控窗帘
受控窗帘的电路符号为S,其最低工作电压为50V,电压达到或超过50V,窗帘即可正常工作,不考虑室外光照强度和室内空间大小等因素,窗帘受室内灯光的光照强度控制。
当电路中所有灯光的光照强度总和在[0,50)lux范围内,窗帘全开; 在[50,100)lux范围内,窗帘打开比例为0.8; 在[100,200)lux范围内,窗帘打开比例为0.6; 在[200,300)lux范围内,窗帘打开比例为0.4; 在[300,400)lux范围内,窗帘打开比例为0.2; 在400lux及以上范围内,窗帘关闭。 当电压低于50V,窗帘不工作,默认为全开状态。 如果电路中没有灯或者灯全部关闭,光照强度为0,窗帘处于全开状态。
窗帘电阻为15
考虑多个并联电路串联在一起的情况。
本题考虑一条串联电路中包含其他串联电路的情况。
本例中T1\T2两条串联电路T3的一个部分,本题考虑这种类型的输入。
设计思路
- MutexSwitch类表示互斥开关,其中的toggle方法用于切换开关的状态。由于connectedPin的初始值为2,并且在此方法中,它的值被更新为
5 - connectedPin
,所以每次调用这个方法时,connectedPin
的值会在2和3之间切换。虽然这看起来像是在模拟引脚编号的切换,但实际上它只是用作一个内部状态标志,用于表示开关是打开还是关闭。
点击查看代码
class MutexSwitch extends Device {int connectedPin;public MutexSwitch(String id) {super(id, "H");this.connectedPin = 2;}public void toggle() {connectedPin = 5 - connectedPin; // Toggle between 2 and 3}@Overridepublic String toString() {return "@" + type + id + ":" + (connectedPin == 2 ? "closed" : "turned on");}
}
- ControlledCurtain类中的
updateTotalLightIntensity
和removeLightIntensity
方法将由电路中的其他灯光设备(如白炽灯、日光灯等)在它们的状态变化时调用,以更新受控窗帘的总光照强度。getCurtainOpenPercentage
方法,用于获取窗帘当前的打开百分比
点击查看代码
public class ControlledCurtain extends Device {private static final int WORKING_VOLTAGE_THRESHOLD = 50; // 窗帘最低工作电压private double totalLightIntensity = 0; // 总光照强度private double curtainResistance = 15; // 窗帘电阻private double curtainOpenPercentage = 100; // 窗帘打开百分比,默认全开public ControlledCurtain(String id) {super(id, "S");}// 更新总光照强度(由其他灯光设备调用)public void updateTotalLightIntensity(double newIntensity) {totalLightIntensity += newIntensity;updateCurtainState();}// 当灯关闭时,更新总光照强度(减少相应强度)public void removeLightIntensity(double removedIntensity) {totalLightIntensity = Math.max(0, totalLightIntensity - removedIntensity);updateCurtainState();}// 根据总光照强度更新窗帘状态private void updateCurtainState() {if (totalLightIntensity < WORKING_VOLTAGE_THRESHOLD) {// 电压低于50V,窗帘不工作,默认为全开状态curtainOpenPercentage = 100;} else if (totalLightIntensity >= 400) {// 光照强度400lux及以上,窗帘关闭curtainOpenPercentage = 0;} else if (totalLightIntensity >= 300) {// [300,400)lux范围内curtainOpenPercentage = 0.2 * 100;} else if (totalLightIntensity >= 200) {// [200,300)lux范围内curtainOpenPercentage = 0.4 * 100;} else if (totalLightIntensity >= 100) {// [100,200)lux范围内curtainOpenPercentage = 0.6 * 100;} else if (totalLightIntensity >= 50) {// [50,100)lux范围内curtainOpenPercentage = 0.8 * 100;}}// 获取窗帘打开百分比public double getCurtainOpenPercentage() {return curtainOpenPercentage;}@Overridepublic String toString() {return "@" + type + id + ":" + (int)(curtainOpenPercentage * 100) / 100.0 + "%"; // 保留两位小数}
}
改进建议
1.输入信息处理的比较混乱,数据无法存储
2.正则表达式使用的有问题,解析的设备信息、连接信息和控制设备调节信息不准确
3.输出处理没有全部完成
4.设备状态更新的逻辑不够准确,需要再次完善
家居强电电路模拟程序-4
新增内容
二极管
1)增加管脚电压的显示
在输出每个电器的状态信息后,再依次输出该电器每个管脚的电压。(格式详见输出信息部分)
2)电流限制
电器在工作时,过大的电流会引起电器过热,从而烧坏电路。本次迭代,每个元器件都有最大电流的设置,当实时电流超过最大电流时,在该电器输出信息的最后加入提示“exceeding current limit error”,与前面的信息之间用英文空格分隔。
例如:**@B1:190 68-17 **exceeding current limit error
本题各类电器的最大限定电流如下:
开关20、分档调速器18、连续调速器18、白炽灯9、日光灯5、吊扇12、落地扇14、互斥开关20、受控窗帘12、二极管8。
3)短路检测
如果电路出现无穷大的电流造成短路,所有元器件信息不输出,仅输出提示“short circuit error”
4)并联电路中包含并联
本次迭代考虑并联电路中包含并联电路的情况,即构成并联电路的串联电路可以包含别的并联电路。
5)二极管
增加二极管元件,其电路特性为:正向导通,反向截止;其电器符号如图4所示,当电流从左至右流过时,二极管导通”conduction”,电阻为0;电流从右至左流动时,二极管截止”cutoff”,电阻无穷大,相当于开关打开。
二极管的标识符为’P’,左侧管脚编号为1,右侧管脚编号为2。
二极管如果两端电压相等,没有电流流过,分以下两种情况输出:
1、如果两端电压为0,二极管的导通/截止状态由接入方向决定,1号引脚靠近电源则状态为导通,反之为截止。
2、如果两端电压不为0,二极管导通。
源码分析
设计思路
二极管是一个电子元件,通常具有两个引脚(阳极和阴极),只允许电流在一个方向上流动。在模拟电路中,二极管可能具有一些特定的属性和行为
点击查看代码
public class Diode extends Device {// 假设的二极管正向电压降private static final double FORWARD_VOLTAGE_DROP = 0.7;// 是否处于正向导通状态private boolean isForwardBiased;// 构造函数,使用Device的构造函数并设置初始状态为非导通public Diode(String id) {super(id, "D"); // 假设"D"代表二极管类型this.isForwardBiased = false;}// 设置二极管是否处于正向导通状态// 这个方法应该基于电路中的电压和电流来判断,但在这里为了简化我们直接设置public void setForwardBiased(boolean forwardBiased) {this.isForwardBiased = forwardBiased;}// 判断二极管是否处于正向导通状态public boolean isForwardBiased() {return isForwardBiased;}// 假设的方法,用于计算通过二极管的电流// 在实际情况中,这将基于电路中的电压、电阻和其他因素来计算public double calculateCurrent(double voltageAcross) {if (isForwardBiased && voltageAcross >= FORWARD_VOLTAGE_DROP) {// 在这里,我们简单地假设一个固定的电流值,但在实际中这将是一个复杂的计算return 1.0; // 示例值,不代表真实电流} else {return 0.0; // 如果不是正向偏置或电压不足,则没有电流}}// 重写toString方法以提供二极管的简化状态信息@Overridepublic String toString() {return "@" + type + id + ":" + (isForwardBiased ? "forward biased" : "reverse biased");}
}
踩坑心得
1.我不知道二极管一边允许电流通过而另一边不允许应该怎么用程序逻辑表示出来,不知道用哪种算法。
2.在题目信息比较多的情况下我喜欢将信息以简图或者文字的形式整理在纸上,这样看着比较清晰,防止信息遗漏。
总结
最后两次作业我都没有做出来,一个是由于之前程序存在的问题没有解决导致无法进行下去,还有就是临近期末,考试特别特别多,面对十分困难的PTA作业,我实在是没有信心花费大量的时间后能做得出来,于是将重心倾向在了考试科目上,但可以保证的是我绝对没有浪费时间。
后面几次老师都没有给出测试点,起初我还有些不理解,毕竟看着测试点写心里比较有底。但是老师说如果以后在企业工作写代码时哪里会有测试点?这么一想特别有道理。看着测试点写就像是看着线索写题目,总想把过程靠近测试点,甚至有的时候还可以凑出答案,确实是不合理的。
学习这门课程写的代码比上学期学C语言的时候写的代码多很多,我最大的收获就是学会了正则表达式和编译器的调试功能。调试真的能帮助我们找到一些不容易发现的错误,特别是在思路稍微复杂的程序里面,优势体现的更加明显。
这学期的课程已经结束,这么长的时间里虽然煎熬痛苦,但是每多掌握一个知识点,每多得一分带来的开心和喜悦是别人无法体会的。在学习过程中,我深刻意识到了自己的不足,与优秀同学的巨大差距,这也将是我未来要着重提升的地方。最后我真的由衷感谢课程组的老师们,他们都是特别特别特别负责得老师,我能感受到他们对教育工作的热忱之心和超强的专业能力。对我个人而言印象最深刻的就是在部分同学认为PTA作业太困难以至于想要放弃这门课程的时候,老师鼓励我们,即使写不出来也不要放弃,还可以做好这门课的其他方面来提升自己,比如实验,比如认真学习线上慕课等。包括中间由于题目太难,老师加班重新出了一道新的题目。我能感受到老师真的在切实为这门课努力,为学生的成长与发展努力。课程中间老师也指出过我的问题,我都听进去了并且努力改正。真的感谢老师们,他们都是最好最好最好的老师!
接下来我会认真复习,争取通过期末考试,以后也会着重提高自己的动手能力,不怕困难,迎难而上。