题目集4-6总结性blog

(1)前言:

题目集4-6知识点总结:作业包含Java语法的基本使用,Java对象和方法的认识,面向对象设计方法的认识。,题目集4-6主要考察了我们有关于正则表达式,各种问题的面向对象设计,继承,对字符串的各种操作,找出最长单词,合并有序数组,对整形数据排序,统计出现的java关键字次数,多态等等,属于java的核心知识,也是与c语言不同且更有用的知识。题量方面我觉得适中,不多也不少,难度由简到难,对于我理解巩固知识有很大的帮助。只是有部分题目较难,我还无法正确解出来,有些问题解决不成功。难度不要偏重于单一的部分,不要像第四次作业的第一题水文校验一样,大部分时间都用在了对数据格式的验证上,实际上实现功能并不难,但是大部分时间花在了编写正则表达式上。题量两三题即可,代码的完整性还是很重要的。

(2)设计与分析

题目集4  7-2 日期问题面向对象设计(聚合一)是Main类依赖DateUtil类,DateUtil类聚合Day类,Day类聚合Month类,Month类聚合Year类,而题目集5 7-5 日期问题面向对象设计(聚合二)是Main类依赖DateUtil类,DateUtil类同时聚合Day,Month,Year这三个类,类与类之间的关系不同。

面向过程与面向对象的比较 

         面向过程思路直接,按照步骤一步一步完成所需任务即可。面向过程是对任务和事务的抽象,不是按照步骤,而是通过各个不同部分\不同对象之间的关系来完成任务。

         第二,面向对象需要思考好类的设计,如果类设计的不好,程序的耦合性和复杂性会非常的高。

面向对象设计的基本原则理解

         1. 单一功能原则:

                一个类或一个方法,应该只干一件事。

         2. 开闭原则:

            在设计的过程中,应该逐步抽象出更高级的抽象,在新功能或者调整出现时,只需要扩展和很小的修改,尽可能的减少修改。

 

 

 

 题目集4 7-3 图形继承

我首先是定义了一个Shape类作为父类,Circle类,Rectangle类都继承自Shape类,然后Ball类又继承自Circle类,Box类继承自Rectangle类。层层继承,Shape类是Circle类和Rectangle类的父类,Circle类又是Ball类的父类,Rectangle类是Box类的父类。类图如下:

 

题目集6 7-5  图形继承与多态 

我是先定义了Circle类和Rectangle类还有Triangle类,Main类运用多态区调用三个类中的各个方法来判断输入是否合法如果合法则返回面积。最后依次相加得到各个图形面积之和。

定义一个GJHS(工具函数)类来使用一个接口。

题目集6 7-6

接口方面的知识我还不太熟练,所以这道题暂时没有解答出来。

 

正则表达式

正则表达式这方面我在这三次作业中琢磨了很久,现在已经基本会使用了,题目集4 7-1 水文数据校验及处理中的正则表达式我思考了许久,现在一一解释

if(!s.matches("[1-9][0-9]{0,3}/(2|3|4|5|6|7|8|10|9|11|12|1)/([1-2]\\d|3[0-1]|[1-9])\\s(2|4|6|8|10|12|14|16|18|20|22|24):[1-60]{2}\\|([1-9][0-9]{0,2}(.[0-9]{3}|.[0-9]{2}|.[0-9]{1})?|1000)\\|([1-9][0-9]{0,2}(.[0-9]{3}|.[0-9]{2}|.[0-9]{1})?|1000)\\|([1-9](.[0-9]{2}|.[0-9]{1})|10.00)/([1-9](.[0-9]{2}|.[0-9]{1})|10.00)\\|([1-9][0-9]{0,3}(.[0-9]{3}|.[0-9]{2}|.[0-9]{1})?|1000)")) 

对应校验格式是

2015/8/2 4:00|133.840|133.070|1.11/1.21|75.780

[1-9][0-9]{0,3}代表,[1-9]第一位数字校验一次,[0-9]第2-4位数字校验三次,因为题目要求第一位数字不能为0

(2|3|4|5|6|7|8|10|9|11|12|1)  代表1-12校验1次,1如果不放最后的校验的话,那么11,12会不满足输入,所以1得放最后来匹配

([1-2]\\d|3[0-1]|[1-9])  代表匹配两次第一位匹配1或者2的时候第二位匹配0-9满足,或者匹配两次第一位匹配3的时候第二位只能匹配0或者1满足,或者只匹配一次1-9。就是日的1-31天。

(2|4|6|8|10|12|14|16|18|20|22|24):[1-60]{2}      (2|4|6|8|10|12|14|16|18|20|22|24)代表匹配2-24小时,[1-60]{2}代表匹配1-60分钟。

([1-9][0-9]{0,2}(.[0-9]{3}|.[0-9]{2}|.[0-9]{1})?|1000)     [1-9][0-9]{0,2}代表先1-9匹配一次,因为首位不能为0,0-9匹配0-2次。[0-9]{3}|.[0-9]{2}|.[0-9]{1})?|1000  代表匹配000-999或者匹配1000.

剩下的就不一一介绍了,我觉得这题主要难度是在正则表达式的书写上,所以我把正则表达式写出来了之后就没时间写其余代码了。之后匆匆提交。

 

 

题目集6  7-1 正则表达式训练-QQ号校验 

正则表达式

[1-9][0-9]{4,14}  [1-9]代表第一位1-9匹配一次,不包括0了已经。[0-9]{4,14}代表除了第一位剩下的匹配4-14次0-9,所以QQ号可以是5-15位的。

这道题相比较水文数据处理来说,算是小菜一碟了

 

 

题目集6  7-3 正则表达式训练-验证码校验 

[0-9a-zA-Z]{4} 代表,0-9或者a-z或者A-Z匹配4次,也是比较简单。

 

 

题目集5 7-4 统计Java程序中关键词的出现次数

Java集合框架应用的分析总结

 

 

 从上图中可以看出,集合类主要分为两大类:Collection和Map。

Collection是List、Set等集合高度抽象出来的接口,它包含了这些集合的基本操作,它主要又分为两大部分:List和Set。

Map是一个映射接口,其中的每个元素都是一个key-value键值对,同样抽象类AbstractMap通过适配器模式实现了Map接口中的大部分函数。

 

(3)踩坑心得

题目集7-1 水文数据校验及处理

关于正则表达式,我在Regex Util插件中得到的正确的正则表达式复制进入程序中,自动会添加/导致判断错误,最后我在同学的帮助下发现并纠正了这个小错误。

 

 其实我这个正则表达式是没有错误的,只是因为在java代码中会自动添加/导致格式错误,我现在都不知道怎么解决这个问题。

题目集1 7-2 日期问题面向对象设计(聚合一)

 

 

 

 

 

 一开始我不知道为什么这个月越界测试过不去,因为我一开始是用1 和2功能测试的月越界测试,程序都正确的报错了,我在写blog时选择用3功能来测试月越界,结果程序真的出错了。我写完blog后会去改正。在3功能if条件里加点判断语句就好

 

题目集4 7-3 图形继承

这道题我开始时在父类Shape中忘了加

public double getMianji(){
return 0.0;
}

方法。

并且输出格式出错了,忘了保留两位小数,最后在输出语句中%f改为%.2f\n就好了。

 

 

 

 

 

 

题目集5 7-1 找出最长的单词-hebust

这道题让我了解了如何用空格去分割一个字符串成位字符串数组。其实只要了解了split函数的用法这道题还是很简单的,一开始我不知道split函数,所以这道题真的无从下手,后面请教了同学才知道如何解答这道题

 

 

题目集5 7-2 合并两个有序数组为新的有序数组

int i,j;
int a=input.nextInt();
int [] a1=new int[a];
for(i =0;i<a1.length;i++)
{
a1[i]=input.nextInt();
}
i=0;
int b=input.nextInt();
int [] b1=new int[b];
int [] c1=new int[a+b];
for(j =0;j<b1.length;j++)
{
b1[j]=input.nextInt();
}
j=0;

一开始忘了在输入完两个数组数据后,忘了将i和j重新赋值为0,导致后面的代码中数组元素作比较是从最后一个数组元素进行比较的,再i++或者j++的话数组就越界了。

 

 错误输出是这样的

 

 这就是数组越界的错误输出。

题目集5 7-3 对整型数据排序

冒泡排序中

for (i=0; i<list.length; i++)
{
for(j=0;j<list.length;j++)
{
if ( list[i] < list[j])
{
temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
}

两个for循环一开始我外层循环是从1开始到list.length,内层循环从0开始到list.length-1,结果排序出错了,没有排序完全,最后我把外层和内层循环都改成了0-list.length,答案正确

 

 

错误答案

 

 至于其他两种排序都是数据结构中常讲到的,还是比较熟练的,没出什么错误。

题目集5 7-4 统计Java程序中关键词的出现次数

这道题现在还没写出来。不太了解Java集合框架应用。以后会加强了解这方面知识。

题目集5 7-5 日期问题面向对象设计(聚合二)

 

 不知道为什么这三个地方出错了,我不知道最大值和最小值到底是多少,所以不知道哪里出错了。

 

题目集6 7-1 正则表达式训练-QQ号校验

关于正则表达式[1-9][0-9]{4,14}

一开始我是直接使用[0-9]{5,15}的,忘记了首位数字不能是0的限制条件导致错误。

 

 

题目集6 7-2 字符串训练-字符排序

不知道这连个函数的用法

char[] b=a.toCharArray();

这是ToCharArray( )的用法,将字符串对象中的字符转换为一个字符数组。

详解释就是:

字符串转换成字符数组后,每个字符的ASC码与字符T的ASC码进行二进制异或运算。

最后把结果转换回字符。


Arrays.sort(b);

Arrays.sort(arr,Comparator<>)
对数组中相邻的两个数进行比较
一轮完了接着二轮 是一个冒泡排序

正确输出

 

 

题目集6 7-3 正则表达式训练-验证码校验 

不知道怎么同时检验0-9a-zA-Z,最后通过百度知道直接把0-9a-zA-Z放到校验条件中就好,正则表达式如下

[0-9a-zA-Z]{4}

正确输出结果

 

 

题目集6 7-4 正则表达式训练-学号校验 

这道题的正则表达式也是稍微有点复杂,但是相比较于那个水文数据的正则表达式来说还是太弟弟了

[2]{1}[0]{1}[2]{1}[0]{1}[11,12,13,14,15,16,17,61,71,72,73,81,82]{2}(([1-3]{1}[0-9]{1})|40|01|02|03|04|05|06|07|08|09)

在学号部分我直接或了一个|40|01|02|03|04|05|06|07|08|09,来校验01-09的学号和40的学号。

正则表达式还是比较熟练的。  

 

 

题目集6 7-5 图形继承与多态

这道题忘了保留两位小数,最后在输出部分加了%.2f\n,答案正确

还有

int a = input.nextInt();
int b = input.nextInt();
int c = input.nextInt();
if(a>=0&&b>=0&&c>=0)

我一开始用了或,导致答案错误

 

正确输出结果

 

 

题目集6 7-6  实现图形接口及多态性

保留两位小数出错了,最后更改输出格式为

System.out.println(Math.round(circle.getMianji()*100)*0.01d);

System.out.println(Math.round(rectangle.getMianji()*100)*0.01d);

但是pta还是报错,我也是不知道为什么

 

 

 

 

 

 

(4)改进建议

题目集4 7-2和题目集5 7-5 可以把

while(n!=0)
{
switch (month){
case 1:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 2:
if(((year%4==0&&year%100!=0)||year%400==0)&&day==29)
{
month++;
day=1;
}
else if(!((year%4==0&&year%100!=0)||year%400==0)&&day==28)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 3:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 4:
if(day==30)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 5:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 6:
if(day==30)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 7:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 8:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 9:
if(day==30)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 10:
if(day==31)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 11:
if(day==30)
{
month++;
day=1;
}
else
{
day++;
}
break;
case 12:
if(day==31)
{
year++;
month=1;
day=1;
}
else
{
day++;
}
break;
}
n++;
if(n==0)
{
System.out.println(year + "-" + month + "-" + day);
System.exit(0);
}
}

代码中的运算方法改简洁一点,更快更便捷的得出日期。

(5)总结

 

 面向对象过程相比于面向过程,更为复杂,实现起来较为简单,主要是观念的转变问题,复杂在总体设计上,往往花费时间更久,通常大于编码时间,需要考虑功能的扩展和复用。同时,设计方案有很多种,第一思路往往不是最好的,需要反复思考,逐步迭代。

 在写了很多次关于图形的作业后很快吸收了继承和多态的意义,从这个角度出发,让我领会了面向对象的意义。同时我也学会了正则表达式的使用,这让我知道了知识的萃取不能光依赖老师的讲解,我们需要及时在网络上查阅相关资料来获得知识。总之我的代码水平在这三次作业中得到了很大的提高,解决问题的独立性也因此增强。

 

posted @ 2021-04-29 12:40  yys's  阅读(93)  评论(0)    收藏  举报