PTA题目集7-8的总结性Blog
一:前言:
1. 知识点总结:
①:递归的使用
②:java面向对象类和对象的基本用法
③:关联类,依赖类和组合等类间关系
④:正则表达式的运用
⑤:接口的基本使用
⑥:Comparator接口及比较器基本使用
⑦:ArrayList的基本使用
2. 题量:
较少,每次题目集只有1题
3. 难度:
由于题量少,所以每次题目集难度较大,难点在于电路复杂多变的情况,这两次题目集加入了多并联及并联包含并联,这样在计算电流时需要考虑局部短路及断路分压
等特殊情况,这对于分流及分引脚电压带来了多种情况,当然这题的难度也不是太大,因为老师设计的测试点舍去了许多异常情况。
二:设计与分析:
第七次题目集:
1. 类图设计:
这次包括主类我总共设计了22个类,6个接口,相较于上一次题目集我新添加了继承自电器类的受控窗帘和互斥开关类,添加了判断断路,搜索受控窗帘,获取总亮度
和输出接口,都是device类实现他们,然后子类去重写。
2. 源码分析:
1、源码信息:
代码行数:1351
语句行数:769
分支数占总语句数百分比:23.8
方法调用语句数:346
注释语句占总语句百分比:11.0
类和接口数:18
最复杂函数的复杂度:36
平均深度:1.84
最大深度:6
平均复杂度:2.08
由上图,红色线表示当前的情况,在绿色范围(所推荐的java良好代码,如平均复杂度在2.0-4.0之间)表示良好,可知当前代码在每个函数平均包含的语句个数
(Average Statements per Method),最复杂函数的复杂度(Maximum Complexity)不合格,其他方面较上次题目集有所改良。
2、源码思路及问题:
思路:首先在Main类中创建一条总干路存储串并联电路及干路电器,然后创建一个临时列表用于存储所有具体的电器设备,这个临时列表就是用于输出所有电
器的状态用的,然后解析三种输入信息,存到总干路及临时列表里,然后计算电流及电压,然后分流分压,由于受控窗帘的状态基于其他电器,所以单独创建一个
类来计算电路的总亮度,然后通过搜索受控窗帘接口给其赋值,由于本题新增了一个互斥开关,我就给互斥开关增加了两个属性,一个是计算时的状态,一个是真
实状态,因为如果只有1.3引脚接入电路,互斥开关真实状态默认是闭合的,但这里显然是断开的,所以真实状态用于输出,计算时状态用于计算电流等,最后是输
出, 利用Comparator的sort方法排序即可。
问题:本次程序存在许多多余的接口,比如搜索受控窗帘这个接口完全没必要,统计电路总亮度可以用其他的方法,不需要单独创建一个类和接口来统计,而且
我是device类实现这个接口,因为我想利用多态,但是实际上只有子类的串联和并联电路类才会用到这个接口,其他的子类完全用不到,但是还是要重写,这就导致
整个程序非常冗长;其次,目前写的这个程序是完全无法应对引脚电压的,我只是让电器分了电压,但是他的输入引脚电压输出引脚电压具体是多少是无法求得的。
第八次题目集:
1. 类图设计:
这次题目集相对于上次我删去了搜索受控窗帘及获取总亮度这两个多余的接口,加上了判断短路接口。
2. 源码分析:
1、源码信息:
代码行数:1811
语句行数:1038
分支数占总语句数百分比:27.9
方法调用语句数:526
注释语句占总语句百分比:11.3
类和接口数:19
最复杂函数的复杂度:50
平均深度:2.02
最大深度:8
平均复杂度:2.56
由上图,红色线表示当前的情况,在绿色范围(所推荐的java良好代码,如平均复杂度在2.0-4.0之间)表示良好,可知当前代码在最复杂函数的复杂度
(Maximum Complexity),每个函数平均包含的语句个数(Average Statements per Method),类和接口数(Classes and Interfaces)
和最大深度(Max Depth)不合格。
2、源码思路及问题:
思路:首先在Main类中创建一条总干路存储串并联电路及干路电器,然后创建一个临时列表用于存储所有具体的电器设备,因为这次加入了要输出输
入输出引脚电压,所以这次又新建一个列表用于存储含两个不同状态的互斥开关,并且在device类加入了一个顺序属性表示引脚顺序,因为电器引脚可能
反接,然后是在计算电路属性时,我在计算电流时,所有的device子类重写断路,短路接口,输入输出电流接口,在遍历时就是递归调用,所以不论并联
里面是否还是有并联,通过这样重写来实现递归调用这个方法就可以遍历各条电路,通过判断断路或短路及输入输出电流然后就可以正确地计算电流及电
压;在计算总亮度时,因为我们之前用了临时列表存了所有的电器,直接在输出之前遍历即可,然后再将值赋给受控窗帘,其他的跟上次题目集逻辑差不多。
问题:最后一次题目集我尽管得了96分,但设计十分失败,因为我的代码写了1800多行,十分冗长,并且没有处理很多的异常,另外一名同学在主函数
只写了try,catch处理了一些异常,并且代码只有1200多行,他在设计时是用链表写的,对了两个引脚设计的更能体现题意,我只是取巧,通过在device类
加一个顺序属性表示两个引脚,顺序表示1-2引脚连接,逆序则2-1引脚;
三:踩坑心得:
第七次题目集:
①:
在本输入样例中,在输出顺序存在着坑,就是B2与B12应该按着什么顺序输出按照之前的写法是B12在后面,因为12比2大嘛,但是这样写的话,就会错以下
测试点:
于是后来与同学讨论得知是按字典序排序,即B2在后面,这样便顺利通过了以下测试点,以下是正确的输出结果:
②:
在本输入样例中,互斥开关只有1-3引脚接入电路,这条路是断开的,但是此时坑就在这里,因为此时互斥开关的实际状态是闭合的,所以这条路如何判断就成为
了问题,因此在处理这个问题的时候,我就给互斥开关设置了两种状态,一个是计算时状态一个是输出时状态,就是如果是1-3引脚计算状态初始时都是断开的,而
1-2引脚初始计算时状态就是闭合的,然后不管是1-2还是1-3他们的初始输出时状态都是闭合的,在调互斥开关时,两个状态都要调,这样就解决了这个坑,以下是
正确的输出结果:
尽管互斥开关时闭合的,但未调互斥开关的话1-3就是断开的,所以D1的值为0;
③:
在以上样例中,坑就是在于判断并联是否断路这里,在并联电路中,若所有的分路都是断开的,则该并联电路时断路的,我之前只判断了串联电路的断路状态,并未判
断并联电路的断路状态,以下是正确的输出结果:
因为两条分路都是断开的,所以整个电路就是断开的。
第八次题目集:
本次题目集的坑主要在于引入了输入引脚和输出引脚电压之后造成的,以下是多个点
①:
第一个坑就是受控窗帘的问题,在之前的题目描述中,若电压为0,那么受控窗帘的打开程度为100%,但是在这次题目集就不是这样了,若电压小于50,受控窗帘为0%,
通过我和同学们的测试,明确这就是32这个测试点,就考这一点:
以下为正确的输出结果:
②:
在这个测试点中就产生了一个问题,这个并联分路全是开关,说明这两条分路都是短路的,那么怎么分流呢,我之前并未处理这个问题,实际上他是均分的,比如,三条分
路全是短路的则电流均分为3,那么会对什么产生影响呢,就是电流超限,如果没有均分,而是全集中在一条分路上,那么可能对于这个开关电流就超限了,在输出时就要输
出“exceeding current limit error”,以下是本例正确的输出结果:
四:改进建议:
由于第八次是第七次的迭代,我就只说明第八次的改进建议。
第八次题目集:
1.针对代码冗长问题:在第八次题目集中,我足足写了1800多行,按照老师所述,这题最多1000左右,而我的代码太过冗长,首先是主类,我写了40行,经过与其他同学讨论
可以在主类只写try-catch代码块,try里面有两行,一行创建一个类处理输入,第二行处理输出即可,catch用于处理异常;其次在解析输入时,有多少个电器我就写了多少
个if这是不对,这会造成很高的圈复杂度,使得代码难以维护及理解,应该用多态才对,因为所有电器都是继承自device类。
2.针对电流计算方法:这题我是通过分流来写的,就是先计算总电流,然后乘以各个电器的电阻从而得出各个电器的电压,这样写的误差其实是比较大的,因为在计算并联电阻
时,会算出无限小数,那么在传值时计算的总电流就有误差,我是通过保留6位小数并四舍五入来减小了这个误差,但若用分压的写法,就可以明确哪一部分电压是多少,通过电
阻来分压。
五:总结:
这二次题目集总共进行了3周左右,这两次题目集的难度明显高于前面两次,因为要处理多种复杂的电路状态,比如断路分压问题,就是并联电路中一条断开一条连通,但是断
开的电路是有输入引脚电压和输出引脚电压的,尽管电压为0,那么在赋电压时就需要考虑在什么情况这样处理,以及遍历到这个断路;这两次题目集我与同学们讨论较多,可以
说是共同完成了这两次PTA中不少难的测试点,确实,有时候一个人还真不一定能想到某个测试点,大家共同讨论来解决这个问题,让我收获颇多,比如一位同学抛出异常使其非
零返回,为了测试哪里出了问题,这都是值得我学习的,运用多方面的知识来解决问题。
六:课程的建议及意见:
本门课程就像老师一开始所说,是有挑战的,也确实如此,但这样让我们学会了许多东西,有时可能在晚上12点左右还在与同学讨论PTA的题目,锻炼了我们的抗压能力及共同
解决问题的能力,这是一种新奇的体验,因为在高中,我觉得这样的讨论机会比较少;对于这门课程我的拙见是:在课程引进一些最新的技术,来增加我们的知识面,还可以搞一
些编程竞赛或者设计竞赛,选编程能力强的或者设计思路较好的来分享经验。
以上就是我针对七八次题目集的Blog,感谢助教组和老师们的辛勤付出,感谢共同讨论、分享的同学!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)