OOP第二次Blog作业
前言
经过一段时间的学习,在老师的讲解下我们对面向对象也有了进一步的了解,也学到了许多新的知识。在多次题目集中我们即积累了许多经验也发现了自己的不足,同时在不断debug的过程中,我们的耐心也得到了锻炼,更加增强了我们锲而不舍的精神。
以下是这三次PTA的总结性报告:
- 所涉及到的知识点
- List的应用
- 正则表达式
- HashMap、setMap等
- 简单工厂模式的应用
- 继承与多态
- 接口的灵活运用
- 题量
这三次题目集相较于前三次,题量是减少了的,如:题目集四有三道题目,题目集五有三道题目,题目集六有一道题目。总的来说题目数量是减少了,但难度并没有,也许老师正是想到了这一点才将题目量减少的吧。 - 难度
前面提及难度并没有减少,这三次题目集为答题判断的最后一次迭代和家居强电电路模拟的前两次迭代。就比如电路题:难点主要在于对于输入数据的处理和存储以及后面的“通电”处理,最后输出顺序也是一难点。
设计与分析
答题判断程序四
nchu-software-oop-2024-上-4
这次迭代增加了选择题(多选题)和填空题,输出顺序也有了变化:
只要是正确格式的信息,可以以任意的先后顺序输入各类不同的信息。比如试卷可以出现在题目之前,删除题目的信息可以出现在题目之前等。
以及一个同学可以有多张试卷。
- 类图:
这次题目一共设计了12个类,分别是:Question,Questions,Choicequestions,Fillquestions,Paper,Students,Answer,Delite,Show,Agent,Check和主函数。每个类都有特定的功能,功能比较分散,就比如Show,主要用来输出数据。
- SourceMonitor生成报表:
- 首先可以看出这次代码的注释量还是比较少的,主要的原因可能是当时思考的时间被比较集中,ennn没有考虑到后续自己或是别人看代码能否看懂。
- 平均圈复杂度在预期范围内,但是最大圈复杂度却大于预期结果,经过分析发现对最大圈复杂度贡献最多的是代码中曾多次使用if-else语句,这使函数可执行路径的数目增加,从而增大了最大圈复杂度。如:
这张图片展示了对输入数据的解析,从图中可以看出使用了多层if语句。 - 同时最大深度(Max Depth)和平均深度(Avg Depth)也挺超出预期,这主要由几个方面的原因造成,一是由以上图可以看出对输入数据的处理使用了多层嵌套,还有就是在写输出语句的时候也使用了嵌套:
- 心得与建议
在写PTA时,我们不会总是一次提交就过了的,这就需要我们不断地debug,找出自己程序中的漏洞,在这过程中难免会遇到多重困难,我们需要坚持不懈的去完成它,不仅仅为了成功之后的愉悦感,也为了提升自己。
而在这次PTA中,经过多次努力我还是有几个测试点没过
下次一定要提前写!!这样就有时间去找错和改正!!!
家居强电电路模拟程序一
nchu-software-oop-2024-上-5
家居电路模拟系列所有题目的默认规则:
1、当计算电压值等数值的过程中,最终结果出现小数时,用截尾规则去掉小数部分,只保留整数部分。为避免精度的误差,所有有可能出现小数的数值用double类型保存并计算,不要作下转型数据类型转换,例如电压、转速、亮度等,只有在最后输出时再把计算结果按截尾规则,舍弃尾数,保留整数输出。
2、所有连接信息按电路从电源到接地的顺序依次输入,不会出现错位的情况。
3、连接信息如果只包含两个引脚,靠电源端的引脚在前,靠接地端的在后。
4、对于调速器,其输入端只会直连VCC,不会接其他设备。整个电路中最多只有一个调速器,且连接在电源上。
- 类图如下:
本次为家居强电电路模拟程序的第一次迭代,故而类的设计不是很复杂,只有11个类。这次程序类的设计比较明确,比如受控设备,控制设备,以及各种电器等等,这种似乎必须要设计一个类啦。至于他们之间的关系,也是比较明确,比如受控设备和控制设备,就肯定是父类啦。 - SourceMonitor生成报表:
- 从表中可以看出这次代码的质量总体上还是很可以的,大部分数据都在预期范围内,说明有很大的进步~。
- 最主要的两点是注释的行数和最大圈复杂度,注释行数的话,ennn这次的类设计比较明确,还有就是这是第一次迭代,不是那么地很复杂,所以注释就少了。最大全复杂度的话,还是if-else的使用,哎~面对多种情况的问题,我们还是首选if-else,这似乎是同学们的习惯了。
- 踩坑心得:
在通过抽象类引用其子类时,有时候用子类特有的方法编译器会报错,
当时就很困惑,这时候我们需要进行强制类型转换才能够顺利引用:
如图,我要设置连续调速器的档位,这个时候直接通过devices来引用的话变回报错,说没有该方法,这时就需要进行强制类型转化。 - 改进建议:
- if-else可以少用,这样可以提高代码质量。
- 注释确实可以多些,这样方便自己或他人能够看懂我们的代码和理解我们的思路。
家居强电电路模拟程序二
nchu-software-oop-2024-上-6
这次受控设备增加了落地扇,同时输入信息的方式也发生了变化,如:
#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT]
#T2:[IN K2-1] [K2-2 D1-1] [D1-2 OUT]
#M1:[T1 T2]
#T3:[VCC L1-1] [L1-2 M1-IN] [M1-OUT D3-1] [D3-2 GND]
#K1
end
电器设备也都增加了电阻:
本次迭代考虑电阻:白炽灯的电阻为 10,日光灯的电阻为 5,吊扇的电阻为 20,落 地扇的电阻为 20。
输出格式:
@K1:closed
@K2:turned on
@L1:0.00
@D1:0
@D2:0
@D3:0
- 类图如下:
从图中可以看出这次一共设计了14个类,这次迭代主要是增加了串联电路类和并联电路类,将并联电路看成是一个电器设备,同时这次的迭代还简单应用了简单工厂模式:
当然这麽说也不是很准确,简单工厂模式是一个工厂类,而我这仅仅是一个方法而已,但都是通过给定的信息然后返回一个特定的类的对象,这样做方便很多,之后定当深入学习简单工厂模式,争取做到熟练应用。 - SourceMonitor生成报表:
总体来说比上次要好很多,主要还是代码的注释,哎,习惯还是很难改的,毕竟我们之前就很少会写注释,但习惯并不是不能改的,在后续的训练中一定会有意识地写注释。再一个就是最大圈复杂度,这个确实挺难避免的,毕竟在一长窜输入信息中找到自己需要的有用的信息这一过程挺难避免不用if的,当然,如果后续找到了更好用的方法肯定会赢更好用的方法~。
- 踩坑心得:
- 首先!一定要注意代码的完整性,先看一下两张图:
当时我觉得我写的挺好的,但是这几个测试点就是过不了,无论如何debug都无济于事,后来经过细致的分析发现没有考虑分档调速器,可能是当时测试样例只有连续调速器和开关和电器的组合,导致主观上就忽略了分档调速器,好在发现的及时和改正的及时:
2. 还有一个值得一说的是输出;
这就需要在输出之前对设备进行排序,可以用如下方法:
创建不同的列表,将不同的电器存入不同的列表中,之后在对每个列表中的数据按编号的大小进行排序,个人觉得这样挺简单入手的。
- 改进建议:
emmm感觉类的设计还不是那么的完美,比如为了减轻主函数的负担而加入了Circuit类,然后基本上逻辑计算都在Circuit类中进行,又使这个类功能复杂。如果要改进的话,可以多设计几个类来分担Circuit类的功能。
总结
经过这一阶段的练习,我们多次灵活运用了继承多态,接口等等,使我们对面向对象有了进一步的理解,如:通过抽象类创建不同子类类型的对象,通过抽象类调用子类对象和子类方法等。同时也提升了我的逻辑思考能力,如:并联电路和串联电路之间的关系,对串联电路通电,以及如何从输入的一长串信息中提取我们需要的信息等等,相信在后续的学习中我将收获更多知识来提升自己的能力。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~