第二次博客

前言:
第四次作业知识点:
正则表达式的运用、CheckData、DealData两个类的作用、日期类的聚合、类之间的继承关系
题量:三道,较少
难度:较难,三道题都不简单。
第五次作业知识点:
聚合关系、接口、合并数组、排序
题量:四道,一般
难度:第一题较难,其他一般
第六次作业知识点:
正则表达式的运用、字符串排序、继承与多态、ArrayList常用方法及和数组的关系、Arrays及Collections的简单应用、封装继承多态及接口
题量:六道,较多
难度:前四道较简单,后两道较难

分析:
第四次作业7-2日期问题面向对象设计(聚合一):
设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] ,应用程序共测试三个功能:
求下n天        求前n天       求两个日期相差的天数
类图:

圈复杂度:

分析:按照类图,将日月年分别放入一个类中,但日类中含有月类,月类中含有年类,日类中日期的变化带着月和年共同变化,代码的关键在于日类的实现。
踩坑心得:因为本题的类图已给,我们需要做的就是按照类图补充具体实现的方法,但在实现代码的过程中发现,各类之间总是不能很好的连接,经过修改发现,类之间的嵌套使用,get和set方法很重要。
改进建议:在求两个日期之间天数时,用的是for循环语句,耗时较多,可以用年月日一一对应所得的差距来计算,如2000年到2010年相差十年,可算作365x10,但还要注意此中是否含有闰年,月日都可以这样来算。

第五次作业7-5日期问题面向对象设计(聚合二)
设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] ,应用程序共测试三个功能:
求下n天     求前n天      求两个日期相差的天数
类图:

圈复杂度:

分析:本次作业与第四次作业相似,差别是日类中不再含有月类,月类中不含有年类,三个类之间的关联全都放在DateUtil类中实现。
踩坑心得:因为本题将三个类的行为全部独立出来,他们之间的关联都放在DateUtil中实现,所以在进行日期的变化时需要考虑的比较多,要做好三个类之间的变化关系。
改进建议:可在DateUtil类中另加一个方法,来实现日期的增减合理。

两次日期类的优劣比较:两次日期类的结构相差不多,但第二次日期类的时间复杂度比第一次的更低,第一次用for循环来求两个日期之间的天数,所用时间较长,第二次用两次日期直接年月日的差来求,所用时间较少。

 

第四次作业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
类图:

 


圈复杂度:

 

分析:本题的重点是继承,这些图形类共有的方法是求面积getArea,但各图形的具体求面积方法都不同,所以在继承父类时,我们需要重写这个方法即可。其实我们只需要考虑好子类与父类有哪些不同,子类在继承父类时有哪些属性需要增加,哪些方法需要重写,这题就很好解决。

第六次作业7-5图形继承与多态
输入格式:
从键盘首先输入三个整型值(例如a b c),分别代表想要创建的Circle、Rectangle及Triangle对象的数量,然后根据图形数量继续输入各对象的属性值(均为实型数),数与数之间可以用一个或多个空格或回车分隔。
输出格式:
如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边关系),则输出Wrong Format。
如果输入合法,则正常输出,输出内容如下(输出格式见输入输出示例):
各个图形的面积;
所有图形的面积总和;
排序后的各个图形面积;
再次所有图形的面积总和。
类图:

 


圈复杂度:

 

分析:本题重点是基于继承上多态的应用以及ArrayList数组的运用。先用继承的方式创建图形类,再将所有的图形类加入ArrayList数组中,并在数组中按照面积大小排序即可。
踩坑心得:开始并不知道如何在ArrayList数组中进行类的排序,通过搜查资料才知道ArrayList数组sort方法,理解后才知道与平常的排序方法原理一样,只是通过比较类中某个值来确定类在数组中的位置。

    public static ArrayList<Shape> sort(ArrayList<Shape> w){
    int i=0,j=0;
    double a=0,b=0,t=0;
    Shape k;
        for (i = 0; i < w.size(); i++) {
            for (j = 0; j < w.size() - i - 1; j++) {
                if (w.get(j).getArea() >= w.get(j + 1).getArea()) {
                    k = w.get(j);
                    w.set(j, w.get(j + 1));
                    w.set(j + 1, k);
                }
            }
        }
        return w;
}

 

第六次作业7-6实现图形接口及多态性
编写程序,使用接口及类实现多态性,GetArea为一个接口,无属性,只有一个GetArea(求面积)的抽象方法;
Circle及Rectangle分别为圆类及矩形类,分别实现GetArea接口
要求:在Main类的主方法中分别定义一个圆类对象及矩形类对象(其属性值由键盘输入),使用接口的引用分别调用圆类对象及矩形类对象的求面积的方法,直接输出两个图形的面积值。(要求只保留两位小数)
输入格式:
从键盘分别输入圆的半径值及矩形的宽、长的值,用空格分开。
输出格式:
如果输入的圆的半径值及矩形的宽、长的值非法(≤0),则输出Wrong Format
如果输入合法,则分别输出圆的面积和矩形的面积值(各占一行),保留两位小数。
类图:

 

圈复杂度:

分析:本题考察的是接口及类实现多态性,在代码中使用interface GetArea来实现求面积方法的接口定义,在图形类里使用求面积接口,较为简单

interface GetArea{
     double getArea();
}

 

三次作业所用到的正则表达式总结

在第四次作业的7-1水文数据校验及处理中,运用了非常复杂的正则表达式,提别是检验测量日期的正则表达式,在这题中,我需要将输入的一条条数据分开,还要除去其中的空格

String a1=x.nextLine();
        String exit="exit";
        while (!a1.equals(exit)){
            a.append('\n').append(a1);
            a1=x.nextLine();
        }

然后再用split来分开他们

String kp= String.valueOf(a);
        String[] b =kp.split("\n");

再来用正则表达式来分别校验他们的错对。

String time1= "(((([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)";
        String kp1="([1-9][0-9]{0,2}(\\.[0-9]{1,3})?)";
        String kdkp="([1-9]\\.[0-9]{2})";

在第六次作业中的三道正则表达式都较为简单,容易理解,不做解释。

 

第五次作业7-4统计Java程序中关键词的出现次数

编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下:

Java中共有53个关键字(自行百度)

从键盘输入一段源码,统计这段源码中出现的关键字的数量

注释中出现的关键字不用统计

字符串中出现的关键字不用统计

统计出的关键字及数量按照关键字升序进行排序输出

未输入源码则认为输入非法

 

圈复杂度:

 分析:本题运用了Pattern和Matcher等方法,这道题最难的地方是将代码中的词提取出来,再进行比照,我先将代码中所有的符号变成空格,让所有的词全都按空格分隔开,然后用split将代码中的词提取出来

 s=s.replace("["," ");
     s=s.replace("]"," ");
    s=s.replace("-"," ");
     s=s.replace("*"," ");
     s=s.replace("/"," ");
     s=s.replace("+"," ");
    s=s.replace(">"," ");
     s=s.replace("="," ");
    s=s.replace("!"," ");
     s=s.replace(":"," ");
    s=s.replace("\\"," ");
     s= s.replaceAll("[^a-zA-Z]", " ");
    String []s1=s.split(" ");

然后创建一个大小为53的数组,当检查到某个关键字出现时,其对应的数组位加一

    for(int k=0;k<arr.length;k++)
        arr[k]=0;
    for(int i=0;i<s1.length;i++)
    {
        for( j=0;j<key.length;j++)
        if(s1[i].equals(key[j]))
        {    
            arr[j]++;
    }
    }

最后输出不为0的数组位及其对应的关键字即可。

总结:本阶段的三次作业让我学到了不少新知识,像正则表达式的使用,split方法的运用,Pattern和Matcher的使用等等,这些都是新的知识,最主要的是学习到了Java的三大特性:封闭、继承、多态。通过这三次作业的一次次练习,我对这三大特性的理解越来越深刻,运用的也越来越熟练,虽然还是有很多不懂得地方,但相信通过以后的练习终会掌握的。老师教的非常阔以哈,没得话说,在课上多讲点例子就更好了。

posted @ 2021-11-13 19:31  cbsldcbsl  阅读(51)  评论(0)    收藏  举报