题目集4~6的总结性Blog
一.前言
1.答题判题程序-4
知识点总结
-
字符串解析与处理:
输入的题目信息、试卷信息、答题信息、学生信息等内容都需要根据特定的格式进行解析,保证能正确提取出每一项数据(如题号、题目内容、标准答案、分值、学生信息等)。
对于字符串的处理要求较高,如去除空格、标准答案的格式匹配、多选题和填空题的分值计算、错误提示信息等。 -
数据存储与查询:
程序需要存储并管理多个试卷、题目、学生和答题数据。通过查询和更新这些数据来判断题目的正确性,并计算每个学生的得分。
特别是在删除题目时,要处理已删除题目的特殊提示,并对试卷、答题信息等进行相应调整。 -
题目类型的判断与评分:
程序不仅要判断选择题和填空题的答题结果,还要考虑多选题和部分正确的评分方式(如按给分规则算出部分得分),这涉及到分数的计算和判断条件。 -
错误处理与输出:
根据格式要求输出错误提示,如题目信息格式错误、答卷中的试卷号或学号错误等。
输出信息的格式要求严格,按题号顺序和学生顺序输出结果,并确保输出的内容与输入数据对应。 -
顺序与优先级处理:
处理答题信息时,需按学号和试卷号的顺序输出,并根据答题顺序输出结果。此外,还要处理删除题目的影响以及试卷信息、学生信息、答题信息的输入顺序无关的情况。
题量:题量较大。
难度
难度较大:
主要难点在于程序需要根据输入信息的顺序来处理多个不同类型的数据,并且需要准确判断每个学生的答题情况。
程序需要处理多种复杂的条件判断(如格式错误、答题内容为空、题目删除等),并根据输入的数据给出正确的评分和提示。
对于多选题和填空题的评分机制相对复杂,需要处理部分正确、完全正确、错误等情况,且在有部分正确答案时进行分数的截尾计算。
2.家居强电电路模拟程序-1
知识点总结
-
电路模拟基础:
理解并模拟串联和的工作原理,尤其是在模拟复杂控制和受控设备连接时的电流、电压变化。
串联电路:将不同的电路设备按一定顺序连接,电流一致,电压按比例分配。 -
控制设备模拟:
开关:模拟开关的开/关操作,影响电路的通断状态。
分档调速器:模拟多档电压调节器,根据档位改变输出电压比例。
连续调速器:通过输入档位参数,模拟电压的连续调节过程。 -
受控设备模拟:
灯:模拟白炽灯和日光灯的亮度变化,考虑电位差对亮度的影响。
风扇:模拟风扇的转速变化,理解电压差对转速的线性影响。 -
输入信息的格式与解析:
设计控制命令,解析开关、调速器调节信息的输入格式,正确理解并执行控制指令。 -
设备状态输出:
设计输出格式,确保按顺序正确输出各设备的状态,如开关状态、亮度、转速等。 -
控制与受控设备之间的交互:
控制设备(如开关、调速器)通过影响电压输出控制受控设备(如灯、风扇)的状态变化,学习如何在电路中传递信息与控制信号。
题量
这次题目结构比较简单,只有单一串联电路设备的连接和调节,题量较少。
难度分析:简单串联电路,难度较低
3.家居强电电路模拟程序-2
知识点
-
电路元件的建模与模拟:
控制设备:包括开关(K)、分档调速器(F)、连续调速器(L)。这些设备具有输入和输出引脚,能够改变或控制电路中的电压。
受控设备:包括白炽灯(B)、日光灯(D)、吊扇(A)、落地扇(R)。这些设备根据电压差来控制状态或行为(如亮度、转速)。
电路连接:不同设备的引脚之间通过串联和并联方式连接,模拟复杂的电路布局。
调节功能:开关和调速器的状态变化影响电路中的其他设备。 -
串联和并联电路的建模:
串联电路中多个电路元件依次连接,影响电压分配。
并联电路中多个串联电路通过共同的输入和输出连接,影响整体电路行为。 -
电压和电流的计算:
电压差影响设备的工作状态,如灯的亮度和风扇的转速。
电路中可能包含电阻,影响电压的分配和电流的流动。
需要进行数值计算,特别是电压与设备状态之间的关系。 -
调节操作:
开关、分档调速器、连续调速器的操作通过输入指令(如#K2、#F3+)来改变电路设备的状态。
分档调速器有多个档位,每个档位对应不同的电压输出。
连续调速器可以精确调节档位参数,控制电压输出。 -
输入输出格式要求:
输入包括设备信息、连接信息和控制信息,格式严格规定。
输出包括设备的当前状态(如开关状态、灯亮度、风扇转速等)。
题量
题目总共要求实现的功能较为全面,具体包括:
设备的状态模拟(包括多个控制和受控设备)。
电路的连接与计算(包括串联电路与并联电路的不同处理)。
多种控制指令的解析与执行(如调节开关和调速器状态)。
输出格式的严格要求。
题量较大,可能需要在一定的时间内进行综合设计和调试。
难度
- 中等偏难:
题目涉及的知识点较多,需要理解电路原理(尤其是串联与并联电路的行为)、设备控制原理和编程实现的细节。
模拟电路中不同设备的行为(如电压、转速、亮度的计算)需要较强的逻辑推理能力。
输入输出格式严格,需要在模拟过程中精确实现数据的输入与输出。
需要设计多个类(如设备类、电路类),并能在这些类之间实现数据传递和状态更新。
电路设备之间的连接需要模拟串联和并联关系,且涉及较复杂的数据结构和计算逻辑。
还涉及数值精度、截尾和四舍五入等细节问题,增加了实现难度。
二.设计与分析
1.答题判题程序-4
1. 程序结构
题目类 (Title
及其子类):
Title
类是所有题目的基类,包含了题目ID、内容、标准答案、删除标志等属性。该类提供了一个检查答案的方法(checkAnswer
)。
ChoiceTitle
和FillInTheBlankTitle
继承自Title
类,分别表示选择题和填空题。它们重写了checkAnswer
方法,并且增加了对部分正确答案的判断。
试卷类 (TestPaper
):
试卷类用于管理一个试卷的信息,包括试卷ID、题目顺序、题目内容和每题的分数等。
该类有方法添加题目(addTitle
)、获取总分(getTotalScore
)等。
答卷类 (AnswerSheet
):
AnswerSheet
类表示一个学生的答卷,包含了学生的所有答案和批改结果。
在答卷类中,主要负责将学生答案与题目标准答案进行比对,并记录批改结果。同时计算学生的得分。
主程序类 (Main
):
负责解析输入数据(如题目、试卷、学生信息、答案等)并将数据存储到对应的结构中。
主要是通过正则表达式将各种输入格式的数据进行分类和处理,之后生成对应的题目对象、试卷对象和学生答卷对象。
最终,根据批改结果输出学生的答卷和得分。
2. 流程设计与逻辑分析
1. 读取输入数据:
首先,通过正则表达式匹配不同格式的输入数据,将数据分类存储。输入数据包括题目信息、试卷信息、删除题目信息、学生信息和答案信息。
题目信息(#N:
, #Z:
, #K:
)用于创建不同类型的题目对象(Title
、ChoiceTitle
、FillInTheBlankTitle
)。
试卷信息(#T:
)定义了试卷的题目和分数信息。
删除题目信息(#D:
)表示某个题目被删除,之后会设置该题目为删除状态。
学生信息(#X:
)记录了学生的ID和姓名。
答案信息(#S:
)存储了学生的答案。
2. 处理题目信息:
根据不同的题目类型(普通题、选择题、填空题),使用正则表达式解析出题目ID、内容和标准答案,并创建相应的题目对象(Title
、ChoiceTitle
、FillInTheBlankTitle
)。
如果题目是选择题或填空题,则会使用HashSet
来存储标准答案,以便后续判断学生的答案。
3. 处理试卷信息:
每个试卷包含多个题目,题目之间有顺序关系。通过正则表达式解析试卷ID及对应题目的分数,并将题目与试卷关联起来。
如果试卷中包含不存在的题目ID,程序会记录这些ID,并生成“非存在的题目”。
4. 处理删除题目信息:
如果某个题目被删除,程序会标记该题目为已删除,后续批改时将忽略这类题目。
5. 处理学生信息和答案:
学生信息包括学生ID和姓名,通过正则解析后保存。
学生的答案信息通过正则表达式解析并存储为一个AnswerSheet
对象。每个学生的答案会被对应到试卷中,进行批改。
6. 答案批改:
根据题目的类型(普通题、选择题、填空题),程序会使用不同的方法来检查学生的答案。
对于选择题和填空题,检查答案时不仅会判断是否完全正确,还会判断部分正确的情况(partially correct
)。
对于普通题,答案只需要与标准答案完全一致。
批改过程中,使用judgeResults
列表保存每道题的批改结果,totalScore
记录学生的总分。
7. 输出结果:
输出每个学生的答卷及批改结果,显示每道题的内容、学生的答案以及批改结果。
输出每个学生的得分情况,包括每道题的得分和总分。
类图:
顺序图:
2.家居强电电路模拟程序-1
一、类的继承结构与功能分析
1. 抽象类 Device
这是所有设备类的基类,定义了设备的基本属性和方法:
属性:id
(设备的唯一标识),voltageIn
(输入电压),voltageOut
(输出电压)。
抽象方法:
setVoltageIn(double voltageIn)
:设置输入电压的抽象方法。
getVoltageOut()
:获取输出电压的抽象方法。
toString()
:用于设备的字符串表示。
2. 抽象类 ElectricalDevice
和 ControlDevice
ElectricalDevice
继承 Device
,用于表示电气设备,Lamp
和 Fan
都是这个类的子类。
ControlDevice
继承 Device
,用于表示控制设备,如 Switch
、GradualSpeeder
和 ContinuousSpeeder
。这些设备有控制状态的能力。
3. 具体设备类
Switch
:继承自 ControlDevice
,实现了开关功能。通过 control
方法切换开关状态(打开/关闭),并根据状态设置输出电压。
GradualSpeeder
和 ContinuousSpeeder
:这两个类也是继承自 ControlDevice
,分别用于表示逐步变速器和连续变速器,通过不同的方式控制电压输出。
FilamentLamp
和 DaylightLamp
:这两个类继承自 Lamp
,分别代表传统的灯泡和日光灯。通过输入电压调节亮度。
CeilingFan
:继承自 Fan
,表示天花板风扇,根据输入电压调节转速。
4. SeriesCircuit
类
这个类代表一个串联电路,包含多个设备。设备通过 applyVoltage()
方法共同作用,电路中的每个设备都根据串联的顺序处理电压。
串联电路会检查 Switch
是否处于“打开”状态,来决定电压是否为 220V。如果有任何一个开关处于打开状态,电压会是 0,否则为 220V。
二、命令行输入和设备管理
1. 设备的创建和连接
程序首先读取输入,设备通过输入命令被创建。
输入以 [
和 ]
括起来表示设备的连接,设备通过 -
连接。
如果设备 ID 不存在,则会创建该设备并添加到 SeriesCircuit
中。
2. 控制命令的执行
控制命令以 #
开头,后面跟着设备的 ID 和操作指令(如档位调整或开关操作)。
控制命令首先根据设备 ID 查找设备,如果该设备是 ControlDevice
类型,则根据命令执行操作,如 Switch
会切换状态,GradualSpeeder
或 ContinuousSpeeder
会根据命令调整档位。
3. 电压应用
在所有命令执行完毕后,SeriesCircuit
的 applyVoltage()
方法会应用电压到电路的所有设备。每个设备的输入电压会影响其输出电压,尤其是控制类设备(如开关和变速器)会根据其状态调整电压。
三、设备输出与显示
最后,程序会按设备类型对设备进行排序,并输出每个设备的状态:
按照设备类型的顺序依次输出 Switch
、GradualSpeeder
、ContinuousSpeeder
、FilamentLamp
、DaylightLamp
、CeilingFan
。
每个设备都会调用其 toString()
方法来输出其当前状态(如开关的状态、灯泡的亮度或风扇的转速)。
四、代码逻辑和流程分析
1. 输入处理
程序通过 Scanner
对象读取输入数据,直到遇到 end
为止。根据输入的格式(设备连接或控制命令)处理不同类型的数据:
[id1-id2 id3]
表示设备连接,设备 ID 会通过 createDevice()
方法创建并加入到电路中。
#id command
表示对设备的控制命令,通过 ControlDevice
的 control()
方法处理。
2. 控制和电压计算
根据设备类型,ControlDevice
子类会在其 control()
方法中执行相应的操作,如切换开关或调整档位。
在 applyVoltage()
中,电压从串联电路的起始设备开始逐步传递,每个设备根据其输入电压设置输出电压。
3. 设备输出
程序通过流处理 (stream()
) 将设备按类型分类并排序,最后依次输出设备的状态。每种类型的设备会按其 toString()
方法输出其当前的状态。
类图:
顺序图:
3.家居强电电路模拟程序-2
1. 类的设计结构
代码中的类可以分为以下几类:
Device类及其派生类:
Device
类是所有电气设备的基类,它有属性 id
(设备ID)、voltageIn
(输入电压)、voltageOut
(输出电压)和 resistance
(电阻)。它定义了设备的基本行为,包括设置电压(setVoltageIn
)、获取输出电压(getVoltageOut
)和设备的字符串表示(toString
)方法。
ElectricalDevice
和 ControlDevice
是 Device
类的两个派生类。ElectricalDevice
代表实际的电气设备(如灯具、风扇等),而 ControlDevice
则代表控制设备(如开关和调速器)。
具体设备类:
Switch
(开关)、GradualSpeeder
(渐变调速器)、ContinuousSpeeder
(连续调速器)等控制设备类,提供了控制设备的特定功能(如开关控制、调速器控制等)。
FilamentLamp
(灯泡)和 DaylightLamp
(日光灯)是具体的灯具类,实现了基于电压变化的亮度调整逻辑。
CeilingFan
(吊扇)和 FloorFan
(地面风扇)是具体的风扇类,通过电压变化调节转速。
电路类:
SeriesCircuit
(串联电路)和ParallelCircuit
(并联电路)类代表了两种常见的电路类型。SeriesCircuit
表示串联电路,ParallelCircuit
表示并联电路。每个电路包含多个设备,可以设置电压并计算电路的总电阻。
2. 核心功能和逻辑
设备的创建和控制:
在主程序中,输入通过命令行读取。命令包括设备创建、串联电路和并联电路的定义、以及设备控制命令(如开关的开关、调速器的调节等)。设备根据命令被动态创建并存储在 devices
映射中。
设备的控制命令(例如开关的开关操作、调速器的调节操作)通过解析输入命令并调用相应的 control
方法来实现。
电路的构建:
通过命令解析,程序将设备加入到串联电路(SeriesCircuit
)或并联电路(ParallelCircuit
)中。
串联电路和并联电路的电压和电流计算是基于每个组件的电阻来实现的。每个电路会计算总电阻,并通过电压分配算法来确定电压的分配。
串联电路中的电压会根据各个设备的电阻分配,电流根据电压和总电阻的比例分配给各个组件。
电压的传递和计算:
每当设备的电压输入被设置时,它会根据设备类型计算输出电压或其他属性(如亮度、转速等)。
电路的电压应用通过 applyVoltages
方法完成。根据主电路和并联电路的电阻计算出电压分配,随后将电压输入到各个电路组件。
3. 代码的流程
-
命令解析:
程序通过扫描用户输入的命令(使用Scanner
)来处理电路的定义和设备的控制命令。命令以#T
或#M
开头分别代表串联电路和并联电路的定义。 -
设备创建:
每当遇到设备的创建命令时(如#T
或#M
命令),程序会根据设备ID判断设备类型,并创建对应的设备对象。 -
电路连接:
在处理电路命令时,程序将设备连接到串联电路或并联电路中,更新电路的组件列表。 -
电压分配:
对于每个电路(串联或并联),程序会计算该电路的总电阻,并基于电压分配原则将电压输入到电路的各个设备上。设备根据电压的不同值调整其输出属性(如亮度、转速等)。 -
控制命令:
控制命令(如+:
或-:
)用于控制设备的操作(如切换开关或调整调速器的级别)。 -
结果输出:
最后,程序按设备类型打印每个设备的状态,显示其最终的属性(如亮度、转速、开关状态等)。
类图:
顺序图:
三.采坑心得
1.答题判题程序-4
1.输出优先级问题:一道题目同时出现答案不存在、引用错误题号、题目被删除,只提示一种信息,答案不存在的优先级最高
用if-else的多层判断来处理:
if ((answer == null && title.isDeleted()) || (answer == null && nonExistentQuestions.contains(title.getTitleID())) || (answer == null && nonExistentQuestions.contains(title.getTitleID()) && title.isDeleted())) {
System.out.println("answer is null");
} else if (nonExistentQuestions.contains(title.getTitleID())) {
System.out.println("non-existent question~0");
} else if (title.isDeleted()) {
System.out.println("the question " + title.getTitleID() + " invalid~0");
} else if (answer == null) {
System.out.println("answer is null");
} else if (i < judgeResults.size()) {
if (title instanceof ChoiceTitle || title instanceof FillInTheBlankTitle) {
result = (String) judgeResults.get(i);
} else {
boolean isCorrect = (boolean) judgeResults.get(i);
result = isCorrect ? "true" : "false";
}
System.out.println(title.getContent() + "~" + answer + "~" + result);
} else {
System.out.println(title.getContent() + "~" + answer + "~false");
}
2.测试点问题:答卷用户答案后面有多个空格,去除一个末尾的最后一个空格
用substring解决:
3.输出逻辑:如果答卷中的学号信息不在学生列表中,答案照常输出,判分时提示错误。
先输出答案再输出提示信息,如果学号不存在,输出提示信息后结束,不打印分数:
for (Integer testID : studentAnswers.keySet()) {
AnswerSheet answerSheet = studentAnswers.get(testID);
answerSheet.printAnswersAndJudgeResults();
if (!students.containsKey(studentID)) {
System.out.println(studentID + " not found");
continue;
}
answerSheet.printScores(studentID, studentName);
}
2.家居强电电路模拟程序-1
1.输出顺序:按开关、分档调速器、连续调速器、白炽灯、日光灯、吊扇的顺序依次输出所有设备的状态或参数。每个设备一行。同类设备按编号顺序从小到大输出。
用多个链表储存设备信息,再按顺序输出:
// 获取所有控制设备并按ID排序后输出
List<Device> switches = devices.values().stream()
.filter(device -> device instanceof Switch)
.sorted(Comparator.comparing(d -> d.id)).collect(Collectors.toList());
List<Device> gradualSpeeders = devices.values().stream()
.filter(device -> device instanceof GradualSpeeder)
.sorted(Comparator.comparing(d -> d.id)).collect(Collectors.toList());
List<Device> continuousSpeeders = devices.values().stream()
.filter(device -> device instanceof ContinuousSpeeder)
.sorted(Comparator.comparing(d -> d.id)).collect(Collectors.toList());
List<Device> filamentLamps = devices.values().stream()
.filter(device -> device instanceof FilamentLamp)
.sorted(Comparator.comparing(d -> d.id)).collect(Collectors.toList());
List<Device> daylightLamps = devices.values().stream()
.filter(device -> device instanceof DaylightLamp)
.sorted(Comparator.comparing(d -> d.id)).collect(Collectors.toList());
List<Device> ceilingFans = devices.values().stream()
.filter(device -> device instanceof CeilingFan)
.sorted(Comparator.comparing(d -> d.id)).collect(Collectors.toList());
// 根据设备类型的顺序输出
printDevices(switches);
printDevices(gradualSpeeders);
printDevices(continuousSpeeders);
printDevices(filamentLamps);
printDevices(daylightLamps);
printDevices(ceilingFans);
// 输出设备列表
private static void printDevices(List<Device> devices) {
for (Device device : devices) {
System.out.println(device);
}
}
2.多个开关情况
增加判断逻辑,有一个开关是打开状态,整个电路电压为0:
// 检查是否有任何一个Switch是turned on状态
boolean anySwitchTurnedOn = components.stream()
.anyMatch(device -> device instanceof Switch && ((Switch)device).isTurnedOn());
double voltage = anySwitchTurnedOn ? 0 : 220;
3.家居强电电路模拟程序-2
1.往串联电路中增加设备时一开始增加了两次,导致算电阻时出错
增加一个判断条件,已添加设备ID不含再添加,保证设备只添加一次:
2.主电路算电压时考虑连在总电源后的控制设备
计算经过控制设备调节后的电压:
3.短路问题
如果并联电路的多个串联支路中有一个支路只有一个开关并且是闭合的,则判定为短路,整个并联电路电阻为0:
四.改进建议
1.答题判题程序-4
代码结构优化:
职责分离: AnswerSheet 类承担了太多职责:读取答案、判断答案、计算分数、打印结果。应该将这些职责分离成更小的类,例如:AnswerReader, AnswerJudge, ScoreCalculator, ResultPrinter。这样可以提高代码的可读性和可测试性。
减少嵌套: judgeAnswers 和 printAnswersAndJudgeResults 方法中存在大量的嵌套 if-else 语句,这使得代码难以阅读和理解。可以使用策略模式或其他设计模式来简化逻辑。例如,可以使用一个接口 AnswerChecker 来定义答案检查的策略,然后针对不同题型实现不同的 AnswerChecker 实现类。
提取公共方法: ChoiceTitle 和 FillInTheBlankTitle 类中 checkAnswer 和 checkAnswerDetailed 方法的逻辑非常相似,可以提取成公共方法,减少代码冗余。
2.家居强电电路模拟程序-1
1. 设备类型的创建逻辑(createDevice
方法)
目前,createDevice
方法通过硬编码对设备ID进行判断,并创建相应的设备实例。随着系统的扩展,设备种类增多时,这种硬编码方式会变得不够灵活,难以维护。可以考虑使用工厂模式来动态创建设备。
改进建议:
使用工厂模式将设备创建逻辑从主逻辑中分离出来,便于扩展和维护。这样,每种设备的创建都集中管理,扩展新设备时只需添加新的工厂类,createDevice
方法也变得更加灵活和可扩展。
2. 命令执行(commands
处理)
在当前代码中,命令的处理是通过字符串解析来完成的,但这种方式可能会导致代码难以扩展或维护。不同的命令可能需要进行更复杂的解析,且每个设备的行为处理方式不同。可以考虑将命令封装成对象,使用命令模式来处理。
改进建议:
使用命令模式来封装不同的设备控制命令,使得每个命令可以独立执行,同时便于扩展和维护。通过命令模式,可以使设备的控制更加模块化,也能更轻松地添加新的命令处理。
3. 电压流动的逻辑(SeriesCircuit
类)
目前,SeriesCircuit
类中的电压流动逻辑比较简单,但在复杂电路中,可能会涉及多个设备之间的电压关系。为了适应更多的电路拓扑结构(例如并联电路等),可以将电路的设计进行抽象化和通用化。
改进建议:
考虑将电路的拓扑结构抽象成一个接口,不仅限于串联电路,可以支持并联电路,甚至更复杂的组合电路。通过引入电路接口,可以方便地扩展更多类型的电路,提升代码的可扩展性。
4. 设备状态管理
目前的设备状态管理是基于一个单一的状态变量(例如state
、level
),而对于一些更复杂的设备,可能涉及到更多的状态和行为。为了使设备状态更加清晰,建议引入状态模式来管理设备状态。
改进建议:
使用状态模式来管理设备的不同状态,使得每个状态有自己的行为,而不是将状态管理集中在设备本身。通过状态模式,设备的不同状态可以独立管理,增加新的状态时不需要修改设备类本身,提高了代码的可维护性。
3.家居强电电路模拟程序-2
1. 代码结构的改进
设备和电路的解耦:
目前的设计将电路的逻辑和设备的具体实现混在一起,尤其是在SeriesCircuit和ParallelCircuit类中。电路的控制(如电压的分配)和设备的具体实现(如亮度、转速、开关等)应当分开处理。
例如,可以将电路的计算逻辑提取到单独的Circuit类中,避免混杂在设备类中。设备类只负责与设备相关的操作,电路类负责电路的连接、计算与电压分配。
减少重复代码:
设备类中,特别是Switch、GradualSpeeder和ContinuousSpeeder类的setVoltageIn和getVoltageOut方法有较大的相似性。可以考虑将它们提取到一个通用的基类或接口中,减少重复代码。例如,考虑提供一个统一的adjustVoltage接口来简化电压的调整和计算过程。
2.优化电压计算与分配
电压分配的改进
当前的电压分配逻辑有点复杂,尤其是在applyVoltages方法中,电压的计算依赖于电路的串联和并联关系。可以考虑设计一个专门的VoltageDistributor类,用来处理电压分配的细节,将电压分配与电路的具体实现分开,使得电路的处理逻辑更加清晰。
电压缓存优化
可以考虑引入一个电压缓存(voltageCache),用于缓存已经计算过的电压,避免重复计算。当电路中某个设备的状态发生变化时,可以只更新该设备相关的电压,其他未受影响的设备保持不变。
五.总结
通过本阶段三次题目集,我学到了如何利用面向对象的编程思想来设计和实现一个试卷评分系统。在这个系统中,通过类的继承和多态特性,能够针对不同类型的题目(如选择题、填空题等)设计对应的子类,并且实现题目的评分和答案判定功能。同时,我还学会了如何使用正则表达式来解析输入的文本数据,并将其分类存储,进一步实现对试卷和答卷的处理和评分。在设计上,我注意到通过抽象类Title和具体子类如ChoiceTitle、FillInTheBlankTitle来处理不同类型的题目,这种方法使得代码结构清晰且易于扩展。例如,新增其他类型的题目时,只需继承Title类并实现相应的评分方法即可,符合面向对象的开放-封闭原则。同时我深刻理解了面向对象编程中的一些重要概念,如继承、多态和抽象类的应用。特别是在设计电气设备(如开关、灯具、风扇等)的类时,使用了抽象类和接口来规范不同设备的共同行为,并通过继承实现了不同设备的具体功能。此外,代码中还涉及了电路模型的设计,包括串联电路和并联电路的处理,体现了如何利用组合模式来组织复杂的电气系统。我学到的一个重要点是如何将设备的行为(如控制电压、电流、亮度等)封装到各个设备类中,并通过抽象方法和多态实现动态的电压和状态变化。这种设计方式提高了代码的扩展性和可维护性,使得未来添加新设备或修改现有设备时不容易引入错误。
然而,仍然有一些地方需要进一步学习和研究。首先,代码中的错误处理机制可以更加完善,尤其是在输入数据的格式不规范时,系统应当能够提供更友好的提示,而不是直接输出错误信息。其次,当前的答题判定逻辑对于一些复杂题目(如选择题中的部分正确)可能过于简化,可能需要引入更复杂的评分策略,例如对部分选择正确的题目做更细致的评分。最后,代码中涉及到的正则表达式应用较为基础,未来可以通过更深入的学习,掌握更高级的正则表达式技巧来处理更加复杂的文本解析任务。电路中涉及的电压、电流计算需要更精确的物理建模,而当前的计算方法可能没有充分考虑复杂的电气特性(如电感、电容等)。此外,代码在处理电压和电流传递时的逻辑可能会面临并发或复杂电路行为下的挑战,值得进一步深入研究如何在多线程或更复杂的情况下进行高效的模拟和计算。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异