java第二次博客
前言
这次我们涉及到了许多的知识点,从一开始的农夫过河实验中,涉及到了类,类成员的属性,方法以及属性的封装,后续实验中我们涉及到了继承和多态,了解了子类与父类之间的继承关系,在Pta大作业中,在点线形这类题目中涉及到了许多种的知识点,例如一些字符串的输入判断,正则表达式,甚至是许多的数学知识,例如如何判断四边形的种类等。在期中考试的题目当中,同样涉及到了类的设计和一些多态以及抽象类和关于列表arraylist的一些有关知识。
设计与分析
①首先进行对期中考试题目的分析:
(1)

根据类图我们可以分析得出我们需要构造两个类,分别是Point类和Line类,我们可以看到在Line类中,有两个属性是Point类型的,所以我们就只需要根据类图对程序进行编写即可。在两个类的方法中,除display方法以外,都是一些简单的get和set以及构造方法,在idea等编译器中便可自动实现,然而display方法也没有难度,只需要按照题目所给的要求进行print即可。
(2)

第二道题目涉及到了有关继承和多态的知识点,根据类图,我们可以看到我们需要建立一个Element父类,而父类中只有一个Display方法,且此方法为抽象方法,因此我们在定义这个类的时候需要将此类定义为抽象类。之后再将我们上一个题目中所定义的Point类和Line类所作修改,将其对Element类进行继承即可,其中要对Element类中的Display方法进行重写即可。此外我们还需额外定义一个面Plane类,同样是继承于Element类,它只有一个属性也就是color。
关于多态的用法,所谓多态也就是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。因此我们需要定义一个Element类的引用,分别使用该引用调用以上四个对象的display()方法,从而实现多态特性。
(3)

第三题相较与第二题而言,涉及到的知识点更为全面,此题涉及到了Arraylist的有关知识,我们需要新定义一个GeometryObject类,这个类中只有一种属性也就是ArrayList型,这个ArrayList里面可以存放Element类的对象,这又涉及到了泛型。在这个类当中我们需要add方法以及remove方法和getlist方法,这些方法如图所示
,这个类当中可以存放Element的对象,这也同样利用到了多态性,我们只需要调用这个Element的对象的相应方法就可以自动帮我们进行其子类的相应方法。我们所需要注意的是,在ArrayList容器当中,本身就拥有add(),remove(),方法,所以我们在进行GeometryObject类中add以及remove方法的编写中,只需要调用ArrayList的对象的add()和remove()方法即可。
②对Pta题目的分析
关于点线形题目的分析
所有的点线形题目的共同点就是关于我们输入的合法性检验根据题目要求,我们需要满足序号:坐标1 坐标2 坐标3 坐标4的基本格式。

首先我们创建一个Point类的列表来储存我们所输入的点,关于Point类,在我们期中考试的题目中有所提到,与其相同,不过新增加了一个判断是否点重叠的方法。接着,在我们将输入的点储存进这个列表中时,我们需要进行一个判断,判断是否这个点的格式输入正确,一想到判断格式是否输入正确,我们首先可以想到利用正则表达式来进行判断最为简便。

如上图所示,我们将输入的数据和我们所设定的格式进行匹配比较,如果不符合格式则会直接输出Wrong Format且结束程序。关于输入格式的判断,我们不仅仅知识判断点的输入是否正确,我们还需要判断其他的格式,例如我们一开始的选项和冒号也就是选项+":",这一项判断我们也可以用正则表达式来进行判断如下图

我们需要注意的是,既然有选择,那么每个选择的需求又是不一样的,所以我们还需要进行一个判断,也就是说我们输入点的个数是否符合我们所选择的选项,如下图:

形式参数为列表对象和一个整型,这样判断我们输入的点是否符合要求,如果不符合要求则直接输出“Wrong number of points”且直接结束程序
在我们做完了输入的判断以后,我们就要根据题目来编写具体的功能了,这些功能大多都涉及到了数学的几何知识,例如判断点是否在由其他四个点组成的四边形中,判断这四个点是否可以组成四边形,组成的是怎样的四边形,这些功能的基础都是数学的几何知识,我们可以在Csdn上寻找有关的公式进行编写。其中我们有一个问题就是如何将数据进行格式化的输出。我们的需求是是将得到的数据按照小数点后面保留三位进行输出,如果不到三位则直接输出。关于这一点,我们可以采用定义一个DecimalFormat对象,将其的格式定义为“#.000”,这样我们在调用这个对象的format方法,使用Double.value()方法将其进行赋值给一个Double对象,最后将这个Double对象进行输出既可以实现我们需要的功能,具体如下:

剩余的一些功能都是一些与数学相关的知识。例如我们判断输入的三个点是否可以组成三角形,我们只需要按照上述要求正确输入三个点后,将三个点之间的距离求出来,再根据三角形的性质,两边之和大于第三边,进行判断,这样就可以是实现判断三个点是否可以组成三角形,值得一提的是,由于在此类题目中,我们反复需要用到点之间的距离,两点构成的直线的斜率等,我们可以将其写成一个图形类,然后在这个类中写好我们需要用到的方法,这样可以极大程度上减少我们的工作量以及使得代码更加的简洁。

我们在大作业四中我们需要判断四个点是否可以组成四边形,首先我们想到的判断是判断这四个点中是否由点重合,因此,在我们将一个点存入点的列表中是,我们应该将这个点与原有的点进行比较,如果没有相同的则顺利存入,如果存在相同的点则输出“points coincide”

③对实验题进行分析
关于农夫过河问题,我们所获得的类图为

根据题目要求,我们需要选择我们所进行的操作,如农夫独自过河或者带着羊过河,因此在我们选择我们所需要的操作时,我们可以用到switch语句来完成

因此我们知道我们羊或者农民类的属性中有crossRiver属性为布尔类型。由于在主类中可以调用这个属性,因此这个crossRiver为public的,这一点我们需要注意。我们知道农夫过河这个游戏,要是单独将狼和羊留下来或者是将羊和卷心菜留下来,羊和卷心菜会被吃掉,因此我们需要进行一个判断,判断当农夫的isCross与羊和狼的或者是与羊和卷心菜的相反时,羊的isAlive和卷心菜的isAlive要变成相反,也就是被吃了,最后我们每一次循环都要判断是否有东西被吃了,如果有的话,游戏结束,没有的话游戏继续,知道所有的角色corssRiver都为true才是游戏胜利。在后续的实验中,我们先是要求将每个类中的属性变成私有,也就是将public变成private,这我们就需要注意,因为属性为私有,因此我们在其他类中并不能直接使用,因此,我们需要构造一个set方法来调用这个私有属性

如上图所示,利用方法访问它的私有属性

我们在这一次当中还新增加了一个船类,且为Cabbage,Sheep,Wolf,Famer增加了一个共同的父类Character。因此我们在过河操作的时候会进行一些改变将过河这个操作交给Boat类的对象来进行处理如下图

在后续的实验中,有要求我们采用多态,因此,在定义农民,兔子的时候,我们统一定义为他的父类的对象,我们在父类中还要定义一个抽象方法,在每个子类中都实现这个展现状态的方法。我们在父类中还有吃这个方法,在兔子类和狼类中都会重载这个方法,以体现多态性。
踩坑心得
(1) 一开始在点线型题目中,关于输入的合法性检验中,我所采用的并不是利用正则表达式来判断输入的数据是否符合格式,而是利用字符串的split函数将输入的数据分割然后利用循环一步一步的进行检验,过程十分十分的麻烦,如下图

判断过程十分繁琐,这花费了我绝大多数的时间,而且还判断的不完善!
(2) 在期中考试中在我构建Point对象和Line对象时,我在类里面创建了两个System.in的对象,以至于不能进行多行的输入,在输入所有数据时,程序中的缓冲区只能用到一部分,以至于在一次性输入所有数据后程序不能正常运行。
(3) 我们要牢记在编程语言当中一般都是0开头!!!就在期中考试当中,最后一题当中,我们需要构造一个容器类,也就是需要用到ArrayList类,在进行列表的添加以及移除时,没有从列表的第0个开始,一直有在进行添加和移除操作时都无法得到正确的结果。
改进建议
(1) 在编写程序中,我们要尽可能的少利用if-else嵌套语句
(2) 我们编写的代码中,若有重复的语句功能,尽可能的提取出公共部分编写成方法,这样可以大大减少我们的工作量和提高代码的可读性
(3) 我们要牢记自顶向下,逐步细化,编写代码要有条理要根据所给的要求进行编写,不要上一句下一句!
(4) 尽可能采用更好的想法,就像是上面采用正则表达式而不是我一开始使用的字符串的判断
总结
在这7-10周中,我们学习了许多的新知识,例如继承与多态,还有抽象类,以及对文件的操作和抛出异常和捕获异常,这些都是非常重要的知识点,对我而言,关于文件的操作以及异常处理这两部分需要进一步的学习。至于对老师上课的方法以及提出改进建议,我认为在我们上课签到这一环节,是否可以适当的延长一两分钟呢,早上8.00是流量高峰期,进入课堂容易卡顿,有时候看着签到干着急却无法签到,希望老师可以改进一下。

浙公网安备 33010602011771号