首页 > 其他 > 详细

题目集4~6的总结性Blog

时间:2021-05-02 22:00:08      阅读:35      评论:0      收藏:0      [点我收藏+]

(1)前言:

  题目集4-6题量依次增大,由第4次的3题,第5次的5题,到第6次的6题,每次都至少有一道难题(就是占据总分一半或是接近一半的那种),主要难在知识点(自学的,如:正则校验的多种写法)或是算法设计上(需要考虑的情况较多,如:计算日期),要花费大量时间去解决它。题目集4-6的知识点有正则表达式,日期类聚合设计,继承(extends)和多态的使用,字符串长度比较,Arrays类的使用,排序算法(冒泡、选择、插入),还有接口(interface)的使用。

(2)设计与分析:

  题目集4(7-1):此题的解题思路为:先判断水文数据是否合理,如果不合理,输出错误提示;反之,进行下一步的水文数据输出和水文数据计算。

  以下是生成报表:

技术分享图片

 技术分享图片

 

 

  由图可知,我此题代码main类的平均复杂度和代码深度数值较大,还有平均每个函数包含的语句数目较多,是调用类的时候用了过多的if和for语句,而且用了多个if嵌套和for嵌套。

  类图如下:

技术分享图片

 

 

   由图可知,Main类调用了Judge、Input、Output类Output类调用了Judge类。Judge负责判断输入数据,Input类、Output类负责输入输出。

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

  题目集4(7-2)解题思路:<1>求下N天我是先将年数除以4取余数,再计算剩余天数有多少年多少月多少日。<2>求前N天也是如此。<3>求相隔N天我是先算输入日期距离1900年1月1日的间隔,再把他们相减。

  题目集5(7-5)解题思路:<1>求下N天我是先判断是否为润年,如果是闰年,则月份数组二月改为29天。然后再把依次加一,到每月最大天数时日期归1。月在日归为最小天数时加一,年在月归为1时年分加一。<2>求前N天先判断是否为润年,如果是闰年,则月份数组二月改为29天。然后再把日依次减一,到每月最小天数时日期归为上个月最大天数。月在日归为最大天数时减一,年在月归为12时年分减一。<3>求相隔N天我是先算两年同月同日(以第一次输入的日期为标准,如计算2000年2月28日到2003年3月21日,即取2月28日为计算起始点)的日期间隔,然后再根据第二次输入的月和日,进行总天数的相加和相减。

  两者的类聚合设计不同在于:

  题目集4(7-2)的是用DateUtil类聚合Day类,Day类聚合Month类,Month类聚合Year类。DateUtilDay,Month,Year四个类均有检验数据合法性的方法,DateUtil类中的方法会取出Day,Month,Year三个类校验数据合法的布尔值,并根据得到的布尔值判断并返回一个数据是否合法的布尔值。日期最大天数作为一个属性放在了DateUtil类里。Day,Month,Year三个类的带参构造方法随着聚合层次的增多,会出现最外层聚合出现疯狂套娃的情况(如:date.getDay().getMonth().getYear().getValue()),聚合层数越多,变量名称越长。还有题目集4(7-2)Day,Month,Year三个类除了对Day,Month,Year进行操作加减外,还有校验数据合法性的方法,有些不符合类的单一职责。但这种结构便于理解。

  题目集5(7-5)的是用DateUtil类聚合Day,Month,Year三个类,Day,Month,Year三个实体类均实现了单一职责,只进行加减操作,DateUtil类作为业务类进行数据合法检验,日期的计算,而且还不会出现题目集4(7-2)的疯狂套娃的情况,变量名称简洁明了。但题目集5(7-5)的DateUtil类过于臃肿,而且在年份合法范围发生改变的时候要修改就只能修改代码,不利于复用。

  以下是生成报表:

技术分享图片

题目集4(7-2)

  由图可知,这段代码中DateUtil类和Main类复杂度较高,代码深度数值较大,原因在于用了if嵌套(事后看了下,减少不了)。Main类由于要调用其他类,导致平均复杂度较高。因为调用其他类的时候是在switch--case中调用的,会有多个嵌套。

 技术分享图片

  题目集5(7-5)

   相较于题目集4(7-2),题目集5(7-5)的复杂度集中在DateUtil类里了。什么循环嵌套全都在DateUtil类里实现,其他三个都是实体类,仅做加减操作,也有效减低了Main类的复杂度,但我在DateUtil类里写了过多的if闰年判断和for循环日期操作,导致DateUtil类代码复杂度比上一次高很多。

  类图如下:

 

 技术分享图片

   我题目集4(7-2)的调用关系是Day类和Month类将Year当做一个属性使用,DateUtil类直接读取Main类输入的数据,且在DateUtil类中有new一个对象的语句。题目集5(7-5)就是把Day、Month、Year三个类当做DateUtil类里的属性,调用方便,一个类计算出问题了也好找。不像题目集4的,计算有问题就是找不出来,找到了一个错,改了后错得更离谱了。

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

  题目集4(7-3)解题思路:按题目要求,我写了Shape、Circle、Rectangle、Ball、Box五个类,Circle、Rectangle、Ball、Box四个类继承于Shape类,这四个类覆盖父类的计算面积方法,并返回对应的值。

  题目集6(7-5):解题思路:按题目要求先写了个抽象类Shape,再写Circle、Rectangle、Triangle三个类继承于Shape类,重写Shape类里的一些方法。又定义了一些对象数组以解决数据存储问题。之后再进行排序。

  题目集6(7-6):解题思路:按题目要求先写了个GetArea接口。Circle及Rectangle则实现GetArea接口。

  题目集4(7-3)运用到了封装、多态和继承的方法,没有用到接口。封装是把每个类的属性设为私有,多态是有参构造和无参构造,继承就是将四个形状类作为Shape类的子类。题目集6(7-5)用到了封装,继承和多态。封装、多态和题目集4的是一样的,继承是子类继承了一个抽象类Shape,再重写父类里的就是面积的方法。题目集6(7-6)用到了封装、继承、多态和接口。封装和多态和前两个题目集的题目很像,但继承就是继承一个GatArea接口,实现接口里面的方法。

  以下是生成报表:

技术分享图片

题目集4(7-3)  

  从报表中可以看出,只有Main类复杂度和深度较高。是因为用了switch-case选择,加上嵌套的if-else,自然就高了。

 技术分享图片

题目集6(7-6) 

  从图中可以看出,这道题代码复杂度和深度都正常,是因为这道题不需要很多判断。

技术分享图片

 题目集6(7-5)

  从图中可以看出,这道题Main类复杂度和深度极高,其原因在于要用for循环创建对象数组,创建前还有判断数据合法性,所以复杂度和深度就高了。

   类图如下:技术分享图片

  由类图可以看出,题目集4(7-3)主要是继承,题目集6(7-5)主要是抽象类的使用和多态,题目集6(7-6)主要是接口的使用。

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

  三次题目集出现正则的题目有题目集4(7-1)、题目集5(7-4)、题目集6(7-1)(7-3)(7-4)。

  题目集4(7-1)是水文判断。解题思路:用正则表达式判断输入数据,正确即进行水文计算。需要用正则的有输入格式校验(是否有4个|,年月日的输入格式等)、数据校验(输入数据是否正确,如年月日、时间、小数位数)、查找错误输入(找出并输出具体错误行数)。格式判断还好,就用正则写一个通式即可,但年份的分类,还有月份的日期问题,较难解决。而输出错误行错误列又要写一个分块的正则一部分一部分地匹配是哪一个数据错了。

  题目集5(7-4)是统计Java中关键词出现的个数。解题思路:先将所有关键词按字典序存入一个数组中,再将文章中注释、输出语句去掉后再进行正则匹配,并统计匹配次数。这道题正则考的是如何把注释还有括号中的语句去掉。还有如何使用多次匹配的Pattern模式。

  题目集6(7-1)(7-3)(7-4)较为简单,主要考察的是匹配输入字符串长度、字符串输入字符、字符串首位输入、字符串的“或”表达。

技术分享图片

  我只有题目集4(7-1)分了类,其余都是一个类。题目集4(7-1)我是Judge类正则判断,题目集5(7-4)我是用matches判断模式(只能判断一次),题目集6(7-1)(7-3)(7-4)也是用的matches模式。

a.matches("(.*)//(.*)")//题目集5(7-4)
QQ.matches("^[1-9][0-9]{4,14}")
a.matches("[a-zA-Z0-9]{4}")
a.matches("2020(1[1-7]|61|7[1-3]|8[1-2])(0[1-9]|[1-3][0-9]|40)")
//题目集6(7-1)(7-3)(7-4)

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

  题目集5(7-4)要求用List、Map、Set接口三者中至少一个,List实现数据的插入(我用于此题拼接分割后的字符串),Map可用于排序(用了,出bug了),至于Get...感觉和List挺相似的。

 

(3)踩坑心得:

  题目集4:

  (7-1)我写这道题的时候,一开始只考虑了输入的年、月、日、时、分,还有目标水位,实际水位和开度、流量的输入,就是默认它的输入完全的,没有少数据的。之后在提交的时候发现它还有数据缺失的情况。 还有之后连续多个输入为空,会导致报错,就是数组里面没有存入数据,无法输出。目标开度实际开度的取值范围,我会出现零点几也算对的情况。关于月份和日期对应的也没有处理的很好(就是会出现类似于4月份有31天不报错的那种情况)。还有就是我关于水文计算的公式没写好。

技术分享图片

 

 

   (7-2)我写这道题的时候,关于日期计算方面有一些问题。在算日期间隔的时候,会出现有时候多一天或少一天情况,应该是闰年那一部分没有判断好(如初始年份就是为闰年的时候)。求下N天和前N天也是同样的情况,总是会有一天的差距(多一天或少一天)。应该是我算法设计有问题。

  题目集5:

  (7-3)我写这道题的时候,一开始把插入排序和冒泡排序弄错了,导致插入排序和冒泡排序写得极为相似。

技术分享图片

 

 

技术分享图片

  (7-4)我写这道题的时候,没把去除注释给弄好,导致测试点过不了,还有我在分割字符串的时候忽视了为空的情况,导致输入为空的时候会显示null的错误提示(如下图)。

技术分享图片

  (7-5) 我写这道题的时候,一开始没有考虑下N天或前N天N值为负的情况,导致之后的代码都是默认N为正的情况下写的,最后在计算前N天后N天的时候,无法计算N为负数的情况。还有那最大整型数,一开始我是用的int型。

  题目集6:

  (7-3)我在写这道题的时候,尝试用了pattern matcher模式,但一直匹配不成功,后来发现我是把matter里面的字符串变量加上了引号,导致一直匹配到是定义字符串变量相同的字符,所以一直输出false。

Matcher m = Pattern.compile("*").matcher("a");//一开始写成了这样
Matcher m = Pattern.compile("*").matcher(a);

 

(4)改进建议:

   题目集4:我觉得我(7-1)需要再改一下水文数据判断的正则表达式,因为它在年月日同时匹配上有些错漏,可以改为天数为31日的月份放在正则表达式同一个子式里。还有开度的首位不能为0也要在split后加一个判断。(7-2)我算法有问题,尤其是相隔天数的,我是计算两个时间距离1900年的天数,再来计算相隔时间。这样一来,首先闰年就判断有问题;其次,万一题目年份数据有效范围改了这个代码就没用了。所以我之后用日期加减带动年月加减的算法写了一遍,和之后题目集5(7-5)的算法类似。

  题目集5:(7-4)我是没有将/**/的注释弄掉,造成了之后的判断会将/**/里面的关键字匹配到,之后我会把它加上去。还有就是关于matches的正则匹配只能使用一次,我当时没用pattern、matcher是因为我没发现我使用的时候多加了个“”,就是题目集6(7-3)的错误。如果把matches改为pattern、matcher的写法,可以多次匹配,效率可以提升,还可以把已经匹配过的字符串删去。(7-5)我想加上一个关于N正负的判断,如果是正就按原样求前N天(或后N天),如果是负就反过来,求后N天(或前N天)。还可以将int改为long,以解决整型数最大最小的问题(还得把bug给改了)。关于算两天之间的间隔,我想先算出年,这样可以减少运算时间,因为在测试的时候用日相加相减经常超时,重点是还没算对(怀疑是月份日期归为最大最小值时没设计好,得改)。

  题目集6:就是(7-5)的toString有些多余,有这个方法但没用上。因为是自动生成的,但题目要求格式并不是自动生成的那样,我可以尝试一下能不能把toString的格式改成题目要求的格式。

(5)总结:

  通过这三次题目集,我学到了Link的用法,日期的计算方法,类方法的重写和重载,类的继承和接口,还有抽象类的使用。加深了对正则表达式的理解和领会,学会了类的封装,初步了解了面向对象的编程方法。关于正则表达式我还不熟练,还有很多不会,要加强学习。日期类的算法设计我没有做好,总是有多一天少一天的bug,还要重写。Map和Set的使用还要找资料学学。总的来说比上个月适应了一些自学的感觉。至于建议和意见就是能否在实验指导书上稍稍说详细些要求(比如给一个名称,要添加到程序里,但不知道这个名称究竟是作为变量还是作为方法),因为很多要求是靠猜的。其他就没什么了。

题目集4~6的总结性Blog

原文:https://www.cnblogs.com/Zi-Yao-OvO/p/14706093.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!