第二次博客作业

 

 

前言

 

题目集4

 

本次题目集涉及到正则表达式的应用,如何实现继承。

 

题目数量偏少但是难度较大。因为涉及到了重要的继承关系,要从之前的写代码的逻辑中跳出来,需要多运用继承解决问题。

 

题目集5

 

本次的题目集涉及到了排序问题,可以用Arrays”,也可以运用三种排序方法,也涉及到了继承的使用,其中7-5与题目集4中的7-2的题目需求相似。

 

题目数量中等,难度也适中,其中7-4的难度偏大。

 

题目集6

 

   本次题目集主要涉及到了对正则表达式的考查,对继承和多态的考察,在7-6中涉及到了对接口新知识点的考察。

 

   题目数量中等,刚开始学习正则表达式时会有难度,但是在了解正则如何使用后,会发现这考察的是比较基础的正则表达式的知识。接口宇继承中的重写比较相似。

 

 

 

 

 

设计与分析

 

① 题目集47-2

 

   

 

根据类图可知:

 

    DateUtil Day 是聚合关系,Day类 与 Month类 是聚合关系 ,Month类 与 Year 类是聚合关系 , Main类 依赖 DateUtil 实现, 其中 DateUtil只和Day类有聚合关系,Year只和Month类有关系,Day类与DateUtilMonth两个类有聚合关系。

 

 

 

 

 

 

 

 

 

 

 

 

题目集57-5

 

 

 

 

 

 

根据类图可知:

 

   DateUtill 类分别与Day类,Year类,Month类三个类有聚合关系,而Day类,Year类,Month类,只和DateUtill类有聚合关系,三个类之间没有聚合关系。

 

 

 

两者的优劣比较:

 

   题目集5中将题目中提到的三个类彼此分开,各自执行自己的功能,通过DateUtil类进行联系,每个类的分工明确,Main类只需要直接与DateUtil类之间有依赖关系就可以了。

 

当要求求下N天,前N天时,以及两个日期之间相隔的天数时,三个类会各自实现变化,通过DateUtil传给Main类。 题目集5 中还将Day的 判断日期输入合理性 也放入了DateUtil类中。

 

   题目集4中将题目中所需的三个类彼此相互串联起来,前一个类与后一个类是聚合关系,当前面的类满足后一个类函数所要求的变化时,可以直接实现变化,当要求求下N天,前N天时,以及两个日期之间相隔的天数时,会将这一个类图从头开始实现一遍。

 

   

 

两个题目集中的差异主要是类对于DateUtil类的传数据的方式不同,题目集5 的传导方式更加便捷,题目集4 的传导方式相比较于题目集5 会有些复杂。但是题目集4 中的三个类之间的变换联系相比较于题目集5 更加的紧密,但是如果题目集4中的函数需要变动时,需要将三个类中的函数改变一下,类的独立性相比较之下就没有题目集5 的完整,题目集5 中的函数需要变动时只需要将各自负责的部分修改完,在检查报错中也是同样的道理。

 

 

 

 

 

 

 

②题目集47-3

 

Shape,无属性,有一个返回0.0的求图形面积的公有方法public double getArea();//求图形面积

 

Circle,继承自Shape,有一个私有实型的属性radius(半径),重写父类继承来的求面积方法,求圆的面积

 

Rectangle,继承自Shape,有两个私有实型属性widthlength,重写父类继承来的求面积方法,求矩形的面积

 

Ball,继承自Circle,其属性从父类继承,重写父类求面积方法,求球表面积,此外,定义一求球体积的方法public double getVolume();//求球体积

 

Box,继承自Rectangle,除从父类继承的属性外,再定义一个属性height,重写父类继承来的求面积方法,求立方体表面积,此外,定义一求立方体体积的方法public double getVolume();//求立方体体积

 

注意:

 

每个类均有构造方法,且构造方法内必须输出如下内容:Constructing 类名

 

每个类属性均为私有,且必须有gettersetter方法(可用Eclipse自动生成)

 

输出的数值均保留两位小数

 

主方法内,主要实现四个功能(1-4): 从键盘输入1,则定义圆类,从键盘输入圆的半径后,主要输出圆的面积; 从键盘输入2,则定义矩形类,从键盘输入矩形的宽和长后,主要输出矩形的面积; 从键盘输入3,则定义球类,从键盘输入球的半径后,主要输出球的表面积和体积; 从键盘输入4,则定义立方体类,从键盘输入立方体的宽、长和高度后,主要输出立方体的表面积和体积;

 

假如数据输入非法(包括圆、矩形、球及立方体对象的属性不大于0和输入选择值非1-4),系统输出Wrong Format

 

 

 

设计思路:首先看到题目中的继承,想到设计一个父类,至少一个子类。

 

将要求全部阅读完后,发现大体的思路是

 

Shape类时Circle类 和Rectangle类的父类,Circle类是Ball类的父类,Rectangle类是Box类的父类

 

因为 每个类均有构造方法,且构造方法内必须输出如下内容:Constructing 类名”

 

所以

 

public Circle() {

 

System.out.println("Constructing Circle");

 

}

 

 

 

其它四个类类似于这种,这样每构造一个类就会有输出相应的图形介绍,并且根据题目要求求出相应的面积或者体积。

 

 

 

 

 

 

为了实现继承,需要使用 extends 关键字,申明子类继承父类。但是需要注意,子类并不能继承父类的私有属性 private 的变量。

 

CircleRectangleBallBox类均被要求重写从父类继承来的求面积的方法,需要运用 super 关键及,以及重写的方法名字要与父类的方法名字完全一致,否则会报错。最好在重写的地方加上标注“@Override”便于写完代码后的检查。

 

题目集67-5)图形的继承和多态

 

https://images.ptausercontent.com/3df4fd25-4579-40d6-9bbf-e8928c97ec02.pdf   

 

阅读完题目后,因为有CircleRectangleTriangle 三个对象,所以会首先想到创建三个不同的类,在各自的类中实现各自的功能,并且在各自的类中判断输入是否符合规则,在主函数中实现从键盘输入。 题目中要求将图形根据面积排序,通过数组可以实现,将图形的面积保存在数组中。

 

代码需要通过继承来实现,需要使用extends 关键字。为了将图形面积排序,需要运用数组的排序java.util.Arrays包来实现。

 

 

 

 

 

 

 

继承使一个子类能继承父类的特征,并且可以附加一些新的内容。子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来却不成立,但是可以运用多态实现,简单的来说,多态意味着父类型的变量可以引用子类型的对象。,多态是一个类创建多个对象。

 

 

 

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

 

编写程序,使用接口及类实现多态性,类图结构如下所示:

 

 

 

 

 

 

 

其中:

 

GetArea为一个接口,无属性,只有一个GetArea(求面积)的抽象方法;

 

CircleRectangle分别为圆类及矩形类,分别实现GetArea接口

 

Main类的主方法中分别定义一个圆类对象及矩形类对象(其属性值由键盘输入),使用接口的引用分别调用圆类对象及矩形类对象的求面积的方法,直接输出两个图形的面积值。

 

题目中明确提到了要求使用接口实现,接口的使用和抽象类的使用基本类似,但是定义一个接口与定义一个抽象类有所不同,接口所有变量必须是public static final,并且接口没有构造方法,接口不能用new操作符实例化,接口中可以包含public的抽象实例方法、public的默认方法以及public的静态方法。Java中只允许为类的继承做单一继承,但是允许接口做多重继承。利用 interface 可以继承一个接口,利用关键字extends,接口就可以继承其他接口。

 

类实现接口时,必须要将接口中抽象的方法重写一次。。

 

 

 

③正则表达式的分析总结

 

 

 

正则表达式是一个字符串,用来描述匹配一个字符串集合的模式。对于字符串处理来说,正则表达式是一个强大的工具。可以使用正则表达式来匹配、替换和拆分字符串。

 

题目集6中的前四题,均是要求使用正则表达式运算。在正则表达式中,判断输入是否合理使用matches关键字进行判断,使用matches关键字要有返回true或者false

 

通过正则表达式会使题目的处理变得简单,只需要输入一串字符串就可以解决输入的正确判断。

 

String number = in.nextLine();

 

String trueNumber = "[2020][11-17_61_71-73_81-82]{2}[01-40]{2}";

 

boolean flag = number.matches(trueNumber);  

 

if(flag)

 

System.out.println("正确");

 

else

 

System.out.println("错误");

 

 

 

类似于题目集67-4中判断学号的输入是否正确就可以按照上面的代码进行输入。

 

但是正则法则中中括号中的数字范围只能是0-9 。因为在正则表达式中中括号中代表的是字符串,并不是数字。如果需要判断的范围中包括数字和字母的可以[0-9A-Za-z]包含了判断是不是数字或者大小写字母,而不是其它符号,如果需要几位可以使用{},中间加上需要的位数。像题目集6中的7-3中要求验证验证码的正确性

 

String trueNumber = "[0-9a-zA-Z]{4}";

 

要求验证是不是4位数,就在中括号中加上4

 

 

 

踩坑心得

 

1、在写这三次大作业中给我最明显的感觉是,我的思路不够清晰。  像题目集6中的7-5,在最后的各个图形面积排序的方法中,我在最开始的时候没有想到数组就开始写题,当最后实施到那一步的时候,发现自己原本的思路无法实现,在最后才想起来要用数组储存每一次图形的面积,导致了我将前面的代码也改了许多,导致代码过于啰嗦。

 

 

 

2、在我看到的一些优秀代码中,他们的类中,除了主函数中,其他的类中几乎没有输出,他们将最后的输出全部放入到主函数中。

 

3、在我用到像public int/float等一些数值型的方法中,在之前一直不知道怎么将return 的数值输出,要在方法的前面用getset的方法,申明this.n(变量)= n;然后再在输出的话才可以输出。

 

4、正则表达式中【】中的数字范围只能是0-9,其实中括号中的不能算是数字,只能算是字符,刚开始写的时候以为是数字,但是如果是数字的话,里面就不会有其它字母的。字母或者数字的判断不分先后。

 

5、写类时要多注意使用getset的方法,会使代码变得更加的符合规则。

 

改进建议

 

希望在题目中给出的引导性的语句可以增加一点,就是对这些题目应该如何切入的思路。

 

总结

 

1、写类时要多注意使用getset的方法,会使代码变得更加的符合规则

 

2、在我看到的一些优秀代码中,他们的类中,除了主函数中,其他的类中几乎没有输出,他们将最后的输出全部放入到主函数中。

 

3、写代码时要注重逻辑,不然最后检查的时候也不好检查。

double radius = 0;
        double width = 0;
        double length = 0;
        double s1 = 0;
        double s2 = 0;
        double s3 = 0;
        double q = 0;
        int i = 0;
        int j = 0;
        int m = 0;
        int z =0;
        int x = 0;
        double sumArea = 0;
        double sumOfC = 0;
        double sumOfR = 0;
        double sumOfT = 0;
        int flag = 0;
        int numberOfCircle = in.nextInt();
        int numberOfRectangle = in.nextInt();
        int numberOfT = in.nextInt();
        if(numberOfRectangle<0||numberOfCircle<0||numberOfT<0)
        {
            System.out.println("Wrong Format");
        }
        else 
        {
        double[] c = new double[numberOfCircle]; 
        double[] c1 = new double[numberOfCircle];
        double[] r =new double[numberOfRectangle];
        double[] r1 = new double[numberOfRectangle];
        double[] r2 = new double[numberOfRectangle];
        double[] t = new double[numberOfT];
        double[] t1 = new double[numberOfT];
        double[] t2 = new double[numberOfT];
        double[] t3 =new double[numberOfT];
        double[] sizes = new double[3];
            if(numberOfCircle==0)
                x++;
            if(numberOfRectangle == 0)
                x++;
            if(numberOfT == 0)
                x++;
        double[] area = new double[numberOfCircle+numberOfRectangle+numberOfT+x];

 

 

 这样的代码在后面的作业中要注意改进

 

 

 

 

 

 

 

   

 

  

 

posted @ 2021-05-01 09:29  1715  阅读(75)  评论(0)    收藏  举报