题目集4-6总结Blog
一、 前言:这三次的PTA作业大体上的题目难度在下降,但题目数目在上升。总体是对着重练习类的构造方法、方法的调用、参数传递、对象的构造与使用;练习循环结构、控制结构;练习数据的输入与输出;学习编写结构清晰、逻辑正确、功能完善的java代码。其中也着重对我们正则表达式的使用和理解能力进行锻炼和考察。理解抽象类与子类的关系,实现继承操作,构造类族;正确使用抽象类和子类实现多态操作;理解接口的意义,并实现行为的多态;理解了解抽象类、类以及接口三者的异同以及使用场合。整体题量适中,大部分的题目的难度适中,有个别题目有着自己的鲜明的特点,也是为了我们能适应更多的情景去写程序。题目集主要是让我们熟悉对类的使用、能够创建相应的对象,同时能够使用正则表达式去判断输入的合法性,摒弃以前那种一个一个字符地去判断,减少代码的圈复杂度。
二、 设计与分析
1、 题目集4(7-2)、题目集5(7-5)两种日期类聚合设计。具体的题目要求如下:设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] 。要求的类图分别为:
应用程序共测试三个功能:
设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:
应用程序共测试三个功能:
我利用工具sourcemonitor做出图表如下:
我根据题目的要求做出大部分的大概程序的主体,剩下的一些方法的设计有网上资料的原理的参考,也有自己想出来的不一样的算法,虽然可能有点瑕疵,但我觉得这个中心思想还是可以的。以下是主要代码:public int numOfDays(int year,int month ,int day)
{
int[] list = {31,28,31,30,31,30,31,31,30,31,30,31};
int n=0;
for(int i=1;i<year;i++)
{
if(isLeapYear(i))
{
n+=366;
list[1] = 29;
}
else
{
n+=365;
}
}
if(isLeapYear(year))
{
list[1] = 29;
for(int i=1;i<month;i++)
{
n+=list[i];
}
}else{
for(int i=1;i<month;i++)
{
n+=list[i];
}
}
n+=day;
return n;
}
}
public void getDaysofDays(int x,int y, int year, int month, int day, int year1, int month1, int day1) {
System.out.println("The days between "+ year +"-"+ month +"-"+ day +" and "+ year1 +"-"+ month1 +"-"+ day1+" are:"+Math.abs(y-x-1));
}
public void getDaysofDays1(int x,int y, int year, int month, int day, int year1, int month1, int day1) {
System.out.println("The days between "+ year +"-"+ month +"-"+ day +" and "+ year1 +"-"+ month1 +"-"+ day1+" are:"+Math.abs(y-x));
}
for(int i=0;i < n;i++)
{
this.day++;
if(this.day > lastday(this.month))
{
this.month++;
this.day = 1;
if(this.month == 13)
{
this.year++;
this.month = 1;
}
}
}
对于以上代码依然有瑕疵。再看sourcemonitor生成的图表,发现自己的代码效率不高,而且该题代码用了大量的if语句,所以导致导致代码的Maximum Complexity有了很高的值,运行时间较长。
问题发现处理心得:在写代码时,还是居于C语言那一套,+除了输入和输出变化了一点,其他基本和C语言一样,且代码过于太复杂,基本全是if….else语句,没能用到高效的算法。代码效率很低,而且中心方法的设计也有问题,缺少了两个日期大小的判断,导致后面有PTA测试点过不了,影响到了后面方法的运行。其中还有出现了负数,最后经过自己的调式,取绝对值便对了。
补充:对于这两道题的方法设计因为之前设计完后有错误,一直没找出来,后来去问了老师,老师帮我看了一下,发现我自己并没有很好的审题,将日期写错,导致运行结果出错,所以一定要认真审题,抓住题目的条件,要细节!
最后,对于老师让我们写的两种形式的日期计算类聚合,我觉得第一种聚合类分工较为明确,若是这样,可以分给不同的人去写,也可以修改的时候,不用大刀阔斧的改。但是功能上的利用就显得复杂一点。而第二种独特的功能就很有特点,对于方法的复用也很方便。内容上的相互依赖,和只是对象的关系的牵扯。总之,两者都有好处,但聚合度高,更利于整体代码的效率和方法复用。
2、 题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)
第一题的图形继承主要由以下类图来解释,由一个父类Shape类,以及下面的子类。父类只有一个求面积的方法,而子类会对getArea方法进行重写。
这个题虽然是初学父类和子类的初始题目,但也充分考察了自己对于老师上课说过的子类方法重载和重写的理解与应用。接下来是自己该程序的sourcemonitor生成表的示意图:
显然,这题的Maximum Complexity就不会太高,但自己的代码的效率也不会太低。运用的语句if之类的冗余的太多了,对于一些方法的使用不太精炼,要多学习和研究好一点的方法。以下是自己代码的类图:
而继承,则为多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。主要的作用为:
对于写完这种继承类的题目后,再看看其他前辈的意见,我觉得,主要由以下几点需要注意:
对于老师上课所讲的,再加上题目经验所得。还有,子类不能直接访问父类中私有的(private)的成员变量和方法,这同样也需要自己牢牢记住。
对于题目集6(7-5)的自己代码的类图为:
我是在老师给的规范下再到里面加东西,添加方法的设计。定义了抽象类的父类,把getArea方法定义为抽象方法,然后每一个抽象方法实际上可以理解为是一种虚方法,可以被重载,不同之处是抽象方法必须被子类重载,而虚方法可以被重载,也可以不被重载,意思就是说抽象方法是基类设计者认为该类必须实现的功能。每次再讲该方法重载,写出每一个类自己的getArea方法。这里再总结一下子类于父类的关系,子类是可以看做特殊的父类,理解为父类为基本方法,而子类有它自己的特殊方法。所以子类能做的事情,父类不一定能做。但是父类能做的事情,子类一定能做。
最后题目集6(7-6),主要考察的是基础的接口和多态的实现。以下是自己代码的sourcemonitor生成表:
3、 对三次题目集中用到的正则表达式技术的分析总结
三次题目集中的正则表达式的应用,主要是对数字和字母的匹配和确认。开始的水文数据校验及处理,那道题目对自己学习正则表达式一开始还是有难度的。所以没能做出来,确实是自己的能力不够,应该多加练习。对于后面出现的小题目,自己还是做出来了。主要是验证用户输入,比如验证输入是否为一个数字,是否是一个全部小写的字符串,或者社会安全号。对于处理字符串来说,正则表达式是一个强大的工具。还有,我很想分享一个网站,它里面归纳总结了大部分可能会用到的正则表达式语法,在这里分享:JAVA正则表达式语法大全 - 星之寒 - 博客园 (cnblogs.com)。
在正则表达式语法中,^ 行的开头,请在正则表达式的开始处使用^。例如:^(abc)表示以abc开头的字符串。注意编译的时候要设置参数MULTILINE,如 Pattern p = Pattern.compile(regex,Pattern.MULTILINE);
$ 行的结尾,请在正则表达式的结束处使用。例如:(^bca).*(abc$)表示以bca开头以abc结尾的行。对于这次的题目,总结的是:*,+,?,{n},{n,}以及{n,m}称为量词符,用于确定量词符前面的模式会重复多少次。
4、 题目集5(7-4)中Java集合框架应用的分析总结
Java对于三大特性以及正则表达式的应用。面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常有的一个方式。1.数组虽然可以存储对象,但是长度是固定的,集合长度是可变的。
数组中可以存储基本数据类型,集合只能存储对象。集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。以下一张图是自己从网上学习收藏到的:
三、 采坑心得:
主要是一定要看对题目的要求,一定要认真审题,抓住题目的条件,要细节!
就比如说是那个算日期的题目,以下是修改后的代码
public void getDaysofDays(int x,int y, int year, int month, int day, int year1, int month1, int day1) {
System.out.println("The days between "+ year +"-"+ month +"-"+ day +" and "+ year1 +"-"+ month1 +"-"+ day1+" are "+(y-x-1));
}
public void getDaysofDays1(int x,int y, int year, int month, int day, int year1, int month1, int day1) {
System.out.println("The days between "+ year +"-"+ month +"-"+ day +" and "+ year1 +"-"+ month1 +"-"+ day1+" are "+(y-x)); }
一开始因为没有加绝对值,一直忽略了相差的天数一定要是正数的条件,而且之前的年份日期的规定也有搞错,所以一定要仔细!
还有就是正则表达式中,可以使用括号来将模式进行分组。重要的是,不要在重复量词符中使用空白。例如,A{3,6}不能在逗号后面有一个空白符A{3, 6}。
四、 改进建议
对于自己的代码,主要是多改进方法的设计,太容易冗余,不能做到利用该利用的方法,并且应该学会怎么去改进代码,使得到时候调试的时候不用修改那么多。
五、 总结
对于本次的题目集的做法,自己觉得自己还不够,还是有很多题目没能做出来,缺少了相应的语法应用的能力。但是,也有自己做的不错的地方,自己想出来了一个比较独特的方法来解决问题。其实题目集主要还是对理解抽象类与子类的关系,实现继承操作,构造类族;正确使用抽象类和子类实现多态操作;理解接口的意义,并实现行为的多态;理解了解抽象类、类以及接口三者的异同以及使用场合。整体题量适中,大部分的题目的难度适中,有个别题目有着自己的鲜明的特点,也是为了我们能适应更多的情景去写程序。