链表,图形类及相关课程作业阶段性总结

链表,图形类及相关课程作业阶段性总结

这一阶段相比上次内容偏少,学习内容涉及java的容器使用,泛型E,以及接口Interface

图Map等等

主要为用Java实现链表,以及涉及继承,多态的·图形类作业编写

 

阶段总结其一:java实现链表

数组可以看作一行连续的多个存储单元,而链表在存储时则是非连续的,正如其名,是一种链式存储,通过节点连接,通过头节点来遍历所有数据

我接触链表是在上学期的C语言课程中,当时是通过结构体,指向结构体的指针,来存储数据,以及形成节点。

而来到java,Java是没有指针的,则采用了类来实现相关链表功能。

 

链表1.0

作业给出了带有相关链表功能函数的接口

 

类图如下

 

 

 

创建了Node(节点)类来代替结构体,并且将Node本身(取名为next)作为一个属性,来表示下一个节点,为实现不同类型的数据存储,对另一属性使用泛型作为数据类型,

而新建的LLsit(Linklist)类(实现接口方法)则将Node作为属性,实现所给接口功能,包括Node head作为头节点,Node curr表示当前节点,Node tail表示尾节点,以实现链表的相关功能,数据的增删,插入等

对尾节点的使用不多,只在链表末尾增数据时使用了

 

 

 

运行效果如下

 我个人是比较喜欢做个操作菜单的,可以方便自己测试,看起来也更加直观,大概比较人性化,

但其实依然存在许多问题,主要是对一些错误的输入没有作出相应的输出,导致许多报错,这个链表不具有健壮性

 

链表2.0

在链表1.0(单向链表)的基础上改为了双向链表

 

类图如下

 

 

 在Node类中新增了Node previous属性来实现前一个节点,增加了链表的功能,对之前链表功能相关的函数进行了修改,

主要是因为删除插入等操作,会改变当前节点的前一个节点,需要相应的更改Node previous。

 

运行效果如下

 

 依然是操作菜单,这次对一些错误输入作了相应的输出,不会再因为报错导致程序结束

但我又发现了新的问题,我的链表是需要给初始值的,也就是不能一开始就创建空链表,

头节点的实现有点错误,按照要求应该头节点是不存数据的,我的当然是存了,还需不断改进

 

 

 

阶段总结其二:图形类设计

 

1.图形中线的相关类设计

线的相关计算

 

创建了以X坐标,Y坐标作为属性的类Point,并在Point中进行点的相关计算,主函数中对不同错误情况进行了判断,以及相应输出

利用HashMap来判断点的个数是否符合要求

 利用正则表达式来判断输入格式是否符合要求

 点的重合,点的斜率等则利用Point类内部的方法来判断

 

程序运行效果:

 

 

难点在笔者看来,主要是对各类特殊情况的判断,如垂直于X轴的线,点重叠,不构成线,输入的点的个数不符合要求等等

当然其实更难的是求交点,更难的是数学公式,类的设计其实并不难,当然作为一名软工的学生,数学公式一般是拿来即用,对公式基本是浅尝辄止

但是你能想象吗,求两个直线的交点要用长达十行的公式,两条直线,四个交点,八个坐标值用不知道的什么关系堆在一起,让人头皮发麻,

不要又长又臭的数学公式,不要数学公式,真的不会数学啊,呜呜呜

 

 

2.图形中三角形的类设计

三角形相关计算

 在第一题的基础上新增了Triangle类,同时又引入了三角形的的各类计算公式,Triangle类中使用Point作为它的属性

并根据Point的坐标,计算出边side作为属性,之后当然是由一堆数学公式组成的方法

 

运行效果:

 

 

 

先除去数学公式作为最难的点,最令我困扰的便是下面这个

 

 乍一看,以为没什么,结果半天没弄明白,%f默认保留六位,导致1.5这种变成1.500000

通过先改为字符串,再转换Double就解决了问题,相关代码如下

 

3.图形中四边形的类设计

四边形相关计算

 

 新增Quar(四边形)类,类似之前的三角形类,以Point,side作为属性,表示四边形的点,边

然后则是各类四边形的计算方法,也有较多对四边形类型的判断,如凸四边形,正方形等等

 

运行效果:

 

 

阶段总结其三:期中考试题目

期中考试三题为递进关系,第二题建立在第一题基础上,第三题又建立在第二题基础上,代码完全可以实现复用

1.0

  • 设计一个类表示平面直角坐标系上的点Point,私有属性分别为横坐标x与纵坐标y,数据类型均为实型数,除构造方法以及属性的getter与setter方法外,定义一个用于显示信息的方法display(),用来输出该坐标点的坐标信息,格式如下:(x,y),数值保留两位小数。为简化题目,其中,坐标点的取值范围设定为(0,200]。若输入有误,系统则直接输出Wrong Format

  • 设计一个类表示平面直角坐标系上的线Line,私有属性除了标识线段两端的点point1、point2外,还有一个字符串类型的color,用于表示该线段的颜色,同样,除构造方法以及属性的getter与setter方法外,定义一个用于计算该线段长度的方法getDistance(),还有一个用于显示信息的方法display(),用来输出线段的相关信息

 

 

 Line由Point组成,Line拥有颜色color属性

关于输入格式错误的判断我将其放入了Point的构造方法中,在构造Point对象时进行坐标X,Y是否符合格式的判断,

在判断输入出错后,将无法创建Point对象,因为在我看来Point自己应该知道自己的属性是否符合要求,这样也避免了许多问题,

减少了main函数中的代码量,以及变量的使用个数

 

 2.0

  • 对题目中的点Point类和线Line类进行进一步抽象,定义一个两个类的共同父类Element(抽象类),将display()方法在该方法中进行声明(抽象方法),将Point类和Line类作为该类的子类。
  • 再定义一个Element类的子类面Plane,该类只有一个私有属性颜色color,除了构造方法和属性的getter、setter方法外,display()方法用于输出面的颜色,输出格式如下:The Plane's color is:颜色
  • 在主方法内,定义两个Point(线段的起点和终点)对象、一个Line对象和一个Plane对象,依次从键盘输入两个Point对象的起点、终点坐标和颜色值(Line对象和Plane对象颜色相同),然后定义一个Element类的引用,分别使用该引用调用以上四个对象的display()方法,从而实现多态特性

 

 继承与多态是2.0的关键点,新增Plane(平面),以及最重要的Element抽象类,使Line,Point,Plane都作为其子类,

通过Element创建Line,Point,Plane对象,使用它们的display方法,简化了程序,使用Element即可调用不同对象的方法

 

 

 

3.0

  • 在原有类设计的基础上,增加一个GeometryObject容器类,其属性为ArrayList<Element>类型的对象(若不了解泛型,可以不使用<Element>
  • 增加该类的add()方法及remove(int index)方法,其功能分别为向容器中增加对象及删除第index - 1(ArrayList中index>=0)个对象
  • 在主方法中,用户循环输入要进行的操作(choice∈[0,4]),其含义如下:
    • 1:向容器中增加Point对象
    • 2:向容器中增加Line对象
    • 3:向容器中增加Plane对象
    • 4:删除容器中第index - 1个数据,若index数据非法,则无视此操作
    • 0:输入结束

 

 

 增加GeometryObject容器类,ArrayList<Element>作为属性,使得可以放入Line,Point,Plane对象,这也是多态的好处

而GeometryObject中的方法,即对容器的相关操作,其实就是ArrayList的方法,在main中通过GeometryObject实现对不同对象的批量操作

如使用它们的display方法,展示它们的属性,仅需一个for循环

 

 

 

总结:

对将要写的程序有一个整体的规划相当重要,首先,类的设计方面,应该想想有那些名词出现过,如苹果,电梯,农夫等,将它们作为实体类,

再根据它们的行为,也即出现在它们旁边的动词,为其设计相应的方法,除此还应该想想它们是否同属于一类东西,如圆形,长方形都属于图形,

便可增添一个图形类,利用继承多态,简化代码,也降低了不同类的耦合性

其次,对程序可能出现的一些错误应该预先想好,作好相应的解决办法,融入类的设计之中,避免之后对代码进行修改,不仅不易找到错误的点,

而且修改后可能让其他部分出错,浪费更多时间

 

posted @ 2022-05-01 23:36  见光易分解  阅读(135)  评论(0)    收藏  举报