一、前言

(1).第四次大作业继承了第三次作业的三角形判断问题,需要判断四边形。需要对第三题进行类比

(2).期中考试考察类图的掌握和类的构建,继承与多态以及容器的使用。相对来说比较基础。

(3).第五次大作业继承了第四次大作业的四边形判断问题,需要判断五边形。比较难写。不能简单类比第四题。

二、设计与分析

(1).第四次大作业第二题的四边形判断问题,我采取的是判断对角线交点与其他点能否构成四个三角形(四次判断),在此基础上还要判断凹凸四边形,就需要用到面积的关系。凹四边形的面积理论上要比凸四边形少一块。所以通过面积刚好能判断凸凹四边形,同时还能将这个四边形的面积计算出来。我的思路先是把数据提取出来判断格式,再对数据进行保留和剔除,最后把需要的数据填充为一个Double数组。这利用了代码中的cut方法,这个方法中也把list转换成了Double。这也是第五次大作业中题目的处理方法。

用户输入一组选项和数据,进行与四边形有关的计算。
以下四边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
1:输入四个点坐标,判断是否是四边形、平行四边形,判断结果输出true/false,结果之间以一个英文空格符分隔。
2:输入四个点坐标,判断是否是菱形、矩形、正方形,判断结果输出true/false,结果之间以一个英文空格符分隔。 若四个点坐标无法构成四边形,输出"not a quadrilateral"
3:输入四个点坐标,判断是凹四边形(false)还是凸四边形(true),输出四边形周长、面积,结果之间以一个英文空格符分隔。 若四个点坐标无法构成四边形,输出"not a quadrilateral"
4:输入六个点坐标,前两个点构成一条直线,后四个点构成一个四边形或三角形,输出直线与四边形(也可能是三角形)相交的交点数量。如果交点有两个,再按面积从小到大输出四边形(或三角形)被直线分割成两部分的面积(不换行)。若直线与四边形或三角形的一条边线重合,输出"The line is coincide with one of the lines"。若后四个点不符合四边形或三角形的输入,输出"not a quadrilateral or triangle"。
后四个点构成三角形的情况:假设三角形一条边上两个端点分别是x、y,边线中间有一点z,另一顶点s:
1)符合要求的输入:顶点重复或者z与xy都相邻,如x x y s、x z y s、x y x s、s x y y。此时去除冗余点,保留一个x、一个y。
2) 不符合要求的输入:z 不与xy都相邻,如z x y s、x z s y、x s z y
5:输入五个点坐标,输出第一个是否在后四个点所构成的四边形(限定为凸四边形,不考虑凹四边形)或三角形(判定方法见选项4)的内部(若是四边形输出in the quadrilateral/outof the quadrilateral,若是三角形输出in the triangle/outof the triangle)。如果点在多边形的某条边上,输出"on the triangle或者on the quadrilateral"。若后四个点不符合四边形或三角形,输出"not a quadrilateral or triangle"。

信息如下:

java 判断点是否在多边形内部_键盘输入

java 判断点是否在多边形内部_java 判断点是否在多边形内部_02

 

 

 

 

 而第三题是构建一个bank类,信息如下:

java 判断点是否在多边形内部_多态_03

java 判断点是否在多边形内部_键盘输入_04

 

 

 

 

 bank类需要完成的方法不算多,题目如下:

1、公有、静态的属性:银行名称bankName,初始值为“中国银行”。
2、私有属性:账户名name、密码password、账户余额balance。
3、银行对用户到来的欢迎(welcome)动作(静态、公有方法),显示“中国银行欢迎您的到来!”,其中“中国银行”自动使用bankName的值。
4、银行对用户离开的提醒(welcomeNext)动作(静态、公有方法),显示“请收好您的证件和物品,欢迎您下次光临!”
5、带参数的构造方法,完成开户操作。需要账户名name、密码password信息,同时让账户余额为0。
6、用户的存款(deposit)操作(公有方法,需要密码和交易额信息),密码不对时无法存款且提示“您的密码错误!”;密码正确、完成用户存款操作后,要提示用户的账户余额,例如“您的余额有1000.0元。”。
7、用户的取款(withdraw)操作(公有方法,需要密码和交易额信息)。密码不对时无法取款且提示“您的密码错误!”;密码正确但余额不足时提示“您的余额不足!”;密码正确且余额充足时扣除交易额并提示用户的账户余额,例如“请取走钞票,您的余额还有500.0元。”。

还需要编写一个测试类Main,在main方法中,先后执行以下操作:
1、调用BankBusiness类的welcome()方法。
2、接收键盘输入的用户名、密码信息作为参数,调用BankBusiness类带参数的构造方法,从而创建一个BankBusiness类的对象account。
3、调用account的存款方法,输入正确的密码,存入若干元。密码及存款金额从键盘输入。
4、调用account的取款方法,输入错误的密码,试图取款若干元。密码及取款金额从键盘输入。
5、调用account的取款方法,输入正确的密码,试图取款若干元(取款金额大于余额)。密码及取款金额从键盘输入。
6、调用account的取款方法,输入正确的密码,试图取款若干元(取款金额小于余额)。密码及取款金额从键盘输入。
7 、调用BankBusiness类的welcomeNext()方法。

按照题目可以很好的进行设计。

(2).期中考试一共有三道题,都是以前一题为基础进行拓展的。类图如下:

java 判断点是否在多边形内部_java 判断点是否在多边形内部_05

 

 

 

java 判断点是否在多边形内部_java 判断点是否在多边形内部_06

 

 

 

java 判断点是否在多边形内部_多态_07

题目要求

  • 设计一个类表示平面直角坐标系上的点Point,私有属性分别为横坐标x与纵坐标y,数据类型均为实型数,除构造方法以及属性的getter与setter方法外,定义一个用于显示信息的方法display(),用来输出该坐标点的坐标信息,格式如下:(x,y),数值保留两位小数。为简化题目,其中,坐标点的取值范围设定为(0,200]。若输入有误,系统则直接输出Wrong Format
  • 设计一个类表示平面直角坐标系上的线Line,私有属性除了标识线段两端的点point1、point2外,还有一个字符串类型的color,用于表示该线段的颜色,同样,除构造方法以及属性的getter与setter方法外,定义一个用于计算该线段长度的方法getDistance(),还有一个用于显示信息的方法display(),用来输出线段的相关信息。
  • 在“点与线(类设计)”题目基础上,对题目的类设计进行重构,以实现继承与多态的技术性需求。
  • 对题目中的点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()方法,从而实现多态特性。

在“点与线(继承与多态)”题目基础上,对题目的类设计进行重构,增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作。

  • 在原有类设计的基础上,增加一个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:输入结束

按照类图进行设计不算太难,但是要注意使用继承,构造容器。还有精度问题(保留小数点后几位),同时应注意数据的封装。

java 判断点是否在多边形内部_多态_08

利用它进行保留两位小数点。

 

(3).第五次大作业把题目拆分为两部分,第一部分难度适中,但第二部分比较难,我不太会写。

第一部分的五边形判断,我采用判断其中三个点是否在一条线上,判断三次(点的顺序为123,245,345)结合一条边与它的对边(两条)的交点不同时在它们上面。我也发现,凹凸五边形好像也可以解决了。交点个数也可以用来判断凸凹五边形,如果只有一个交点就是凹五边形,如果没有就是凸五边形,但是凹五边形交点个数不能多于两个。

信息如下:

java 判断点是否在多边形内部_键盘输入_09

 

 isA是判断三点一线的方法,PointYN是判断交点个数的方法。

三、踩坑心得

这些题目感觉比较难,考察了许多地方,在一些地方一不小心就会出错,在知道计数器会很难在这些题目中存活后,我选择构建类,使用inputError()类和主类进行代码设计。随着时间的推移我发现我对类的使用越来越需要了。但是对java特有的继承多态,容器等掌握的还不够熟练。我还需要继续学习,继续练习,这样才能跟上老师的进度,跟上大家的脚步。

四、改进建议

首先我的代码还存在漏洞,需要进一步去修改,还要请教其他同学,找到自己代码不完善的地方,或者更换自己的思路,使用新方法继续进行。同时还要继续学习继承与多态和容器,我对于这些方面还不够熟悉。

五、总结

这几次的题都有逐步推进的感觉,从之前的格式判断到三角形,四边形,五边形。老师有意锻炼我们.。通过这几次的作业,java给我一种不一样的体验。从对Java丝毫不懂到现在,我已经认识到了很多。

以下是部分代码:

1     public static Double[] cut(String[] a) {
 2         ArrayList<Double> list = new ArrayList<>();
 3         for(int i = 0; i < a.length; i++)
 4         {
 5             String[] a2 = a[i].split(",");
 6             double x = Double.parseDouble(a2[0]);
 7             double y = Double.parseDouble(a2[1]);
 8             list.add(x);
 9             list.add(y);
10         }
11         Double[] a3 = (Double[])list.toArray(new Double[list.size()]);
12         return a3;
13     }
1     public static boolean PointYN(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) {
 2         boolean answer1,answer2;
 3         double X=(x3 * (y3-y4) * (x2-x1) - x1 * (y2-y1) * (x3-x4) + (y1-y3) * (x2-x1) * (x3-x4)) / ((y3-y4) * (x2-x1) - (y2-y1) * (x3-x4));
 4         double Y=(y1 * (x2-x1) * (y3-y4) - y3 * (x3-x4) * (y2-y1) + (x3-x1) * (y3-y4) * (y2-y1)) / ((x2-x1) * (y3-y4) - (x3-x4) * (y2-y1));
 5         double A1 = y2-y1;
 6         double B1 = x1-x2;
 7         double C1 = x2*y1-x1*y2;
 8         double A2 = y4-y3;
 9         double B2 = x3-x4;
10         double C2 = x4*y3-x3*y4;
11         if(A1*X+B1*Y+C1==0 && ((X>x1&&X<x2)||(X>x2&&X<x1)))
12             answer1 = true;
13         else
14             answer1 = false;
15         if(A2*X+B2*Y+C2==0 && ((X>x3&&X<x4)||(X>x4&&X<x2)))
16             answer2 = true;
17         else
18             answer2 = false;
19         if(answer1 == true && answer2 == true)
20             return false;
21         else
22             return true;
23     }