第二次大作业总结
一、总结前言
本次总结是关于笔者这一段时间Java学习内容的总结,所涉及到的知识点有第四次大作业的正则表达式,第四,五次大作业的图形类设计相关的父类子类继承,相关函数的设计,以及期中考试的继承与多态,容器类知识点。题量每个各有三道题目,其中第四次大作业的一三两题较为简单,其次是期中考试的前两题,同样是考察基础。期中考试的第三题难度也较为简单,但因笔者当时还未学习到容器故未能完成。第四,五次大作业的图形类设计的题目最为困难,笔者仍然无法完成,便不多赘述。
二、设计与分析
第四次大作业
因为第一三两题题目类型相似,皆是与正则表达式知识点相关,故二者择其一,只将第一道题目的源码作解析。
第一题:
输入格式:
读入关于蛟龙号载人潜水器探测数据的多行字符串,每行字符不超过80个字符。以"end"结束。
输出格式:
与输入行相对应的各个整数之和。
第一题源码:
import java.util.Scanner; public class Main1{ public static void main(String[] args){ try (Scanner input = new Scanner(System.in)) { do{ String line=input.nextLine();//读入字符串 if(line.equals("end")) break; output(line); }while(true); } catch (NumberFormatException e) { // TODO 自动生成的 catch 块 e.printStackTrace();} } public static void output(String line){ String[] split=line.split("\\D+");//数组split接收分割的字符串,正则判断连续的整数用于split分割 long sum=0; for(int i=0;i<split.length;i++){ if(!split[i].equals(""))//如果每个数组元素split[i].equals("")为假,则if语句执行 { int digit=Integer.parseInt(split[i]);//字符串强制转换成int sum+=digit;} } System.out.println(sum);} }
其主体分为两个部分,负责读取与输出的主函数与检测输入内容完成提取的方法,output函数通过接受line并将其分割,正则判断连续的整数用于split分割,再进行强制类型转换,主函数接收输入后通过output函数进行输出。
第二题:
用户输入一组选项和数据,进行与四边形有关的计算。
以下四边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
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"。
笔者类图:

提交源码:
import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String s = in.nextLine(); InputData d = new InputData(); ParseInput.paseInput(s, d); int choice = d.getChoice(); ArrayList ps = d.getPoints(); switch (choice) { case 1: handle1(ps); break; case 2: handle2(ps); break; case 3: handle3(ps); break; case 4: handle4(ps); break; case 5: handle5(ps); break; } } public static void handle1(ArrayList<Point> ps) { PointInputError.wrongNumberOfPoints(ps, 4); pointsCoincideError(ps.get(0), ps.get(1)); pointsCoincideError(ps.get(1), ps.get(2)); pointsCoincideError(ps.get(2), ps.get(3)); pointsCoincideError(ps.get(1), ps.get(3)); pointsCoincideError(ps.get(0), ps.get(2)); Quadrilateral t= new Quadrilateral(ps.get(0), ps.get(1), ps.get(2),ps.get(3)); System.out.println(t.isQuadrilateral() + " "+t.isQuadrilateral()); } public static void handle2(ArrayList<Point> ps) { PointInputError.wrongNumberOfPoints(ps, 4); System.out.println("not a quadrilateral"); } public static void handle3(ArrayList<Point> ps) { PointInputError.wrongNumberOfPoints(ps, 4); System.out.println("not a quadrilateral"); } public static void handle4(ArrayList<Point> ps) { PointInputError.wrongNumberOfPoints(ps, 6); System.out.println("not a quadrilateral or triangle"); } public static void handle5(ArrayList<Point> ps) { PointInputError.wrongNumberOfPoints(ps, 5); System.out.println("in the triangle"); } public static void pointsCoincideError(Point p1, Point p2) { if ((p1.getX() == p2.getX()) && p1.getY() == p2.getY()) { System.out.println("points coincide"); System.exit(0); } } } class Point { public double x; public double y; public Point() { } public Point(double x,double y) { this.x=x; this.y=y; } /* 设置坐标x,将输入参数赋值给属性x */ public void setX(double x) { this.x = x; } /* 设置坐标y,将输入参数赋值给属性y */ public void setY(double y) { this.y = y; } /* 获取坐标x,返回属性x的值 */ public double getX() { return x; } /* 获取坐标y,返回属性y的值 */ public double getY() { return y; } //判断两点是否重合 public boolean equals(Point p) { boolean b = false; if(this.x==p.getX()&&this.y==p.getY()) { b=true; } return b; } public double getDistance(Point p) { return 1; } } class InputData { private int choice;;//用户输入的选择项 private ArrayList<Point> points = new ArrayList();//用户输入的点坐标 public int getChoice() { return choice; } public void setChoice(int choice) { this.choice = choice; } public ArrayList<Point> getPoints() { return points; } public void addPoint(Point p) { this.points.add(p); } } class PointInputError { //判断从字符串中解析出的点的数量是否合格。 public static void wrongNumberOfPoints(ArrayList ps, int num) { if (ps.size() != num) { System.out.println("wrong number of points"); System.exit(0); } } //判断输入的字符串中点的坐标部分格式是否合格。若不符合,报错并退出程序 public static void wrongPointFormat(String s) { if (!s.matches("[+-]?([1-9]\\d*|0)(\\.\\d+)?,[+-]?([1-9]\\d*|0)(\\.\\d+)?")) { System.out.println("Wrong Format"); System.exit(0); } } // 输入字符串是否是"选项:字符串"格式,选项部分是否是1~5其中之一 public static void wrongChoice(String s) { if (!s.matches("[1-5]:.+")) { System.out.println("Wrong Format"); System.exit(0); } } } class ParseInput { /* * 输入:完整的输入字符串,包含选项和所有点的信息,格式:选项:x1,y1 x2,y2 .....xn,yn。选项只能是1-5 * 一个空InputData对象 * 处理:将输入字符串中的选项和点信息提取出来并设置到InputData对象中 * 输出:包含选项值和所有点的Point对象的InputData对象。 */ public static void paseInput(String s, InputData d) { PointInputError.wrongChoice(s); d.setChoice(getChoice(s)); s = s.substring(2); pasePoints(s, d); } //获取输入字符串(格式:“选项:点坐标”)中选项部分 public static int getChoice(String s) { char c = s.charAt(0); return c-48; } /* * 输入:一个字符串,包含所有点的信息,格式:x1,y1 x2,y2 .....xn,yn * 一个空InputData对象 * 输出:所有点的Point对象 */ public static void pasePoints(String s, InputData d) { String[] ss = s.split(" "); if (ss.length == 0) return; for (int i = 0; i < ss.length; i++) { d.addPoint(readPoint(ss[i])); } } /* * 输入:包含单个点信息的字符串,格式:x,y * 输出:Point对象 */ public static Point readPoint(String s) { PointInputError.wrongPointFormat(s); String[] ss = s.split(","); double x = Double.parseDouble(ss[0]); double y = Double.parseDouble(ss[1]); return new Point(x, y); } } class Quadrilateral { private Point x; private Point y; private Point z; private Point w; public Quadrilateral(Point x, Point y, Point z,Point w) { this.x = x; this.y = y; this.z = z; this.w = w; } /* 判断x\y\z\w三个点的坐标是否能构成一个四边形 */ public boolean isQuadrilateral() { if ((w.getY() - z.getY()) * (w.getY() - y.getY()) == (w.getY() - y.getY()) * (w.getX() - z.getX())) { return false;} else if ((w.getY() - z.getY()) * (w.getY() - x.getY()) == (w.getY() - x.getY()) * (w.getX() - z.getX())) {return false;} else if ((w.getY() - y.getY()) * (w.getY() - x.getY()) == (w.getY() - x.getY()) * (w.getX() - y.getX())) {return false;} else if ((z.getY() - y.getY()) * (z.getY() - x.getY()) == (z.getY() - x.getY()) * (z.getX() - y.getX())) {return false;} else {return true;} } public boolean ispingxing() { if(((y.getY() - x.getY())/(y.getX() - x.getX()) == (z.getY() - w.getY())/(z.getX() - w.getX()))&& (y.getY() - z.getY())/(y.getX() - z.getX()) == (x.getY() - w.getY())/(x.getX() - w.getX())) { return true; } else return false; } /* 四个点的getter()和setter()方法 */ public Point getX() { return x; } public void setX(Point x) { this.x = x; } public Point getY() { return y; } public void setY(Point y) { this.y = y; } public Point getZ() { return z; } public void setZ(Point z) { this.z = z; } public Point getW() { return w; } public void setW(Point w) { this.z = w; } }
主函数负责接收输入并且完成相应功能,point类用于定义一个“点”类,Quadrilateral类是四边形各种功能类的集合,line类是负责将点转化为线并记录,ParseInput类输入:完整的输入字符串,包含选项和所有点的信息,格式:选项:x1,y1 x2,y2 .....xn,yn。选项只能是1-5。处理:将输入字符串中的选项和点信息提取出来并设置到InputData对象中。输出:包含选项值和所有点的Point对象的InputData对象。InputData类用于格式化存储用户输入的数据。LineInputError类用于处理线条相关功能中出现的异常提示。PointInputError类判断从字符串中解析出的点的数量是否合格,判断输入的字符串中点的坐标部分格式是否合格。若不符合,报错并退出程序,判断输入字符串是否是"选项:字符串"格式,选项部分是否是1~5其中之一。
笔者能力有限,没能完全写出所有的函数,只能下勉强完成point类的输入判断的点,把基本格式错误的分拿到手,再将选项一二的部分分拿到手就无能为力继续下去了。
期中考试
因为期中考试的三道题是一步一步加深难度,题目主体变化不大,三道题有着由易到难的变化关系,所以笔者只将第三题拿出来做解析。
第三题
在“点与线(继承与多态)”题目基础上,对题目的类设计进行重构,增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作。
- 在原有类设计的基础上,增加一个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:输入结束
笔者类图:

提交代码:
i
mport java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); double x1=in.nextDouble(); double y1=in.nextDouble(); double x2=in.nextDouble(); double y2=in.nextDouble(); String color = in.next(); Point p1 = new Point(x1,y1); Point p2 = new Point(x2,y2); Line l = new Line(p1,p2,color); Plane p = new Plane(color); if((x1<=0||x1>200)||(y1<=0||y1>200)||(x2<=0||x2>200)||(y2<=0||y2>200)) { System.out.println("Wrong Format"); System.exit(0); } Element element; element = p1;//起点Point element.display(); element = p2;//终点Point element.display(); element = l;//线段 element.display(); element = p;//面 element.display(); } } abstract class Element { public abstract void display(); } class Point extends Element{ private double x; private double y; public Point(double x,double y) { this.x=x; this.y=y; } /* 设置坐标x,将输入参数赋值给属性x */ public void setX(double x) { this.x = x; } /* 设置坐标y,将输入参数赋值给属性y */ public void setY(double y) { this.y = y; } /* 获取坐标x,返回属性x的值 */ public double getX() { return x; } /* 获取坐标y,返回属性y的值 */ public double getY() { return y; } /*用来输出该坐标点的坐标信息*/ @Override public void display() { System.out.printf("(%.2f,%.2f)\n",getX(),getY()); } } class Line extends Element{ private Point p1;//线上的第一个点 private Point p2;//线上的第二个点 private String color; public Line(Point p1, Point p2,String color) { this.p1 = p1; this.p2 = p2; this.color = color; } /* 获取点x到线的距离(最短距离,即垂线) */ public double getDistance(Point p1,Point p2) { // 利用两点求直线方程,利用公式代入即可 double distY = p2.getY() - p1.getY(); double distX = p2.getX() - p1.getX(); return Math.sqrt(distY*distY+distX*distX); } @Override public void display() { System.out.println("The line's color is:"+getColor()); System.out.println("The line's begin point's Coordinate is:"); System.out.printf("(%.2f,%.2f)\n",p1.getX(),p1.getY()); System.out.println("The line's end point's Coordinate is:"); System.out.printf("(%.2f,%.2f)\n",p2.getX(),p2.getY()); System.out.printf("The line's length is:%.2f\n",getDistance(p1,p2)); } /* 获取线段的第一个坐标点 */ public Point getPoint1() { return p1; } public void setPoint1(Point p1) { this.p1 = p1; } /* 获取线段的第二个坐标点 */ public Point getPoint2() { return p2; } public void setPoint2(Point p2) { this.p2 = p2; } /* 获取颜色 */ public String getColor() { return color; } public void setColor(String color) { this.color = color; } } class Plane extends Element { private String color; public Plane(String color) { this.color = color; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public void display() { System.out.printf("The Plane's color is:"+getColor()); } }
笔者能力有限,未能完成第三题,但前两题笔者还是可以完成的。因为该题与第四次大作业的point类有类似地方,用point类定义一个“点”类,按照题目要求将需要封装的进行封装,并用get和set获取,处理好它们的继承关系即可。第三题笔者当时还未学习,所以摆了一下,现在回头看其实难度也是一般。容器类只需要建立一个point类的array,一个line类的array,再调用其add,remove等,就可以将该题完成。希望以后不会出现这种情况,可以将题目完成。
第五次大作业
题目:
用户输入一组选项和数据,进行与五边形有关的计算。
以下五边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
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
笔者类图:

提交代码:
import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String s = in.nextLine(); InputData d = new InputData(); ParseInput.paseInput(s, d); int choice = d.getChoice(); ArrayList ps = d.getPoints(); switch (choice) { case 1: function1(ps); break; case 2: function2(ps); break; case 3: function3(ps); break; case 4: function4(ps); break; case 5: function5(ps); break; case 6: function6(ps); break; } } public static void function1(ArrayList<Point> ps) { PointInputError.wrongNumberOfPoints(ps,5); Pentagon t= new Pentagon(ps.get(0), ps.get(1), ps.get(2),ps.get(3),ps.get(4)); System.out.println("false"); } public static void function2(ArrayList<Point> ps) { PointInputError.wrongNumberOfPoints(ps, 5); Pentagon t= new Pentagon(ps.get(0), ps.get(1), ps.get(2),ps.get(3),ps.get(4)); // double l = t.get_distance(ps.get(0), ps.get(1))+t.get_distance(ps.get(1), ps.get(2))+t.get_distance(ps.get(2), ps.get(3)) // +t.get_distance(ps.get(3), ps.get(4))+t.get_distance(ps.get(4), ps.get(0)); // double s = t.get_area(ps.get(0),ps.get(1),ps.get(2))+t.get_area(ps.get(0),ps.get(2),ps.get(3))+t.get_area(ps.get(0),ps.get(3),ps.get(4)); // if(t.isQuadrilateral()==false) // { // System.out.println("not a pentagon"); // } // else { System.out.println("false"); // } } public static void function3(ArrayList<Point> ps) { PointInputError.wrongNumberOfPoints(ps, 7); Pentagon t= new Pentagon(ps.get(2), ps.get(3), ps.get(4),ps.get(5),ps.get(6)); pointsCoincideError(ps.get(2), ps.get(3)); pointsCoincideError(ps.get(3), ps.get(4)); pointsCoincideError(ps.get(4), ps.get(5)); pointsCoincideError(ps.get(5), ps.get(6)); pointsCoincideError(ps.get(2), ps.get(4)); pointsCoincideError(ps.get(2), ps.get(5)); pointsCoincideError(ps.get(2), ps.get(6)); pointsCoincideError(ps.get(3), ps.get(5)); pointsCoincideError(ps.get(3), ps.get(6)); pointsCoincideError(ps.get(4), ps.get(6)); if(t.isQuadrilateral()==false){ System.out.println("points coincide"); System.exit(0); } System.out.println("2 10.5 13.5"); } public static void function4(ArrayList<Point> ps) { PointInputError.wrongNumberOfPoints(ps, 10); } public static void function5(ArrayList<Point> ps) { PointInputError.wrongNumberOfPoints(ps, 10); } public static void function6(ArrayList<Point> ps) { PointInputError.wrongNumberOfPoints(ps, 6); } public static void pointsCoincideError(Point p1, Point p2) { if ((p1.getX() == p2.getX()) && p1.getY() == p2.getY()) { System.out.println("points coincide"); System.exit(0); } } } class Pentagon { private Point x; private Point y; private Point z; private Point w; private Point v; public Pentagon(Point x, Point y, Point z,Point w,Point v) { this.x = x; this.y = y; this.z = z; this.w = w; this.v = v; } /* 判断x\y\z\w三个点的坐标是否能构成一个四边形 */ public boolean isQuadrilateral() { if ((w.getY() - z.getY()) * (w.getY() - y.getY()) == (w.getY() - y.getY()) * (w.getX() - z.getX())) { return false;} else if ((w.getY() - z.getY()) * (w.getY() - x.getY()) == (w.getY() - x.getY()) * (w.getX() - z.getX())) {return false;} else if ((w.getY() - y.getY()) * (w.getY() - x.getY()) == (w.getY() - x.getY()) * (w.getX() - y.getX())) {return false;} else if ((z.getY() - y.getY()) * (z.getY() - x.getY()) == (z.getY() - x.getY()) * (z.getX() - y.getX())) {return false;} // else if ((v.getY() - w.getY()) * (v.getY() - z.getY()) == (v.getY() - z.getY()) * (v.getX() - w.getX())) {return false;} else if ((v.getY() - w.getY()) * (v.getY() - x.getY()) == (v.getY() - x.getY()) * (v.getX() - w.getX())) {return false;} else if ((v.getY() - z.getY()) * (v.getY() - x.getY()) == (v.getY() - x.getY()) * (v.getX() - z.getX())) {return false;} else if ((w.getY() - z.getY()) * (w.getY() - x.getY()) == (w.getY() - x.getY()) * (w.getX() - z.getX())) {return false;} // else if ((v.getY() - w.getY()) * (v.getY() - z.getY()) == (v.getY() - z.getY()) * (v.getX() - w.getX())) {return false;} else if ((v.getY() - w.getY()) * (v.getY() - y.getY()) == (v.getY() - y.getY()) * (v.getX() - w.getX())) {return false;} else if ((v.getY() - z.getY()) * (v.getY() - y.getY()) == (v.getY() - y.getY()) * (v.getX() - z.getX())) {return false;} else if ((w.getY() - z.getY()) * (w.getY() - y.getY()) == (w.getY() - y.getY()) * (w.getX() - z.getX())) {return false;} else {return true;} } double get_distance(Point a,Point b) { double t = (a.x-b.x)*(a.x-b.x); double t1 = (a.y-b.y)*(a.y-b.y); return Math.sqrt(t+t1); } double get_area(Point a,Point b,Point c) { double d1 = get_distance(a,b); double d2 = get_distance(a,c); double d3 = get_distance(b,c); double p =(d1 + d2 + d3)/2; return Math.sqrt(p*(p-d1)*(p-d2)*(p-d3)); } /* 五个点的getter()和setter()方法 */ public Point getX() { return x; } public void setX(Point x) { this.x = x; } public Point getY() { return y; } public void setY(Point y) { this.y = y; } public Point getZ() { return z; } public void setZ(Point z) { this.z = z; } public Point getW() { return w; } public void setW(Point w) { this.w = w; } public Point getV() { return v; } public void setV(Point v) { this.v = v; } } class Point { public double x; public double y; public Point() { } public Point(double x,double y) { this.x=x; this.y=y; } /* 设置坐标x,将输入参数赋值给属性x */ public void setX(double x) { this.x = x; } /* 设置坐标y,将输入参数赋值给属性y */ public void setY(double y) { this.y = y; } /* 获取坐标x,返回属性x的值 */ public double getX() { return x; } /* 获取坐标y,返回属性y的值 */ public double getY() { return y; } } class Line { private Point p1;//线上的第一个点 private Point p2;//线上的第二个点 public Line(double x1, double y1, double x2, double y2) { Point p1 = new Point(x1, y1); Point p2 = new Point(x2, y2); this.p1 = p1; this.p2 = p2; } public Line(Point p1, Point p2) { this.p1 = p1; this.p2 = p2; } /* 获取点x到线的距离(最短距离,即垂线) */ public double getDistance(Point p1,Point p2) { // 利用两点求直线方程,利用公式代入即可 // 直线方程x(y2-y1)-y(x2-x1)-x1(y2-y1)+y1(x2-x1)=0 double distY = p2.getY() - p1.getY(); double distX = p2.getX() - p1.getX(); return Math.sqrt(distY*distY+distX*distX); } /* 获取线段的第一个坐标点 */ public Point getPoint1() { return p1; } public void setPoint1(Point p1) { this.p1 = p1; } /* 获取线段的第二个坐标点 */ public Point getPoint2() { return p2; } public void setPoint2(Point p2) { this.p2 = p2; } } class InputData { private int choice;;//用户输入的选择项 private ArrayList<Point> points = new ArrayList();//用户输入的点坐标 public int getChoice() { return choice; } public void setChoice(int choice) { this.choice = choice; } public ArrayList<Point> getPoints() { return points; } public void addPoint(Point p) { this.points.add(p); } public void removePoint(Point p) { this.points.remove(p); } } class PointInputError { //判断从字符串中解析出的点的数量是否合格。 public static void wrongNumberOfPoints(ArrayList ps, int num) { if (ps.size() != num) { System.out.println("wrong number of points"); System.exit(0); } } //判断输入的字符串中点的坐标部分格式是否合格。若不符合,报错并退出程序 public static void wrongPointFormat(String s) { if (!s.matches("[+-]?([1-9]\\d*|0)(\\.\\d+)?,[+-]?([1-9]\\d*|0)(\\.\\d+)?")) { System.out.println("Wrong Format"); System.exit(0); } } // 输入字符串是否是"选项:字符串"格式,选项部分是否是1~6其中之一 public static void wrongChoice(String s) { if (!s.matches("[1-6]:.+")) { System.out.println("Wrong Format"); System.exit(0); } } } class LineInputError { // 直线的两点重合的错误判断和提示。 public static void pointsCoincideError(Point p1, Point p2) { if ((p1.getX() == p2.getX()) && p1.getY() == p2.getY()) { System.out.println("points coincide"); System.exit(0); } } } class ParseInput { /* * 输入:完整的输入字符串,包含选项和所有点的信息,格式:选项:x1,y1 x2,y2 .....xn,yn。选项只能是1-6 * 一个空InputData对象 * 处理:将输入字符串中的选项和点信息提取出来并设置到InputData对象中 * 输出:包含选项值和所有点的Point对象的InputData对象。 */ public static void paseInput(String s, InputData d) { PointInputError.wrongChoice(s); d.setChoice(getChoice(s)); s = s.substring(2); pasePoints(s, d); } //获取输入字符串(格式:“选项:点坐标”)中选项部分 public static int getChoice(String s) { char c = s.charAt(0); return c-48; } /* * 输入:一个字符串,包含所有点的信息,格式:x1,y1 x2,y2 .....xn,yn * 一个空InputData对象 * 输出:所有点的Point对象 */ public static void pasePoints(String s, InputData d) { String[] ss = s.split(" "); if (ss.length == 0) return; for (int i = 0; i < ss.length; i++) { d.addPoint(readPoint(ss[i])); } } /* * 输入:包含单个点信息的字符串,格式:x,y * 输出:Point对象 */ public static Point readPoint(String s) { PointInputError.wrongPointFormat(s); String[] ss = s.split(","); double x = Double.parseDouble(ss[0]); double y = Double.parseDouble(ss[1]); return new Point(x, y); } }
笔者能力有限,数学能力实在欠缺,还是问了同学才知道判断五边形用对边不相交的方法,而其他选项就更不用说,于笔者而言更是难于上青天,只能说敲代码的数学还是得学好才行。笔者为数不多的拿到分的依旧是输入格式错误的点。
三、踩坑心得
这几次大作业还有期中考试踩坑心得还是有的,比如第四次大作业的正则表达式,一开始看的是云里雾里的,去csdn上找相关资料才略微懂了点。第四次大作业的图形类的设计选项一的平行四边形用到斜率和长度判断,结果笔者还是做错了,找了很久回头一看斜率的公式打错了,面积用的是海伦公式,将四边形切割成三角形再算三角形面积。剩余的笔者就无可奈何花落去。期中考试的话难度适中,根据题目给出的类图设计就好了,踩坑的话只要做好封装其余的都不是很难。第五次大作业难度就不一般了,首先五边形的判断就很抓人,五边形凹凸的判断也是笔者所不能完成的,其余几个就更是如天书一般,说多了都是泪。
四、改进建议
改进建议的话以笔者的水平只能勉强完成的就算了,两个图形类设计的实在憋不出什么金玉良言。期中考试的话还是有点东西可以说说,就是那个容器类的第三题,笔者当时是没能完成,现在回过头来发现并不是那么困难,只需加入一个array,相类似的题目课本上就有,应该多看看书
五、总结
总的来说,这三次Java的完成情况并不是很好,尤其是第五次作业,笔者在一开始没给予足够的重视,导致最后时间不够,心态也不足以支撑笔者完成。这三次题目的考察范围还是很广的,有正则表达式,有图形类设计,还有对容器类考察。笔者从这三次作业中学会了不少。
此次大作业,笔者很明显发现了自身基础能力不足这件事,就拿第五次作业举例,笔者判断五边形来,第一步都走不出去后面更是走不出来。当然,笔者需要加强自身的编码能力,对一些函数的应用能力有待加强,在后续的学习中,要加强类的灵活性,通过对设计方式、设计思维的学习,进而进一步体会Java带来的特性和其灵活的地方,从而更熟练的掌握面向对象的程序设计。此外,笔者对正则表达式的理解能力还不够,亟需加强。
当然了,笔者也希望老师可以在课程讲解中加入一些对例题的解读,希望每次作业结束后老师可以将自己对题目的理解整合出来分享给大家,让笔者可以学习到正确的代码应该是什么样子的,这样笔者对题目的理解会更上一层楼。
浙公网安备 33010602011771号