标签:++ 运算 注释 日期 logs 间隔 image main 继承
这次题目集比前三次题目集难度明显提升了很多,获得的分数也少了很多,甚至有一次不及格。幸亏后面老师降低了难度,不然我就要直接挂了……
题量上虽然后面可能会多一些,但这也是为了我们能够更多的受到训练,也在承受范围之内。
这次三个题目集主要是考察我们对于聚合,继承及多态的理解与操作,第六次题目集还考察了接口的使用方法,及正则表达式的运用,在训练中我也学到了很多。
这两道题目的聚合设计,在我看来其实是各有优劣的。
7-2中的聚合,结构清晰,在功能类里使用的方法较少,更容易让人理清。但同时,它的缺点也很明显,功能类无法直接调用每一个类,想要调用一个类需要先调用上一个类,多了很多不必要的麻烦。
分析圈复杂度发现在功能类及main类中的复杂度较高
检查后发现有较多的连环判断,结构和下图类似,每段判断都相似,若是能够用同一语句代替(this == date)便可降低(只是猜想,并未实现)。
从上图也可以很明显的看出来,若想在功能类里调用所有变量,需要层层调用,非常的麻烦。生成的类图也与给出的类图一致,类结构设计无问题。
7-2这种类型的聚合虽然看起来简单明了,能将月日年的各种判断在各自的类中直接完成,但是调用起来十分繁杂,需要一层层的进行调用,实际上是降低了程序运行的效率。
而7-4的聚合设计虽然在功能类中多了很多方法,但是他可以直接对月日年进行引用,更加方便
类图与题目给出的类图基本一致,从圈复杂度来看聚合二中的复杂度要更低一些,说明聚合二的效率要更高。总体来说,还是聚合二的结构更加合理,效率也更高。
封装的好处很多,我就不再赘述了,现在在设计类的时候每个属性就会直接设为私有。
这三道题题目各有要求,因此类的设计各有不同,但也各有好处。
7-3与7-5均使用了继承,我最直观的感受就是简洁,从7-3的圈复杂度中就可以看出来
在7-5中含有排序的方法,并且在设计程序的时候并未将该方法使用位置处理好导致复杂度略高,但整体的类间关系符合要求,并且可以感受到继承重构带来的方便。
7-3中的继承由于多了体积的计算,因此多了一层,但是每次继承都能让我清晰的感受到复用的好处,不用重复的定义同样的方法,一个@Override就可以解决这些。
而在7-6中使用到的接口,本质上我感觉和继承相差不大,但是要省去Override这一过程,在调用的时候会更加方便快捷。
我在这三次题目集中主要在题目集6中使用了正则表达式,都是非常简单的使用。但在字符判定方面确实非常的方便且实用,只用通过一串语句便可以将字符串每一位都判断到,可以完美降低全复杂度,使代码更加的简洁。
需要注意的是,使用正则表达式匹配特殊字符本身的时候,一定要记得加上反斜杠 “ \ ”,另外需要灵活使用“通配符”,但排除范围内字符的话需要使用[ ]进行匹配,同样的方便,且更加灵活。
总的来说,在处理字符串的时候尽量多使用正则表达式,也要灵活的处理,可以提高程序的运行效率。
对于关键字的提取与出现次数的计算,使用正则表达式可以很灵活的处理。
输入的代码首先肯定是要根据空格、括号等符号进行划分,使用list进行操作。不过list是按对象存入的顺序保存对象,不做排序和编辑操作,因此后期需要对关键字次数另行计算与排序。
由于关键字、非关键字、注释等处理方式都不同,因此可以根据这三类来设计类。
另外处理注释的时候,\\起到了主要作用,因此需要先对注释进行处理后再进行其他字符的处理。
题目集4虽然看起来只有三道题,但是难度却是不容小觑的,尤其是第一道题——水文数据校验及处理 。这道题题目又长又唬人,很容易就会被吓到(当然我确实是被吓到了)导致对后面的题目丧失信心,但是仔细看后面的题目又会发现其实后面题目集反而相对简单一些,稍微花一些时间就能研究出来。
这道题在写的时候出现了很多奇奇怪怪的bug,最后检查出来有的错误还是十分低级的那种。
一开始输出时日期真的是非常离谱,经过检查之后才发现是一个很低级的错误
经过调试之后才发现是循环出错,要是想下图中一直n++的话也不知道什么时候才能结束,这样程序也能运行是我没想到的。
将n++改为i++后程序能够成功的运行,这次数字就正常多了,但是还是有很大的问题。
经过几次调试,在解决了程序里面的算法错误以及一个很弱智的年份与日期输入相反的错误后程序终于能够正常的运行了。
不过两日期间隔天数我一直是没法成功执行,每次都会错上那么几天
直到题目集结束我还没有解决,还是在问了同学之后才成功的将间隔测出来,果然,有时候不能一个人在那死磕
解决后的方法代码:(改进建议)
public int getDaysofDates(DateUtil date) { int sum = 0; while(this.equalTwoDays(date) != true) { if(this.compareDates(date) == true) { date.getDay().dayIncrement(); sum ++; }else { date.getDay().dayReduction(); sum ++; } } return sum; }
题目集5相比上一个题目集要简单许多,虽说多了两道题目,但前三道挺简单的。坑我最多的还是日期计算。
除去在上个题目集中犯的低级错误,这道题目最让人头疼的是程序的运行效率。
如果仅仅使用单次日期加减的方法进行运算,计算前后n天时,在面对整型数最大最小值的时候会运行超时。
改进建议:添加循环,减少计算次数
这里我使用的方法是天数大于四年的时候直接减去四年的时间,并且将年份直接移动四年,但在闰年的判断上面仍存在问题,导致最后天数会相差很多。
可以在这段闰年判断上进一步考虑,细化各种情况。
题目集6有很多正则表达式的判断问题,其中在学号校验中一开始虽然通过了所有测试点,但题目中给出的测试样例并未通过,经过深入学习后,将并列校验再加上括号便可成功解决。
这道题一开始并没有把排序优先考虑,只想着后来再对所有数据进行处理,但是在整体结构编写完成后才发现三个图形循环产生的数据,无法在最后一起处理,因此在每个数据计算后便储存进数组。
又由于我是在循环中输入数据,而不是在一开始便输入的,因此判断数据合法性的时候又无比的麻烦。且部分数组界限无比混乱,所有图形属性非法输入的判断都无法通过。
这道题从一开始的设计就出现了错误,导致主函数的逻辑一塌糊涂,到现在都很难理清楚。
改进建议:将排序、输入图形的处理另外新建一个类,单独进行操作,减少混乱逻辑的产生。
通过这几次的题目集,我对于类的继承设计有了进一步的了解,体会到了代码高效使用的好处,在今后的学习中我将进一步灵活运用学习到的技术,改进自己类的设计,增加代码复用性,提高代码的使用以及程序运行效率。
同时我发现在程序中使用正则表达式能够使我更加高效的对代码进行处理,还可以降低代码中的圈复杂度,减少判断语句的使用,是代码更加简洁,在今后程序设计中应多加使用。
另外,我认识到自己还存在许多的不足,经常在题目集结束之后才找到解决错误的方法,还需提高自己的学习效率,以及加强与老师同学的沟通,我也意识到了有时候一个人的力量是有限的,与人沟通的时候往往能够拓宽思路,找到新的解决方案。
希望在今后的学习中,我能够灵活处理遇到的问题,改掉自己许多的小毛病,让自己的学识更进一步。
标签:++ 运算 注释 日期 logs 间隔 image main 继承
原文地址:https://www.cnblogs.com/kynan/p/14707455.html