OOP四月学习心得-20201410-胡健平

Posted on 2021-04-27 20:35  tomehay  阅读(76)  评论(0)    收藏  举报

一、前言

  在四月的OOP课程学习当中,完成了三次的题目集,及两次实验,还有一些老师要求完成课下练习,在这个月的学习当中,宽泛一点说是主要学习了类的使用,而精确点来说是学习了类的继承、聚合、如何使用正则表达式来校验数据,及练习了一些的接口知识。

    简单总结下第四次作业,第四次题目集中的题目量极小,但限定时间也为一周,一开始就暗示本次作业集的难度,第一题较难,而第二第三题难度一般,所用到的知识主要是正则表达式的应用及类的继承还有类的多态,可虽然第二第三题难度不高。

    再来说说第五次的题目集, 相较于前两次的题目集,第六次题目集的难度较低,但题目量相应的增加了一些,而第四题也需应用到正则表达式(在本次题目集中本题难度最高),其他题目主要是考察到了数组相关知识的应用,比如说排序,数组内部求长度最大值元素及合并有序数组。

    最后的题目集六,个人看来题目集六并无难度,也许是制定课程安排的老师们特意设计着在前几次难度较大的习题集后面布置这样一份简单的题目集以安抚学生的心情,让学生保持对java学习的积极性。回归正题,本次的题目集主要是对于正则表达式的练习和对于类的使用的巩固,还有引出接口的使用。

二、设计与讨论

  (一)题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣比较:

    题目集4中的有关时间和日期的编程题是类与类之间的关系是一个类与一个类层层递进的关系,这种关系只需在主函数中调用Dateutil类即可,并且在这种方法中,代码简单,只需调用方法即可,算得上是一种十分简便的方法。但是从给出的代码运行时间限制来看,很明显,这种方法运行时长很长 ,因为每一次调用方法时或是让天数加一减一都要进行一次运算,平均下来计算机需进行1000+次运算。

    而题目集5中的有关时间和日期的编程题是类与类之间的关系并不是层层递进的关系,在这种情况下,本人采取了先年再月最后日的算法,这样虽然是可以大大降低计算机的运算次数,但是,这样写下来,判断条件过多,思路稍微错误就会导致输出结果的错误,在循环中寻找错误是非常复杂的(可能是闰年错误,可能是百年不闰的问题),这些种种累计在一起就导致调试变得十分困难,我的代码便是这样,调试十分困难,最后还是试了骗测试点的方法才将这题的40分悉数取得。以下附使用SourceDesigner生成的报表内容

 

 

 

   (二)题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)

 

     题目集4中的7-3是这一系列题目的基础,以下三道题题目都是在7-3得到基础上进行改良,应用新的知识点上得到的。所实话在个人的看法中,题目集6中的7-6是最简单的一道题目,既使它的分数是题目集4中的两倍,只需定义矩形类和圆类即可,抽象类的接口定义与调用也简单。而7-5相对来说复杂一些,需要使用到对象数组及排序方法。总结下封装、继承、多态、接口等方法的作用吧,在我目前看来,最为实用的方法是继承方法,不用额外定义原来已经定义过的变量。而封装方法,限于目前的编程水平,并未很明白的了解到封装的必要性和优点,多态则是指一类事物的多种形态,在把动物放进电器的课下联练习中体会到了作用,接口方法接触也并不是很多暂不冒昧评价。

   (三)对三次题目集中用到的正则表达式技术的分析总结

     在这几次的习题集中真切的体会到了正则表达式的妙用,正则表达式需要一定时间的学习,不可直接使用,但是这段学习时间是必要且回报无穷的,在进行判断中,就拿水文数据那题举例,不考虑数据类型的前提下,如果使用if else判定语句的话判定条件的编写就相对来说显得复杂不少,而在题目集6的许多判定中,通过自己书写正则表达式掌握了关于正则表达式的基本语法,在以后的日子中会更加注重对正则表达式的学习,加强自己对于正则表达式的应用。

   (四)题目集5(7-4)中Java集合框架应用的分析总结

     在7-4的关键字统计之中,主要应用到的知识点是流的使用和使用正则表达式切割字符串的应用,及字符串的拼接,还有ArrayList 的排序应用,在思考无果后寻求网络思路,在CSDN看见博主Chen大强的方法,感叹于方法的精妙,但是不敢依照他的方法写下去,因为这种方法以前并未很多的使用过,所以就没有将7-4代码全部完成,但是再截止之后也继续关注了这道题,询问了已经把在这道题解决了的同学他们的解题思路,大概掌握了本题的解决方法。

 

三、踩坑心得  

  题目集四:

    ①7-1的水文数据的校验及处理,本题需输入多段由终止符分割的字符串,并将他们合并校验及处理,在一开始,我对输入方式思考错误,一开始我在探求一种输入方式能够将全部字符串直接复制进一个新的字符串中,当时就在CSDN及博客园中上寻找一种输入方式,尝试过.next、.nextline等方法,发现并不能实现我的需求,之后我转变了思路,既然都是要一条一条数据处理的,那为什么我不直接使用循环语句输入,一次对一条数据进行处理与输出呢,殊不知我这样反而进入了一个更大的错误(伏笔),再后续完成了对数据字符串的切割之后,开始对每条数据进行检验,起初并未想到用正则表达式方式对数据进行检验,后续发现使用Intger.parseInt(String)方法并不能维持原数据中的小数点位数数目,而再经过同学点拨以后使用了正则表达式的方式对数据进行验证,体会到了正则表达式的判断的优越性,但,在提交时发现自己的数据输出与答案并无差别,但是并未能够得到分数,在一番思考之后,发现写出来的程序是输入一行数据就会输出一行结果,题目要求的是将全部数据输入之后再输出,后续还是使用了StringBuilder类中的append方法进行了汇总。但是这来来回回的折腾,定义了太多的类与字符串数组,代码可读性变得出奇的差,复杂度也高。

   

从中我更加深刻的吸取到了写代码之前要认真阅读题目要求,不要耍小聪明的教训。

 

  ②7-5 日期问题面向对象设计(聚合二)

 

   本题中有整型最大值(2^32-1)的测试点,这一数字过大,之前写的7-2的代码会运行超时,重新编写程序之后发现对于闰年输出结果存在问题,但是并未找到问题所在,在网上找到的日期计算器也都没有求前整型最大值天数的作用,采取了骗测试点的方法,使用if语句如若求得天数是整型最大值,修改所求天数N至正确值,最后输出正确。从中学会了算法要简单明了,不要使用繁杂的代码,会导致后续的调试困难,影响自己心态。

 

   在题目集5的7-2合并两个有序数组为新的有序数组时,开始时想着定义两个整型数组,大小分别是输入的num1和num1+num2,但是在合并时第二个数组超出num2的部分总是会为0,后定义一个数组3用来储存数组一数组二中的元素,运行成功,原因可能是之前数组二中的超出num2的部分未被初始化,无法进行赋值,导致输出错误。

 

 四、改进建议

   多注重正则表达式的学习,在编写程序时注重逻辑的思考,写出的代码精简,注意缩进处理,使代码可读性加强,多注意java的相关工具的学习,并且多看看社区中代码书写较好的人的代码结构,多应用封装、继承、多态、接口技术。

五、总结

  在四月的学习中,我不光学习到了专业课的相关知识,并且在课余的时间了解掌握了SourceMonitor的生成报表内容以及PowerDesigner的相应类图的使用,虽然现在并未完全掌握这两项工具,但是在以后的学习工作之中,显然这两项工具会对我的编程能力产生影响。说说这几次的习题集的收获,在这几次的习题中,学习到了类的相关知识,和掌握了正则表达式的基本语法,及初步了解了流计算但是并没有很清楚这项技术,在课下应加强自学能里,在对于类图的理解和正则表达式的学习上需要多下一些功夫,掌握更多的知识,写出更好的代码。课下需要确定自学的方向,通过mooc、B站等方式学习课堂上还未讲到的知识。课堂上需要多注意老师讲解的知识,好好学习好java。