20201710赖成慧第二次Blog总结

一、前言

  题目集四、五、六结束了,题目四考察继承知识点,题目五考察继承,题目六考察接口与多态和正则表达式。这三次题目集大部分题相对容易,但是涉及正则表达式的题目比较困难,没有很好的拿到分数。

二、设计与分析

1、日期类题目

  1.题目集4(7-2)

题目:参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

 

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

 思路:此题只要按照类图将各个类写出来,并且完善其中的各个方法的内容就可以。

遇到的困难:

1.在设计求下n天功能/求前n天功能时,因为测试样例比较大所以比较难以手动计算,验证错误比较困难,而且我担心几万次的循环会使得内存占用特别大,运行时间也可能会超时。

2.在设计求两个日期相差的天数功能时,我的第一个思路是先比较两个日期大小,然后用循环将较大的日期执行日期减一的方法,知道两个日期相同,记录循环次数。但实际操作中,代码运行起来太过于冗杂,内存占用和时间都变大变长了。

解决办法:

1.在多次测试之后实际上并没有超时,所以依旧采用循环方法。

2.多次测试之后,改进无望,改用另一方法

 

 

 该方法计算快,不会出错。

  2.题目集5(7-5)

题目:参考题目7-3的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

 

 

 

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

思路:可以基于题目集四的7-2来做这题,将Year,Month,Day类改成DateUtil的子类,按类图写代码,并完善其中各个方法内容。

遇到的困难:

1.并没有很多困难,因为功能与7-4是基本一致的,所以只需要注意细节就可以

  3.题目集四(7-2)与题目集五(7-5)的优劣比较

   这两题都将所有的类都整合在一起,只需要创建一个对象就可以对年月日进行操作。题目集四中DateUtil类Day类Month类Year类从左到右左边是右边的父类,题目集五中则将Day类Month类Year类全部改成了DateUtil类的子类,变成了“平辈”关系。

   从我个人角度来看,题目集五(7-5)的设计,要更优与题目集(7-2)。首先,两个题目都是在Main类中创建一个DateUtil对象,都是题目集四在使用该对象时,十分笨重,因为要一代一代用getter方法访问下去,访问到需要的对象,再用方法进行操作。这导致题目集四在设计年份和月份的操作时,一个小操作都要写一长串,例如下:

 

 

 仅仅是输出一个日期,代码长度已经冗长成这样了。与之相比较的题目集五,则只需要 对象.getter对象().getter数据() 在写代码时更规律的写法更不容易出错,在别人查看时,更能理清楚其中的逻辑关系。

2、三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)

  1. 题目集4(7-3)

  题目:

编写程序,实现图形类的继承,并定义相应类对象并进行测试。

  1. 类Shape,无属性,有一个返回0.0的求图形面积的公有方法public double getArea();//求图形面积
  2. 类Circle,继承自Shape,有一个私有实型的属性radius(半径),重写父类继承来的求面积方法,求圆的面积
  3. 类Rectangle,继承自Shape,有两个私有实型属性width和length,重写父类继承来的求面积方法,求矩形的面积
  4. 类Ball,继承自Circle,其属性从父类继承,重写父类求面积方法,求球表面积,此外,定义一求球体积的方法public double getVolume();//求球体积
  5. 类Box,继承自Rectangle,除从父类继承的属性外,再定义一个属性height,重写父类继承来的求面积方法,求立方体表面积,此外,定义一求立方体体积的方法public double getVolume();//求立方体体积
  6. 注意:
  • 每个类均有构造方法,且构造方法内必须输出如下内容:Constructing 类名
  • 每个类属性均为私有,且必须有getter和setter方法(可用Eclipse自动生成)
  • 输出的数值均保留两位小数

主方法内,主要实现四个功能(1-4): 从键盘输入1,则定义圆类,从键盘输入圆的半径后,主要输出圆的面积; 从键盘输入2,则定义矩形类,从键盘输入矩形的宽和长后,主要输出矩形的面积; 从键盘输入3,则定义球类,从键盘输入球的半径后,主要输出球的表面积和体积; 从键盘输入4,则定义立方体类,从键盘输入立方体的宽、长和高度后,主要输出立方体的表面积和体积;

假如数据输入非法(包括圆、矩形、球及立方体对象的属性不大于0和输入选择值非1-4),系统输出Wrong Format

思路:先画出类图:

 

创建父类Shape和其两个子类Rectangle和Circle,再以两个子类为父类创建两个子类Box和Ball

遇到的困难:做题目时还没学会super的用法,在调用父类参数时浪费了很多时间

解决方法:使用super

  2.题目集6(7-5)

  题目:掌握类的继承、多态性及其使用方法。具体需求参见作业指导书。

  思路:类图:

 

 使用对象数组,先输入各个图形的数量,再创建相应大的对象数组。

遇到的困难:报错Exception in thread "main" java.lang.NullPointerException: Cannot invoke "sixfive.Circle.setRadius(double)" because "cir[i]" is null
    at sixfive.Main.main(Main.java:26)

解决方法:对象数组中的每一个元素,使用前都要用new创建为一个对象,否则会报上错

  3.题目集6(7-6)

 

 题目:编写程序,使用接口及类实现多态性,类图结构如下所示:

 

 

其中:

  • GetArea为一个接口,无属性,只有一个GetArea(求面积)的抽象方法;
  • Circle及Rectangle分别为圆类及矩形类,分别实现GetArea接口
  • 要求:在Main类的主方法中分别定义一个圆类对象及矩形类对象(其属性值由键盘输入),使用接口的引用分别调用圆类对象及矩形类对象的求面积的方法,直接输出两个图形的面积值。(要求只保留两位小数)

思路:按类图敲代码,比较简单,但是这题用了一个接口

遇到的困难:还真没什么困难,常规题目

解决方法:细心调试一下就可以

  4.图形设计类题总结

  三个题目对应三种做法,第一种是创建图形类然后按图形分类创建子类,一直细化下去创建子类。第二种是每种图形一个类,互不关联。第三种是每种图形一个类,但需要执行的操作以接口的形式写进代码里。第一种方法适用于,属于同一种图形,但是有多个特征,比如三角形,有等边,直角,等角,等腰,直角等边等特征,这种情况第一种方法比较适合。第二种方法在对图形的操作不深入,而图形种类比较多样的情况,例如简单计算面积的状况。第三种则适合要分配功能执行功能的情况,例如有多个图形,一部分图形要算面积,一部分图形要计算周长等。

3、正则表达式总结

  1.正则表达式应该先实验好功能再贴近代码,这需要使用https://regexr-cn.com/,可以在上面实验自己的正则表达式。

  2.正则表达式知识点总结https://www.runoob.com/regexp/regexp-syntax.html

  3.使用心得:正则表达式可以从大量文本中筛选出自己需要的部分,这对于验证账号等正确性有很大的方便。正则在JAVA中要配合Pattern类和Mattern类使用,Pattern类从来引入规定正则表达式,而Mattern类用来对字符串操作,在正则表达式中的捕获分组可以用Mattern的group方法提取出来。

三、踩坑心得

  这三次作业明显强调了对于错误数据的处理,无论是普通的编程题还是使用正则表达式的题目,都要对错误的数据进行反应。在敲代码的时候,时刻要考虑用户会如何使用,并且时时刻刻保持注释的好习惯。7-4对学号的检验,题目中要考虑1、7、8方向各个方向有哪些班,不然会造成验证数据时出错。

 

四、改进建议

  正则题目顺序安排不当,我们在第三次第四次都做了正则类题目,但是难度都比较大,然而我们正则表达式基础题在第六次作业才出,我觉得这有些晚了,基础训练确实会做了,但是我们却失去了几次联系进阶题目的机会。

五、总结

  三次作业做完了,这三次作业对应的课程进度的速度比较能接受了,同时我也深刻发觉,继承、接口、多态这些操作对于JAVA来说多么重要,而且在实际运用上可以帮助我们实现很多功能,并且简化很多代码和操作。现在正值开始学习异常之时,不禁感叹,当初觉得难的内容总会在一次又一次的查询资料和实践中逐渐掌握。在这三周不仅有PTA作业,还有实验农夫过河,在PTA中学习到的新知识我都运用在了农夫过河中,也是不负这三次作业的投入了。正则表达式虽然掌握了基本内容,但是在复杂的文本面前我还是不知所措,需要更多的练习。在JAVA学习展开的这两个月,我认为我较好的学到了什么是面向对象的程序设计了。

 

posted @ 2021-04-25 21:42  木野kino  阅读(78)  评论(0)    收藏  举报