Blog作业02
题目集4~6总结
一、前言
题目集合4~6主要考察了与JAVA类相关的概念,诸如聚合,继承,等概念,总体来说难度不大,题量也不算多,只是题个别题目目复杂程度较高,花费的时间多一点。
二、设计与分析
7-2 日期问题面向对象设计(聚合一) (35 分)
参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:
解题思路
该题比较简单,题目类图已经给出,只需将功能一一实现即可。
复杂度测试

类图

7-5 日期问题面向对象设计(聚合二) (40 分)
参考题目7-3的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:
解题思路
该题比较简单,题目类图已经给出,只需将功能一一实现即可。
复杂度测试

类图

两种聚合的比较
聚合一像火车,一环扣一环,坏了任一环,火车跑不起,聚合二像乐高,准备好零件,在聚合在一起实现功能,某个零件坏了可以单独更换,更加成熟。
7-3 图形继承 (15 分)
编写程序,实现图形类的继承,并定义相应类对象并进行测试。
- 类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,则定义立方体类,从键盘输入立方体的宽、长和高度后,主要输出立方体的表面积和体积;
解题思路
比较简单的继承,依葫芦画瓢即可,比较简单
代码复杂度

类图

后继:
7-5 图形继承与多态 (50 分)
改题目仅仅在上题的概念上增加了多态的概念。
7-6 实现图形接口及多态性 (30 分)
此题又进行了一些小改动,仅仅增加了一个接口的概念,相信对于认真听MOOC的同学,30分包括上面的50分是十分好拿的,比较简单。
三题小总结
这三个题目相比于前面的求导,和水位检测,的确可以说是十分基础简单的题目,仅仅涉及基础概念而已,没有复杂的过程和抽象的算法,入门水平而已。但有助于巩固基础。
涉及知识点
多态性是指同一操作(某一方法)作用于某一类对象(动物),可以有不同的结解释(重写),产生不同的执行结果。例如不同平台下按F1时有不同的解释
多态存在的三个必要条件
1 需要存在继承和实现的关系
2 同样的方法调用而执行不同操作,运行不同的代码(重写操作)
3 在运行时父类或者接口的引用变量必须引用其子类的对象
多态的作用
1多态通过分离做什么和怎么做,重另一个角度将接口和实现进行分离
2多态消除了类型之间的耦合关系
3多态的存在提高了程序的可扩展性和后期的可维护性
接口
1接口(interface)是抽象方法和常量值的定义的集合
2从本质上来讲,接口是一类特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现
3接口中申明的属性默认为public static final 也只能是public static final的
4接口中只能定义抽象方法 而且这些方法默认为public的 也只能是public的、
5接口可以继承其他接口 并添加新的属性和抽象方法
6多个无关类可以实现同一个接口 一个类可以实现多个无关接口 接口与接口之间可以相互继承
③对三次题目集中用到的正则表达式技术的分析总结
正则表达式是一个很好的工具,对于大量的数据提取和判断,起到了一个决定性作用,三次题目涉及到的正则,基本上把正则的基本概念涉及到了尤其是求导和水文检测,正则表达式很大程度上影响这后续的过程。
涉及知识点
Pattern
//基本匹配
boolean b = Pattern.matches("a*b", "aaaab");
System.out.println(b);
String的aplit的实现
//按照数字分割
Pattern p=Pattern.compile("\\d+");
String[] str=p.split("好456456像:0532214是");
for (int i = 0; i < str.length; i++) {
System.out.println(str[i]);
}
一般使用Pattern.matches(String regex,CharSequence input)是一个静态方法,用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串.
重点:#
matches方法尝试将整个输入序列与该模式匹配。lookingAt尝试将输入序列从头开始与该模式匹配。find方法扫描输入序列以查找与该模式匹配的下一个子序列。
// matches()对整个字符串进行匹配,只有整个字符串都匹配了才返回true
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
m.matches();//返回false,因为bb不能被\d+匹配,导致整个字符串匹配未成功.
Matcher m2=p.matcher("2223");
m2.matches();//返回true,因为\d+匹配到了整个字符串
// lookingAt()对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true
Pattern p1=Pattern.compile("\\d+");
Matcher m3=p1.matcher("22bb23");
m.lookingAt();//返回true,因为\d+匹配到了前面的22
Matcher m4=p1.matcher("aa2223");
m2.lookingAt();//返回false,因为\d+不能匹配前面的aa
// find()对字符串进行匹配,匹配到的字符串可以在任何位置.
Pattern p2=Pattern.compile("\\d+");
Matcher m5=p2.matcher("22bb23");
m.find();//返回true
Matcher m6=p2.matcher("aa2223");
m2.find();//返回true
Matcher m7=p2.matcher("aa2223bb");
m3.find();//返回true
Matcher m8=p2.matcher("aabb");
m4.find();//返回false
Mathcer.start()/
Matcher.end()/ Matcher.group()
当使用matches(),lookingAt(),find()执行匹配操作后,就可以利用以上三个方法得到更详细的信息.
- start()返回匹配到的子字符串在字符串中的索引位置.
- end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置. 即为最后位置加一
- group()返回匹配到的子字符串
④题目集5(7-4)中Java集合框架应用的分析总结
此题虽分值不高,但难度却一点不小
1、对关键字的检索
2、对关键字的统计
3、对干扰信息的过滤
主要的三大难点,一一攻克便可解决,然而此题涉及许多新知识,对于个人独立完成难度不小。
涉及知识点
Map集合概述和特点
概述:
将键映射到值的对象
一个映射不能包含重复的键
每个键最多只能映射到一个值
Map接口和Collection接口的不同
Map是双列的,Collection是单列的
Map的键唯一,Collection的子体系Set是唯一的
Map集合的数据结构针对键有效,跟值无关;Collection集合的数据结构是针对元素有效
Map集合的功能概述
a:添加功能
V put(K key,V value):添加元素。这个其实还有另一个功能?替换
如果键是第一次存储,就直接存储元素,返回null
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
b:删除功能
void clear():移除所有的键值对元素
V remove(Object key):根据键删除键值对元素,并把值返回
c:判断功能
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
d:获取功能
Set<Map.Entry<K,V>> entrySet(): 返回一个键值对的Set集合
V get(Object key):根据键获取值
Set keySet():获取集合中所有键的集合
Collection values():获取集合中所有值的集合
e:长度功能
int size():返回集合中的键值对的对数
三、踩坑心得
可能是经过第一次题目集的洗礼,此次题目集并无太大阻碍,暂时无踩坑心得可分享。
四、改进建议
1、虽然信息不透明是提高题目难度的方法之一,但学生还是希望这这种基础练习中关键提示可以尽量给足,或者老师多回答学生不清楚的地方(概念相关)因为大家对于标准的理解是会存在偏差的。例如求导那题,听说最后一个点是老师数据给错了3+1给成了31导致浪费了大量的时间依旧过不了点。
2、希望题目集结束后给出答案,或者讲解,以供学习和借鉴。
五、总结
题目量适中,难度适中,总结比较适合基础巩固。
六、心得
不足:知识点不全面,从题目中可以窥见,程序设计涉及的知识点十分的多,代码复杂度,类图,等等一系列的概念,而课堂时间有限,很多知识点不能涵盖全面,需要课下花大量时间自学,如果未认识到该点,只以解出PTA题目为目标的话,眼光是十分狭隘的,不利于后续学习,而编码能力,编码习惯,编码规划,更是需要大量的时间和精力去提高,仅仅只靠PTA是远远不够的。更不必提许多同学并没有理解软件工程的内涵所在,私以为软件工程重在设计,编码过程只是将脑海中的图纸实现的工具。我们要提高的除了编码能力,更重要的是逻辑,和设计思维。

浙公网安备 33010602011771号