目录
一.前言
第四次大作业:
1.题量:这次的大作业有三道题,题量较少。
2.难度:第四次大作业的核心题目答题判题程序-4是经过了三次对第一次答题判题程序为基础的迭代而成,难度毋庸置疑,而且因为第一次总结,这次大作业距离上一次大作业也有很多天,我对我的代码也多了很多陌生的感觉,我觉得难度是大的,至少对于我来说难度是大的,我这次大作业也没有拿到多少分。觉得很遗憾,但我也会在作业后再次花时间去熟悉,去解决。
3.知识点的使用:
第四次大作业使用了以下Java知识点:
这段Java代码是一个考试系统,用于管理考试问题、学生答案、评分和输出结果。以下是代码中使用的一些关键Java知识点:
(1). 类和对象:代码定义了多个类(Question
, text
, Student
, AnswerSheet
, Main
以及内部类 wd
),并创建了这些类的对象。
(2). 封装:每个类都封装了数据和行为,例如 Question
类封装了问题编号、内容、标准答案和有效性状态。
(3). 继承:虽然代码中没有显示继承的使用,但Java中的所有类都隐式地继承自 Object
类。
(4). 内部类:Main
类中定义了一个内部类 wd
,用于存储一些特定的数据。
(5). 静态成员:在 Main
类中使用了静态 Map
, List
, Set
等来存储和管理学生、问题、答案等数据。
(6). 散列:使用了 HashMap
来利用散列实现快速查找。
(7). 数据结构:使用 Map
和 List
作为主要的数据结构来存储和操作数据。
(8). 正则表达式:虽然代码中没有直接使用正则表达式,但在解析字符串时可能会用到。
(9). 模块化:代码被组织成多个类和方法,易于维护和扩展。
第五次大作业:
1.题量:这次的大作业有三道题,题量较少。
2.2.难度:第五次大作业是继前四次迭代大作业结束后的新的迭代式大作业家居强电电路模拟程序,新的程序项目,新的开始,这次大作业的难度相较简单,但比第一次大作业是要难的。老师也在大 作业题目上先说明了大作业
3.3.知识点的使用:
4.第五次大作业使用了以下Java知识点:
(1). 类和对象:定义了多个类(Device
, Switch
, SteppedSpeedController
, ContinuousSpeedController
, Blight
, Rlight
, Fan
, DeviceController
, Main
),每个类都是一个蓝图,用于创建对象(实例)。
(2). 继承:Device
是一个抽象类,它定义了一些基本属性和方法,而 Switch
, SteppedSpeedController
, ContinuousSpeedController
, Blight
, Rlight
, Fan
等类继承自 Device
类,扩展了其功能。
(3). 封装:每个类都封装了自己的属性和方法。例如,Device
类封装了设备ID、输入电压和输出电压。
(4). 多态:Device
类中的 setVoltage()
和 display()
方法被不同的子类以不同的方式实现,展示了多态性。
(5). 抽象类:Device
类是一个抽象类,它不能被实例化,但可以作为其他类的基类。
(6). 接口:虽然代码中没有直接使用接口(interface
),但是 Device
类的抽象方法可以看作是一种接口的定义。
(7). 集合:使用了 Map
和 List
集合来存储和管理设备及其连接。
(8). 正则表达式:在 DeviceController
类的 interpretControls
方法中,使用了 Pattern
和 Matcher
类来解析控制字符串。
(9). 异常处理:代码没有显示异常处理机制,但在实际应用中,对输入电压的调整和设备操作可能需要异常处理。
(10). 方法重写:子类通过重写父类的方法来改变其行为,例如 display()
方法在不同的子类中有不同的实现。
第六次大作业:
1.题量:这次的大作业只有一道题,题量少。
2.2.难度:第六次大作业是继第五次大作业家居强电电路模拟程序的第一次迭代,虽然只有一道题,但结果就是得分的占比全部拉到了这次的核心作业:家具强电电路模拟程序-2.难度也是相较于第一次的基础难了不少。
3.3.知识点的使用:
4.第六次大作业使用了以下Java知识点:
这段Java代码演示了一个电子电路模拟系统,涉及到多个关键的Java编程概念:
(1). 抽象类:Device
类是一个抽象类,定义了所有设备共有的属性和方法,比如电压针脚、电阻和刷新设备状态的方法。
(2). 继承:Toggle
, SteppedSpeedController
, ContinuousSpeedController
, Blight
, Tlight
, Fan
, StandardFan
等类继承自 Device
类,实现了具体的设备行为。
(3). 封装:类封装了属性和方法,隐藏了内部实现细节,只暴露了必要的接口。
(4). 多态:Device
类中的 refreshDeviceState()
和 displayStatus()
方法在不同的子类中有不同的实现,体现了多态性。
(5). 集合框架:使用了 List
, Set
, Map
等集合类来存储和管理设备对象。
(6). 泛型:集合类如 ArrayList
, HashSet
, LinkedHashMap
使用了泛型来确保类型安全。
(7). 异常处理:代码中没有显示异常处理,但在实际应用中,解析输入或执行操作时可能需要异常处理。
(8). 正则表达式:代码中没有直接使用正则表达式,但在解析复杂字符串时可能会用到。
(9). 方法重写:子类通过重写父类的方法来改变其行为。
(10). 并行和串行电路:SerialCircuit
和 ParallelCircuit
类模拟了电子电路中的串行和并行连接方式。
二.设计与分析:
对于第四次大作业,新增加了输入选择题题目,填空题题目的分别,而且在选择题上增加了多选题的分类,导致输入方式变得多样,由于判断方法不同,第四次大作业中,我还新创建了一个判断类,专门用来判断题目类型,并且来调用特定类的判题方法。也增添了多张试卷分析。而且输入顺序也得到改变。
第四次大作业Source Monitor分析
我对第四次大作业的答题判题顺序-4 的代码进行了SourceMontor分析生成报表内容。
第五次大作业,我看到是有关物理的串联并联电路问题,首先应该就是先在脑子和草稿纸上模拟我们高中学过的电路问题,这样思路就明显清晰很多,建立设备类为父类,其中分控制设备的开关或者不同调速器。这个系统较为简单,只需要考虑串联就行,默认所有设备为串联链接,计算方面只要计算好各个调速器在不同电压下的开关或速度调控和电器的输入电压和输出电压之间的电压差。
第五次大作业Source Monitor分析
我对第五次大作业的答题判题顺序-4 的代码进行了SourceMontor分析生成报表内容。
第六次大作业
第六次大作业是第五次大作业的第一次迭代,其相较于第五次大作业,这次增加了一个新电器落地扇,其电压计算较为简单,加入到设备父类的过程也较为简单。但这次迭代最为核心的是电路增加分成为串联和并联电路,其中并联电路的计算较为复杂些,然后就是输入里的电路与电路的链接,我的想法是把电路也看作为电器原件,这样我们就能把电路作为一个元件进入到输入的要求里。
第六次大作业Source Monitor分析
我对第六次大作业的答题判题顺序-5 的代码进行了SourceMontor分析生成报表内容。
三.踩坑心得
1.第四次大作业踩坑心得:
在第四次大作业中,我对新添加的选择题中的选择和单选的判定这方面出现了问题,导致输出总是为空,我的代码的问题可能出现在我代码对字符串的处理出现了错误,在之后我询问了我的同学,向其请教,他告诉我的逻辑有很大错误,并给我发了一个简易模板,
// 处理单选题 if ("single".equals(question.getType())) { boolean result = question.checkAnswer(answer); results.put(number, result); scores.put(number, result ? testPaper.getScore(question.getNumber()) : 0); } // 处理多选题 else if ("multiple".equals(question.getType())) { String[] correctAnswers = question.standardAnswer.split(","); Set
之后我对判定方法进行重构,方法也得到了改善。
2.第五次大作业踩坑心得:
在这次电路模拟中,我出现了多个错误,第一个就是在吊扇转速的计算时没有考虑double的精度导致了电压无法正确分压,从而导致四舍五入时产生偏差导致整个“开关-吊扇”的测试点无法通过。
class Fan extends Device{
private int speed;
public Fan(String id) {
super(id);
this.speed=0;
}
public void setVoltage()
{
double diffv = Math.abs(pin1Voltage - pin2Voltage);
updateOutput(diffv);
}
public void updateOutput(double volege)
{
if (volege < 80) {
speed= 0;
} else if (volege > 150) {
speed = 360;
} else {
speed = 80 + (int) (((360.0 - 80) / (150.0 - 80) * (volege - 80)));
}
}
public String display()
{
return "@" + id + ":" + speed;
}
}
还有就是我的字符串处理我尝试使用正则表达式去处理字符串,但输入样例后输出为空,到最后发现是正则的符号判定我写错了。
3.第六次大作业踩坑心得:
第六次大作业的测试点是没有说明的,我这次大作业也做得很是粗心,没有认真考虑每一个细节,第一个就是因为在上一个大作业的错误下,我没有完善优化开关的状态改变,导致我输入后的输出是错误的。第二个就是排序的问题,没有考虑到输出的顺序,导致输出的上下是倒置输出,后来增加了输出的排序后,输出得到改善。
最后的输出还有一个问题就是每次输出的数值都是0。
比如输入样例2,输出应该是@K1:closed @K2:turned on @L1:1.00 @D1:0 @D2:200 @D3:200但是输出后的结果D2和D3的数值为0。因为时间的问题,我这个问题还是没有得到确切的解决,但我猜测是并联电路的字符串处理后的计算出现了问题。
四.改进建议
- 代码结构优化:我的代码因为自身想的逻辑太过于复杂,没有找到简易的代码思路导致代码太长,结构多余复杂凌乱,我希望我以后能够确保代码结构清晰,模块化,遵循面向对象编程原则。可以考虑引入设计模式来简化代码并提高可维护性。
- 异常处理:加强异常处理机制,确保系统在面对异常情况时能够优雅地处理,并给出相应的提示信息让用户能够理解发生了什么问题。
- 性能优化:查找并消除可能存在的性能瓶颈,优化算法和数据结构以提高程序的运行效率。
4.功能扩展:每一次的代码都是临时抱佛脚,导致每一次迭代做的都很复杂费时间,没有进一步考虑代码的后续书写,我希望我以后能够考虑是否有进一步的功能扩展空间,可以在原有功能基础上进行创新和扩展,使代码更具吸引力和实用性。
5.我应该在写代码之前提前先构思好这一次大作业的基本思路,模拟实际上的作业要求,比如预先模拟好实际电路的构造,去思考逻辑,代码架构,需要画好类图,否则写代码时就会出现调用关系不清晰等问题。
五.总结
收获:
面向对象编程(OOP)的应用:通过设计和实现 Device 类及其子类,您加深了对面向对象编程中类和对象的理解,学会了如何使用继承和多态性来构建代码。
电路理论的实际应用:在模拟电路行为时,您可能对电路的基本概念,如电压、电流、电阻和功率等有了更深入的理解。
数据结构和算法:在处理电路连接和设备排序时,您可能使用了不同的数据结构(如列表、集合)和算法(如排序),这有助于提高您的算法设计能力。
正则表达式的使用:通过使用正则表达式来解析输入,您可能提高了对字符串处理和模式匹配的理解。
代码组织和模块化:将功能提取为方法,您可能学会了如何组织代码,使其更加模块化和可维护。
问题解决技巧:在解决编程中遇到的问题时,您可能锻炼了调试和问题解决的能力。
自主学习:在完成作业的过程中,您可能需要自学新的编程概念或技术,这增强了您的自主学习能力。
不足:
代码重用性:在代码中可能存在重复的逻辑,这表明需要进一步提高代码的重用性,例如通过创建更通用的方法或工具类。
输入验证:如果代码中没有充分的输入验证,这可能导致程序对错误或异常输入的鲁棒性不足。
异常处理:代码可能缺少异常处理机制,这在实际应用中可能导致程序崩溃或不正确的行为。
性能优化:随着电路规模的增长,性能可能成为问题。代码可能需要优化以提高效率,特别是在处理大规模数据时。
文档和注释:每次回头看代码都会有一种陌生感,代码中缺少足够的文档和注释,这可能会影响我代码的可读性和可维护性。
设计模式的应用:在解决某些问题时,可能没有充分利用设计模式来提高代码的灵活性和可扩展性。