nchu-wjl

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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的三大特性,在处理有迭代信息的类可以使用,但不能为了使用而使用,一定是要方便我们处理信息和理顺逻辑才用的。

posted on   吴俊椋  阅读(13)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示