Blog2

(1)前言:

 

   题目集4

  1,水文数据校验及处理----正则表达式对输入字符串数据进行合法性校验及计算

  2,日期问题面向对象设计(聚合一)-----由类图写出代码,以及实现类图中的方法。了解继承的用法

  3,图形继承-----考察类的继承,使用继承,使得父类中的方法可在子类中使用

 

  难度分析:第一题,有一定难度,要求利用正则对输入字符串进行检验,先前未在实际运用中使用正则表达式,因此该题对我而言十分吃力。

       第二题,在给出类图的情况下,只需按照类图编写,以及实现其中的方法即可,难度不大。

       第三题,也较为简单,图形的继承,涉及到重载的使用,以及对数据格式化输出。

 

  题目集5

  1,找出最长的单词-hebust -----考察正则表达式中Pattern类和split的用法

  2,合并两个有序数组为新的有序数组-----数组的运用和排序

  3,对整型数据排序----插入、选择、冒泡排序

  4,统计Java程序中关键词的出现次数----arrayslist的运用,合理使用Pattern、Matcher类中的方法find

  5,日期问题面向对象设计(聚合二)----合理运用聚合,使代码可复用 

 

  难度分析:第一题,利用split对输入字符串分割后,依次求出单词长度,取最大输出即可。

       第二题,与前面题目集中题目相同,考察运用数组。

       第三题,三种排序的实现,在C语言的学习中已经了解到,难度不大。

       第四题,统计代码中的关键字,用array list将每一行加入list中,再在list中搜索关键字。

       第五题,聚合的使用,在某个类中聚合其他类。

 

  题目集6

  1,正则表达式训练-QQ号校验----考察正则表达式是否匹配成功

  2,字符串训练-字符排序----字符串转化为字符数组,再对字符数组排序

  3,正则表达式训练-验证码校验 ----考察正则表达式的使用

  4,正则表达式训练-学号校验----考察正则表达式的使用

  5,图形继承与多态 -----考察类的继承、多态性及其使用方法

  6,实现图形接口及多态性-----使用接口及类实现多态性

 

  难度分析:经过前面的学习,前四题都较为基础。

       第五题,与题目集4的最后一题类似,此处合理运用了多态,在不同类中,方法的功能相同。

       第六题,利用接口,实现多态,较为简单。

 

(2)设计与分析

 

①题目集4(7-2)、题目集5(7-5)两种日期类聚合设计的优劣比较

 

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

 

类图

 

 

 SourceMonitor的报表:

 

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

 

类图

 

 

 

 SourceMonitor的报表:

 

优劣比较:

前者,一步步使用聚合。

后者,直接在最后将日期的类聚合同一类中。

 由SourceMonitor的报表,可以明显看出后者复杂度更高,代码量与之类似,但从程序效率来看,后者不如前者。

 从类图来看,后者明显逻辑更加清晰,大大减少了各类之间的关系,符合面向对象设计原则---迪米特法则---尽量减少类的耦合性。

 

②题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)

 

题目集4(7-3)--图形继承

 

类图

 

 SourceMonitor的报表:

 

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

 

类图

 

 

 SourceMonitor的报表:

 

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

 

类图

 

 

 SourceMonitor的报表:

 

分析:

经过三次的练习,一步步简化代码量,提高效率。

由最开始的,直接通过继承,在子类中使用父类的方法。

再学习到使用多态,修改在子类中改写父类的方法,使得在不同图形中,都能得到相同的属性---面积。

最后,又学习到使用接口,接口的使用与多态相比,更为简便,在接口中定义抽象方法,在子类中实现。

在面对相同的问题时,使用不同的技术,达到的效果天差地别。

因此就要一步步学习新的技术,提高效率,减少代码量

 

③对三次题目集中用到的正则表达式技术的分析总结

 

三次题目集中的正则表达式,都较为简单,都是简单的检验数字是否合法。

 正则表达式的基础使用

1 开始             ^     
2 结束             $     
3 数字             [0-9]  
4 等价于[0-9]      \d
5 小写字母         [a-z] 
6 大写字母         [A-Z]
7 m-n位的数字    ^\d{m,n}$

 

④题目集5(7-4)中Java集合框架应用的分析总结

此题中,使用List中的ArrayList动态储存输入的数据。

ArrayList是一个可动态调整大小的实现List的集合。

List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。

再使用get方法进行查询操作。

 

(3)采坑心得:

 

 在求球的体积时,涉及到4/3的计算

1      int a=3,b=4;
2         double c=b/a;

但输出为

 

修改后,得到正确结果

1      double a=3,b=4;
2         double c=b/a;

 

  

 

 

 在让result年份自增到result+y时,出现逻辑错误,变成了年份累加

1             for(i=0;i<y;i++) {
2                         
3                         result.year.setValue(result.year.getValue()+i);//变成了累加 1+2+3.....
4                         
5                         if(result.year.isLeapYear())
6                             n++;
7     
8                     }

修正后:先增后减,就能依次判断从result到result+y的年份是否为闰年

1             for(i=0;i<y;i++) {
2                         
3                         result.year.setValue(result.year.getValue()+i);
4                         
5                         if(result.year.isLeapYear())
6                             n++;
7                         result.year.setValue(result.year.getValue()-i);
8                         
9                     }

 

 

 

(4)改进建议:

 

在求日期的后n天时,初次使用的方法为一天一天的往后加天数,效率极低

 1 DateUtil getNextNDays(int n){//求后N天
 2         
 3         for(int i=0;i<n;i++) {
 4             
 5             day.dayIncrement();
 6             
 7             if(!day.validate()) {//跨月
 8             //月份加1 天数重置为1
 9                 day.getMonth().monthIncrement();
10                 
11                 if(!day.getMonth().validate()) {//跨年
12                     //年份加1 月份 天数重置
13                         day.getMonth().getYear().yearIncrement();
14                         day.getMonth().resetMin();
15                         day.resetMin();
16                 }
17                 
18                 day.resetMin();
19             }
20             
21         }
22         DateUtil result = new DateUtil(day.getMonth().getYear().getValue(),day.getMonth().getValue(),day.getValue());
23         return result;
24     }

 

对此改进,可以将日期转化为年份和总天数,在增加n天后,计算增加年份,再将总天数转化为月份和天数。

 求前n天也与之类似。

 1 DateUtil getNextNDays(int n){//求后N天
 2         
 3         int [] mon_maxnum= {31,28,31,30,31,30,31,31,30,31,30,31};//各月份的天数
 4         int []a={0,31,59,90,120,151,181,212,243,273,304,334};//前面月份的总天数
 5         int TotalDays=0,i=0,t=0;
 6         
 7         for(i=0;i<day.getMonth().getValue()-1;i++) {
 8             
 9             TotalDays+=mon_maxnum[i];
10         }
11         
12         
13         t=TotalDays/365+day.getMonth().getYear().getValue();//新的年份
14         day.getMonth().getYear().setValue(t);
15         
16         for(i=0;i<a.length;i++) {
17             if(TotalDays%365>a[i]) {
18                 day.getMonth().setValue(i);//新的月份
19                 day.setValue(TotalDays%365-a[i]);
20             }    
21         }
22         
23         DateUtil result = new DateUtil(day.getMonth().getYear().getValue(),day.getMonth().getValue(),day.getValue());
24         return result;
25     }

 

 

 

在合并数组并排序中,排序使用冒泡排序,

 1         for(i=0;i<list3.length-1;i++) {
 2                 for(j=0;j<list3.length-i-1;j++) {
 3                     if(list3[j]>list3[j+1]) {
 4                         t=list3[j];
 5                         list3[j]=list3[j+1];
 6                         list3[j+1]=t;
 7                     }
 8                     
 9                     
10                 }
11                 
12             }

改进,直接使用,arraylist中的方法sort,

1 Arrays.sort(list3);

 

 

(5)总结:          

学到了什么:

面向对象的三个基本特征

1,封装

2,继承

3,多态

都基本了解到了如何使用,以及作用。

与之相应的,也学习到了使用重载、聚合、接口等,来一步步减少代码量,提高程序效率。

还了解到,面向对象设计的一些基本原则,迪米特法则、单一职责等等。

用正则表达式对数据的合法性检验。

 

需要进一步学习及研究:

正则表达式的运用不太熟练,需要多加学习和练习。

初次使用接口,接口中只能定义常量和抽象方法,还需加强学习。

还有抽象类、方法的使用。

 

posted @ 2021-05-02 15:02  见到  阅读(62)  评论(0)    收藏  举报