第二次blog
一.前言
1.题目集4~6的知识点:
(1)这几个题目都使用了面向对象编程原理,根据题目给出的信息和题目的复杂程度,建立了对应的类,并在类中添加了方法。通过使用Java自带的类库,如Scanner类中的方法用于接收用户输入,regex.Matcher类中的方法用于正则表达式匹配,regex.Pattern类中的方法用于编译正则表达式。正则表达式被用于对题目给出的输入内容进行判断,从而分离出每道题目的文本和答案,并加入到自己创建的类中。
(2)循环语句和条件语句被使用来控制程序的逻辑性,例如循环遍历题目列表和学生答案列表,以及条件判断学生答案的正确与否。
(3)异常情况的处理,通过将题目输入的大块字符串分割成一段一段的字符串进行逐个处理,并对异常情况进行输出,保证程序的稳定性。
(4)按照题目要求输出相关结果,包括判断每道题的正误情况、批改每张卷子的总分,并检查每张卷子的总分是否等于一百等。这些结果被格式化输出,使用了System.out.println等方法来呈现学生的得分情况以及每道题的正确情况。
(5)第四次题目集加入了继承和多态,通过继承的使用,我们可以避免重复编写相似的代码,提高了代码的重用性。同时,当需要对某一类题目进行特定操作时,我们只需要针对该类的子类进行处理,而不必修改基础类的代码,从而提高了代码的灵活性和可维护性。
(6)第五次与第六次关于电路的题目涵盖了电路理论的基本概念,如欧姆定律、电阻并联与串联,以电路为例提高了编程技能,为未来的学习和工作奠定良好的基础。
2.题量
(1)在第三次大作业中,有大量的设计需要完成,因此需要投入相当多的时间和精力。
(2)第四次大作业的题量适中,完成起来需要一定的时间和努力。
(3)而在第五次大作业中,设计虽然也很多,但与第三次相比,它需要更多的时间来完成整个作业,因为其中的每个知识点都更加复杂,需要更深入的思考和分析。
3.难度
(1)第三次大作业的难度:较高。由于有大量的设计需要完成,并且需要花费大量的时间和精力,因此这个作业的难度较高。
(2)第四次大作业的难度:适中。题量在中等水平,需要一定的时间和努力,但相对于第三次大作业来说,难度稍低一些。
(3)第五次大作业的难度:较高。虽然设计思路也很多,但难度与第三次大作业相当,需要投入大量的时间和精力来完成。
二.设计与分析
1.第三次大作业
(1)设计与分析
Student 类:
包含了两个私有属性:studentID 和 name。
有一个构造函数用来初始化这两个属性,以及一个默认构造函数。
提供了获取学生ID和姓名的方法 getStudentID() 和 getName()。
Topic 类:
包含了三个保护属性:topicID、topicContent 和 standardAnswer,以及一个 exist 属性。
有一个构造函数用来初始化这些属性,以及一个默认构造函数。
提供了获取题目存在状态、正确题目的方法 correctTopic(),以及获取题目ID、题目内容和标准答案的方法。
有一个方法 deleteTopic() 用来标记题目不存在。
calculationTopic、multipleChoiceTopic 和 clozeTopic 类:
这三个类都继承自 Topic 类,并且都重写了 correctTopic() 方法。
calculationTopic 类表示计算题,它的 correctTopic() 方法比较答案与标准答案是否相等。
multipleChoiceTopic 类表示多项选择题,它的 correctTopic() 方法比较答案与标准答案中的选项是否一致。
clozeTopic 类表示填空题,它的 correctTopic() 方法比较答案是否包含在标准答案中。
Answer类:
属性:
answerID: 答案ID,用于标识每个学生答题记录的唯一标识。
studentID: 学生ID,用于关联答题记录和学生信息。
student: 表示学生对象,通过学生ID关联学生信息。
exam: 表示考试对象,通过答案ID关联考试信息。
answerList: 存储学生的答案列表。
answerIDList: 存储答案对应的题目ID列表。
topicPointList: 存储每个题目的得分情况。
构造函数:
接受答案ID、学生ID、答案ID列表和答案列表作为参数,并进行初始化。
初始化了 student、exam 和 topicPointList。
方法:
setStudent(ArrayList
compareTo(Answer other): 实现 Comparable 接口,用于比较答题记录的顺序。
setExam(ArrayList
correctExam(): 对考试进行批改,计算每个题目的得分并输出总分。
在 correctExam() 方法中,代码进行了一系列操作:
遍历考试题目,检查答案是否存在,如果存在则进行批改,否则输出相应的提示信息。
调用 correctTopic() 方法对答案进行批改,根据批改结果计算得分。
输出每个题目的得分情况以及总分。
Exam 类:
属性包括考试ID examID、题目列表 topics、题目分值列表 points 和题目ID列表 topicIDs。
构造函数接受考试ID、题目ID列表和分值列表,并初始化相应属性。
chooseTopics(ArrayList
judgePoint() 方法用于检查考试总分是否为100分,如果不是则输出警告信息。
JudgeFormat 类:
属性为一个字符串 line,表示待检查的字符串。
构造函数接受一个字符串,并初始化 line 属性。
judgement() 方法用于检查字符串的格式是否符合预期,通过正则表达式进行匹配。
主函数用来读取输入信息分类处理。
(2)心得
第一次提交没考虑多张试卷多个学生的信息,没有在类中加入比较接口。后来仔细查看代码发现该问题,加入比较接口后获得满分。
2.第五次大作业
(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 方法用于设置电路中的电压,并根据电压计算每个设备的状态。
(2)心得
第一次提交得分少,发现是题意没看清,开关的状态输入与题目相反,修改结果:
观察测试点给的提示发现出错的测试点全部与分档调速器有关,仔细查看题目信息与设计的分档调速器类发现分档调速器不能超过三档与不能低于0档的隐藏条件,加入限制规则后获得满分。
3.第六次大作业
(1)设计与分析
在第五次大作业的基础上进行迭代,在相关电器设备加入了电阻属性,重新设计了串联电路类的各种方法,并且加入了落地扇类和并联电路类
SeriesCircuits 类:
代表串联电路。
属性包括一个存储 CircuitEquipment 对象的列表 circuitEquipments。
构造函数接受设备数量和一个 ArrayList,用于初始化 circuitEquipments。
重写了 display 方法,以按顺序显示串联电路中的设备。
实现了 setResult 方法来计算串联电路中每个设备的结果(电压)。
包括 calculateTotalResistance 方法用于计算总电阻,以及 seriesCircuitsState 方法来检查串联电路中设备的状态。
提供了 getCircuitEquipments 方法来获取串联电路中的设备列表。
ParallelCircuit 类:
代表并联电路。
属性包括一个存储 SeriesCircuits 对象的列表 seriesCircuits。
构造函数接受设备数量,初始化 seriesCircuits 列表。
重写了 getResistance 方法来计算并联电路的总电阻。
包括 getCircuitEquipments 方法来获取并联电路中的设备列表。
实现了 setResult 方法来设置并联电路中的每个串联电路的结果(电压)。
(2)心得
第一次提交发现还有错误,仔细分析题目与设计各类测试点发现没有考虑主线路开关断开的电压情况,在串联电路类加上限制条件使开关闭合时线路电压设置为0,加入限制后获得满分。
三.总结
通过本次的三次大作业,我掌握了面向对象编程的基本原理。这包括了类、对象、封装等概念,以及如何在编程中应用这些原理。通过学习具体的编程语言,我掌握了其语法和特性,并了解了如何使用该语言进行面向对象编程。在完成作业和实验的过程中,我提升了编程实践能力,学会了解决实际问题的方法和技巧。未来,在学习中我会将相似的功能封装成方法或者类,以提高代码的复用性和可维护性。同时,我也认识到了代码的可读性的重要性,因此在编写代码时,我会注重给变量和方法起一个有意义的名字,并添加注释来解释代码的作用和逻辑。这样可以让其他人更容易理解代码,也方便自己日后的维护和修改。通过这次编程作业,我还学会了正则表达式的应用。正则表达式是一种强大的文本匹配工具,可以用来检查、提取和替换字符串。在编程中,我学会了如何使用正则表达式来处理文本数据,例如搜索特定模式的字符串、验证输入的格式是否符合要求等。这为我解决实际问题提供了一种更加灵活和高效的方法。在今后的学习和工作中,我会继续深入学习和应用正则表达式,以提高自己的编程水平和解决问题的能力。深入理解了继承的概念和作用。在编程实践中,我学会了如何创建一个子类,并且利用继承机制来扩展其功能。这种方法可以使得代码更加模块化和可扩展,同时也减少了代码的重复编写。在今后的学习和工作中,我将继续应用继承的原理,设计和实现更加灵活、可维护的代码结构,以满足不同项目的需求。