面向对象课程第一阶段作业总结

面向对象课程第一阶段作业总结

目录
1.前言
2.设计与分析
3.踩坑心得
4.改进建议
5.总结

正文
1.前言
本阶段的pta实验作业主要是考察我们对类与对象创造的理解,以及面向对象三大关系当中的组合和聚合,主要的体现就是在创建内置时必须单独为一个封装类进行使用,不能在全部写在一个main函数当中,总体调用体现了工程的分装思想,分布思想,帮助我们逐步理解了面向对象的原则以及感受其可能带来的好处,此外,在设计电梯题时体现了迭代思想,这更加符合现代工程设计当中的主流方法,避免重复造轮子,是提高工程效率最重要的方法,当然,在答题电梯类迭代题时,会出现使用look算法这一类需要从现实生活中总结出来的算法,并且按照计算机逻辑书写代码的情况,这也是对我们程序设计代码能力的进一次提高,在这几次的题目设计中,三道题为主要考察一次增加难度,一次增加理解分别不同的题目放在不同的情景下进行书写,在所有题目中,电梯题因为涉及复杂的算法理解和算法书写难度最大也最重要,三次的迭代,第一次是最为困难的,因为在完全不理解电梯的运行规律的情况下,开始学习书写以及理解题目含义需要耗费大量的时间,这大大的锻炼我们的逻辑思考能力,而后两次电梯的迭代中,告诉我们要将算法当中的步骤按更小的模块依次分析,这样才方便在类的调整中重新改写方法之间的调用关系,而不会揉成一团,需要重新书写的情况出现,可以看出,这是一次很好的对软件工程的工程开发当的初步理解,有个很好的示范作用和引导作用。

2.设计与分析
Week 1:
7-1:第一题在第一次提交时忘记考虑了,身份证最后一位x输入时是大写,而不是小写,从而第一次错误;
7-2:题目简单过;
7-3:题目简单过,但要注意输入的字符和后续使用的字符名字的一致性;
7-4:注意if结构本身含有顺序,在同级的条件下最好写在一个if语句中
7-5:电梯题目的第一次出现:
先读题目:

不难看出本题最大的一个难点就是理解题目要求的运行规则。不同于日常坐电梯时,多部电梯同时调度,当一部电梯调动时,它的方法和结构有很多种可能。题目要求的方法与我们习惯认为的方法不同,从而产生较大的误差。题目中理解出来的要点是,当同方向时,优先同方向当距离近时,优先距离近,也就是说电梯的运行并不取决于楼梯之间的远近,而是更专注于上行和下行的延续性
此外,内部和外部需要分别存于不同的两个空间,这对在读取数据时产生了非常大的调用难度。同时,因为外部有,数字和字符同时存在,所以我们需要在处理字符后再能对数字进行处理,这非常考验在设计程序时逻辑的连续性和逻辑的完整性,有可能一个地方的缺失就可能导致后面全部重写
随后便是本题最大的难度点look算法的重现和实现,不同于其他算法,这个算法需要我们在题目中理解后自己写出,自己退出,所以我们需要非常锻炼我们的逻辑思维能力,我的想法是用大量的if语句,讲要到楼层设为两列,每列列头在调用,到时同时对比,对比出符合运行方向,同时距离最近的优先到达,并每一层设计一个桥变量来对比。当前变量是否满足目标变量,从而达到效果,但因为在预付中中需要镶嵌非常多的方向判断,以及楼梯层数判断以及相同情况下的情况如何,所以重写了大量次数过后才能勉强实现,通过测试点,不能猜出我的代码逻辑性中其实依旧存在巨大的问题,复盘我的思路当中,我首先判断了是否方向为同一方向上行还是下行,随后再对比两个桥头。在此过程中的距离大小如果小于则怎么样?如果大于则怎么样?如果等于则优先运行内部方向,那么,这时又产生了一个问题,如何正确高效的移除已经使用了的念头?如果没有使用的念头,它是应该放到最后面,还是应该继续维持验证?下一个对比,所以要要在未使用的念头继续使用的话,就必须在保存为现在的链条和下一个链条进行对比,这其中又产生了大量的if语句,所以在最后一次重写时,我选择将每一层楼都进行一次if对比,从而在if语句中减少循环和嵌套的次数,达到想要的效果,这样会浪费大量的空间,复杂度和时间复杂度,但是好在最后实现了效果。

下面是代码分析
第一步,创造接收对象,并用正则表达式进行接收

第二步,书写移动的主要方法,先不写它的规则,达到一个框架效果

第三步,根据框架的思路去书写具体的移动法则就是look算法

分析第三步,第三步的是否停留下中,设置了很多if的循环来判断是否为目标楼层,同时是否应该加入链表或者退出链表,产生了大量的无用空间,同时,在开门,关门以及是否加入,是否进入,是否停下,是否设为目标函数之间的逻辑关系,非常的杂乱,所以为第二次的书写时留下了很大的麻烦以及隐患,在完成后回头看第一次的代码,明显的感觉到了第一次书写时思路的混乱以及浮躁,这更体现了框架的重要性。
下面是完成后的sm图:

week 2:
7-1:
这是第一道让我们要求设计两个类来实现聚合关系的题,这道题是对类分类使用的第一次实现,是为后面两道题逐步加大难度,的一个先导和预习,难度并不大,但是在书写时,因为忽略了,判断条件中的一个数值,所以在多次尝试无果后,才重新仔细读题,发现了问题,就看出来越简单的题,越需要细致出题

7-2:
这是对网课上例题的重新实现以及重新分析,检测了我们在网课的学习是否达标,是一道很有代表性的中等题,锻炼了,我们在设计类之间调用时的能力,而不是老师给出我们流程图,我们一个个书写,我在书写时就遇到了最小类和中间类调用时产生错误的问题,后来发现在书写中最大的类当中也要书写调用的小类,才能调用全部的类达到了效果
同时也了解了在对象调用方法时,可以同时调用两个方法,只需要通过两个顿号逗开即可。

7-3:
第三题是难度最大的题,也是对上一次书写的电梯运行的分类调试的迭代,这一次让我充分体现了在书写程序时方法分类和方法细化的好处,因为第一次所有的方法集中在一个程序当中,所以这次分步调开时产生了很多问题,调用与调用之间的错误以及调用过后答案出现错误等原因,让我十分头疼。
首先要解决就是非零返回的问题:

在整装的代码无法实现后,我只能强行将我的大块代码拆分为不同的小块,最开始想到的是将它拆分为三个部分,一个部分是,程序运行的楼层的加减,第二个部分则是调动算法时是否判断达到目标楼层第三个部分是设置目目标楼层但在调用后发现并不解决问题,楼层与楼层之间的调用需要很多的删除与插入,如果太过集中的话,在楼层的上下之时,会调用这个删除与传入,同时在设置目标楼层时,也可能会调用,所以两个方法非常的冲突,所以只能再次更细化拆分,基于上述的原因,所以我将删除和传入,重新写成了两个方法,放在了当中,五个方法进行调用,这个时候又发现了上行和下行调用的时候不同,所以经验告诉我,我要将它再次拆分为上行和下行,以及为了防止上行和下行目标楼层设定的不同,我将目标楼层设定也分为了上行和下行的设定,同时加上了转换上行下行的方法,在这种设计过后,最终非零回返回的问题总让我解决了。

但此次提交后发现了一个新的问题,就是我的运行超时了,可能是使用了太多if语句,所以我必须将很多if语句的循环给去掉,从而保证我的运行时间进行降低,所以我觉得应该将我的方法中的if分为不同的方法,再次进行分支,来删去重复使用的if判断相同情况的时候,此外,我将我的link list函数设置为了三个来方便最外层的读入,最外层方向,我将它设为了1和-1,减少了一定的空间,1到-1的判断也提高了时间的反应的效率,以及将所有的push函数换为1和-1来减少定义的时,所要花的时间
下面是各个方法的大体作用;

在改写过程中,不仅理清了之前在一个方法中,产生了大量误解以及冲突,比起第一次的众多测试点当中,这次分开写过后能过掉更多的测试点,提高了代码的可读性,也提高代码运行的正确性,这是非常好的正面消息,这也提醒了我以后在书写中首先要做的是设计方法和方法之间的框架,而不是直接将所有的写在一个函数中,以为节约了时间,实际上非常消耗耐心,不如最开始就先将框架打好。

下面给出SourceMontor的生成报表内容

week 3:
7-1:
这道题较为简单,最主要的问题就是如何在main对象当中调用order对象时,我以选择另外的三个分类选择达到统一的效果,这里就体现了依赖关系当中的可以直接调用的原则了,只需要在有关联的函数当中提前写好调用它的步骤含有或者含有调用它的方法即可.
反复过不了的原因也主要是在判断语句当中缺少了上限的判断。
下面给出SourceMontor的生成报表内容

7-2:
这道题主要考察现场学习的能力,是一道数字建模的原题,在学习了这种计算方法过后,我想到了将其设为一个聚合的方式来进行书写,这个时候我们就要重视一个关联关系的书写了,我想要写一个圆心的坐标和一个矩形的点坐标,从而推出呃圆和矩形的面积,再通过对比得到它们的比例,最后得到数值。蒙特卡罗计算圆周率的本质就是随机投点,通过大量投点来算出比例,所以我们需要的是要判断一个圆,它的圆心和半径就非常的重要。同时,统计方法当中,在类与类之间的调用时,将主函数的计算方法呃放到main方法当中才能实现。我在MonteCarloSimulation类中设置了判断矩形长度是否大于零,同时是否为正方形的函数,不是的话则返回wrongforward,然后设置了设置两点之间距离的函数,方便计算,同时使用random随机生成点位达到头点的效果。
综上所述,本题方便我们学习理解组合关系。
下面是类图:

7-3:
第三次迭代时,要将所有存入信息放在一个passenger的封闭类当中,同时输入方法也从之前的五楼down变成了五楼到七楼,这样子具体有目的的方向,具体的修改就是要将乘客类来代替请求类,乘客类,所以需要将请求类当中的list函数给接入,同时因为乘客类有三个不同的变量,所以请求类当中原本没有后续的墓地,楼层也需要重新加入墓地,楼层增多了,更多的添加和删除的步骤同时排序顺序也需要进行改变。

那接下来我们第一步就是创造一个封闭的passenger内,并在中创建list函数存储三个数据,为了方便数据的传入和整合,以及最后排序,我将两种不同的传入方式设置为了一种,如果当没有第二个数值传入时,它就是内层顺序,如果有第二个数值传入时,它就是外层顺序。同时,同时,我在python简类当中加入了方向判断的方法,方便后续直接调用它,来吻合之前写的用方向来判断顺序的步骤。

随后便是调整Ctrl对象当中要对末值进行改变以及排序的重新组合,同样的,首先对比链头的两个数值的大小以及方向的判断,随后在相对应的使用后删除,另一个则存入链条尾部,除此之外,当外部链条被调用时,它的末链条也需要被立刻传入到相应位置,不能直接传入链尾。如果直接传入链尾的话,则无法达到相对应的目的,在头几次的实验中,我就忽略了这个问题,从而得到数据总是错误的,在头几次的实验中,我就忽略了这个问题,从而得到数据总是错误的,以及在楼层移动函数中打印显示,楼层时一定要和已经调用的目标楼层相区分不然会打印两个重复的楼层。此后,我便可以通过第一个测试用例以及两个测试点。

纠结于困惑:
此后,我便可以通过第一个测试用例以及两个测试点,但当调试到第二个测试用例时,发现了巨大的问题,我的述职在对比相同的内部和外部还数数值时,如果相同外部的数值会全部存入到最外层,而在此时按距离最近原则考虑应该是内部执行过后直接去执行外部的最佳楼层,相当于是内外部同时执行了,但是在以前的函数当中并没有这种情况,所以必须重新书写,但是在书写当中我单链条的设置并不方便在链条中直接插入一个数字,因为不好判断它的位置和大小,如果需要判断大小,则需要遍历整个链条,时间又超时了如果直接插入队尾,则会出现又再次使用内部这个数值的问题,让整个后续的排序出现问题但是如果遵循最近原则,调整过后则会又出现测试第一个用例过不了的情况虽然测试点又多过了一个,但是第一个测试点估计是结合两种测试用例的情况,同时出现的这便是我对此题的困惑与理解之处,当最近楼层时,我不知道如何选择插入以及重新计算,在多次尝试过后,我想到了最低版时使用的双链条方案。双链条可以对比过后直接进行使用,就只需改掉在相同情况下的方法即可但是在第二次迭代时,已经将双链条改为了单链条,如果需要重新设计,则需要全部推倒重写为了通过测试,所以我选择全部重写,但是在重写后发现第一个测试用例依旧过不了,同时第一个测试点也始终过不去,仔细分析问题,并没有能找出合理的解释,询问同学后,他们的书写方式与判断方式跟我大致相同,但是最终在逻辑方面出现的一些困点,可能让我始终无法过掉这个测试的点,在此次,复盘总结时,我突然想到了,如果当两个链头出现相同情况下,直接同时运行它们,而不使用双链条则会有相同的效果,同时也不会打乱后续的顺序,十分开心,但是虽然已经过了时间,可能当时实在是太纠结于链条的单条还是双条,而忽略了方法本身在调用时数据对比的问题所以适当的总结和反非常有助于当我们陷入某个牛角尖时,跳出原本局限的思维当中。

下面是我的复杂图

3.踩坑心得
这次实验的确踩了很多坑,大部分的坑已经写在了前面测试用例的分析当中,但我觉得总结下来,最大的两个问题,一个是读题时思路的细节的把握,还有一个就是提前对不同方法框架的设定的重要性,这是相当重要的,不然就像会像我一样写很多遍,所以当下次遇到问题时,首先想到的应该是,努力的先挂好框架,然后再进行代码写写取。正如老师说的,写代码是最基础的框架设计,才是学习面向对象编程的核心。

4.改进与建议
希望老师们可以设立更多的中等题目,供同学们强化面向对象的思维,思想这种东西非常难以理解,需要大量的题目给予支撑,才能达到最终的练习目的,达到最佳的效果。

5.总结
写到这里的时候,已经写了5747个字了,但是还有很多话没有说出来,我觉得整个pta第一次阶段的过程,除了让我对JAVA和面向对象这门技术有了初步的了解以外,更重要的是不断锻炼了我们的耐心,正如老师说的,普通人和大师之间的距离不是天赋,是不断的练习以及时间,正所谓唯所属耳,只有沉下心来,更多的思考,更多的练习,不断的思考,不断的记忆复盘,才会有更深刻的理解,才会有大脑,才会有更清晰的思路希望在下一部分的pta能够静下心来思考更多更多的细节,而不是盲目的只是为了过了测试用例而不断的自我否定自我烦躁学习就是一个枯燥且乏味的过程,希望我能坚持下来,在面向对象这门可以在未来大有作为的科目上取得良好成绩,并且为未来的工作打下良好的基础,毕竟软件工程最重要的思维就是汇总和框架思维而而不是只会简单的雷代码,好了,这就是我的第一次总结,谢谢。

posted @ 2025-04-20 10:57  尉普  阅读(62)  评论(0)    收藏  举报