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