java第二次博客作业
一、前言
作业情况:第一次作业练习的主要是正则表达式的书写,第二次相较于第一次则增加了多态以及ArrayList的使用,第三次则是多了接口得应用。第一次作业第一道题就是考察正则表达式,老师让我们先自学,学的不咋样,第一道题做的很差劲,可见其深奥性。第二次作业比较简单,除了那个关键字,数组的使用很复杂,以至于我连参考代码都没有看懂,好在其他比较简单,有两道排序基本上是送分题。第三次作业也考察了正则表达式,但都是一些比较基本简单得表达式,还算简单。还有一道接口的题目则花了比较长的时间。
二、设计与分析
(1)题目集4(7-2)、题目集5(7-4)两种日期类聚合设计,各有各的优势和劣势。在聚合一里,主类指向DateUtil类,再由DateUtil类指向Day类,再由Day类指向Month类,再指向Year类。然而聚合二则由DateUtil类同时指向Day类、Month类和Year类。个人认为聚合二更加简便,因为在DateUtil类中引用其他三个类里的数据时,输入要更加简短,类的建立也比聚合一要简单,同时调试过程也比聚合一好检查。
题目集四7-2:这道日期题比较简单,因为给了类图,各个类里的方法和属性都一目了然。只要对着类图敲代码就行了。重点就是DateUtil里的方法设计,例如求前n天,下n天,两日期之间的天数等,这里涉及到的算法比较多,要小心一点。这是其中的计算下N天的代码。
public DateUtil getNextNDays(int n){ int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int y=0,m=0,d=0; int i,j; int b=syts(this);//该年剩余天数 if(b>n){//该年剩余天数大于n y=this.getDay().getMonth().getYear().getValue(); if(this.getDay().getMonth().getYear().isLeapYear()){//如果是闰年 a[2]=29; } int e=a[this.getDay().getMonth().getValue()];//该月的天数 e=e-this.getDay().getValue();//本月剩余的天数 if(e>=n){//如果n天后在本月 m=this.getDay().getMonth().getValue(); d=n+this.getDay().getValue(); } else{//如果n天后不在本月 n=n-e; m=this.getDay().getMonth().getValue()+1; i=m; while(n-a[i]>0&&i<=12){//找到月 n=n-a[i]; m++; i++; } d=n;//找到天 } } else{//该年剩余天数小于n n=n-b; y=this.getDay().getMonth().getYear().getValue()+1; int c=365;//平年天数 if(new Year(y).isLeapYear()){//闰年天数 c++; } while(n-c>0){//找到年 n=n-c; y++; c=365; if(new Year(y).isLeapYear()) c++; } i=1; while(n-a[i]>0&&i<=12){//找到月 n=n-a[i]; i++; } m=i; d=n;//找到天 } return new DateUtil(y, m, d); }

(2) 题目集4(7-3)、题目集6(7-5、7-6),这三道题都是关于面向对象类的继承的相关训练。题目集4的(7-3)就是实现图形类
的继承,并定义相应类对象并进行测试。先建立一个无属性的shape类作为父类,再建立Circle类,继承自Shape类,作为Shape类的子类,用来求圆的面积。同样的Rectangle类,也是继承自Shape类,用来求矩形的面积。但Ball和Bax则是作为Circle类和Rectangle类的子类。题目集6(7-5不仅要求有继承性还要有封装性和多态性,这就要用到abstract类,对于刚开始学习的我来讲难度还是很大的。要先建立抽象类Shape类作为父类,Circle、Rectangle、Triangle为实体类作为Shape类的子类,再按照类图去添加相应的内容。)题目集6(7-6)则需要用到继承的接口interface,是一种特殊的抽象类,所以接口中所有的方法都是抽象的。

(3)这三次题目集中都有用到正则表达式的题。感觉难度从难到易。经过三次题目集的训练,感觉自己对正则表达式的理解加深一点,尤其感受到了正则表达式在数据校验中的重要性。水文校验这道题比较难与复杂,需要考虑的东西很多。
以下为水文校验的类图。

(4)题目集5(7-4)这个题是统计JAVA程序中关键词的出现次数,首先需要自己去网上查询53个关键词。再通过键盘输入
输入exit是停止。这道题比较难,需要用到的一些数组我也不太会用,所以这道题我没有写出来。希望老师有时间可以讲一讲‘
各类数组的用法
三、踩坑心得
1、在判断三角形三边是否合法时一定要将三边从小到大排列,再用a+b<=c两边之和大于第三边来判断,如果不进行排列判断就会有误,我就因此有几个测试点没有通过。切记在判断三角形是否合法是要排序!/4、
2、如果正则表达式想要匹配的是一个完整的字符(如double不会匹配出do),那么就要在该正则表达式的开头和结尾加上\\b,因为一开始我并不清楚导致好几个测试点过不了,经过大神的检查后终于知道了原因。
3、因为题目集5(7-4)在一开始输入时就直接把两种注释的方式都转换成空格,但忽略了用“/* */”注释的内容是可以跨行的,就不能按照我一行一行输入那样处理,就必须在整个字符串里来替换。这是忽略了最基本的内容而导致的低级错误。
4、抽象类可以有构造方法,接口中不能有构造方法。抽象类中可以有普通成员变量,接口中没有普通成员变量。抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。抽象类中可以包含静态方法,接口中不能包含静态方法。抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。一个类可以实现多个接口,但只能继承一个抽象类。
四、改进建议
对于题目集6(7-2),在对字符排序时我们除了可以使用for循环或者是增强for循环外,我们还可以使用sort方法,这个方法不仅只需要一行,使代码更加短、简单,而且在书写上也更加美观。
对于题目集6(7-5),在检查数据是否合法时,我将检查的方法放在了主类中,这样会使主类看起来不那么简单,应该把它放在Shape类里,把它交给父类来完成,这样也更加面向对象,而不是面向过程了。
在三道图形继承题里,我的命名(如面积,边长,形状等)都比较中国化,就是用的拼音。但是实际上这样并不符合Java编程规范,应该都用英语来命名。当然不这么做的原因是老师给出的类图,命名就是用的是英语,但是PTA会查重,所以为了防止命名相同而导致的查重率过高,我会选择换一个不与其他人一样的命名。
题目集5(7-4)和题目集4(7-1)这两道题并没有拿到满分,分别有两个和一个测试点没有通过,我不应该因为作业截止了就此放弃,即使截止也要继续修改代码,直到准确无误。
题目集4(7-1)我是面向过程了,并没有面向对象,因为时间不够了,事实上这个题要是能面向对象就更加完美了。
五、总结
对于本阶段三次题目集,我学会了用正则表达式来检查字符串是否正确,用sort方法对数组从小到大进行排序,也学会了对代码进行调试,对类进行封装和简单的类的继承。关于继承(接口)学习的还有很多,Map方法也要更深入的学习研究,Matcher和Pattern也要加强巩固。我要学习的东西还很多,不足的地方也很多。对于老师上课的方式,我还是比较喜欢的,投影看不清可以选择看网课,对一些眼睛近视或者离投影比较远的同学是友好的。但是讲课的进度和作业的进度是不一样的,总需要我们到网上自主学习,不过这样也大大提高了我们的自学能力。对于作业的话我认为难度小一点还是比较好的,但是作业平台不一样,又是PTA,又是慕课的,容易忽略慕课上的作业,建议统一平台!实验的话灵活度大,时间长,但是每次提交的方式都是五花八门的,把一项简单的工作搞得复杂了,属于浪费时间的地方。Java这门课程很有难度,但是我会认真学习下去,尽最大努力跟上教学任务的。
浙公网安备 33010602011771号