24201506ttu

导航

关于题目集5~7的总结性Blog

一、前言

这三次题目集的题量总体来说并不大都在5题以内,而且前面几道题目的难度并不困难只要稍微用点心便可攻破,所以我只需将注意力全都放在最后一题的电梯题中。第五个题目集的前四题都与正则表达式相关,知识点都是围绕如何正确使用正则表达式展开,再看过线上视频后这部分会变得较为简单。而第六、七两个题目集的前面两题是关于如何正确设计类,并且考验了我们关于不同类的对象之间通过方法调用实现协作的能力,相较于第五个题目集略有加难但都在我们的能力范围内。而关于贯穿三个题目集的电梯题对于我个人而言确实有些困难,主要问题还是无法设计出流畅的可行的电梯算法。

所以在这次迭代作业中主要还是考验我们学生的类间关系的设计,考验我们能否以单一职责原则为基础设计代码。

二、设计与分析

第五次题目集:

1.第1次电梯设计:
第一次电梯的结构要求并不高,没有要求严格的单一职责,只需要main一个类和一个Elevator类即可。但这次的难度在于电梯的算法,需要设计一个电梯使其在正确的楼层可以停留。我的设计思路如下:
电梯的运行请求分为内外两个队列,当内外方向相同时取近的楼层到达。当内外两个请求的方向不同时需要先运行完同方向的楼层才能变换电梯方向。因为是第一次迭代训练,所以只需要一个单独的电梯类Elevator包含电梯的最大楼层数、最小楼层数(默认为1层)当前楼层、运行方向、运行状态,目标楼层,以及电梯内部乘客的请求队列和电梯外部楼层乘客的请求队列。Elevator类中除了getter与setter方法外还有move方法用来控制电梯的上行与下行、findNextTarget方法则是用来确定下一次到达的楼层、processRequests则是确定电梯是否继续运行。

2.第1次电梯分析:

根据SourceMonitor分析可知:

1. Method Call Statements显示51条,反映出代码中方法间调用频繁,代码模块化程度尚可。

2.Maximum Block Depth显示6,说明嵌套层数过高影响代码的可读性和可维护性。

3.Methods per Class的值为4,说明类的功能比较集中。

4.分支语句占比 22.1% ,方法调用语句有 51 条也说明了这次代码的条件判断语句较为复杂,这也可能是无法正确到达正确楼层的原因之一。

5.总共的代码行数为154行也从侧面反映出电梯的算法错误,无法按照内外部的请求在正确的楼层打开电梯门。

第六次题目集:

1.第二次电梯设计:

第二次题目在第一次题目集的基础上要求遵循单一职责原则(SRP),要求必须包含但不限于设计电梯类、乘客请求类、队列类以及控制类,并且这次需要考虑连续输入相同楼层的错误情况,所以在有多个连续相同输入时只需要记录第一的输入楼层。与第一题一样将内部与外部的请求放到两个队列中,但是这次除了主类和Elevator类外还有3个类

1.ExternalRequest类有两个方法用于处理外部输入,将外部楼层与运行方向存到队列中。

2.RequestQueue类用于处理队列请求,除了getter与setter方法外还有addInternalRequest与addExternalRequest方法来添加对应楼层到队列

3.Controller类用于控制电梯的运行,processRequest是处理电梯请求的方法,而move方法是控制电梯上行或下行。ShouldStop则是判断电梯是否需要停下来再结合opendDoors这个方法来开门,每次电梯的目标楼层需要通过方法getNextFloor与getClosest两个方法来判断。最后再用removeRequest这个方法移除队列中以及完成的指令。

第二次电梯分析

1.Percent Branch Statements:20.9%,分支语句在总代码中的占比并没有特别高,所以每个类中的语句并没有那么复杂

2.Maximum Complexity:29,方法的最大复杂度达到29,由数据显示最大复杂度的方法是getNextFloor侧面表明我们的具体方法逻辑还是不够清晰导致电梯无法到达正确楼层。

3.Average Complexity:2.85,平均复杂度并没有特别高,说明算法过于集中在getNextFloor中了导致有些偏离单一职责原则。

4.Methods per Class:6.80 ,平均每个类包含 6.8 个方法 ,表明我们的其实还可以再细致化我们的代码,做到类与功能相对应。

5.代码的Lines为243行,相较于其他同学的代码而言有些过于精简了,所以漏掉了些许要求。

第三次电梯设计

第三次的代码要求相较于之前加上了一个passenger类,这个passenger类代替了之前的Extenalrequest类。所以外部输入也要做些变动,不再输入外部目标楼层与运行方向而是输入外部乘客的所在楼层以及目标楼层。RequestQueue类负责管理电梯的请求队列,采用 List 存储内部请求,使用 List 存储外部请求。提供添加、移除和查询请求的方法。具备检查是否存在请求以及特定方向上是否有请求的方法。Elevator 类这个类代表电梯拥有move方法(依据当前方向移动电梯openDoors和closeDoors方法(模拟电梯门的开启和关闭)Controller类是电梯系统的核心控制器,包含了start方法(先向上扫描处理请求,若还有未处理的请求,再向下扫描处理,scanUp和scanDown方法(分别向上和向下扫描请求),processFloorRequests方法(处理当前楼层的请求,若需要则打开和关闭电梯门)hasHigherRequests和hasLowerRequests方法(检查当前楼层之上或之下是否存在请求)

第三次电梯分析

1.文件中 20.3% 的语句是分支语句,相较于前两次的比例以及下降了一些,但还是存在可以修改的一些地方。

2.Method Call Statements数为71,所以调用方法的语句还挺多,说明我们的模块化较好实现了高内聚低耦合,便于代码的维护、复用和测试

3.最大代码块深度为5,说明我们的流程还是有些复杂,代码执行路径错综复杂,理解代码在不同条件下的执行走向变得困难。

4.最复杂的方法名称为RequestQueue类中的hasRequestsInDirection,由于这是本次题目中的核心方法,所以比较复杂而且存在着我无法找出错误的缺点。

5.平均代码块深度为2.07,说明代码中代码块的平均嵌套层次处于相对适中水平让代码在维护时更加友好。

三、踩坑心得

以下是我电梯题目中的一些错误提示:

1. 首先我们应该尽量多提交,只有不断尝试才能在错误中一步步写出正确的代码

2.关于“非零返回”的问题一直困扰着我,在查阅了许多资料,看了书本上的一些内容之后我明白了问题是出现在LinkedList的使用,当LinkedList里面没有元素时再使用get()与remove()等方法时就会导致非零返回所以我们需要加上if()来判断LinkedList里面是否存在元素然后再进行接下来的操作

3.关于“编译错误”这个问题是需要我们熟练掌握语法,当我们熟练后编译错误就会变少但是还要注意一些小细节,比如有没有漏掉分号或者半边花括号。当肉眼无法看出什么编译错误时我们还可以通过eclipse进行调试。

4.当所有编译上的错误没有了但出现“答案错误”时我们就该思考是不是我们的算法出现了错误从而导致无法正确的输出答案,这时我们可以将代码复制到eclipse或者其他的能调试的软件中。通过设置断点,一步步的运行代码查看关键数据的值是否是预期的值,如果没有预期值我们就可以考虑这块附近的代码逻辑出现了什么问题,修改逻辑漏洞便可以一步步调出正确答案

在算法方面的踩坑心得:

上面这张是第一次琢磨出来的可运行的结果,但是明显可以看到实际结果与预期结果相差甚远。当外部或者内部请求没有时,电梯将不会走完剩下的请求,所以实际答案与预期答案不符。经过一段时间的调试后发现我是因为getNextFloor方法中没有处理剩下队列,所以我又加上了几个条件语句去判断当内部或外部队列为空时getNextFloor应该返回什么值。修正过后的运行结果如下图

经过调试后可以发现电梯无法在最后一层开关门,但是由于技术有限无法找出错误的原因。所以我的一个小建议是各位在设计算法之前可以先画一个流程图,具体分析一下代码的流程设计,弄清楚应该怎么设计类才合理,弄清楚算法逻辑一步步拆分才可能写出代码。

四、改进建议

1.最大的建议就是多练!!!勤能补拙,我这次无法做出电梯题的主要问题就是我不能设计出正确的流程,导致我的答案一直显示错误,而根本原因便是我没有多多训练这种算法困难的题目,没有想着去强化这方面的能力。所以在今后的学习中我会更加勤奋,不再被动学习而是主动自己去学习,编程是需要努力的一门学科,我更应该去努力学习。争取在下一次的迭代训练中拿到满分。

2.及时跟进网课的学习,第五到七次的题目及中都参杂着正则表达式的运用,而网课也有开放这一部分,所以我们需要及时去看网课提前学习才不会被落下

3.减少无用的if-else语句,有些时候写出的第一遍代码充满了if-else语句所以代码的重复性高,变得十分复杂,而且嵌套的层数越多越容易出错,我以后可以通过设置方法的办法减少条件语句的使用,这样既简化了代码也利于后续的修改。

4.建议深入学习正则表达式,现在的输入都不在是单纯的字符串或整形数组,所以我还需要学习更多正则表达式的使用,这样才能设计出更符合实际需求的代码,这也为之后的成长做了铺垫。

5.应该养成适当增加注释的习惯,在前几次的代码分析后都存在这个问题,所以在日后的题目中我会适当增加注释既有利于自己修改代码,也方便他人的阅读。

五、总结

1.三次题目集带给我最深的感触就是编程是需要不断训练才能有结果的一门学问,我们是不能自己糊弄自己的。虽然这次写电梯题目时真的很疲倦,但是我也学到了许多东西,知道了正则表达式的简单使用,知道了LinkedList的使用,也不再局限于静态数组了。在pta开放的评论区中也可以通过交流不断修改错误,这也一定程度上提升了我的编译能力。
2.在调试代码的过程中,我也积累了不少经验。以前遇到错误常常不知所措,现在学会了利用调试工具,一步步排查问题。通过分析报错信息、设置断点观察变量值的变化等方式,能够更高效地定位和解决问题。这一能力的提升,让我面对复杂程序时更有信心。
3.此外,通过这几次题目集的练习,我愈发认识到代码规范的重要性。从变量命名到代码结构的布局,规范的代码不仅便于自己日后回顾和修改,也能让他人更轻松地理解代码逻辑。在团队合作编程中,规范的代码更是协作顺畅进行的基石。我会在后续学习和实践中,更加注重代码规范,严格要求自己。
4.在学到了新知识的同时我还找到了新的迷惑点,所以在接下来的时间里我会进一步学习如何灵活使用正则表达式,而不是局限于识别数字的单一组合了。我还将进一步研究LOOK算法,争取在课后时间完善之前的电梯程序。在老师的指导下我学习到了许多关于java的新知识,我也十分满意现在的教学模式,希望在下一阶段的学习中我的代码能力能够提升一大步!

posted on 2025-04-19 21:57  ttu+  阅读(39)  评论(0)    收藏  举报