NCHU PTA4~6次题目集总结
PTA 4~6次题目集总结
1. 前言
2. 设计与分析
3. 踩坑心得
4. 改进建议
5. 总结
(1)前言
第四次大作业:
第四次大作业相比前几次难度都上升了不少,增加了多选题,填空题,包括批改的方式也不同,答卷和试卷的格式和类型也变多了。考察的知识点有:类的简单继承,哈希表,列表等。最后一次迭代增加了很多复杂的情况和条件,需要设计很多细节。由于我前几次代码设计层面上用心过少,导致迭代基本需要重新来写过,时间的紧凑和其余课程的压力导致我没有好好完成这一次大作业,后续我通过600行左右代码量基本完成了。主要思路就是处理好答题信息,怎么收集,怎么归类,怎么判题,而且要保证每个类(句子处理类,答题类,答卷类等等)独立完成自己的职责,同时也要保证圈复杂度小,不能一层套一层的逻辑往下写,这是写起来意识不到但是十分致命的问题。整体上来说,出于个人能力原因,我认为这次大作业是偏难的。
第五次大作业:
第五次大作业开始重新迭代,内容是家居强电电路模拟程序,这一次考察的知识点有:类的继承,接口,排序,正则表达式等。由于是第一次迭代,题目只要求处理一条串联电路的信息,相对还是简单的。这里题目对信息处理的要求相比前一次简单了一些,信息我认为可以分成四个部分:1.连接电源端的电器部分(如:[VCC F1-1]),2.电路中间的电器,引脚相连接的部分(如[F1-2 D2-1]),3.电路最后电器与接地的部分(如[D2-2 GND]),还有最后的对控制设备的处理,也就是实际人为的操作部分(如:#F1+,加1档)。总体上来说代码量不大,我自己用了440多行处理完成,PTA上的测试点都通过了,总体上来难度是偏容易的。
第六次大作业:
第六次大作业在第五次大作业的基础上迭代,增加了一个受控设备,添加了并联这一条件,要考虑电流,电阻,电压的计算,还要考虑并联各个分路的受控设备的情况,考察的内容还是主要为:类的继承,接口,排序,正则表达式。信息的处理也更加复杂了一些。我认为还是可以分为四部分:1.并联电路所有的支路(如:#T1:[IN K1-1] [K1-2 D2-1] [D2-2 OUT])。2.并联电路(如#M1:[T1 T2])。3.主干路(如:#T3:[VCC L1-1] [L1-2 M1-IN] [M1-OUT D3-1] [D3-2 GND])。4.对控制设备的处理(如:#K1 #L1:1.00)。值得一提的是这次题目集的迭代十分看重对于类与类的设计,对于类设计比较合理,完善的代码,甚至一口气就能写完所有的要求。可谓“工欲善其事,必先利其器”“磨刀不误砍柴工”。如果写代码前思考不全面,不充分,写代码的时候就会非常痛苦,总有几个点过不了,也许是计算过程中导致的电压精度问题,也许是设备连接问题等。总体上来说代码量也不算大,在前一次的基础上新增了200左右的代码量,也就是说大概就要640行左右的代码,其实整体来说难度也不算大,但是PTA还有几个测试点没过,是我类设计不充分,继承关系运用不完善的原因,除此之外还有很多我需要反思的地方。
(2)设计与分析
第四次大作业:
第四次大作业仍然是主要分为题目类,试卷类,答题类,试卷题目类,信息处理类。然后通过继承的方式,将问题分为:单选题,多选题,选择题,并通过不同的判题方法来处理最后的得分情况。同时要注意删除的题目和错误的题目,不能将他们归到处理信息一起。在处理题目信息的时候,我创建了几个哈希表:HashMap<String,String>学生哈希表
,HashMap<String,questionN> questionNHashMap
单选题哈希表,HashMap<String,questionK> questionKHashMap
填空题哈希表,HashMap<String,questionZ> questionZHashMap
多选题哈希表等。通过下标来和处理类Process
联动。最后输出所有的信息和判题情况。
可以看到SourceMontor的生成报表圈复杂度还是很高,这也是我前几次大作业写的时候没有处理好类的关联导致的。
以下是第四次大作业代码的idea自动生成类图和SourceMontor的生成报表内容:
第五次大作业:
第五次大作业对于类我一共分为三个部分:受控设备,控制设备(二者都继承于同一个父类Device
)类,信息处理类以及最后的Main
类。对于仅有一条串联电路且只有一个用电器的情况,我们不需要考虑电流和电阻,VCC在经过调速器(分档调速器和连续调速器)后直接赋电压值给单一的用电器,然后输出各类设备的信息。在main方法里我实例化了一个process
(处理类)的实例对象,创建了一个<String,Device>
类型的Hashmap,用来存储设备信息,最后处理完再将Hashmap的键值,也就是设备的名称转化成一个ArrayList,再通过写一个排序接口Collections.sort(list, new Comparator<String>()
来按照KFLBRD的顺序对list排序。再遍历list用hashmap去查找所有的设备按顺序来进行输出。综上,除了信息处理需要花些时间其他的想法和代码都是十分自然的,总体上来说设计是很简单的。
但出于一系列原因,我在通过SourceMontor检查我的最大圈复杂度的时候,居然发现其居然超过了40,可能是main方法太过冗杂,各个类的单一职责功能不充分,于是我在后一次大作业进行了进一步的修改和完善。
以下是第五次大作业代码的idea自动生成类图和SourceMontor的生成报表内容:
第六次大作业:
在第六次大作业中添加了单个并联的条件,在基于前一次大作业的基础上我又添加了几个类:线路类(Line
),并连类(CombineLine
),并且在Device类里添加了电阻和电流属性,在各个受控设备中我在带参构造方法里还给其电阻赋了特点的值。并且大改了处理类(process
)并添加了线路处理类(lineprocess
),以更方便地处理信息和增加代码的可扩展性,可读性。基本思路是把并联电路也当作主干路的一个用电器,由外至内,先进行各个设备的分压,再对并联电路的各个支路的各个设备进行处理,最后输出。其次输出我把每个设备添加了show方法,show出自己的信息,使各类的职责更加独立。然后处理信息我放弃了hashmap,只用了一个Line类的ArrayList储存所有电路信息,这样可以使得我们对各个线路操作的时候一步到位。排序方面我直接在Device
大类里写了一个Comparator
接口,先按照字母KFLBRD排序后按照数字大小进行排序,使得排序更加直接。
值得一提的是这一次的代码的圈复杂度得到了很大的进步,控制在了10以内。
以下是第六次大作业代码的idea自动生成类图和SourceMontor的生成报表内容:
(3)踩坑心得
鄙人认为就这三次大作业来说,踩得坑基本都是在类的设计上。很多时候头脑一热,自以为灵光涌现,其实不然,一时的冲动远不及深思熟虑后的从容。所谓的冲动,无非也就是赶着DeadLine,想让自己尽快的写完,从而忽略掉很多基本的类与类之间的关联和细节方面的设计。就比如第五次大作业,我可以根本不去考虑Line类,电阻,引脚的设计,但后续的迭代呢?我们不能局限于眼前题目给你的限制从而为了得分而设计,而是从大局方面去考虑,去设计,去面向整个程序和可能存在的需求。我们不能拘泥于分数而抛弃了思考的包袱,这是不对的。思考和设计所花的时间应该远远大于敲代码的时间,就像很多优秀同学的设计一样,一开始就设计好各种类与类之间的关联,各个方面都考虑进去,敲代码只是水到渠成的事情;而如果我们背道而驰,一开始就上手敲代码,到最后只会是一路的缝缝补补,拆了东墙补西墙。到了下一次迭代又发现,好像上一次设计的逻辑又有问题,只能推倒重来。其实我们只要多考虑一下底层的逻辑思路,有起码70%的代码是可以不用动的,因为这些就是整个迭代系列的灵魂,支柱。整个迭代都可以基于它们去根据新的要求更新,而不是可能和部分同学一样只有20%的代码能沿用,200,300行的main方法一次跟着一次迭代完全改变,这是错误而致命的。
(4)改进建议
就电路设计迭代这一次的代码来说吧,我的类设计还是不是很合理,不仅没有好好用到电流这个属性,对类的继承比如并联电路继承电器类还是线路类等等没有思考完全。我认为下次可以再好好完善和修改这两点。
(5)总结
学到了什么:
1,更加灵活地使用正则表达式和String的一些提供的方法,如substring去更加高效地处理各类信息。
2,要正确设计类和类之间的关系,以及类本身处理的职责,可以更加合理的对信息进行划分和处理。
3,接口是个好东西,Comparable和Comparator两个接口可以配合Colletcions.sort方法很便捷地对某个类的列表排序,帮助我们输出题目要求的格式。
4,继承是java的三大特性,在处理有迭代信息的类可以使用,但不能为了使用而使用,一定是要方便我们处理信息和理顺逻辑才用的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~