面向对象程序设计题目集4-6总结
面向对象程序设计第二次博客作业
题目集4~6的总结
//该blog的前言,设计与分析,采坑心得,改进建议为一个一个题目集进行分析
//总结是整体总结
//题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)在相应的题目的类图这里。
//题目集5(7-4)中Java集合框架应用的分析总结、对三次题目集中用到的正则表达式技术的分析总结在最后一部分
//题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣比较也在最后一部分
1.第四次题目集:
前言:
在经过一段时间面向对象程序设计的学习后,我们进行了之后的题目集作业。
第四次题目集有三道题目,需要用到正则表达式的进阶知识、新学的聚合以及继承知识。
这次题目集只有第一题比较困难,虽然老师上课讲过思路,但得分对于我而言还是很困难。第二题第三题比较常规,是聚合和继承的经典例题,难度适中。
(一)第四次题目集设计与分析:
- 7-1
类图:

依旧是运用正则表达式的知识点,但较上一次题目集来说难度更大,需要对正则表达式有着更深刻的认知学习。
使用Java中的字符串处理类以及正则表达式对输入字符串数据进行合法性校验及计算。
每一行输入数据共包含五部分:测量时间、目标水位、实际水位、开度(包含目标开度和实际开度,以“/”分隔)、流量。
与之前的求导不同,这次测试点的通过也比较困难,思路有,但是却不好实现。
String position="[1-9]\\d{0,2}(\\.\\d{0,3})?";//水位数据匹配
String date="(((([1-9])|([1-9][0-9])|([1-9][0-9]{2})|([1-9][0-9]{3})/((([13578]|1[02])/([1-9]|[12][0-9]|3[01]))|(([469]|11)/([1-9]|[12][0-9]|30))|(2/([1-9]|[1][0-9]|2[0-8])))))|(((([1-9][0-9])(0[48]|[2468][048]|[13579][26]))|(([48]|[2468][048]|[3579][26])00))/2/29)) ((([02468])|(1[02468])|(2[02])):00)";
//年月日时间匹配
int i=0,j=0;
String[] k;
String[] b;
String[] save;
Pattern d = Pattern.compile(date);
Pattern p = Pattern.compile(position);
Date[] t=new Date[500];
public boolean validatatime(String time)//判断年月日是否正确
{
if (Pattern.matches(date,time)) {
return true;
}
else {
return false;
}
}
public boolean validataWaterLevel(String waterLevel) //水位、开度合法性校验
{
if (Pattern.matches(position,waterLevel)) {
return true;
}
else {
return false;
}
}
结构分析:


在写的过程中并没有很好地理解类图,自己编写的过程中遇到了很多问题,例如将题目给的三个类变成了两个类,导致写出来的过程有些艰难,对于题目的意思没有搞太明白。
- 7-2
设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31]
应用程序共测试三个功能:
- 求下n天
- 求前n天
- 求两个日期相差的天数
类图:

- validate();用来判断数据是否正确
- format(int);判断前n天的天数
- after(int);判断后n天的天数
- sub(DateUtil,DateUtil)判断两个日期相差的天数
这题主要运用聚合的知识点,将Year、Month、Day、DateUtil一层一层聚合,在DateUtil中运用day.getmonth().getvalue()的形式访问。
题目集5(7-4)是Year、Month、Day全部在DateUtil里聚合,直接通过访问DateUtil来调用Year、Month、Day,相较于这个方法,题目集5中的方法更加方便简单,使代码一目了然,清晰简洁,是对该题聚合方法的一种改进。
结构分析:


结构较为复杂,平均深度较高。
- 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();//求立方体体积
(二)第四次题目集采坑心得
在写7-1题的时候,在每一个输入数据两端均可能存在多余的空格,忘记过滤,忘记如果用户未输入数据,则直接输出Max Actual Water Level和Total Water Flow的值,在用正则表达式的时候,分割处理有点问题,导致最后并没有过多少测试点。
在写7-2题的时候,层层聚合写起来比较难理解,在对数据的调用方面卡了较长时间,包括对数据的引用传参,但是思路较为简单。
7-3题的继承会忘记每个类均有构造方法,且构造方法内必须输出Constructing 类名,总体来说继承比较简单。
(三)第四次题目集改进建议
正则表达式类的题目难度较大,思路能够想出来,但具体实现的代码写不出...
第二题是聚合的经典例题,难度适中。
第三题是继承的经典例题,比较简单。
总体来说难度比较适合我们。
2.第五次题目集
前言:
第五次题目集的题量中等,只有5题,前三题比较基础,是对字符串和排序内容掌握的检测。
需要用到正则表达式的题目只在7-4,相比起前两次题目集的正则表达式的来说,难度降低了很多,是可以做的出来的程度。
7-5是对上一题目集7-2聚合的进一步改进,思路大体差不多。
(一)第五次题目集设计与分析:
- 7-4
编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。
类图:

其中:
- boolean blank(String k);是对字符串是否为空进行匹配
- boolean match(String k);是是否匹配到“exit”
- math(String k,String[] a,String[] key,int[] r);是用来计算关键词出现的次数
- String take(String k);用来替代各个符号
String []key= {"abstract","assert","boolean","break","byte","case","catch","char","class","const",
"continue","default","do","double","else","enum","extends","false","final","finally","float",
"for","goto","if","implements","import","instanceof", "int","interface","long","native","new",
"null","package", "private","protected","public","return","short","static", "strictfp","super",
"switch","synchronized","this","throw", "throws","transient","true","try","void","volatile","while"};
public static boolean match(String k) { if(Pattern.matches("exit",k)) { return true; } return false; } public static boolean blank(String k){ if(Pattern.matches("^\\s*|\\s*$",k)){ return true; } return false; }
Java集合框架应用的分析总结
先设置一个储存关键字的数组,再设置另一个数组将长度设置为53,初始化为0.
将输入的字符串分割,在class Deal中进行处理,判断是否输入为空或关键词在注释中。
若不在注释中或为空就在String take(String k)中进行替换,然后在出现该关键词的时候,对应的数组+1,表示出现次数。
结构分析:


该题的深度较广,使用的语句部分和调用次数较多,且在完成题目的过程中,有一个测试点无法通过。
- 7-5
参考题目7-3的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 设计类图如下
类图:

同题目集四的函数功能一样,只是将聚合的方式更改了一下。
- validate();用来判断数据是否正确
- format(int);判断前n天的天数
- after(int);判断后n天的天数
- sub(DateUtil,DateUtil)判断两个日期相差的天数
题目集4(7-2)将Year、Month、Day、DateUtil一层一层聚合,在DateUtil中运用day.getmonth().getvalue()的形式访问,通过一层一层访问来调用Year、Month、Day,相较于题目集4中的方法,这题的聚合方法更加方便简单,Year、Month、Day全部在DateUtil里聚合,直接通过访问DateUtil来调用Year、Month、Day,使代码一目了然,清晰简洁,是对题目集4聚合方法的一种改进。
结构分析:



该题复杂度较广,简单将聚合方式更改,换为另一种聚合方式。
(二)第五次题目集采坑心得
前三题的题目比较简单,测试点比较好过。
第四题能输出正常数据,但正常数据测试的测试点过不去,至今还没清楚怎么过。
第五题在题目集四(7-2)的基础上修改结构后,下n天:整型数最大值测试、前n天:整型数最小值测试的测试点总是显示超时,花了较大时间观察,发现第n天的数据输入时会导致数据溢出,只需将天数从int类型改为long类型即可解决。
(三)第四次题目集改进建议
题目集四相比起题目集三来说,除了第四题测试点稍微有点问题、写起来稍微困难以外,难度稍难,题目1-3题和第5题难度适中。
3.第六次题目集
前言:
第六次题目集的难度比起第五次题目集又减少了一些,运用到了继承与多态、接口与多态的知识点。
前四题是正则表达式的训练,让我们稍微掌握了正则表达式的写法。
第五题稍微困难一点,其他题目较为简单。
- 7-5
掌握类的继承、多态性及其使用方法。
类图:

其中:
sort(ArrayList<shape>);是对定义的ArrayList<shape>的储存方法进行面积大小的排序。
渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)
class Circle、Rectangle、Triangle继承与class Shape。
采用的是抽象类定义、实体类构建的方式。即 Shape 为抽象类,Circle、Rectangle 及 Triangle 为实体类。
getArea()方法为抽象方法,功能为求得图形的面积;validate()方法也为抽象方法,对图形的属性进行合法性校验;toString()继承自 Object,功能为输出图形的面积信息。
父类定义子类构建、接口定义实现类构建和抽象类定义实体类构建,子类再重写父类中的validate()和getArea()方法。
主函数利用多态,例如:
ArrayList<Shape> w=new ArrayList<>(); w.add(new Rectangle(width, length));
结构分析:


平均深度较深,结构比较复杂,调用参数的次数较多。
- 7-6
编写程序,使用接口及类实现多态性
类图:

图形继承设计的思路与技术运用(封装、继承、多态、接口等)
GetArea为一个接口,无属性,只有一个GetArea(求面积)的抽象方法;
Circle及Rectangle分别为圆类及矩形类,分别实现GetArea接口;
在两个子类中重写了接口中的求面积的值。
在Main类的主方法中分别定义一个圆类对象及矩形类对象,使用接口的引用分别调用圆类对象及矩形类对象的求面积的方法,直接输出两个图形的面积值。
利用:
Circle a = new Circle(r); Rectangle b = new Rectangle(width, length); GetArea w1 = a; GetArea w2 = b;
来进行多态转换。
结构分析:


题目的深度和复杂度一般,题目较为简单。
(二)第六次题目集采坑心得
在写该题目集的过程中并未遇到很多困难,前四题运用较为基础的正则表达式进行判断。
第五题编写的时候需要仔细谨慎,善用debug发现错误,第一个测试点数量非法不太容易通过,要比较细心发现逻辑错误,注意完成题目所给的要求,查询了较多资料。
第六题相对而言比较简单,只需掌握好接口的使用方法就可以写出来。
(三)第四次题目集改进建议
题目设置得较为合理,没有什么需要改进的地方。
--------------------总结------------------
- 题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣比较
题目集4(7-2)将Year、Month、Day、DateUtil一层一层聚合,在DateUtil中运用day.getmonth().getvalue()的形式访问,通过一层一层访问来调用Year、Month、Day,实现多个相关类之间的相互调用,相较于题目集4中的方法,题目集5(7-4)的聚合方法更加方便简单,Year、Month、Day全部在DateUtil里聚合,直接通过访问DateUtil来调用Year、Month、Day,使代码一目了然,清晰简洁,是对题目集4聚合方法的一种改进。
- 题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)
题目集4(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();//求立方体体积
题目集6(7-5):
class Circle、Rectangle、Triangle继承与class Shape。
采用的是抽象类定义、实体类构建的方式。即 Shape 为抽象类,Circle、Rectangle 及 Triangle 为实体类。
getArea()方法为抽象方法,功能为求得图形的面积;validate()方法也为抽象方法,对图形的属性进行合法性校验;toString()继承自 Object,功能为输出图形的面积信息。
父类定义子类构建、接口定义实现类构建和抽象类定义实体类构建,子类再重写父类中的validate()和getArea()方法。
主函数利用多态,例如:
ArrayList<Shape> w=new ArrayList<>(); w.add(new Rectangle(width, length));
题目集6(7-6):
GetArea为一个接口,无属性,只有一个GetArea(求面积)的抽象方法;
Circle及Rectangle分别为圆类及矩形类,分别实现GetArea接口;
在两个子类中重写了接口中的求面积的值。
在Main类的主方法中分别定义一个圆类对象及矩形类对象,使用接口的引用分别调用圆类对象及矩形类对象的求面积的方法,直接输出两个图形的面积值。
利用:
Circle a = new Circle(r);
Rectangle b = new Rectangle(width, length);
GetArea w1 = a;
GetArea w2 = b;
来进行多态转换。
- 对三次题目集中用到的正则表达式技术的分析总结
正则表达式的总体难度比较困难,第四次题目集使用Java中的字符串处理类以及正则表达式对输入字符串数据进行合法性校验及计算,输入的数据需要对它进行分割判断,近似于多次分割判断,难度较大。第五次题目集运用正则表达式求关键字出现的次数,同样是利用分割的方式,将注释与代码部分隔开,在一个一个匹配检索,难度较难。第六次题目集是运用最基础的正则表达式进行对输入数据的匹配,比较简单。
- 题目集5(7-4)中Java集合框架应用的分析总结
先设置一个储存关键字的数组,再设置另一个数组将长度设置为53,初始化为0.
将输入的字符串分割,在class Deal中进行处理,判断是否输入为空或关键词在注释中。
若不在注释中或为空就在String take(String k)中进行替换,然后在出现该关键词的时候,对应的数组+1,表示出现次数。
总的来说,经过这三次的题目集练习,我学会了很多,学会了比较基础的正则表达式,但是较难的还是无法掌握,通过练习的题目,学到了继承、接口与多态的使用方法,明白了不同聚合的优劣势,能够更加理解聚合对于参数的赋值与调用。

浙公网安备 33010602011771号