BLOG-2

一.前言
1.知识点:
(1)从第四次大作业开始就需要考虑父类和子类的情况了,所以需要了解父类和子类的基本概念,了解什么时候应该衍生子类,子类应该替代父类执行什么样的功能,就像第四次大作业题目类的两个子类就是要帮父类存储多选题和填空题的内容。
(2)因为需要使用子类所以应该要使用抽象类和接口来让子类通过父类提供的接口来实现不同的功能,就像第五次大作业中的设备父类的抽象showStatus函数,因为不同的设备展现状态的方法不同,所以应该使用抽象函数,方便子类进行改写。
(3)采用多态来直接对父类进行操作,而不需要知道这是哪一个子类,因为子类虽然改写了父类的抽象方法,但在父类中这个抽象方法还是存在的,所以当一个未知类型的子类实例要调用这个抽象方法的时候可以直接用父类的类型来调用。
(4)使用子串操作来从输入信息中读取我们需要的信息,比如可以使用substring方法来去除第六次大作业中输入信息最前面的#以及最后面的]。
(5)采用 Scanner 类来读取用户输入,从控制台读取用户输入的信息,然后使用spilt方法来对输入信息进行分割并依次将有用的信息存储下来。

2.题量:
这三次题目集的题量对比前面三次还是比较多的,因为毕竟第四次大作业是前面三次的最终升级版,而且这三次大作业都开始使用子类,所以相对来说代码量要多了不少,几乎要花费大半天才能写完,前提是你最开始的思路对了,否则后面要想拿到满分要花费大量的时间去测测试点。

3.难点:
这三次的大作业的难点主要是集中在第四次和第六次大作业的分数最多的那一题,第四次大作业不用说,毕竟它集最前面的三次大作业的难点于一体而且还需要在题目类的基础上衍生子类。而第六次主要难点就在于它的电路分析如何通过代码表示出来,如果单单是电路分析那并不难,但是如果要用代码表示就需要将所有可能发生的情况都考虑进去,需要的代码量也就大了。
二.设计与分析
1.校园角色类设计-1
几乎不需要什么设计,因为题目已经说明了有什么类,以及它们承担的功能是什么,只需要根据题目中给的main函数来对每个类的内容进行填充就行了。

2.答题判题程序-4
针对题目内容,我设计了八个类分别是:
(1)Topic类:用于存储题目的题号,题目状态,内容和标准答案。
(2)MultipleChoiceTopic类:Topic类的子类,用于存储多选题的题号,题目状态,内容和标准答案。
(3)FillInTheBlankTopic类:Topic类的子类,用于存储填空题的题号,题目状态,内容和标准答案。
(4)TestPaper类:用于存储试卷编号以及对应题目编号的题目分值。
(5)Student类:用于存储学生的学号和姓名。
(6)AnswerPaper类:用于存储试卷编号,学生学号以及对应试卷中题目的提交答案。
(7)Input类:用于从用户输入中筛选格式正确的输入内容并将它们存储到对应的类中。
(8)Answer类:用于进行改分操作,根据答卷的信息依次找对应的试卷进行批改,并将对应结果输出。

对应类图如下:

对应时序图如下:

因为题目要求针对不同类型的题目要使用不同的子类,所以以原来的Topic类为父类衍生出了多选题类和填空题类两个子类,因为题目的整体处理思路相较于上次没有太大的区别,只是多了多选题和填空题的输入读取以及判分处理,因为我前面代码的复用性还不错所以在这个题目中没有做太多更改。

3.家居强电电路模拟程序-1
针对题目内容,我设计了十二个类,分别是:
(1)Device类:总的电路设备类。
(2)ControlDevice类:Device类的子类,控制设备类,是开关,分档调速器等能够控制电路的设备的父类。
(3)Switch类:开关类,能够控制电路的开闭。
(4)GradeGovernor类:分档调速器类,能够控制通过它的电压大小。
(5)ContinuousGovernor类:连续调速器类,能够控制通过它的电压大小。
(6)ControlledDevice类:受控设备类,主要是灯,风扇等受电路控制的设备的父类。
(7)IncandescentLamp类:白炽灯类,根据两端电压的不同,亮度不同。
(8)FluorescentLamp类:日光灯类,根据两端电压的不同,亮度不同。
(9)CeilingFan类:吊扇类,根据两端电压的不同,转速不同。
(10)Input类:输入读取类,能够将用户的输入信息读取,并根据题目要求将需要的内容存储下来。
(11)SeriesCircuit类:串联电路类,主要是对串联电路的电路情况进行分析,并更新电路中设备的状态。
(12)OutPut类:输出类,将电路中设备的状态信息输出。

对应类图如下:

对应时序图如下:

Input类主要就是根据输入信息的类型不同将不同的设备存储下来并放在链表中形成一条串联电路,读取信息的基本思想就是通过substring方法和spilt方法对输入的字符串进行筛选分割,并将需要的设备信息存储下来。
SeriesCircuit类主要就是进行串联电路分析,计算出每一个设备的输入输出电压,根据计算出的电压差来对设备状态进行更新。
OutPut类主要是因为题目要求必须按照一定的顺序将设备信息进行输出,因为题目要求的顺序根据一般的排序方法无法进行排序所以我将设备按照不同的类型分别提取出来,在同类型的设备中按照标号大小进行排序,然后根据题目要求的顺序依次将不同类型的设备链表插入到一个总的链表中。

4.家居强电电路模拟程序-2
针对题目内容,我设计了十二个类,分别是:
(1)Device类:总的电路设备类。
(2)ControlDevice类:Device类的子类,控制设备类,是开关,分档调速器等能够控制电路的设备的父类。
(3)Switch类:开关类,能够控制电路的开闭。
(4)GradeGovernor类:分档调速器类,能够控制通过它的电压大小。
(5)ContinuousGovernor类:连续调速器类,能够控制通过它的电压大小。
(6)ControlledDevice类:受控设备类,主要是灯,风扇等受电路控制的设备的父类。
(7)IncandescentLamp类:白炽灯类,根据两端电压的不同,亮度不同。
(8)FluorescentLamp类:日光灯类,根据两端电压的不同,亮度不同。
(9)CeilingFan类:吊扇类,根据两端电压的不同,转速不同。
(10)StandFan类:落地扇类,根据两端电压的不同,转速不同。
(11)Input类:输入读取类,能够将用户的输入信息读取,并根据题目要求将需要的内容存储下来。
(12)SeriesCircuit类:串联电路类,主要是对串联电路的电路情况进行分析,并更新电路中设备的状态。
(13)MultipleCircuit类:并联电路类,主要是对并联电路的电路情况进行分析,并更新电路中设备的状态。
(14)OutPut类:输出类,将电路中设备的状态信息输出。

对应类图如下:

对应时序图如下:

因为题目增加了电路出现并联电路的可能,所以增加了MultipleCircuit类,如果电路中出现了并联电路就会有这个类来对并联电路进行分析和更新并联电路中设备的状态信息。
三. 采坑心得
1.在答题判题程序-4中,我的多选题判分一直有问题,他一直都不能满分,哪怕答案是正确的,后面我单独将多选题读取的答案进行输出发现它只能读取第一个答案,后面的答案它不会存储,查找资料发现是我的正则表达式有问题如果读取到两个答案间的空格会直接将空格后面的内容删除,修改正则表达式后才将这个问题解决。

对应正则表达式的代码如下:
Pattern pattern = Pattern.compile("^#Z:(\\d+) #Q:(.+) #A:(.+)$");
2.在家居强电电路模拟程序-1中,我有几个测试点一直过不了,不管怎么修改都没办法,我甚至将引脚反接的情况都考虑了还是无法解决,我都准备放弃这几分了结果突然发现有的测试样例我和满分的同学输出结果不同一样,虽然结果都一样但顺序却不同,这时候我才想起来题目要求设备的输出顺序要按照它的要求输出,于是我在输出前对设备信息进行排序最终解决了这个问题。

3.在家居强电电路模拟程序-2中,我也是几个测试点过不去也不知道到底是哪个地方错了,结果我就试了一下并联电路的所有开关全开的情况,结果发现并联电路虽然断路了结果后面的设备还能运行,所以我添加了断路判断最后解决了这个问题。

四. 改进建议
1.避免冗长的类:在家居强电电路模拟程序-2中SeriesCircuit 和 MultipleCircuit 类过于冗长和复杂。可以考虑将它们拆分为多个子类或模块,减少每个类或方法的职责,提升代码的可读性和可维护性。
2.优化电压计算:目前的电压计算方法中,SeriesCircuit 和 MultipleCircuit 类中有多个重复的逻辑(例如设备电压的更新和电流计算)。可以将这些逻辑再细分到不同的类中,分别阅读和修改。
3.优化排序算法:bubbleSort 排序算法比较低效,当设备数量增多时,性能会急剧下降。可以将其替换为更高效的排序算法,能够提高排序操作的性能。
4.减少不必要的遍历:在updateInputVoltage(),每次更新设备状态时都要遍历所有设备。可以想办法看看能不能减少遍历。
五. 总结
这三次大作业整体来说难度还是比较难的,因为我对子类和父类的使用还比较生疏,在仔细研究了子类和父类的相关定义以及抽象类和抽象方法的定义后才稍微好一些,能够快速的分辨出哪些类需要使用子类,又有哪些方法要定义为抽象方法。在这几次大作业中我的代码调试能力有了明显的提高,特别是在家居强电电路模拟程序-2中,因为家居强电电路模拟程序-2中有非常多的数据信息,需要一步步的调试来判断是哪一步出现了问题,而我也是在一次次的调试中才将拿到了满分。
对我而言,这三次大作业的收获是巨大的,它们不仅帮我巩固了前面的知识,还带我了解了很多我不知道的知识,同时还锻炼了我独立解决问题的能力。

posted @ 2024-11-23 18:22  22207119-王翰文  阅读(45)  评论(0)    收藏  举报