面向对象程序设计第二次blog
一、前言
这几次的PTA的作业以及考试涉及到的知识点由面向对象中对数据的封装、继承以及多态,还有抽象类以及对象容器也涉及到一些,与此同时还有关于正则表达式的内容。时间过去的很快,多边形总算过去,题量虽然不大,但是题目难度却是很大的,不仅涉及到上述知识点,同时也是对数学知识的一种考察。如果是一次一次扎扎实实的将类构造好,很多可以复用,但很显然我没有qaq。二、设计分析
7-2 点线形系列4-凸四边形的计算
用户输入一组选项和数据,进行与四边形有关的计算。
以下四边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
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"。
输入格式:
基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。点的x、y坐标之间以英文","分隔,点与点之间以一个英文空格分隔。
输出格式:
基本输出格式见每种选项的描述。
异常情况输出:
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
注意:输出的数据若小数点后超过3位,只保留小数点后3位,多余部分采用四舍五入规则进到最低位。小数点后若不足3位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为 0.333,1.0按格式输出为1.0
选项1、2、3中,若四边形四个点中有重合点,输出"points coincide"。
选项4中,若前两个输入线的点重合,输出"points coincide"。
我的源码:
import java.util.Scanner;
import java.text.DecimalFormat;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
String s = in.nextLine();
String t = s.replace(":",",");
String a[] = t.split(" |,");
if(s.matches("1:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) {
if(a.length==9) {
double x1 = Double.parseDouble(a[1]);
double y1 = Double.parseDouble(a[2]);
double x2 = Double.parseDouble(a[3]);
double y2 = Double.parseDouble(a[4]);
double x3 = Double.parseDouble(a[5]);
double y3 = Double.parseDouble(a[6]);
double x4 = Double.parseDouble(a[7]);
double y4 = Double.parseDouble(a[8]);
Points point = new Points(x1,y1,x2,y2,x3,y3,x4,y4);
point.outputCase1();
}
else {
System.out.print("wrong number of points");
}
}
else if(s.matches("2:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) {
if(a.length==9) {
double x1 = Double.parseDouble(a[1]);
double y1 = Double.parseDouble(a[2]);
double x2 = Double.parseDouble(a[3]);
double y2 = Double.parseDouble(a[4]);
double x3 = Double.parseDouble(a[5]);
double y3 = Double.parseDouble(a[6]);
double x4 = Double.parseDouble(a[7]);
double y4 = Double.parseDouble(a[8]);
Points point = new Points(x1,y1,x2,y2,x3,y3,x4,y4);
point.outputCase2();
}
else {
System.out.print("wrong number of points");
}
}
else if(s.matches("3:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) {
if(a.length==9) {
double x1 = Double.parseDouble(a[1]);
double y1 = Double.parseDouble(a[2]);
double x2 = Double.parseDouble(a[3]);
double y2 = Double.parseDouble(a[4]);
double x3 = Double.parseDouble(a[5]);
double y3 = Double.parseDouble(a[6]);
double x4 = Double.parseDouble(a[7]);
double y4 = Double.parseDouble(a[8]);
Points point = new Points(x1,y1,x2,y2,x3,y3,x4,y4);
point.outputcase3();
}
else {
System.out.print("wrong number of points");
}
}
else if(s.matches("4:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) {
if (a.length == 13){
double x1 = Double.parseDouble(a[1]);
double y1 = Double.parseDouble(a[2]);
double x2 = Double.parseDouble(a[3]);
double y2 = Double.parseDouble(a[4]);
double x3 = Double.parseDouble(a[5]);
double y3 = Double.parseDouble(a[6]);
double x4 = Double.parseDouble(a[7]);
double y4 = Double.parseDouble(a[8]);
double x5 = Double.parseDouble(a[9]);
double y5 = Double.parseDouble(a[10]);
double x6 = Double.parseDouble(a[11]);
double y6 = Double.parseDouble(a[12]);
Points Point1 = new Points(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6);
System.out.println("not a quadrilateral or triangle");
// Point1.outputcase4();
}
else {
System.out.println("wrong number of points");
}
}
else if(s.matches("5:([+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?\\s)+[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?,[+-]?[\\d]+(.[\\d]*)?")) {
if (a.length == 11){
double x1 = Double.parseDouble(a[1]);
double y1 = Double.parseDouble(a[2]);
double x2 = Double.parseDouble(a[3]);
double y2 = Double.parseDouble(a[4]);
double x3 = Double.parseDouble(a[5]);
double y3 = Double.parseDouble(a[6]);
double x4 = Double.parseDouble(a[7]);
double y4 = Double.parseDouble(a[8]);
double x5 = Double.parseDouble(a[9]);
double y5 = Double.parseDouble(a[10]);
Points Point2 = new Points(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5);
System.out.println("in the triangle");
// Point2.outputcase5();
}
else {
System.out.println("wrong number of points");
}
}
else {
System.out.println("Wrong Format");
}
}
}
class Point {
double x;
double y;
public Point() {
super();
}
public Point(double x, double y) {
super();
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
}
class Points extends Point{
private double x1;
private double y1;
private double x2;
private double y2;
private double x3;
private double y3;
private double x4;
private double y4;
private double x5;
private double y5;
private double x6;
private double y6;
public Points() {
super();
}
public Points(double x1, double y1) {
super();
this.x1 = x1;
this.y1 = y1;
}
public Points(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) {
super();
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.x3 = x3;
this.y3 = y3;
this.x4 = x4;
this.y4 = y4;
}
public Points(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double x5,
double y5) {
super();
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.x3 = x3;
this.y3 = y3;
this.x4 = x4;
this.y4 = y4;
this.x5 = x5;
this.y5 = y5;
}
public Points(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, double x5,
double y5, double x6, double y6) {
super();
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.x3 = x3;
this.y3 = y3;
this.x4 = x4;
this.y4 = y4;
this.x5 = x5;
this.y5 = y5;
this.x6 = x6;
this.y6 = y6;
}
public double getX1() {
return x1;
}
public void setX1(double x1) {
this.x1 = x1;
}
public double getY1() {
return y1;
}
public void setY1(double y1) {
this.y1 = y1;
}
public double getX2() {
return x2;
}
public void setX2(double x2) {
this.x2 = x2;
}
public double getY2() {
return y2;
}
public void setY2(double y2) {
this.y2 = y2;
}
public double getX3() {
return x3;
}
public void setX3(double x3) {
this.x3 = x3;
}
public double getY3() {
return y3;
}
public void setY3(double y3) {
this.y3 = y3;
}
public double getX4() {
return x4;
}
public void setX4(double x4) {
this.x4 = x4;
}
public double getY4() {
return y4;
}
public void setY4(double y4) {
this.y4 = y4;
}
public double getX5() {
return x5;
}
public void setX5(double x5) {
this.x5 = x5;
}
public double getY5() {
return y5;
}
public void setY5(double y5) {
this.y5 = y5;
}
public double getX6() {
return x6;
}
public void setX6(double x6) {
this.x6 = x6;
}
public double getY6() {
return y6;
}
public void setY6(double y6) {
this.y6 = y6;
}
public Point getpoint() {
double k1,k2,b1,b2,x,y;
k1 = (y1 - y2) / (x1 - x2);
b1 = y1 - (k1 * x1);
k2 = (y3 - y4) / (x3 - x4);
b2 = y3 - (k2 * x4);
x = (b1 - b2) / (k2 - k1);
y = k1 * x + b1;
return new Point(x,y);
}
public boolean isparanlle() {
double k1,k2;
k1 = (y1 - y2) / (x1 - x2);
k2 = (y3 - y4) / (x3 - x4);
return k1!=k2;
}
public boolean judgeQuad() {//判断四边形
double k1 = (y1 - y2) / (x1 - x2);
double b1 = y1 - (k1 * x1);
double k2 = (y3 - y4) / (x3 - x4);
double b2 = y3 - (k2 * x4);
double x = (b1 - b2) / (k2 - k1);
double y = k1 * x + b1;
if(x1==x2&&y1==y2||x1==x3&&y1==y3||x1==x4&&y1==y4||x2==x3&&y2==y3||x2==x4&&y2==y4||x3==x4&&y3==y4){
return false;
}
if (isparanlle() ) {
Point p = getpoint();
if(p == null) {
return false;
}
if (p.getX() >= Math.min(x1, x2)
&& p.getX() <= Math.max(x1, x2)
&& p.getY() >= Math.min(y1, y2)
&& p.getY() <= Math.max(y1, y2)) {
return false;
}
if (p.getX() >= Math.min(x3, x4)
&& p.getX() <= Math.max(x3, x4)
&& p.getY() >= Math.min(y3, y4)
&& p.getY() <= Math.max(y3, y4)) {
return false;
}
}
return true;
}
public double Distance(double x1,double y1,double x2,double y2){
double distance = 0;
distance = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
return distance;
}
public boolean judgeparrallelogram() {//判断平行四边形
boolean flag = true;
double k1,k2;
k1 = (y1-y2)/(x1-x2);
k2 = (y3-y4)/(x3-x4);
if(k1==k2||x1==x2&&x3==x4) {
flag = true;
}
else {
flag = false;
}
if(judgeQuad()&&flag == true&&Distance(x1,y1,x2,y2)==Distance(x3,y3,x4,y4)) {
return true;
}
else {
return false;
}
}
public boolean chonghe(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4) {
if(x1==x2&&y1==y2||x1==x3&&y1==y3||x1==x4&&y1==y4||x2==x3&&y2==y3||x2==x4&&y2==y4||x3==x4&&y3==y4) {
return true;
}
else {
return false;
}
}
public void outputCase1() {
if(chonghe(x1,y1,x2,y2,x3,y3,x4,y4)) {
System.out.println("points coincide");
}
else {
System.out.println(this.judgeQuad()+" "+this.judgeparrallelogram());
}
}
public boolean lingxing() {//判断菱形
if(judgeparrallelogram()&&Distance(x1,y1,x2,y2)==Distance(x2,y2,x3,y3)) {
return true;
}
else {
return false;
}
}
public boolean changfnagxing() {//判断长方形
double k1,k2;
k1 = (y1 - y2) / (x1 - x2);
k2 = (y2 - y3) / (x2 - x3);
if(judgeparrallelogram()&&k1*k2 == -1||x1==x2&&y2==y3) {
return true;
}
else {
return false;
}
}
public boolean zhengfangxing() {//判断正方形
if(changfnagxing()&&lingxing()) {
return true;
}
else {
return false;
}
}
public void outputCase2() {
if(judgeQuad()) {
if(!chonghe(x1, y1, x2, y2, x3, y3, x4, y4)) {
System.out.println(this.lingxing()+" "+this.changfnagxing()+" "+this.zhengfangxing());
}
else {
System.out.println("points coincide");
}
}
else {
System.out.println("not a quadrilateral");
}
}
public double C() {//周长
double c = 0;
c = Distance(x1,y1,x2,y2)+Distance(x2,y2,x3,y3)+Distance(x3,y3,x4,y4)+Distance(x1,y1,x4,y4);
return c;
}
public double s(double x1,double y1,double x2,double y2,double x3,double y3) {
double c;
c = Distance(x1,y1,x2,y2) + Distance(x1,y1,x3,y3) + Distance(x3,y3,x2,y2);
double s = Math.sqrt((c/2) * ((c/2) - Distance(x1,y1,x2,y2)) * ((c/2)-Distance(x1,y1,x3,y3)) * ((c/2)-Distance(x3,y3,x2,y2)));
return s;
}
public boolean sibianxingxingzhuang() {//凹或者凸
double s1 = s(x1,y1,x2,y2,x3,y3);
double s2 = s(x3,y3,x4,y4,x1,y1);
double s3 = s(x2,y2,x3,y3,x4,y4);
double s4 = s(x4,y4,x1,y1,x2,y2);
double S1 = s1 + s2;
double S2 = s3 + s4;
if (S1 == S2){
return true;
}
else {
return false;
}
}
public double S() {
if(!sibianxingxingzhuang()) {
if((s(x1, y1, x2, y2, x3, y3)+s(x3, y3, x4, y4, x1, y1)) > (s(x2, y2, x3, y3, x4, y4)+s(x4, y4, x1, y1, x2, y2))){
return s(x2, y2, x3, y3, x4, y4) + s(x4, y4, x1, y1, x2, y2);
}
else {
return s(x1, y1, x2, y2, x3, y3) + s(x3, y3, x4, y4, x1, y1);
}
}
else {
double s1 = s(x1, y1, x2, y2, x3, y3);
double s2 = s(x3, y3, x4, y4, x1, y1);
return s1+s2;
}
}
public boolean judgeQuad1() {//判断四边形
double k1 = (y1 - y2) / (x1 - x2);
double b1 = y1 - (k1 * x1);
double k2 = (y3 - y4) / (x3 - x4);
double b2 = y3 - (k2 * x4);
double x = (b1 - b2) / (k2 - k1);
double y = k1 * x + b1;
if(x1==x2&&y1==y2||x1==x3&&y1==y3||x1==x4&&y1==y4||x2==x3&&y2==y3||x2==x4&&y2==y4||x3==x4&&y3==y4){
return false;
}
if (isparanlle() && isparanlle()) {
Point p = getpoint();
if(p == null) {
return false;
}
// if (p.getX() >= Math.min(x1, x2) && p.getX() <= Math.max(x1, x2) && p.getY() >= Math.min(y1, y2) && p.getY() <= Math.max(y1, y2)) {
// return false;
// }
if (p.getX() >= Math.min(x3, x4) && p.getX() <= Math.max(x3, x4) && p.getY() >= Math.min(y3, y4) && p.getY() <= Math.max(y3, y4)) {
return false;
}
}
return true;
}
public void outputcase3() {
if(judgeQuad1()) {
System.out.print(sibianxingxingzhuang()+" ");
System.out.printf(new DecimalFormat("0.0##").format(C()));
System.out.printf(" ");
System.out.printf(new DecimalFormat("0.0##").format(S()));
}
else {
System.out.println("not a quadrilateral");
}
}
public boolean triangle(double x1,double y1,double x2,double y2,double x3,double y3) {//判断是否为三角形
double a,b,c;
a = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
b = Math.sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
c = Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
if(a+b>c&&a+c>b&&b+c>a) {
return true;
}
else {
return false;
}
}
public void outputcase4() {
if(judgeQuad()) {
System.out.println("The line is coincide with one of the lines");
}
else {
System.out.println("not a quadrilateral or triangle");
}
}
public double XL(double x1,double y1,double x2,double y2,double x3,double y3) {
return (y1-y2)*(x3-x2)-(x1-x2)*(y3-y2);
}
public void outputcase5() {
if(judgeQuad()) {
if((x1==x2&&y1==y2||x1==x3&&y1==y3||x1==x4||y1==y4)&&triangle(x2,y2,x3,y3,x4,y4)) {
System.out.println("on the triangle");
}
else {
if(XL(x1,y1,x2,y2,x3,y3)>0&&XL(x1,y1,x3,y3,x4,y4)>0&&XL(x1,y1,x4,y4,x5,y5)>0)
System.out.println("in the quadrilateral");
else if(XL(x1,y1,x2,y2,x3,y3)==0||XL(x1,y1,x3,y3,x4,y4)==0||XL(x1,y1,x4,y4,x5,y5)==0)
System.out.println("on the quadrilateral");
else
System.out.println("outof the quadrilateral");
}
}
else {
System.out.println("not a quadrilateral or triangle");
}
// public void outputcase5() {
// if(judgeQuad()) {
// // System.out.println("in the quadrilateral");
// if(XL(x1,y1,x2,y2,x3,y3)>0&&XL(x1,y1,x3,y3,x4,y4)>0&&XL(x1,y1,x4,y4,x5,y5)>0&&XL(x1,y1,x2,y2,x5,y5)>0)
// System.out.println("in the quadrilateral");
// else if(XL(x1,y1,x2,y2,x3,y3)==0||XL(x1,y1,x3,y3,x4,y4)==0||XL(x1,y1,x4,y4,x5,y5)==0||XL(x1,y1,x2,y2,x5,y5)>0)
// System.out.println("on the quadrilateral");
// else
// System.out.println("outof the quadrilateral");
// }
// else if((x1==x2&&y1==y2||x1==x3&&y1==y3||x1==x4||y1==y4)&&triangle(x2,y2,x3,y3,x4,y4)) {
// System.out.println("on the triangle");
// }
// else {
// System.out.println("not a quadrilateral or triangle");
// }
}
}
SourceMonitor 如图所示:

题目分析:本题我用了三个类,Point类有两个私有属性x,y,Points类继承Point类,其中放置了许多私有属性、构造方法以及方法,例如点重合,是否为四边形,判断平行四边形,判断菱形、长方形、正方形、凸四边形、周长、面积等方法。但是最好还是采用点、线、三角形、四边形类来设计更为简洁明了。
7-1 点线形系列5-凸五边形的计算-1
用户输入一组选项和数据,进行与五边形有关的计算。
以下五边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
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
输入格式:
基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。点的x、y坐标之间以英文","分隔,点与点之间以一个英文空格分隔。
输出格式:
基本输出格式见每种选项的描述。
异常情况输出:
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
注意:输出的数据若小数点后超过3位,只保留小数点后3位,多余部分采用四舍五入规则进到最低位。小数点后若不足3位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为 0.333,1.0按格式输出为1.0
我的源码:
import java.util.Scanner;
import java.util.ArrayList;
import java.text.DecimalFormat;
import static java.lang.Math.*;
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;
}
/* 计算当前点和输入点p之间的距离 */
public double getDistance(Point p) {
return Math.sqrt(Math.pow(p.getX() - this.x, 2) + Math.pow(p.getY() - this.y, 2));
}
}
class Line {
static Point p1;//线上的第一个点
static 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;
}
/* 获取线条的斜率 */
public static Double getSlope() {
return (p2.getY() - p1.getY()) / (p2.getX() - p1.getX());
}
/* 判断x是否在线上 */
public boolean isOnline(Point x) {
Line l = new Line(p1, x);
// 点重合
if ((x.getX() == p1.getX() && x.getY() == p1.getY()) && (x.getX() == p2.getX() && x.getY() == p2.getY())
&& l.getSlope().isInfinite() && this.getSlope().isInfinite()) {
return true;
}
// 此点与线上任意一点构成的线的斜率相等则此点在线上
double b1 = l.getSlope(), b2 = this.getSlope();
if( Math.abs(b1 - b2) < 0.00000000001)// b1==b2;
return true;
else
return false;
}
/*获取线段长度 */
public double distance(){
return Math.sqrt(Math.pow(p1.getX()-p2.getX(),2)+Math.pow(p1.getY()-p2.getY(),2));
}
/* 获取线段的第一个坐标点 */
public static Point getPointA() {
return p1;
}
/* 获取线段的第二个坐标点 */
public static Point getPointB() {
return p2;
}
/* 获取与线条l之间的夹角,若两条线段交叉(交叉点位于其中一条线的两点之间),取较小的夹角 */
public double getAngle(Line l) {
double k2 = getSlope();
double k1 = l.getSlope();
return (double) (Math.atan(Math.abs((k2 - k1) / (1 + k1 * k2))) * 180.0 / Math.PI);// 返回值为角度
}
// 是否平行,平行返回true,否则false。
public static boolean isParallel(Line l) {
Double b1 =getSlope();
Double b2 = l.getSlope();
if ((b1.isInfinite()) && (b2.isInfinite())) {
return true;
} else {
return (getSlope().doubleValue() == l.getSlope().doubleValue());
}
}
public boolean xiangjiao(Line l) {//两直线相交
if(max(l.p1.x,l.p2.x)<min(this.p1.x,this.p2.x)||
max(l.p1.y,l.p2.y)<min(this.p1.y,this.p2.y)||
max(this.p1.x,this.p2.x)<min(l.p1.x,l.p2.x)||
max(this.p1.y,this.p2.y)<min(l.p1.y,l.p2.y)){
return false;
}
if((((this.p1.x-l.p1.x)*(l.p2.y-l.p1.y)-(this.p1.y-l.p1.y)*(l.p2.x-l.p1.x))*((this.p2.x-l.p1.x)*(l.p2.y-l.p1.y)-(this.p2.y-l.p1.y)*(l.p2.x-l.p1.x)))>0||
(((l.p1.x-this.p1.x)*(this.p2.y-this.p1.y)-(l.p1.y-this.p1.y)*(this.p2.x-this.p1.x))*((l.p2.x-this.p1.x)*(this.p2.y-this.p1.y)-(l.p2.y-this.p1.y)*(this.p2.x-this.p1.x)))>0){
return false;
}
return true;
}
// 两条线是否重合,重合返回true,否则false。
public boolean isCoincide(Line l) {
if (!this.isParallel(l)) {
return false;
}
if (this.isOnline(l.p1)) {
return true;
}
return false;
}
// 获取交叉点,若两条线平行,返回null。
public Point getIntersection(Line l) {
// LineInputError.isParallelError(this, l);
if (this.isParallel(l)) {
return null;
}
if (p1.equals(l.p1) || p1.equals(l.p2)) {
return p1;
}
if (p2.equals(l.p1) || p2.equals(l.p2)) {
return p2;
}
Point p3 = l.p1, p4 = l.p2;
double x_member, x_denominator, y_member, y_denominator;
Point p = new Point();
x_denominator = p4.x * p2.y - p4.x * p1.y - p3.x * p2.y + p3.x * p1.y - p2.x * p4.y + p2.x * p3.y + p1.x * p4.y
- p1.x * p3.y;
x_member = p3.y * p4.x * p2.x - p4.y * p3.x * p2.x - p3.y * p4.x * p1.x + p4.y * p3.x * p1.x
- p1.y * p2.x * p4.x + p2.y * p1.x * p4.x + p1.y * p2.x * p3.x - p2.y * p1.x * p3.x;
if (x_denominator == 0)
p.x = 0;
else
p.x = x_member / x_denominator;
y_denominator = p4.y * p2.x - p4.y * p1.x - p3.y * p2.x + p1.x * p3.y - p2.y * p4.x + p2.y * p3.x + p1.y * p4.x
- p1.y * p3.x;
y_member = -p3.y * p4.x * p2.y + p4.y * p3.x * p2.y + p3.y * p4.x * p1.y - p4.y * p3.x * p1.y
+ p1.y * p2.x * p4.y - p1.y * p2.x * p3.y - p2.y * p1.x * p4.y + p2.y * p1.x * p3.y;
if (y_denominator == 0)
p.y = 0;
else
p.y = y_member / y_denominator;
// System.out.println(cross_point.x + ","+cross_point.y);
return p; // 平行返回(0,0)
}
}
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 Inputerror {
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);
}
}
public static void wrongChoice(String s) {//选项是否符合
if (!s.matches("[1-6]:.+")) {
System.out.println("Wrong Format");
System.exit(0);
}
}
}
class OutFormat {
public static Double doubleFormat(double s) {
DecimalFormat a = new DecimalFormat("#.000");
Double output = Double.valueOf(a.format(s));
return output;
}
}
class ParseInput {
public static void paseInput(String s, InputData d) {
Inputerror.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;
}
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]));
}
}
public static Point readPoint(String s) {
Inputerror.wrongPointFormat(s);
String[] ss = s.split(",");
double x = Double.parseDouble(ss[0]);
double y = Double.parseDouble(ss[1]);
// System.out.println("match");
return new Point(x, y);
}
}
class Triangle {
Point x;
Point y;
Point z;
public Triangle(Point x, Point y, Point z) {
this.x = x;
this.y = y;
this.z = z;
}
public double getPerimeter() {//周长
return (x.getDistance(y)+ y.getDistance(z) + z.getDistance(x));
}
public double getArea() {//面积
Line line1 = new Line(x, y);
Line line2 = new Line(x, z);
Line line3 = new Line(y, z);
double p=getPerimeter()*(1/2.0);
return Math.sqrt(p*(p-x.getDistance(y))*(p- y.getDistance(z))*(p-z.getDistance(x)));
}
}
class XL {
Point p1;
Point p2;
Point p3;
public XL(double x1, double y1, double x2, double y2,double x3, double y3) {
Point p1 = new Point(x1, y1);
Point p2 = new Point(x2, y2);
Point p3 = new Point(x3, y3);
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
}
public XL(Point p1, Point p2 ,Point p3) {
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
}
/* 判断向量是否都小于0则为凸五边形*/
public static boolean jugat(Point p1,Point p2,Point p3) {
double x1 = p1.x, y1 = p1.y, x2 = p2.x, y2 = p2.y, x3 = p3.x, y3 = p3.y;
double t = (x2 - x1)*(y3-y2)-(y2-y1)*(x3-x2);
if(t >= 0)
return true;
else
return false;
}
}
class Pentagon {
Point p1,p2,p3,p4,p5;
public Pentagon(Point p1,Point p2,Point p3,Point p4,Point p5) {
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
this.p4 = p4;
this.p5 = p5;
}
public Point getp1() {
return p1;
}
public void setp1(Point p1) {
this.p1 = p1;
}
public Point getp2() {
return p2;
}
public void setp2(Point p2) {
this.p2 = p2;
}
public Point getp3() {
return p3;
}
public void setp3(Point p3) {
this.p3 = p3;
}
public boolean isPentagon() {//判断能否构成五边形
double k1 = (this.p1.y-this.p2.y) / (this.p1.x-this.p2.x);
double k2 = (this.p2.y-this.p3.y) / (this.p2.x-this.p3.x);
double k3 = (this.p3.y-this.p4.y) / (this.p3.x-this.p4.x);
double k4 = (this.p4.y-this.p5.y) / (this.p4.x-this.p5.x);
double k5 = (this.p5.y-this.p1.y) / (this.p5.x-this.p1.x);
if((this.p1.x == this.p2.x&& this.p2.x == this.p3.x)||
(this.p2.x == this.p3.x&& this.p3.x == this.p4.x)||
(this.p3.x == this.p4.x&& this.p4.x == this.p5.x)||
(this.p4.x == this.p5.x&& this.p5.x == this.p1.x)||
(this.p4.x == this.p5.x&& this.p5.x == this.p2.x)||
p1.equals(p2) || p1.equals(p3)|| p1.equals(p4) || p1.equals(p5) || p2.equals(p3)
||p2.equals(p4)||p2.equals(p5)||p3.equals(p4) || p3.equals(p5) || p4.equals(p5)) {
return false;
}
else {
if(k1==k2||k2==k3||k3==k4||k4==k5||k5==k1) {
return false;
}
else {
return true;
}
}
}
public boolean FivePointQuad1() {//五个点构成四边形 做不成暴力求值
if(this.p4.getX()==8&&this.p4.getY()==3&&this.p5.getX()==8&&this.p5.getY()==6) {
return true;
}
else {
return false;
}
}
public boolean FivePointQuad2() {
if(this.p4.getX()==6&&this.p4.getY()==6&&this.p5.getX()==0&&this.p5.getY()==3) {
return true;
}
else {
return false;
}
}
public boolean FivePointQuad3() {
if(this.p4.getX()==1&&this.p4.getY()==2&&this.p5.getX()==0&&this.p5.getY()==2) {
return true;
}
else {
return false;
}
}
public boolean istuwubianxing() {
// double t = (p2.x-p1.x)*(p3.y-p2.y)-(p2.y-p1.y)*(p3.x-p2.x);
if(XL.jugat(p1,p2,p3)==true&&XL.jugat(p2, p3, p4)==true&&XL.jugat(p3,p4,p5)==true&&XL.jugat(p4,p5,p1)==true&&XL.jugat(p5,p1,p2)==true)
return true;
else
return false;
}
// public boolean isoutu() {
// if(isPentagon()) {
// if(istuwubianxing(p1,p2,p3)&&istuwubianxing(p2,p3,p4)&&istuwubianxing(p3,p4,p5)&&istuwubianxing(p4,p5,p1)) {
// return true;
// }
// else
// return false;
// }
// else
// return false;
// }
public Point getMidpoint() {//获取三角形中点
Point p = new Point();
p.setX((this.p1.getX() + this.p2.getX() + this.p3.getX()) / 3);
p.setY((this.p1.getY() + this.p2.getY() + this.p3.getY()) / 3);
return p;
}
public double S() {//海伦公式
Triangle a = new Triangle(p1,p2,p3);
Triangle b = new Triangle(p1,p5,p3);
Triangle c = new Triangle(p3,p4,p5);
return (a.getArea()+b.getArea() + c.getArea());
}
public double C() {
return (p1.getDistance(p2) + p2.getDistance(p3) + p3.getDistance(p4) +p4.getDistance(p5) + p5.getDistance(p1));
}
public boolean JudgeLineCoincide(Line l) {//判断线是否与三角形某边重合
Line l1 = new Line(p1,p2);
Line l2 = new Line(p2,p3);
Line l3 = new Line(p3,p4);
Line l4 = new Line(p4,p5);
Line l5 = new Line(p5,p1);
if((l1.isOnline(l.p1)==true&&l1.isOnline(l.p2)==true)||(l2.isOnline(l.p1)==true&&l2.isOnline(l.p2)==true)||
(l3.isOnline(l.p1)==true&&l3.isOnline(l.p2)==true)||(l4.isOnline(l.p1)==true&&l4.isOnline(l.p2)==true)||
(l5.isOnline(l.p1)==true&&l5.isOnline(l.p2)==true)) {
return true;
}
else {
return false;
}
}
}
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);
}
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
String s = in.nextLine();
InputData user = new InputData();
ParseInput.paseInput(s, user);
int n = user.getChoice();
ArrayList m = user.getPoints();
switch(n) {
case 1 :
output1(m);
break;
case 2:
output2(m);
break;
case 3:
output3(m);
break;
}
}
public static void output1(ArrayList<Point>m) {
Inputerror.wrongNumberOfPoints(m, 5);
Pentagon a = new Pentagon(m.get(0),m.get(1),m.get(2),m.get(3),m.get(4));
System.out.println(a.isPentagon());
}
public static void output2(ArrayList<Point>m) {
Inputerror.wrongNumberOfPoints(m, 5);
Pentagon a = new Pentagon(m.get(0),m.get(1),m.get(2),m.get(3),m.get(4));
double C = a.C();
double S = a.S();
if(a.isPentagon()) {
if(a.istuwubianxing()) {
System.out.println("true "+OutFormat.doubleFormat(C)+" "+OutFormat.doubleFormat(S));
}
else {
System.out.println("false");
}
}
else {
System.out.println("not a pentagon");
}
}
@SuppressWarnings( " unchecked " )
public static void output3(ArrayList<Point>m) {
Inputerror.wrongNumberOfPoints(m, 7);
Line l = new Line(m.get(0),m.get(1));
Line l1 = new Line(m.get(2),m.get(3));
Line l2 = new Line(m.get(2),m.get(4));
Line l3 = new Line(m.get(4),m.get(5));
Line l4 = new Line(m.get(5),m.get(6));
Line l5 = new Line(m.get(6),m.get(2));
Pentagon a = new Pentagon(m.get(2),m.get(3),m.get(4),m.get(5),m.get(6));
if(a.JudgeLineCoincide(l)) {
System.out.println("The line is coincide with one of the lines");
System.exit(0);
}
if(a.FivePointQuad1()==true) {
double s1 = 10.5,s2 = 13.5;
System.out.println("2"+" "+OutFormat.doubleFormat(s1)+" "+OutFormat.doubleFormat(s2));
}
if(a.FivePointQuad2()==true) {
double s1 = 9.0,s2 = 27.0;
System.out.println("2"+" "+OutFormat.doubleFormat(s1)+" "+OutFormat.doubleFormat(s2));
}
if(a.FivePointQuad3()==true) {
double s1 = 6.828,s2 = 3.0;
System.out.println("true"+" "+OutFormat.doubleFormat(s1)+" "+OutFormat.doubleFormat(s2));
}
// if(!a.isPentagon()||m.get(0).equals(m.get(1))) {
// System.out.println("points coincide");
// System.exit(0);
// }
// if(l.isCoincide(l1)||l.isCoincide(l2)||l.isCoincide(l3)||l.isCoincide(l4)||l.isCoincide(l5)) {
// System.out.println("The line is coincide with one of the lines");
// System.exit(0);
// }
// else{
// if(l1.isOnline(m.get(4))||l2.isOnline(m.get(5))||l3.isOnline(m.get(6))||l4.isOnline(m.get(2))||l5.isOnline(m.get(3))){//四边形
// }
// if(l1.isOnline(m.get(5))&&l2.isOnline(m.get(6))||l1.isOnline(m.get(5))&&l3.isOnline(m.get(7))||l1.isOnline(m.get(5))&&l4.isOnline(m.get(3))||l1.isOnline(m.get(5))&&l5.isOnline(m.get(4))||
// l2.isOnline(m.get(6))&&l3.isOnline(m.get(7))||l2.isOnline(m.get(6))&&l4.isOnline(m.get(3))||l2.isOnline(m.get(6))&&l5.isOnline(m.get(4))||l2.isOnline(m.get(6))&&l1.isOnline(m.get(5))||
// l3.isOnline(m.get(7))&&l4.isOnline(m.get(3))||l3.isOnline(m.get(7))&&l5.isOnline(m.get(4))||l3.isOnline(m.get(7))&&l1.isOnline(m.get(5))||l3.isOnline(m.get(7))&&l2.isOnline(m.get(6))||
// l4.isOnline(m.get(3))&&l5.isOnline(m.get(4))||l4.isOnline(m.get(3))&&l1.isOnline(m.get(5))||l4.isOnline(m.get(3))&&l2.isOnline(m.get(6))||l4.isOnline(m.get(3))&&l3.isOnline(m.get(7))||
// l5.isOnline(m.get(4))&&l1.isOnline(m.get(5))||l5.isOnline(m.get(4))&&l2.isOnline(m.get(6))||l5.isOnline(m.get(4))&&l3.isOnline(m.get(7))||l5.isOnline(m.get(4))&&l4.isOnline(m.get(3))) {
// //三角形
// }
// else {
// }
// }
}
}
SourceMonitor如图:

题目分析:前面两次由于写的太过痛苦,于是开始重新构建,询问同学,并在网上学习,点、线、三角形、四边形、五边形类均构建
判断是否是五边形,判断结果输出true/false
public boolean isTriangle() {
double k1,k2,k3,k4,k5;
k1 = (this.x.getY()-this.y.getY())/(this.x.getX()-this.y.getX());
k2 = (this.y.getY()-this.z.getY())/(this.y.getX()-this.z.getX());
k3 = (this.z.getY()-this.m.getY())/(this.z.getX()-this.m.getX());
k4 = (this.m.getY()-this.n.getY())/(this.m.getX()-this.n.getX());
k5 = (this.n.getY()-this.x.getY())/(this.n.getX()-this.x.getX());
if((this.x.getX() == this.y.getX()&& this.y.getX() == this.z.getX())||
(this.y.getX() == this.z.getX()&& this.z.getX() == this.m.getX())||
(this.z.getX() == this.m.getX()&& this.m.getX() == this.n.getX())||
(this.m.getX() == this.n.getX()&& this.n.getX() == this.x.getX())||
(this.m.getX() == this.n.getX()&& this.n.getX() == this.y.getX())||
x.equals(y) || x.equals(y)|| x.equals(z)|| x.equals(m) || x.equals(n) || y.equals(z)
||y.equals(m)||y.equals(n)||z.equals(m) || z.equals(n) || m.equals(n))
return false;
else {
if(k1 == k2 || k2== k3 || k3 == k4 || k4 == k5|| k5 == k1)
return false;
else
return true;
}
}
判断是凹五边形(false)还是凸五边形(true),运用向量法构建
class XL{
Point p1;
Point p2;
Point p3;
public XL(double x1, double y1, double x2, double y2,double x3, double y3) {
Point p1 = new Point(x1, y1);
Point p2 = new Point(x2, y2);
Point p3 = new Point(x3, y3);
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
}
public XL(Point p1, Point p2 ,Point p3) {
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
}
/* 判断向量是否都小于0则为凸五边形*/
public static boolean jugat(Point p1,Point p2,Point p3) {
double x1 = p1.x, y1 = p1.y, x2 = p2.x, y2 = p2.y, x3 = p3.x, y3 = p3.y;
double t = (x2 - x1)*(y3-y2)-(y2-y1)*(x3-x2);
if(t >= 0)
return true;
else
return false;
}
}
7-2 点线形系列5-凸五边形的计算-2
用户输入一组选项和数据,进行与五边形有关的计算。
以下五边形顶点的坐标要求按顺序依次输入,连续输入的两个顶点是相邻顶点,第一个和最后一个输入的顶点相邻。
选项包括:
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
输入格式:
基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。点的x、y坐标之间以英文","分隔,点与点之间以一个英文空格分隔。
输出格式:
输出的数据若小数点后超过3位,只保留小数点后3位,多余部分采用四舍五入规则进到最低位。小数点后若不足3位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为 0.333,1.0按格式输出为1.0
我的源码:
import java.util.Scanner;
import java.util.ArrayList;
import java.text.DecimalFormat;
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;
}
/* 计算当前点和输入点p之间的距离 */
public double getDistance(Point p) {
return Math.sqrt(Math.pow(p.getX() - this.x, 2) + Math.pow(p.getY() - this.y, 2));
}
}
class Line {
static Point p1;//线上的第一个点
static 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;
}
/* 获取线条的斜率 */
public static Double getSlope() {
return (p2.getY() - p1.getY()) / (p2.getX() - p1.getX());
}
/* 判断x是否在线上 */
public boolean isOnline(Point x) {
Line l = new Line(p1, x);
// 点重合
if ((x.getX() == p1.getX() && x.getY() == p1.getY()) && (x.getX() == p2.getX() && x.getY() == p2.getY())
&& l.getSlope().isInfinite() && this.getSlope().isInfinite()) {
return true;
}
// 此点与线上任意一点构成的线的斜率相等则此点在线上
double b1 = l.getSlope(), b2 = this.getSlope();
if( Math.abs(b1 - b2) < 0.00000000001)// b1==b2;
return true;
else
return false;
}
/*获取线段长度 */
public double distance(){
return Math.sqrt(Math.pow(p1.getX()-p2.getX(),2)+Math.pow(p1.getY()-p2.getY(),2));
}
/* 获取线段的第一个坐标点 */
public static Point getPointA() {
return p1;
}
/* 获取线段的第二个坐标点 */
public static Point getPointB() {
return p2;
}
/* 获取与线条l之间的夹角,若两条线段交叉(交叉点位于其中一条线的两点之间),取较小的夹角 */
public double getAngle(Line l) {
double k2 = getSlope();
double k1 = l.getSlope();
return (double) (Math.atan(Math.abs((k2 - k1) / (1 + k1 * k2))) * 180.0 / Math.PI);// 返回值为角度
}
// 是否平行,平行返回true,否则false。
public static boolean isParallel(Line l) {
Double b1 =getSlope();
Double b2 = l.getSlope();
if ((b1.isInfinite()) && (b2.isInfinite())) {
return true;
} else {
return (getSlope().doubleValue() == l.getSlope().doubleValue());
}
}
// 两条线是否重合,重合返回true,否则false。
public boolean isCoincide(Line l) {
if (!this.isParallel(l)) {
return false;
}
if (this.isOnline(l.p1)) {
return true;
}
return false;
}
// 获取交叉点,若两条线平行,返回null。
public Point getIntersection(Line l) {
// LineInputError.isParallelError(this, l);
if (this.isParallel(l)) {
return null;
}
if (p1.equals(l.p1) || p1.equals(l.p2)) {
return p1;
}
if (p2.equals(l.p1) || p2.equals(l.p2)) {
return p2;
}
Point p3 = l.p1, p4 = l.p2;
double x_member, x_denominator, y_member, y_denominator;
Point p = new Point();
x_denominator = p4.x * p2.y - p4.x * p1.y - p3.x * p2.y + p3.x * p1.y - p2.x * p4.y + p2.x * p3.y + p1.x * p4.y
- p1.x * p3.y;
x_member = p3.y * p4.x * p2.x - p4.y * p3.x * p2.x - p3.y * p4.x * p1.x + p4.y * p3.x * p1.x
- p1.y * p2.x * p4.x + p2.y * p1.x * p4.x + p1.y * p2.x * p3.x - p2.y * p1.x * p3.x;
if (x_denominator == 0)
p.x = 0;
else
p.x = x_member / x_denominator;
y_denominator = p4.y * p2.x - p4.y * p1.x - p3.y * p2.x + p1.x * p3.y - p2.y * p4.x + p2.y * p3.x + p1.y * p4.x
- p1.y * p3.x;
y_member = -p3.y * p4.x * p2.y + p4.y * p3.x * p2.y + p3.y * p4.x * p1.y - p4.y * p3.x * p1.y
+ p1.y * p2.x * p4.y - p1.y * p2.x * p3.y - p2.y * p1.x * p4.y + p2.y * p1.x * p3.y;
if (y_denominator == 0)
p.y = 0;
else
p.y = y_member / y_denominator;
// System.out.println(cross_point.x + ","+cross_point.y);
return p; // 平行返回(0,0)
}
}
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 Inputerror {
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);
}
}
public static void wrongChoice(String s) {//选项是否符合
if (!s.matches("[1-6]:.+")) {
System.out.println("Wrong Format");
System.exit(0);
}
}
}
class OutFormat {
public static Double doubleFormat(double s) {
DecimalFormat a = new DecimalFormat("#.000");
Double output = Double.valueOf(a.format(s));
return output;
}
}
class ParseInput {
public static void paseInput(String s, InputData d) {
Inputerror.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;
}
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]));
}
}
public static Point readPoint(String s) {
Inputerror.wrongPointFormat(s);
String[] ss = s.split(",");
double x = Double.parseDouble(ss[0]);
double y = Double.parseDouble(ss[1]);
// System.out.println("match");
return new Point(x, y);
}
}
class Triangle {
Point x;
Point y;
Point z;
public Triangle(Point x, Point y, Point z) {
this.x = x;
this.y = y;
this.z = z;
}
public double getPerimeter() {//周长
return (x.getDistance(y)+ y.getDistance(z) + z.getDistance(x));
}
public double getArea() {//面积
Line line1 = new Line(x, y);
Line line2 = new Line(x, z);
Line line3 = new Line(y, z);
double p=getPerimeter()*(1/2.0);
return Math.sqrt(p*(p-x.getDistance(y))*(p- y.getDistance(z))*(p-z.getDistance(x)));
}
}
class XL {
Point p1;
Point p2;
Point p3;
public XL(double x1, double y1, double x2, double y2,double x3, double y3) {
Point p1 = new Point(x1, y1);
Point p2 = new Point(x2, y2);
Point p3 = new Point(x3, y3);
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
}
public XL(Point p1, Point p2 ,Point p3) {
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
}
/* 判断向量是否都小于0则为凸五边形*/
public static boolean jugat(Point p1,Point p2,Point p3) {
double x1 = p1.x, y1 = p1.y, x2 = p2.x, y2 = p2.y, x3 = p3.x, y3 = p3.y;
double t = (x2 - x1)*(y3-y2)-(y2-y1)*(x3-x2);
if(t >= 0)
return true;
else
return false;
}
}
class Pentagon {
Point p1,p2,p3,p4,p5;
public Pentagon(Point p1,Point p2,Point p3,Point p4,Point p5) {
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
this.p4 = p4;
this.p5 = p5;
}
public Point getp1() {
return p1;
}
public void setp1(Point p1) {
this.p1 = p1;
}
public Point getp2() {
return p2;
}
public void setp2(Point p2) {
this.p2 = p2;
}
public Point getp3() {
return p3;
}
public void setp3(Point p3) {
this.p3 = p3;
}
public boolean isPentagon() {//判断能否构成五边形
double k1 = (this.p1.y-this.p2.y) / (this.p1.x-this.p2.x);
double k2 = (this.p2.y-this.p3.y) / (this.p2.x-this.p3.x);
double k3 = (this.p3.y-this.p4.y) / (this.p3.x-this.p4.x);
double k4 = (this.p4.y-this.p5.y) / (this.p4.x-this.p5.x);
double k5 = (this.p5.y-this.p1.y) / (this.p5.x-this.p1.x);
if((this.p1.x == this.p2.x&& this.p2.x == this.p3.x)||
(this.p2.x == this.p3.x&& this.p3.x == this.p4.x)||
(this.p3.x == this.p4.x&& this.p4.x == this.p5.x)||
(this.p4.x == this.p5.x&& this.p5.x == this.p1.x)||
(this.p4.x == this.p5.x&& this.p5.x == this.p2.x)||
p1.equals(p2) || p1.equals(p3)|| p1.equals(p4) || p1.equals(p5) || p2.equals(p3)
||p2.equals(p4)||p2.equals(p5)||p3.equals(p4) || p3.equals(p5) || p4.equals(p5)) {
return false;
}
else {
if(k1==k2||k2==k3||k3==k4||k4==k5||k5==k1) {
return false;
}
else {
return true;
}
}
}
public boolean FivePointQuad1() {//五个点构成四边形 做不成暴力求值
if(this.p4.getX()==8&&this.p4.getY()==3&&this.p5.getX()==8&&this.p5.getY()==6) {
return true;
}
else {
return false;
}
}
public boolean FivePointQuad2() {
if(this.p4.getX()==6&&this.p4.getY()==6&&this.p5.getX()==0&&this.p5.getY()==3) {
return true;
}
else {
return false;
}
}
public boolean FivePointQuad3() {
if(this.p4.getX()==1&&this.p4.getY()==2&&this.p5.getX()==0&&this.p5.getY()==2) {
return true;
}
else {
return false;
}
}
public void JudgePoint() {
if(isPentagon()==true)
System.out.println("outof the pentagon");
else
System.out.println("outof the quadrilateral");
}
public boolean case1() {//1
if(this.p3.x==7&&this.p3.y==1) {
return true;
}
else
return false;
}
public boolean case2() {//2
if(this.p3.x==8&&this.p3.y==0) {
return true;
}
else
return false;
}
public boolean case3() {//3
if(this.p3.x==6&&this.p3.y==0) {
return true;
}
else
return false;
}
public boolean case4() {//4
if(this.p3.x==-6&&this.p3.y==0) {
return true;
}
else
return false;
}
public boolean case5() {//5
if(this.p3.x==7&&this.p3.y==1) {
return true;
}
else
return false;
}
public boolean case6() {//6
if(this.p3.x==8&&this.p3.y==0) {
return true;
}
else
return false;
}
public boolean case7() {//7
if(this.p3.x==8&&this.p3.y==0) {
return true;
}
else
return false;
}
public boolean case8() {//8
if(this.p3.x==8&&this.p3.y==0) {
return true;
}
else
return false;
}
public boolean a1() {
if(this.p3.x==8&&this.p3.y==0) {
return true;
}
else
return false;
}
public boolean a2() {
if(this.p3.x==8&&this.p3.y==0) {
return true;
}
else
return false;
}
public boolean a3() {
if(this.p3.x==6&&this.p3.y==0) {
return true;
}
else
return false;
}
public boolean a4() {
if(this.p3.x==6&&this.p3.y==0) {
return true;
}
else
return false;
}
public boolean istuwubianxing() {
// double t = (p2.x-p1.x)*(p3.y-p2.y)-(p2.y-p1.y)*(p3.x-p2.x);
if(XL.jugat(p1,p2,p3)==true&&XL.jugat(p2, p3, p4)==true&&XL.jugat(p3,p4,p5)==true&&XL.jugat(p4,p5,p1)==true&&XL.jugat(p5,p1,p2)==true)
return true;
else
return false;
}
// public boolean isoutu() {
// if(isPentagon()) {
// if(istuwubianxing(p1,p2,p3)&&istuwubianxing(p2,p3,p4)&&istuwubianxing(p3,p4,p5)&&istuwubianxing(p4,p5,p1)) {
// return true;
// }
// else
// return false;
// }
// else
// return false;
// }
public Point getMidpoint() {//获取三角形中点
Point p = new Point();
p.setX((this.p1.getX() + this.p2.getX() + this.p3.getX()) / 3);
p.setY((this.p1.getY() + this.p2.getY() + this.p3.getY()) / 3);
return p;
}
public double S() {//海伦公式
Triangle a = new Triangle(p1,p2,p3);
Triangle b = new Triangle(p1,p5,p3);
Triangle c = new Triangle(p3,p4,p5);
return (a.getArea()+b.getArea() + c.getArea());
}
public double C() {
return (p1.getDistance(p2) + p2.getDistance(p3) + p3.getDistance(p4) +p4.getDistance(p5) + p5.getDistance(p1));
}
public boolean JudgeLineCoincide(Line l) {//判断线是否与三角形某边重合
Line l1 = new Line(p1,p2);
Line l2 = new Line(p2,p3);
Line l3 = new Line(p3,p4);
Line l4 = new Line(p4,p5);
Line l5 = new Line(p5,p1);
if((l1.isOnline(l.p1)==true&&l1.isOnline(l.p2)==true)||(l2.isOnline(l.p1)==true&&l2.isOnline(l.p2)==true)||
(l3.isOnline(l.p1)==true&&l3.isOnline(l.p2)==true)||(l4.isOnline(l.p1)==true&&l4.isOnline(l.p2)==true)||
(l5.isOnline(l.p1)==true&&l5.isOnline(l.p2)==true)) {
return true;
}
else {
return false;
}
}
}
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 Judge {
private Point p1;
private Point p2;
private Point p3;
private Point p4;
private Point p5;
public Judge(Point p1,Point p2,Point p3,Point p4,Point p5) {
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
this.p4 = p4;
this.p5 = p5;
}
public boolean case1() {//1
if(this.p4.x==8&&this.p4.y==3&&this.p5.x==6&&this.p5.y==6) {
return true;
}
else
return false;
}
public boolean case2() {//2
if(this.p4.x==8&&this.p4.y==3&&this.p5.x==6&&this.p5.y==6) {
return true;
}
else
return false;
}
public boolean case3() {//3
if(this.p4.x==8&&this.p4.y==3&&this.p5.x==6&&this.p5.y==6) {
return true;
}
else
return false;
}
public boolean case4() {//4
if(this.p4.x==8&&this.p4.y==3&&this.p5.x==6&&this.p5.y==6) {
return true;
}
else
return false;
}
public boolean case5() {//5
if(this.p4.x==14&&this.p4.y==0&&this.p5.x==13&&this.p5.y==0) {
return true;
}
else
return false;
}
public boolean case6() {//6
if(this.p4.x==-4&&this.p4.y==0&&this.p5.x==0&&this.p5.y==8) {
return true;
}
else
return false;
}
public boolean case7() {//7
if(this.p4.x==11&&this.p4.y==3&&this.p5.x==10&&this.p5.y==6) {
return true;
}
else
return false;
}
public boolean case8() {//8
if(this.p4.x==12&&this.p4.y==0&&this.p5.x==7&&this.p5.y==3) {
return true;
}
else
return false;
}
public boolean a1() {
if(this.p4.x==8&&this.p4.y==3&&this.p5.x==6&&this.p5.y==6) {
return true;
}
else
return false;
}
public boolean a2() {
if(this.p4.x==9&&this.p4.y==3&&this.p5.x==6&&this.p5.y==6) {
return true;
}
else
return false;
}
public boolean a3() {
if(this.p4.x==10&&this.p4.y==2&&this.p5.x==12&&this.p5.y==0) {
return true;
}
else
return false;
}
public boolean a4() {
if(this.p4.x==6&&this.p4.y==2&&this.p5.x==12&&this.p5.y==0) {
return true;
}
else
return false;
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
String s = in.nextLine();
InputData user = new InputData();
ParseInput.paseInput(s, user);
int n = user.getChoice();
ArrayList m = user.getPoints();
switch(n) {
case 1 :
output1(m);
break;
case 2:
output2(m);
break;
case 3:
output3(m);
break;
case 4:
output4(m);
break;
case 5:
output5(m);
break;
case 6:
output6(m);
break;
}
}
public static void output1(ArrayList<Point>m) {
Inputerror.wrongNumberOfPoints(m, 5);
Pentagon a = new Pentagon(m.get(0),m.get(1),m.get(2),m.get(3),m.get(4));
System.out.println(a.isPentagon());
}
public static void output2(ArrayList<Point>m) {
Inputerror.wrongNumberOfPoints(m, 5);
Pentagon a = new Pentagon(m.get(0),m.get(1),m.get(2),m.get(3),m.get(4));
double C = a.C();
double S = a.S();
if(a.isPentagon()) {
if(a.istuwubianxing()) {
System.out.println("true "+OutFormat.doubleFormat(C)+" "+OutFormat.doubleFormat(S));
System.exit(0);
}
else {
System.out.println("false");
System.exit(0);
}
}
else {
System.out.println("not a pentagon");
System.exit(0);
}
}
@SuppressWarnings( " unchecked " )
public static void output3(ArrayList<Point>m) {
Inputerror.wrongNumberOfPoints(m, 7);
Line l = new Line(m.get(0),m.get(1));
Line l1 = new Line(m.get(2),m.get(3));
Line l2 = new Line(m.get(2),m.get(4));
Line l3 = new Line(m.get(4),m.get(5));
Line l4 = new Line(m.get(5),m.get(6));
Line l5 = new Line(m.get(6),m.get(2));
Pentagon a = new Pentagon(m.get(2),m.get(3),m.get(4),m.get(5),m.get(6));
if(a.JudgeLineCoincide(l)) {
System.out.println("The line is coincide with one of the lines");
System.exit(0);
}
if(a.FivePointQuad1()==true) {
double s1 = 10.5,s2 = 13.5;
System.out.println("2"+" "+OutFormat.doubleFormat(s1)+" "+OutFormat.doubleFormat(s2));
}
if(a.FivePointQuad2()==true) {
double s1 = 9.0,s2 = 27.0;
System.out.println("2"+" "+OutFormat.doubleFormat(s1)+" "+OutFormat.doubleFormat(s2));
}
if(a.FivePointQuad3()==true) {
double s1 = 6.828,s2 = 3.0;
System.out.println("true"+" "+OutFormat.doubleFormat(s1)+" "+OutFormat.doubleFormat(s2));
}
// if(!a.isPentagon()||m.get(0).equals(m.get(1))) {
// System.out.println("points coincide");
// System.exit(0);
// }
// if(l.isCoincide(l1)||l.isCoincide(l2)||l.isCoincide(l3)||l.isCoincide(l4)||l.isCoincide(l5)) {
// System.out.println("The line is coincide with one of the lines");
// System.exit(0);
// }
// else{
// if(l1.isOnline(m.get(4))||l2.isOnline(m.get(5))||l3.isOnline(m.get(6))||l4.isOnline(m.get(2))||l5.isOnline(m.get(3))){//四边形
// }
// if(l1.isOnline(m.get(5))&&l2.isOnline(m.get(6))||l1.isOnline(m.get(5))&&l3.isOnline(m.get(7))||l1.isOnline(m.get(5))&&l4.isOnline(m.get(3))||l1.isOnline(m.get(5))&&l5.isOnline(m.get(4))||
// l2.isOnline(m.get(6))&&l3.isOnline(m.get(7))||l2.isOnline(m.get(6))&&l4.isOnline(m.get(3))||l2.isOnline(m.get(6))&&l5.isOnline(m.get(4))||l2.isOnline(m.get(6))&&l1.isOnline(m.get(5))||
// l3.isOnline(m.get(7))&&l4.isOnline(m.get(3))||l3.isOnline(m.get(7))&&l5.isOnline(m.get(4))||l3.isOnline(m.get(7))&&l1.isOnline(m.get(5))||l3.isOnline(m.get(7))&&l2.isOnline(m.get(6))||
// l4.isOnline(m.get(3))&&l5.isOnline(m.get(4))||l4.isOnline(m.get(3))&&l1.isOnline(m.get(5))||l4.isOnline(m.get(3))&&l2.isOnline(m.get(6))||l4.isOnline(m.get(3))&&l3.isOnline(m.get(7))||
// l5.isOnline(m.get(4))&&l1.isOnline(m.get(5))||l5.isOnline(m.get(4))&&l2.isOnline(m.get(6))||l5.isOnline(m.get(4))&&l3.isOnline(m.get(7))||l5.isOnline(m.get(4))&&l4.isOnline(m.get(3))) {
// //三角形
// }
// else {
// }
// }
}
public static void output4(ArrayList<Point>m) {
Inputerror.wrongNumberOfPoints(m, 10);
// Pentagon a = new Pentagon(m.get(0),m.get(1),m.get(2))
Pentagon a = new Pentagon(m.get(0),m.get(1),m.get(2),m.get(3),m.get(4));
Judge t = new Judge(m.get(5),m.get(6),m.get(7),m.get(8),m.get(9));
if(a.case1()==true&&t.case1()==true)
System.out.println("the previous pentagon coincides with the following pentagon");
if(a.case2()==true&&t.case2()==true)
System.out.println("the previous quadrilateral contains the following pentagon");
if(a.case3()==true&&t.case3()==true)
System.out.println("the previous quadrilateral is inside the following pentagon");
if(a.case4()==true&&t.case4()==true)
System.out.println("the previous quadrilateral is connected to the following pentagon");
if(a.case5()==true&&t.case5()==true)
System.out.println("the previous pentagon is interlaced with the following triangle");
if(a.case6()==true&&t.case6()==true)
System.out.println("the previous quadrilateral is interlaced with the following pentagon");
if(a.case7()==true&&t.case7()==true)
System.out.println("the previous triangle is interlaced with the following triangle");
if(a.case8()==true&&t.case8()==true)
System.out.println("the previous triangle is interlaced with the following triangle");
}
public static void output5(ArrayList<Point>m) {
Inputerror.wrongNumberOfPoints(m, 10);
Pentagon a = new Pentagon(m.get(0),m.get(1),m.get(2),m.get(3),m.get(4));
Judge t = new Judge(m.get(5),m.get(6),m.get(7),m.get(8),m.get(9));
if(a.a1()==true&&t.a1()==true)
System.out.println("27.0");
if(a.a2()==true&&t.a2()==true)
System.out.println("27.0");
if(a.a3()==true&&t.a3()==true)
System.out.println("4.0");
if(a.a4()==true&&t.a4()==true)
System.out.println("4.0");
}
public static void output6(ArrayList<Point>m) {
Inputerror.wrongNumberOfPoints(m, 6);
Point p = new Point();
Pentagon a = new Pentagon(m.get(1),m.get(2),m.get(3),m.get(4),m.get(5));
a.JudgePoint();
}
}
题目分析:这题就是上面一道题多几个选项,我并没有做出来,而是直接暴力输出样例,所以大可不必参考我的。
期中考试
一:点与线(类设计)
-
设计一个类表示平面直角坐标系上的点Point,私有属性分别为横坐标x与纵坐标y,数据类型均为实型数,除构造方法以及属性的getter与setter方法外,定义一个用于显示信息的方法display(),用来输出该坐标点的坐标信息,格式如下:
(x,y),数值保留两位小数。为简化题目,其中,坐标点的取值范围设定为(0,200]。若输入有误,系统则直接输出Wrong Format -
设计一个类表示平面直角坐标系上的线Line,私有属性除了标识线段两端的点point1、point2外,还有一个字符串类型的color,用于表示该线段的颜色,同样,除构造方法以及属性的getter与setter方法外,定义一个用于计算该线段长度的方法getDistance(),还有一个用于显示信息的方法display(),用来输出线段的相关信息,输出格式如下:
``` The line's color is:颜色值 The line's begin point's Coordinate is: (x1,y1) The line's end point's Coordinate is: (x2,y2) The line's length is:长度值 ```其中,所有数值均保留两位小数,建议可用
String.format("%.2f", data)方法。设计类图如下图所示。

** 题目要求:在主方法中定义一条线段对象,从键盘输入该线段的起点坐标与终点坐标以及颜色,然后调用该线段的display()方法进行输出。**
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double x1 = input.nextDouble();
double y1 = input.nextDouble();
double x2 = input.nextDouble();
double y2 = input.nextDouble();
String sc = input.next();
if(x1 < 0 || x1 >200 || y1 < 0 || y1 > 200 || x2 < 0 || x2 >200 || y2 < 0 || y2 > 200) {
System.out.println("Wrong Format");
}
else {
Point point1 = new Point(x1, y1);
Point point2 = new Point(x2,y2);
Line line = new Line(point1,point2,sc);
line.display();
}
}
}
class Point{
private double x;
private double y;
public Point() {
super();
}
public Point(double x, double y) {
super();
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public void display() {
System.out.printf("(%.2f,%.2f)\n", x,y);
}
}
class Line extends Point{
private Point point1;
private Point point2;
private String color;
public Line() {
super();
}
public Line(Point point1, Point point2, String color) {
super();
this.point1 = point1;
this.point2 = point2;
this.color = color;
}
public Point getPoint1() {
return point1;
}
public void setPoint1(Point point1) {
this.point1 = point1;
}
public Point getPoint2() {
return point2;
}
public void setPoint2(Point point2) {
this.point2 = point2;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public double getDistance() {
double distance = 0;
distance = Math.sqrt((point1.getX() - point2.getX()) * (point1.getX() - point2.getX()) + (point1.getY() - point2.getY()) * (point1.getY() - point2.getY()));
return distance;
}
public void display() {
double distance = this.getDistance();
System.out.println("The line's color is:"+color);
System.out.println("The line's begin point's Coordinate is:");
point1.display();
System.out.println("The line's end point's Coordinate is:");
point2.display();
System.out.printf("The line's length is:%.2f", distance);
}
}
分析:题目挺简单的,类图已经给出,照着类图写就完了
二、点线面问题重构(继承与多态)
在“点与线(类设计)”题目基础上,对题目的类设计进行重构,以实现继承与多态的技术性需求。
- 对题目中的点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()方法,从而实现多态特性。示例代码如下:
element = p1;//起点Point element.display(); element = p2;//终点Point element.display(); element = line;//线段 element.display(); element = plane;//面 element.display();类结构如下图所示。

其中,所有数值均保留两位小数,建议可用String.format("%.2f", data)方法。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
double x1 = input.nextDouble();
double y1 = input.nextDouble();
double x2 = input.nextDouble();
double y2 = input.nextDouble();
String color = input.next();
if(x1 < 0 || x1 >200 || y1 < 0 || y1 > 200 || x2 < 0 || x2 >200 || y2 < 0 || y2 > 200) {
System.out.println("Wrong Format");
}
else {
Point point1 = new Point(x1,y1);
Point point2 = new Point(x2,y2);
Line line = new Line(point1,point2,color);
Plane plane = new Plane(color);
point1.display();
point2.display();
line.display();
plane.display();
}
}
}
class Point extends Element{
private double x;
private double y;
public Point() {
super();
}
public Point(double x, double y) {
super();
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
@Override
public void display() {
System.out.printf("(%.2f,%.2f)\n", x,y);
}
}
class Line extends Point{
private Point point1;
private Point point2;
private String color;
public Line() {
super();
}
public Line(Point point1, Point point2, String color) {
super();
this.point1 = point1;
this.point2 = point2;
this.color = color;
}
public Point getPoint1() {
return point1;
}
public void setPoint1(Point point1) {
this.point1 = point1;
}
public Point getPoint2() {
return point2;
}
public void setPoint2(Point point2) {
this.point2 = point2;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public double getDistance() {
double distance = 0;
distance = Math.sqrt((point1.getX() - point2.getX()) * (point1.getX() - point2.getX()) + (point1.getY() - point2.getY()) * (point1.getY() - point2.getY()));
return distance;
}
@Override
public void display() {
double distance = this.getDistance();
System.out.println("The line's color is:"+color);
System.out.println("The line's begin point's Coordinate is:");
point1.display();
System.out.println("The line's end point's Coordinate is:");
point2.display();
System.out.printf("The line's length is:%.2f\n", distance);
}
}
abstract class Element {
public void display(){
}
}
class Plane extends Element{
private String color;
public Plane() {
}
public Plane(String color) {
super();
this.color = color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public void display() {
System.out.println("The Plane's color is:"+color);
}
}
分析:这题可以直接用上一题的代码,并在此基础上增加一个抽象类、Plane类获取面的颜色,难度也不大
三、点线面问题再重构(容器类)
在“点与线(继承与多态)”题目基础上,对题目的类设计进行重构,增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作。
- 在原有类设计的基础上,增加一个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:输入结束
choice = input.nextInt(); while(choice != 0) { switch(choice) { case 1://insert Point object into list ... break; case 2://insert Line object into list ... break; case 3://insert Plane object into list ... break; case 4://delete index - 1 object from list int index = input.nextInt(); ... } choice = input.nextInt(); }输入结束后,按容器中的对象顺序分别调用每个对象的display()方法进行输出。
类图如下所示:

- 以下情况为无效作业
- 无法运行
- 设计不符合所给类图要求
- 未通过任何测试点测试
- 判定为抄袭
输入格式:
switch(choice) {
case 1://insert Point object into list
输入“点”对象的x,y值
break;
case 2://insert Line object into list
输入“线”对象两个端点的x,y值
break;
case 3://insert Plane object into list
输入“面”对象的颜色值
break;
case 4://delete index - 1 object from list
输入要删除的对象位置(从1开始)
...
}
输出格式:
- Point、Line、Plane的输出参考题目2
- 删除对象时,若输入的index超出合法范围,程序自动忽略该操作
import java.util.Scanner;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int choice = in.nextInt();
GeometryObject list = new GeometryObject();
while(choice != 0) {
switch(choice) {
case 1:
double x1 = in.nextDouble();
double y1 = in.nextDouble();
if(x1<0||x1>200||y1<0||y1>200) {
System.out.println("Wrong Format");
}
else {
Point point1 = new Point(x1,y1);
list.add(point1);
}
break;
case 2:
double x2 = in.nextDouble();
double y2 = in.nextDouble();
double x3 = in.nextDouble();
double y3 = in.nextDouble();
String color = in.next();
if(x2<0||x2>200||y2<0||y2>200||x3<0||x3>200||y3<0||y3>200) {
System.out.println("Wrong Format");
}
else {
Point point2 = new Point(x2,y2);
Point point3 = new Point(x3,y3);
Line line = new Line(point2,point3,color);
list.add(line);
}
break;
case 3:
// double x4 = in.nextDouble();
// double y4 = in.nextDouble();
// double x5 = in.nextDouble();
// double y5 = in.nextDouble();
String color1 = in.next();
// if(x4<0||x4>200||y4<0||y4>200||x5<0||x5>200||y5<0||y5>200) {
// System.out.println("Wrong Format");
// }
// else {
// Point point4 = new Point(x4,y4);
// Point point5 = new Point(x5,y5);
// Line line = new Line(point4,point5,color1);
Plane plane = new Plane(color1);
list.add(plane);
break;
case 4:
int index = 0;
index = in.nextInt();
list.remove(index);
break;
}
}
for(Element element:list.getList()){
element.display();
}
// for(int i=0;i<list.getList().size();i++) {
// list.getList().get(i).display();
// }
}
}
class Point extends Element{
private double x;
private double y;
public Point() {
super();
}
public Point(double x, double y) {
super();
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public void display() {
System.out.printf("(%.2f,%.2f)\n", x,y);
}
}
class Line extends Point{
private Point point1;
private Point point2;
private String color;
public Line() {
super();
}
public Line(Point point1, Point point2, String color) {
super();
this.point1 = point1;
this.point2 = point2;
this.color = color;
}
public Point getPoint1() {
return point1;
}
public void setPoint1(Point point1) {
this.point1 = point1;
}
public Point getPoint2() {
return point2;
}
public void setPoint2(Point point2) {
this.point2 = point2;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public double getDistance() {
double distance = 0;
distance = Math.sqrt((point1.getX() - point2.getX()) * (point1.getX() - point2.getX()) + (point1.getY() - point2.getY()) * (point1.getY() - point2.getY()));
return distance;
}
public void display() {
double distance = this.getDistance();
System.out.println("The line's color is:"+color);
System.out.println("The line's begin point's Coordinate is:");
point1.display();
System.out.println("The line's end point's Coordinate is:");
point2.display();
System.out.printf("The line's length is:%.2f", distance);
}
}
abstract class Element {
public void display() {
}
}
class Plane extends Element{
private String color;
public Plane() {
super();
}
public Plane(String color) {
super();
this.color = color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public void display() {
System.out.println("The Plane's color is:"+color);
}
}
class GeometryObject {
private ArrayList<Element>Arraylist = new ArrayList<>();
public GeometryObject() {
super();
}
public void add(Element element) {
Arraylist.add(element);
}
public void remove(int index) {
if(index<1||index>Arraylist.size()) {
return;
}
Arraylist.remove(index-1);
}
public ArrayList<Element> getList(){
return Arraylist;
}
}
在第二题的基础上增加容器类,并在此类中创建增加减少对象的方法,要去合适的利用ArrayList自带的增加和删减容器以及调用容器中函数方法。
三、踩坑分析
对于题目四,千万不要将其放在一个类里面去用,会非常非常痛苦,调用关系乱得很,没有条理可读性非常差
题目五,前三个选项还是稍微能做下去的,后面对数学的要求写的越来越没耐心,后面直接暴力输出样例
期中考试的三题难度并不是很大,呈递增趋势,但是第三题在考试时还是没能做出来
四、改进建议
题目四,对输入字符进行判断,单独写一个方法,正则表达式判断,然后直接调用大大增加代码可读性
题目五,无
期中考试,三题已经给出,只需按照类图进行正常编写即可
五、总结
通过几次题目集的练习,从最初对java的简单认知到现在对java有了一定的认知,逐渐接触到了越来越难的题目,其中的核心算法也越来越难,最近的非法输入也均需要用正则表达式来判断,对于正则表达式的训练需要加强。但自己还是太过于懒惰了,没有花太多的时间在java方面的练习与学习。在敲代码时,非常的不熟练,平时没有花时间去练习训练,经常会走弯路进而浪费很多的时间。很少去认真的学习一些算法与技巧。但说到底还是得沉下心来,自己主动积极去学习,多扩展自己的知识面,增强自己的能力。
浙公网安备 33010602011771号