PTA题目集4~6总结性报告
前言
这是第二次Blog总结性报告,在本次的pta题目集4~6中,相较于之前的题目,难度幅度有点较大的提升,需要学习的知识也大量增加。题目集4相较于之前的1~3,题目数目是减少了,但是难度却是大大增加(可能是我练的太少了和每天花的时间短了),而题目集5和6,经过同学的反应,老师便又将题目的数量增加,但是难度下降,这样改变对于我来说还是比较适应的(做对几道小题还是能增加自信心和动力的),不过就算这样,后面的大题目我还是有些没有能够全对,总有几个点过不去。现在来说这3次题目集涉及的知识点,这3次题目集涉及最多的(在我看来),应该是正则表达式,题目集4~6中都涉及含有正则表达式的题目,这个刚开始我学的是真的有点懵逼,不知道该如何运用,到后面慢慢就熟悉了。其次便是继承与多态的运用,其中题目集4中的7-3 图形继承和题目集6中的7-5 图形继承与多态都涉及到继承。
设计与分析
①题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣比较
首先比较两个类图7-2:

7-4:
从这两个类图看来,这两题目的内容是差不多的,但是还是有着区别,主要体现在DateUtil和Day这两个类当中的不同,7-2中Day类的构造方法和7-4的Day类中的构造方法相比,较为复杂,而7-4中的Day类就变得较为简单,更加简洁;
其中是两个类中代码的比较 7-2:
class Day{
int value;
Month month;
int mon_maxnum[]= {31,28,31,30,31,30,31,31,30,31,30,31};//定义每个月份的天数
public Day() {
}
public Day(int yearValue,int monthValue,int dayValue) {
this.month = new Month(yearValue,monthValue);
this.value = dayValue;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public Month getMonth() {
return month;
}
public void setMonth(Month value) {
this.month = value;
}
public void resetMin() {
value=1;
}
public void resetMax() {
value=mon_maxnum[month.getValue()-1];
}
public boolean validate() { if(this.getMonth().getYear().isLeapYear())
mon_maxnum[1]++;
if(1<=value&&mon_maxnum[month.getValue()-1]>=value)
return true;
return false;
}
public void dayIncrement() {
value++;
}
public void dayReduction() {
value--;
}
}
7-4:
class Day{
int value;
Day(int y, int m, int d){
}
Day(int value){
this.value=value;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value=value;
}
public void dayIncrement() {
value++;
}
public void DayReduction() {
value--;
}
}
无论是从格式,还是代码,相较于前者,7-4都变得简洁许多。而内容上,7-2相较7-4中,便是多了需要校检数据合法性的方法、日期复位、日期改为月份最大值
void validate()//检测日期合法性
void resetMin()//日期复位
void resetMax()//日期改为月份最大值
其次,7-2中的Day类是需要调用Month类中的对象与方法,而7-4中Day类与Month类两个是相互独立的类,双方都互相不受影响,这也体现了7-4中的优势,相较于7-2,7-4中的类都是相互独立的,这也便于思维的舒展。7-2中的类都是层层调用(Main->DateUtil->Day->Month->Year),如果有一环出现问题,那么将导致整个程序出现问题,而7-4这避免了这样的风险,7-4中Day类、Month类、Year类都是相互独立的,只由DateUtil类分别调用,这样就避免了7-2中的风险。并且,相比于原7-2的Day类,7-4中的Day类多个方法都去除掉了,放在DateUtil类中,节省了调用时间,所以7-4更加简便容易理解而且使用方便。
②题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)
7-3图形继承:
题目要求如下:
类Shape,无属性,有一个返回0.0的求图形面积的公有方法public double getArea();//求图形面积
类Circle,继承自Shape,有一个私有实型的属性radius(半径),重写父类继承来的求面积方法,求圆的面积
类Rectangle,继承自Shape,有两个私有实型属性width和length,重写父类继承来的求面积方法,求矩形的面积
类Ball,继承自Circle,其属性从父类继承,重写父类求面积方法,求球表面积,此外,定义一求球体积的方法public double getVolume();//求球体积
类Box,继承自Rectangle,除从父类继承的属性外,再定义一个属性height,重写父类继承来的求面积方法,求立方体表面积,此外,定义一求立方体体积的方法public double getVolume();//求立方体体积
注意:
每个类均有构造方法,且构造方法内必须输出如下内容:Constructing 类名
每个类属性均为私有,且必须有getter和setter方法(可用Eclipse自动生成)
输出的数值均保留两位小数
主方法内,主要实现四个功能(1-4): 从键盘输入1,则定义圆类,从键盘输入圆的半径后,主要输出圆的面积; 从键盘输入2,则定义矩形类,从键盘输入矩形的宽和长后,主要输出矩形的面积; 从键盘输入3,则定义球类,从键盘输入球的半径后,主要输出球的表面积和体积; 从键盘输入4,则定义立方体类,从键盘输入立方体的宽、长和高度后,主要输出立方体的表面积和体积;
假如数据输入非法(包括圆、矩形、球及立方体对象的属性不大于0和输入选择值非1-4),系统输出Wrong Format
这道题相对来说较为简单,因为它需要构造的类较少,除了需要在Main类中输出懂点脑筋之外(PTA测试的要求和一些奇怪的测试点,输出格式要求啥的),其他都是直接一股脑写下去。至于这道题的设计思路和技术运用,题目已经表达的很清晰了,就是让两个个图形类Circle、Rectangle去继承Shape类,并且重写Shape类中的方法,来求相应的面积;而Ball类继承Circle类,Box类继承Rectangle类,都需要重写父类的方法,这些继承类都需要通过修饰符private来定义私有属性,起到保护封装作用,其他的就很基础,并且每个图形求面积的方法也都很简单,不需要多说。
7-5图形继承与多态: 类图:

这道题目相对于前面的7-3的图形继承难度上就要增加许多,不过也是有着许多相似之处,许多类都存在相似的地方,但也有不同,最主要的不同我认为应该是在于Triangle类中三角形求面积的方法,这道题三角形给出的是三条边长,要求它的面积,这就要用到一个数学上非常重要的公式——海伦公式,解析如下
假设在平面内,有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得:
S=√[p(p-a)(p-b)(p-c)]
而公式里的p为半周长:
p=(a+b+c)/2
这样便能通过已知三边求得三角形的面积
同时,在设计技巧方面也与前一道题有所不同,尽管两者都用到了继承,但是7-5更是用到了抽象类abstract,声明一个抽象类Shape,在抽象类中定义抽象方法
abstract double getArea();
abstract boolean validate();
public abstract String toString() ;
该三个方法在抽象类Shape类中通过abstract修饰符修饰后,只表面该方法被声明而没有进行实现,需要在子类当中去实现;
之后便是将所求得的面积运用for循环存储在一个个的数组里面,通过冒泡排序,将所得的面积进行排序输出
double sjmj[] = new double[c];
double san = 0;
for(int i = 0;i<c;i++) {
side1[i] = input.nextDouble();
side2[i] = input.nextDouble();
side3[i] = input.nextDouble();
shape = new Triangle(side1[i],side2[i],side3[i]);
if(shape.validate()) {//判断输入的数据是否符合,不符合则输出Wrong Format
sjmj[i] = shape.getArea();
san = sjmj[i] + san;
}
else {
check=0;
}
}
if(check == 0) {
System.out.println("Wrong Format");
}
7-6实现图形接口及多态性: 类图:

从类图当中我们也可以看出这道题并不是很复杂,相较于前面两道题就是多了一个接口,题目总体感觉还是比较简单的,图形继承类大体只是在Main类中的输出可能要求不一样,其他很多地方都是非常相似,不需要做出太大的改动,只不过是在类的声明中运用接口
publiic interface GetArea{
public double getArea();
}
来定义一个抽象方法getArea();其他的方法只需要在各个类当中实现即可;
再通过implements来实现接口中定义的抽象方法
class Rectangle implments GetArea{
}
其他类也是如Rectangle类,并不是非常的复杂;
③对三次题目集中用到的正则表达式技术的分析总结
总结:总的来说这三次题目集的题目中,运用到正则表达式的题目可以说是占比比较大的,对于我这种比较害怕正则表达式的简直是噩梦,但是经过一番奋斗,还是弄明白些许,这三次题目的正则表达式,其中题目集4中的第一道题 7-1 水文数据校验及处理和题目集5中的第四道题7-4 统计Java程序中关键词的出现次数,在我看来是比较难的,我没法完成,而题目集6中的那些小题目的正则表达式又特别简单,这就有点两极分化了,这也让我清楚了我在正则表达式的薄弱之处,需要多加学习,写一些其他需要用到正则表达书的题目,来挺高自己对正则表达式的运用;
踩坑心得
总的来说,这些题目对于我来说没啥坑,主要是简单的都会做,没怎么踩过坑,难得写不来(不配踩坑,哈哈哈哈),不过有一点,就是对于这些题目数据的输出格式,许多都是保留小数点后两位数字,这里我就运用到一个方法,import java.text.DecimalFormat; 这个包,对于保留有效数字可以来说是非常方便的,不需要去纠结使用println还是print来对数据进行输出;
import java.text.DecimalFormat;//特定的包
DecimalFormat df = new DecimalFormat("0.00");//选择需要保留小数点后几位
System.out.println(df.format(需要保留两位数的数据));//对数据进行输出
大致的用法就如上述,非常的方便;
总结
总的来说,这次的题目集合相较于前面的题目集难度是要大上许多,但是如果你仔细,并且有所学习,这些题目除了个别难的之外,其他还是比较容易亦或是中等难度,都是可以通过自己解决的,而且从这些题目集中当中也激发了我认真学习正则表达式的念头,因为到后面许多题目都需要用到正则表达式,正则表达式对于学习Java的我们实在是太重要了,不能就这样轻易的抛弃!

浙公网安备 33010602011771号