第一次oo博客
一、前言(总结前三次作业情况)
第一次作业(题目集1):
此次作业主要考察的是对输入数据边界以及对输入数据的功能性的判断以及熟悉java相关语法。题量适中,难度比较低。
第二次作业(题目集2):
此次作业主要考察字符串的相关操作,java中方法的创建和使用,基本排序算法和计算日期的算法,如闰年判断,以及对输入的日期合法性进行判定。题量适中,难度有一定提升但还在可接受范围内。
第三次作业(题目集3):
此次作业主要考察java面向对象中类的创建及使用,以及如何运用正则表达式对输入内容进行校验同时对字符串进行必要操作。题量偏少但难度较大,因为此前没有接触过正则表达式所以很懵,虽然学习了相关内容,但是对题目没有思路,最后没能完成任务。
二、设计与分析:
第一次作业中以7-8为例:
从分析图中可以看出代码最大复杂度为12,因为代码中运用了大量的if-else结构来判断输入数据的合法行以及对应三角形类型。判断过程比较复杂,但是思路还是比较清晰。通过后续与同学交流发现可以在判断数据前先对输入的三角形的三边进行排序,使得后续的判断过程中避免因为三边关系未知而导致每次判断都要将三边分别考虑如:else if((a==b&&(Math.abs(e)<0.1))||(a==c&&(Math.abs(d)<0.1))||(c==b&&(Math.abs(f)<0.1))),从而使得代码更简洁。
类图:

由于题目较为简单同时还为接触类的构建,所以此处只有一个主类。
第二次作业:
7-4:

可以看出此次代码的复杂度更高为25,分析原因由于对输入的日期的合法性需要做出判断包括边界判定以及日期合法性。其中边界判断较为简单只需满足输入日期在题目所给范围内即可,但日期合法性的判断稍稍复杂,主要问题在于根据年月份以及平、闰年的不同各月份的合法天数也有所变化。所以此功能运用了大量if-else语句进行判断,同样在进行日期计算时也需考虑到上述因素,所以代码复杂度较高。但是整体的代码思路还是比较清晰。
类图:

按照题目要求在主类中创建相应子方法来及实现相应功能。
7-5:

从图中可看出复杂度又有了飞跃高达44,不难看出代码较为冗杂。分析原因,同7-4一样需要对日期进行判断,在判断平、闰年以及日期是否有效的功能与7-4基本一致,但是因为添加了计算日期的前或后的n天,所以还要考虑到日期具有跨越性(包括天,月份,甚至年份),所以对日期的判断要求更高,以至于添加了大量的if-else语句,将复杂度大幅提高,此时反思,应尝试使用switch语句替换if-else语句,降低复杂度。
类图:

同7-4,类图虽然功能较为复杂但整体结构还是比较简单。
第三次作业:
7-2:

次题目是在上次作业的基础上进一步迭代,以面向对象的方式来实现功能。由于只是在整体结构上产生变化功能没有发生改变,所以此次作业套用了上次作业中的代码,复杂度也解百纳没有发生改变。
类图:
按照面向对象的思想,在主类中创建日期类的对象,然后通过调用对象类中的方法进而实现对应功能。
7-3:

和类图一起分析吧(完成度很低)。
类图:

很惭愧,这是目前为止做的最差的一道题,因为根本没有完成任何需求,只是碰巧对了两个测试点,在正则判断和求导两大方面均没有实质性进展,面对题目没有一个完整的思路,所以代码很简短复杂度很低以及无法体现完整的结构(因为没有实现)。
三、踩坑心得
第一次作业(7-8):在判断三角形成立的条件中错把两边之和大于第三边写为两边之和大于等于第三边从而出现报错点,此外没有考虑到特定三角形测试数据的特殊性,如在测试是否为等腰直角三角形时。三角形三边应满足1:1:√2,但实际上根号二在测试数据中只能体现为一个存在精度范围的浮点数,所以为满足两边(两直角边)的平方和等于第三边(斜边)的平方,在此题中应采用两边的平方之和与第三边的平方之差的绝对值小于0.0001(以此精度值为例)。
第二次作业:
7-4、7-5,因为二者处理的问题相近所以一起分析。首先是平、闰年的二月份,因为事先考虑到其特殊性所以并没有在此花费很多时间。但是在7-5中忽略了一个问题,存在类似八月份的“特殊月份”,因为七月为31天所以在八月中的前n天要考虑到月份天数的变化。
例:
输入:2018 8 5 5
输出:5 days ago is:2018-7-31
第三次作业:
7-2:开始没有注意到边界范围以及输出格式的变化,在对象类中照搬了前一次作业的代码使得在pta提交代码的时候出现大面积报错,在排查过后最终发现了问题。以后再读题方面还要更细心,搞清楚需求再下手。
7-3:在用正则表达式进行输入校验以及对字符串处理方面暴露出很大问题,没能学会运用正则表达式以及对字符串处理的方法以及没有清晰的解题思路导致没能完成任务。
四、改进建议
第一次作业(7-8)应才用先对三边进行预排序,从而简化后续判断中的语句,让代码更简洁。同时还可以采用面向对象的思想,将子方法归集与一个关于判断三角形的类中,从而可以使代码耦合度进一步降低。此外也可以通过对在三角形进行迭代使其功能更加齐全进而实现其可持续性发展。
第二次作业:
7-4、7-5:此类题需要对日期进行很多判断,所以需要大量判断语句,采用if-else结构会使代码复杂度大幅增加,应将部分替换为switch语句从而降低复杂度。同样也可以创建日期类,将相关方法套用到日期类中,与主类分离,在实现功能时通过主类创建对象,进而调用日期类中的方法,从而降低代码耦合度。通过对日期类的迭代也同样可以实现代码的可持续性发展。
第三次作业:
7-2:在日期计算方面还需进一步调整计算的思路简化代码。
7-3:抓紧时间学习正则表达式以及字符串的处理,理清如何进行类似求导的操作。
除针对三次作业外,我也发现我现阶段的代码书写格式还不够规范,所以在加强代码逻辑的学习的同时也要开始注意代码的书写规范。
五、总结
纵观三次作业,第一次作业可以说的上是非常简单,只是对java一些基本的语法和算法的考察,并没有对逻辑思维能力有很高要求,主要是帮助同学们熟悉相关语法。其实不难发现java和C语言有很多相通的地方,大部分语法使用方式都相同,只不过在数组等一些地方有变化。还有就是接触java后会发现java中并没有直接使用类似C语言指针的操作,这在一定程度上降低学习的难度。在第二次作业中,主要是针对日期的一些计算,一方面考察了我们对题目需求以及合法性判断的严谨程度,另一方面也进一步对代码逻辑有了更高要求。同时不难发现题目中反复出现对输入数据的合法性判断为后续题目集中的正则表达式做了铺垫,第三次作业中就体现出其重要性。第三次中的前两题是针对java中面向对象的练习。区别于曾经学过的C语言,对象所在类中的变量属性均为私有,需要通过创建对象的方式从而调用其方法,可以将其抽象理解为一个加强版的C语言结构体,通过这种操作可以在不同程度上降低代码中各部分的耦合度,促进代码的可持续发展。而第三题则是一个没有接触过的领域——正则表达。通过自学大概知道它可以用来判断输入是否合法进而按照需求进行相关操作,这也是这次题目所考察的地方。但是通过一段时间学习我并没有弄懂它如何操作,只是了解了一点基础语法,不能写出具有完整逻辑的判断语句,这也导致我在测试中没有通过。此外,我对如何对表达式进行求导操作也没有清晰的思路,这表明我的逻辑思维能力有待提高,这也是我需要学习和加强的地方。
总的来说通过前三次习题集,在一定程度上暴露出我的编程能力存在很大欠缺,不仅是逻辑思维方面同样也包括代码规范,学习主动性,以及学习效率等方面。我需要提高对java学习的重视程度不能以所学过C语言的目光看待它。同时就效率方面而说,我也应该及时与同学沟通交流,而不是一个人没有目的的学习,浪费了大量的时间在查找资料和研究代码上,最终也没能够弄懂。此外老师也反复强调这门学科对今后我们的职业发展的重要性以及它的困难程度之大,通过题目集三的挫败,我也清楚的认识到自身的不足,所以我需要将更多的时间分配在这门学科。
对这门课程的建议:老师的教学风格以及教学模式都是经过多年打磨出来的,我非常认同,虽然有的时候不太能跟得上,但是我还是非常适应这种教学模式,紧凑的学习更能激发学习的动力。因此我对这门课程暂时没有更好的建议。或许在今后的学习过程中会有一些新的想法。
浙公网安备 33010602011771号