Blog2-第二次总结大作业
前言:
又到了写博客的时间了,本次博客主要内容,主要是总结第四次和第五次大作业以及期中考试知识点以及设计分析,踩坑心得和改进建议。前三次作业总结可以看我的另一篇文章https://www.cnblogs.com/W-xuyu/p/W-xuyu.html。
第四次和第五次及期中测试知识点总结:
(1)ArrayList的使用,书写模版ArrayList<> 名称 = new Arraylist();可以向其中传入对象。
(2)将对象作为参数传入,可以防止新建太多对象,导致数据混乱。
题量较小但难度较大。
设计与分析:
(1)第四次作业第二题--四边形
题目:
用户输入一组选项和数据,进行与四边形有关的计算。
以下四边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
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"。


对四边形的实现我设计了比较多的类如:Line,Point,Main,除此之外,我还设计了DealStirng,Input,Wrongjudge,Pointlin等类,并且类之间的关联性太强,导致代码的复用性不强,有种牵一发而动全身的感觉。但是通过对类的复杂度分析发现每个类的平均复杂度基本符合要求。此次类设计时重点应是在前几个类中,但是发现功能实现所需要的方法很多,于是又多加了很多其他的功能类。
下面附上一段Pointlink代码,此类中方法最多,和其他类之间的关联最强。
import java.util.ArrayList; public class Pointlink { Line line = new Line(); private static ArrayList<Point> points = new ArrayList(); public void add(Point point) { points.add(point); } public Point p1() { return points.get(0); } public Point p2() { return points.get(1); } public Point p3() { return points.get(2); } public Point p4() { return points.get(3); } public Point p5() { return points.get(4); } public Point p6() { return points.get(5); } private double long1; //判断两点是否重合 public void chonghe() { for(int i = 0;i<4;i++) { for(int j=0;j<4;j++) { if(points.get(i).getX()==points.get(j).getX()&&points.get(i).getY()==points.get(j).getY()&&i!=j) { System.out.println("points coincide"); System.exit(0); } } } } public boolean chonghe2() { for(int i = 0;i<4;i++) { for(int j=0;j<4;j++) { if(points.get(i).getX()==points.get(j).getX()&&points.get(i).getY()==points.get(j).getY()&&i!=j) { return true; } } } return false; } public void chonghe1() { if(p1().getX()== p2().getX()&&p1().getY() == p2().getY()) { System.out.println("points coincide"); System.exit(0); } } //判断点是否在一条直线上 public boolean onaline() { double k1 = line.getSlope(p1(), p2()); double k2 = line.getSlope(p2(), p3()); double k3 = line.getSlope(p3(), p4()); double k4 = line.getSlope(p4(), p1()); if(k1 == k2||k2 == k3||k3==k4||k4==k1) { return false; }else { if(p1().getX()==p2().getX()&&p2().getX() == p3().getX()||p2().getX()==p3().getX()&&p3().getX() == p4().getX()||p3().getX() == p4().getX()&&p4().getX()==p1().getX()||p4().getX()==p1().getX()&p1().getX()==p2().getX()) { return false; }else{ if(Xiandjiao.ba()) { return true; }else { return false; } } } } public boolean parsefour() { if(onaline() == false) { return false; }else { if(p1().getX() == p2().getX()&&p3().getX() == p4().getX()||p1().getY() == p2().getY()&&p3().getY() == p4().getY()) { if(this.distant(p1(), p2()) == this.distant(p3() , p4())) { return true; }else { return false; } }else { return false; } } } public void Judgepoint() { switch(DealString.choice()) { case 1: chonghe(); break; case 2: chonghe(); break; case 3: chonghe(); break; case 4: chonghe1(); break; } } public double distant(Point a,Point b) { long1 = Math.sqrt(Math.pow(a.getX()-b.getX(),2)+Math.pow(a.getY()-b.getY(), 2)); return long1; } public double area(Point a,Point b,Point c) { double l1 = distant(a, b); double l2 = distant(b, c); double l3 = distant(a, c); double p = (l1+l2+l3)/2; double s = Math.sqrt(p*(p-l1)*(p-l2)*(p-l3)); return s; } }
第五次作业:五边形题目
用户输入一组选项和数据,进行与五边形有关的计算。
以下五边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
1:输入五个点坐标,判断是否是五边形,判断结果输出true/false。
2:输入五个点坐标,判断是凹五边形(false)还是凸五边形(true),如果是凸五边形,则再输出五边形周长、面积,结果之间以一个英文空格符分隔。
若五个点坐标无法构成五边形,输出"not a pentagon"
3:输入七个点坐标,前两个点构成一条直线,后五个点构成一个凸五边形、凸四边形或凸三角形,输出直线与五边形、四边形或三角形相交的交点数量。如果交点有两个,再按面积从小到大输出被直线分割成两部分的面积(不换行)。若直线与多边形形的一条边线重合,输出"The line is coincide with one of the lines"。若后五个点不符合五边形输入,若前两点重合,输出"points coincide"。
以上3选项中,若输入的点无法构成多边形,则输出"not a
polygon"。输入的五个点坐标可能存在冗余,假设多边形一条边上两个端点分别是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
以下五边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
4:输入十个点坐标,前、后五个点分别构成一个凸多边形(三角形、四边形、五边形),判断它们两个之间是否存在包含关系(一个多边形有一条或多条边与另一个多边形重合,其他部分都包含在另一个多边形内部,也算包含)。
两者存在六种关系:1、分离(完全无重合点) 2、连接(只有一个点或一条边重合) 3、完全重合 4、被包含(前一个多边形在后一个多边形的内部)5、交错 6、包含(后一个多边形在前一个多边形的内部)。
各种关系的输出格式如下:
1、no overlapping area between the previous
triangle/quadrilateral/ pentagon and the following triangle/quadrilateral/
pentagon
2、the previous triangle/quadrilateral/ pentagon is
connected to the following triangle/quadrilateral/ pentagon
3、the previous triangle/quadrilateral/ pentagon
coincides with the following triangle/quadrilateral/ pentagon
4、the previous triangle/quadrilateral/ pentagon is inside
the following triangle/quadrilateral/ pentagon
5、the previous triangle/quadrilateral/ pentagon is
interlaced with the following triangle/quadrilateral/ pentagon
6、the previous triangle/quadrilateral/ pentagon
contains the following triangle/quadrilateral/ pentagon
5:输入十个点坐标,前、后五个点分别构成一个凸多边形(三角形、四边形、五边形),输出两个多边形公共区域的面积。注:只考虑每个多边形被另一个多边形分割成最多两个部分的情况,不考虑一个多边形将另一个分割成超过两个区域的情况。
6:输入六个点坐标,输出第一个是否在后五个点所构成的多边形(限定为凸多边形,不考虑凹多边形),的内部(若是五边形输出in the pentagon/outof the pentagon,若是四边形输出in
the quadrilateral/outof the quadrilateral,若是三角形输出in the
triangle/outof the triangle)。输入入错存在冗余点要排除,冗余点的判定方法见选项5。如果点在多边形的某条边上,输出"on the triangle/on the quadrilateral/on the pentagon"。
以上4、5、6选项输入的五个点坐标可能存在冗余,假设多边形一条边上两个端点分别是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


从五边形的类图来看,与四边形相比做出了较大的调整,类的数量减少,但是类之间的调用基本上都是有传递参数建立,导致类与类之间的联系几乎没有,近乎与一个个独立的类,需要在近一步学习类与类之间的关系,在写类时进行合理的联系。与之相对应得在类减少后,每个类的复杂度都相应提高,下次可以通过继承,来减少类的复杂度。
由于类之间的联系变少,所以Main函数就十分简洁
public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Input input = new Input(); Pentagon pt = new Pentagon(); Pentagon2 pt2 = new Pentagon2(); Line line = new Line(); input.getString(); input.getpoint(); switch (input.getchoice()) { case 1: System.out.println(pt.isPentagon(input,line,input.getlist(0),input.getlist(1),input.getlist(2),input.getlist(3),input.getlist(4))); break; case 2: pt.isaotu(line, input); break; case 3: pt.four(input, line); pt.chong(input, line); pt.zong(input, line); break; case 4: pt2.pan(input, line); pt2.huihe(input, line); break; case 6: pt2.liu(input, line); } } } 与后面Pentagon形成鲜明对比,如:Pentagon类 import java.text.DecimalFormat; //判断是否是五边形 public class Pentagon { Point p1; Point p2; private int tuxing = 0; private int cnt = 0; private int cnt1 = 0; private int num = 0; DecimalFormat df = new DecimalFormat("#.0##"); public boolean isPentagon(Input input,Line line,Point p1,Point p2,Point p3,Point p4,Point p5) { if(p1.getx()==p2.getx()&&p2.getx()==p3.getx()||p2.getx()==p3.getx()&&p3.getx()==p4.getx() ||p3.getx()==p4.getx()&&p4.getx()==p5.getx()||p4.getx()==p5.getx()&&p5.getx()==p1.getx()) { return false; }else { if(line.getk(p1, p2)==line.getk(p2, p3)|| line.getk(p2, p3)==line.getk(p3, p4)|| line.getk(p3, p4)==line.getk(p4, p5)|| line.getk(p4, p5)==line.getk(p5, p1)|| line.getk(p5, p1)==line.getk(p1, p2)) { return false; }else { //判断有无交点 if(!java.awt.geom.Line2D.linesIntersect(p1.getx(),p1.gety(), p2.getx(), p2.gety(), p4.getx(), p4.gety(), p5.getx(), p5.gety()) &&!java.awt.geom.Line2D.linesIntersect(p1.getx(), p1.gety(), p2.getx(), p2.gety(), p3.getx(), p3.gety(), p4.getx(), p4.gety()) &&!java.awt.geom.Line2D.linesIntersect(p2.getx(), p2.gety(), p3.getx(), p3.gety(), p4.getx(), p4.gety(), p5.getx(), p5.gety()) &&!java.awt.geom.Line2D.linesIntersect(p2.getx(), p2.gety(), p3.getx(), p3.gety(), p5.getx(), p5.gety(), p1.getx(), p1.gety()) &&!java.awt.geom.Line2D.linesIntersect(p3.getx(), p3.gety(), p4.getx(), p4.gety(), p5.getx(), p5.gety(), p1.getx(), p1.gety())) { return true; }else{ return false; } } } } //判断凹凸边形并输出凸多边形面积 public void isaotu(Line line,Input input) { if(!this.isPentagon(input,line,input.getlist(0),input.getlist(1),input.getlist(2),input.getlist(3),input.getlist(4))) { System.out.println("not a pentagon"); }else { double s1 = line.san(input.getlist(0), input.getlist(1), input.getlist(2))+line.san(input.getlist(0), input.getlist(2), input.getlist(3))+line.san(input.getlist(0), input.getlist(3), input.getlist(4)); double s2 = line.san(input.getlist(3), input.getlist(1), input.getlist(0))+line.san(input.getlist(3), input.getlist(2), input.getlist(1))+line.san(input.getlist(3), input.getlist(0), input.getlist(4)); if(Math.abs(s1-s2)<0.000000000001) { System.out.println(true+" "+df.format(line.Cwu(input.getlist(0), input.getlist(1), input.getlist(2), input.getlist(3), input.getlist(4)))+" "+df.format(s1)); }else { System.out.println(false); } } } //判断前两点是否重合,以及后五个点是否符合 public void chong(Input input,Line line) { this.judge(input, line); if(line.chonghe(input.getlist(0), input.getlist(1))||tuxing==3) { System.out.println("points coincide"); System.exit(0); } } //判断是否是四边形、三角形 public void four(Input input,Line line) { int[] a = {7,7,7,7,7}; int n = 6; for(int j = 2;j<n;j++) { for(int i = j+1;i<=n;i++) { if(line.chonghe(input.getlist(j), input.getlist(i))) { cnt++; n--; input.points.remove(i); } } } if(line.getk(input.getlist(2), input.getlist(3))==line.getk(input.getlist(3), input.getlist(4))||input.getlist(2).getx()==input.getlist(3).getx()&&input.getlist(3).getx()== input.getlist(4).getx()) { a[cnt1] = 3; cnt1++; } if(line.getk(input.getlist(3), input.getlist(4))==line.getk(input.getlist(4), input.getlist(5))||input.getlist(3).getx()==input.getlist(4).getx()&&input.getlist(4).getx()== input.getlist(5).getx()) { a[cnt1] = 4; cnt1++; } if(line.getk(input.getlist(4), input.getlist(5))==line.getk(input.getlist(5), input.getlist(6))||input.getlist(4).getx()==input.getlist(5).getx()&&input.getlist(5).getx()== input.getlist(6).getx()) { a[cnt1] = 5; cnt1++; } if(line.getk(input.getlist(5), input.getlist(6))==line.getk(input.getlist(6), input.getlist(2))||input.getlist(5).getx()==input.getlist(6).getx()&&input.getlist(6).getx()== input.getlist(2).getx()) { a[cnt1] = 6; cnt1++; } if(line.getk(input.getlist(6), input.getlist(2))==line.getk(input.getlist(2), input.getlist(3))||input.getlist(6).getx()==input.getlist(2).getx()&&input.getlist(2).getx()== input.getlist(3).getx()) { a[cnt1] = 2; cnt1++; } int v = a[0]; int s = a[1]; for(int i = 0;i<5;i++) { if(a[i]<=6&&a[i]>=2) { if(i==0) input.points.remove(v); else input.points.remove(s); if(s!=2) { s = s-1; } } } } //判断后五个点组成的是什么(0:三角形,1:四边形,2:五边形,3:组不成) public void judge(Input input,Line line) { if(input.points.size()==7) { if(this.isPentagon(input, line,input.getlist(2),input.getlist(3),input.getlist(4),input.getlist(5),input.getlist(6))) { tuxing = 2; } }else { if(cnt == 1&&cnt1==0||cnt1==1&&cnt==0) { tuxing = 1; }else { if(cnt == 2&&cnt1==0||cnt == 1&&cnt1==1||cnt ==0&&cnt1==2) { tuxing = 0; }else { tuxing = 3; } } } } //选项三的总括 public void zong(Input input,Line line) { if(tuxing == 0) { this.get(input, line); }else { if(tuxing == 1) { this.get2(input, line); }else { this.get3(input, line); } } } //得到交点并求面积(三角形的) public void get(Input input, Line line) { int m = 0; //交点个数 int l = 0; int z = 0; double s1 = 0; int[] a = new int[4]; Point[] ps = new Point[2]; line.panduan(input.getlist(0),input.getlist(1),input.getlist(2),input.getlist(3)); line.panduan(input.getlist(0),input.getlist(1),input.getlist(3),input.getlist(4)); line.panduan(input.getlist(0),input.getlist(1),input.getlist(4),input.getlist(2)); if(line.jiao(input.getlist(0),input.getlist(1),input.getlist(2),input.getlist(3))) { m++; a[l] = 2; a[l+1] = 3; l = l+2; ps[z] = line.jiaodian(input.getlist(0),input.getlist(1),input.getlist(2),input.getlist(3)); z++; } if(line.jiao(input.getlist(0),input.getlist(1),input.getlist(3),input.getlist(4))) { m++; a[l] = 3; a[l+1] = 4; l = l+2; ps[z] = line.jiaodian(input.getlist(0),input.getlist(1),input.getlist(3),input.getlist(4)); z++; } if(line.jiao(input.getlist(0),input.getlist(1),input.getlist(4),input.getlist(2))) { m++; a[l] = 4; a[l+1] = 2; l = l+2; ps[z] = line.jiaodian(input.getlist(0),input.getlist(1),input.getlist(4),input.getlist(2)); z++; } if(m < 2) { System.out.println(m); }else { if(m==2) { if(a[0]==a[3]) { s1 = line.san(input.getlist(a[0]), ps[0], ps[1]); }else { s1 = line.san(input.getlist(a[1]), ps[0], ps[1]); } double s2 = line.san(input.getlist(2), input.getlist(3), input.getlist(4)) - s1; if(s1<s2) { System.out.println(m+" "+df.format(s1)+" "+df.format(s2)); }else { System.out.println(m+" "+df.format(s2)+" "+df.format(s1)); } } } }
(3)期中考试:
期中考试提供了相应的类图,不需要我们自己再去设计类,只需根据类图所给类,以及类中的属性及方法进行书写几个,重要的是要掌握基础的知识,知道如何进件类,类之间的联系是什么,以及怎么实现类之间的联系,掌握这些之后其中考试基本就诶问题了,以及一定要把握时间。及时提交
现附上一张其中考的类图及代码

mport java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); double x1 = in.nextDouble(); double y1 = in.nextDouble(); double x2 = in.nextDouble(); double y2 = in.nextDouble(); if(x1<=0||x1>200||x2<=0||x2>200||y1<=0||y2>200||y2<=0||y1>200) { System.out.println("Wrong Format"); System.exit(0); } in.nextLine(); String color = in.nextLine(); Line line = new Line(x1,y1,x2,y2,color); line.display(); } } class Point { private double x; private double y; public Point() { } public Point(double x, double y) { super(); this.x = x; this.y = y; } public double getx() { return x; } public double gety() { return y; } public void setx(double x) { this.x = x; } public void sety(double y) { this.y = y; } public void display() { System.out.print("("); System.out.print(String.format("%.2f",getx())); System.out.print(","); System.out.print(String.format("%.2f",gety())); System.out.println(")"); } } class Line { // Point point = new Point(); private Point point1; private Point point2; private String color; public Line () { } public Line(double x1, double y1, double x2, double y2, String color) { super(); Point point1 = new Point(x1, y1); Point point2 = new Point(x2, y2); this.point1 = point1; this.point2 = point2; this.color = color; } public Point getPoint1() { return point1; } public Point getPoint2() { return point2; } public void setPoint(Point point1) { this.point1 = point1; } public void setpublic(Point point2) { this.point2 = point2; } public String getcolor() { return color; } public void setcolor(String color) { this.color = color; } public double getdistance() { double distant = Math.sqrt(Math.pow(point1.getx()-point2.getx(),2)+Math.pow(point1.gety()-point2.gety(),2)); return distant; } public void display() { System.out.println("The line's color is:"+color); System.out.println("The line's begin point's Coordinate is:"); this.point1.display(); System.out.println("The line's end point's Coordinate is:"); this.point2.display(); System.out.print("The line's length is:"); System.out.printf("%.2f",getdistance()); } }
踩坑心得:
(1)所设计类太过具体,复用性不强,导致每次新增一个功能都要对代码进行大量改动,所以在进行一个功能是现实,要考虑后面是否还需此功能,如需要如何提高此代码的复用性。
(2)没有使用继承,多态,抽象类,导致代码复杂度过高,在运行时容易出现错误,且在修改找错误时难度较大。
(3)不能熟练掌握正确的类与类之间的关系,代码类之间不能正确建立联系
改进建议:
(1) 进一步学习掌握类之间的关系,并建立正确的关系,可以减少代码的复杂度
(2) 尝试使用父类,抽象类,对代码进行忧化。
(3) 提高代码的复用性,可以多次引用代码,减少编码时间,提高效率。
总结:
通过这几次大作业的磨练,对如何建立类,应该建立从具体对象中抽象出来的的类有了更近一步的认识以及认识了类与类之间的联系的重要性,和在代码中使用父类和抽象类的便捷和对代码性能提高的好处,
主要问题是代码复用性太差,即使是同一道题目,需要同一功能,但是由于改变了使用此功能时所使用的点,就导致此功能不适用,所以书写代码时不要过于具体化。可提高书写效率。
以上便是进几次大作业的全部总结。

浙公网安备 33010602011771号