nchu-software-oop-2022-3

7-1 点线形系列1-计算两点之间的距离
分数 10  作者 蔡轲  单位 南昌航空大学

输入连个点的坐标,计算两点之间的距离

输入格式:

4个double类型的实数,两个点的x,y坐标,依次是x1、y1、x2、y2,两个点的坐标之间以空格分隔,每个点的x,y坐标以英文“,”分隔。例如:0,0 1,1或0.1,-0.3 +3.5,15.6。
若输入格式非法,输出"Wrong Format"。
若输入格式合法但坐标点的数量超过两个,输出“wrong number of points”。

输出格式:

计算所得的两点之间的距离。例如:1.4142135623730951

输入样例:

整数输入。例如:

0,0 1,1
 

输出样例:

在这里给出相应的输出。例如:

1.4142135623730951
 

输入样例1:

带符号double类型实数输入。例如:

+2,-2.3 0.9,-3.2
 

输出样例1:

在这里给出相应的输出。例如:

1.42126704035519
 

输入样例2:

格式非法。例如:

++2,-2.3 0.9,-3.2
 

输出样例2:

在这里给出相应的输出。例如:

Wrong Format
 

输入样例3:

点的数量超过两个。例如:

+2,-2.3 0.9,-3.2 +2,-2.3
 

输出样例3:

在这里给出相应的输出。例如:

wrong number of points

代码实现:

 

import java.util.Scanner;

public class Main {
   public static void main(String[] args) {

      Scanner input = new Scanner(System.in);
      String str = input.nextLine();
      double sum[][] = null;
      String[] part = str.split(" ");
      double snum = 0;
      for (int i = 0; i < part.length; i++) {
          String[] num = null;
          num = part[i].split(",");
          for (int j = 0; j < num.length; j++) {
              if (!num[j].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$")) {
                  System.out.print("Wrong Format");
                  System.exit(0);
              }
          }
          if (part.length != 2) {
              System.out.print("wrong number of points");
              System.exit(0);
          }
          String[] num1 = part[0].split(",");
          String[] num2 = part[1].split(",");
          double x1 = Double.valueOf(num1[0]);
          double y1 = Double.valueOf(num1[1]);
          double x2 = Double.valueOf(num2[0]);
          double y2 = Double.valueOf(num2[1]);
          if (x1 == x2 && y1 == y2) {
              System.out.print("Wrong Format");
              return;
          }
          snum = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
      }
      System.out.println(snum);
  }
}

7-2 点线形系列2-线的计算
分数 42  作者 蔡轲  单位 南昌航空大学

用户输入一组选项和数据,进行与直线有关的计算。选项包括:
1:输入两点坐标,计算斜率,若线条垂直于X轴,输出"Slope does not exist"。
2:输入三个点坐标,输出第一个点与另外两点连线的垂直距离。
3:输入三个点坐标,判断三个点是否在一条线上,输出true或者false。
4:输入四个点坐标,判断前两个点所构成的直线与后两点构成的直线是否平行,输出true或者false.
5:输入四个点坐标,计算输出前两个点所构成的直线与后两点构成的直线的交点坐标,x、y坐标之间以英文分隔",",并输出交叉点是否在两条线段之内(不含四个端点)的判断结果(true/false),判断结果与坐标之间以一个英文空格分隔。若两条线平行,没有交叉点,则输出"is parallel lines,have no intersection point"。

输入格式:

基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。
例如:1:0,0 1,1
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
不论哪个选项,如果格式、点数量都符合要求,但构成任一条线的两个点坐标重合,输出"points coincide",

输出格式:

见题目描述。

输入样例1:

选项1,两点重合。例如:

1:-2,+5 -2,+5
 

输出样例:

在这里给出相应的输出。例如:

points coincide
 

输入样例2:

选项1,斜率无穷大的线。例如:

1:-2,3 -2,+5
 

输出样例:

在这里给出相应的输出。例如:

Slope does not exist
 

输入样例3:

选项1,斜率无穷大。例如:

1:-2,3 -2,+5
 

输出样例:

在这里给出相应的输出。例如:

Slope does not exist
 

输入样例4:

选项1,符合格式输入,带符号/不带符号数混合。例如:

1:-2.5,3 -2,+5.3
 

输出样例:

在这里给出相应的输出。例如:

4.6
 

输入样例5:

选项2,计算第一个点到另外两点连线的垂直距离。例如:

2:0,1 1,0 2,0
 

输出样例:

在这里给出相应的输出。例如:

1.0
 

输入样例6:

选项3,判断三个点是否在一条线上。例如:

3:0,1 2,2 5,3
 

输出样例:

在这里给出相应的输出。例如:

false
 

输入样例7:

选项4,判断两条线是否平行。例如:

4:0,1 0,2 2,1 3,0 
 

输出样例:

在这里给出相应的输出。例如:

false
 

输入样例8:

选项5,判断两条线的交点。例如:

5:0,0 -1,-1 0,2 3,-1
 

输出样例:

在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:

1.0,1.0 true
 

输入样例9:

选项5,判断两条线的交点。但两条线平行例如:

5:0,0 -1,-1 2,3 3,4
 

输出样例:

在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:

is parallel lines,have no intersection point

本题用面向过程的方式实现,所以代码量相对较多

代码实现:

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
      Scanner input = new Scanner(System.in);
      String str = input.nextLine();
      String[] part = str.split(":");//part[0]为选项,part[1]为坐标
      String[] zuobiao = part[1].split(" ");//zuobiao[i]表示第i—1的坐标

      if(!str.matches("^[1-5][:](([+-]?(0|(0\\.\\d+)|[1-9][0-9]*(\\.\\d+)?))[,]([+-]?(0|(0\\.\\d+)|[1-9][0-9]*(\\.\\d+)?))\\s?)+$")){
          System.out.print("Wrong Format");
          System.exit(0);
      }
      switch (part[0]){
            case "1":
            if(zuobiao.length == 2){
                operation1(zuobiao);
                break;
            }
            else{
                System.out.print("wrong number of points");
                System.exit(0);
            }
            case "2":
            if(zuobiao.length == 3){
                  operation2(zuobiao);
                break;
             }
            else{
                System.out.print("wrong number of points");
                System.exit(0);
            }
            case "3":
            if(zuobiao.length == 3){
                operation3(zuobiao);
                break;
            }
            else{
                System.out.print("wrong number of points");
                System.exit(0);
            }
            case "4":
            if(zuobiao.length == 4){
                operation4(zuobiao);
                break;
            }
            else{
                System.out.print("wrong number of points");
                System.exit(0);
            }
            case "5":
            if(zuobiao.length == 4){
                operation5(zuobiao);
                break;
            }
            else{
                System.out.print("wrong number of points");
                System.exit(0);
            }
    }
}

private static void operation5(String[] zuobiao) {
      String[] part1 = zuobiao[0].split(",");
      String[] part2 = zuobiao[1].split(",");
      String[] part3 = zuobiao[2].split(",");
      String[] part4 = zuobiao[3].split(",");
      double x1 = Double.parseDouble(part1[0]);
      double y1 = Double.parseDouble(part1[1]);
      double x2 = Double.parseDouble(part2[0]);
      double y2 = Double.parseDouble(part2[1]);
      double x3 = Double.parseDouble(part3[0]);
      double y3 = Double.parseDouble(part3[1]);
      double x4 = Double.parseDouble(part4[0]);
      double y4 = Double.parseDouble(part4[1]);
      if (((x1 == x2) & (y1 == y2)) || ((x3 == x4) & (y3 == y4))) {
          System.out.print("points coincide");
          System.exit(0);
      }
      if ((y1 - y2) / (x1 - x2) == (y3 - y4) / (x3 - x4) | (x1 == x2) & (x3 == x4)) {
          System.out.print("is parallel lines,have no intersection point");
          System.exit(0);
      }
      double x0 = 0;
      double y0 = 0;
      if(x1==x2&x3!=x4){
      double b = (y3 - y4) / (x3 - x4);
      x0 = x1;
      y0 = b*(x0-x3)+y3;
      }
      else if(x1!=x2&x3==x4){
          double a = (y1 - y2) / (x1 - x2);
          x0 = x3;
          y0 = a*(x0-x1)+y1;
      }
      else{
          double a = (y1 - y2) / (x1 - x2);
          double b = (y3 - y4) / (x3 - x4);
          x0 = (a * x1 - b * x3 + y3 - y1) / (a - b);
          y0 = (b * y1 - a * y3) / (b - a);
      }
      String pd;
      if((x0 > Math.min(x1,x2)& x0 < Math.max(x1,x2))|(x0 > Math.min(x3,x4)& x0 < Math.max(x3,x4))){
          pd = "true";
      }
      else{
          pd = "false";
      }

      System.out.print(x0 + "," + y0 + " " + pd);
      System.exit(0);
}

private static void operation4(String[] zuobiao) {
      String[] part1 = zuobiao[0].split(",");
      String[] part2 = zuobiao[1].split(",");
      String[] part3 = zuobiao[2].split(",");
      String[] part4 = zuobiao[3].split(",");
      double x1 = Double.parseDouble(part1[0]);
      double y1 = Double.parseDouble(part1[1]);
      double x2 = Double.parseDouble(part2[0]);
      double y2 = Double.parseDouble(part2[1]);
      double x3 = Double.parseDouble(part3[0]);
      double y3 = Double.parseDouble(part3[1]);
      double x4 = Double.parseDouble(part4[0]);
      double y4 = Double.parseDouble(part4[1]);
      if(((x1==x2)&&(y1==y2))||((x3==x4)&&(y3==y4))){
          System.out.print("points coincide");
          System.exit(0);
      }
      if((y1-y2)/(x1-x2)==(y3-y4)/(x3-x4)){
          System.out.print(true);
      }
      else{
          System.out.print(false);
      }
}

private static void operation3(String[] zuobiao) {
      String[] part1 = zuobiao[0].split(",");
      String[] part2 = zuobiao[1].split(",");
      String[] part3 = zuobiao[2].split(",");
      double x1 = Double.parseDouble(part1[0]);
      double y1 = Double.parseDouble(part1[1]);
      double x2 = Double.parseDouble(part2[0]);
      double y2 = Double.parseDouble(part2[1]);
      double x3 = Double.parseDouble(part3[0]);
      double y3 = Double.parseDouble(part3[1]);
      if((y1-y2)/(x1-x2)==(y1-y3)/(x1-x3)||((x1==x2)&&(y1==y2))||((x1==x3)&&(y1==y3))||((x3==x2)&&(y3==y2))){
          System.out.print(true);
      }

      else{
          System.out.print(false);
      }
}

private static void operation2(String[] zuobiao) {
      String[] part1 = zuobiao[0].split(",");
      String[] part2 = zuobiao[1].split(",");
      String [] part3 = zuobiao[2].split(",");
      double x1 = Double.parseDouble(part1[0]);
      double y1 = Double.parseDouble(part1[1]);
      double x2 = Double.parseDouble(part2[0]);
      double y2 = Double.parseDouble(part2[1]);
      double x3 = Double.parseDouble(part3[0]);
      double y3 = Double.parseDouble(part3[1]);
      if(x2 == x3&&y2 == y3){
          System.out.print("points coincide");
          System.exit(0);
      }
      double mianji = Math.abs((y2-y3)*x1+(x3-x2)*y1+y3*x2-y2*x3);
      double line = Math.sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
      double juli = mianji/line;
      System.out.print(juli);
}

private static void operation1(String[] zuobiao) {
      String[] part1 = zuobiao[0].split(",");
      String[] part2 = zuobiao[1].split(",");
      double x1 = Double.parseDouble(part1[0]);
      double y1 = Double.parseDouble(part1[1]);
      double x2 = Double.parseDouble(part2[0]);
      double y2 = Double.parseDouble(part2[1]);
      if(x1==x2){
          if(y1==y2){
              System.out.print("points coincide");
              System.exit(0);
          }
          else{
              System.out.print("Slope does not exist");
          }
      }
      else{
          double xielv = (y1-y2)/(x1-x2);
          System.out.print(xielv);
      }
      System.exit(0);

  }

}

 

由于对Java类的使用不太熟悉,所以本题用了面向过程的编程,所以代码量较大,冗余较大。

 
 
7-3 点线形系列3-三角形的计算
分数 48  作者 蔡轲  单位 南昌航空大学

用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
1:输入三个点坐标,判断是否是等腰三角形、等边三角形,判断结果输出true/false,两个结果之间以一个英文空格符分隔。
2:输入三个点坐标,输出周长、面积、重心坐标,三个参数之间以一个英文空格分隔,坐标之间以英文","分隔。
3:输入三个点坐标,输出是钝角、直角还是锐角三角形,依次输出三个判断结果(true/false),以一个英文空格分隔,
4:输入五个点坐标,输出前两个点所在的直线与三个点所构成的三角形相交的交点数量,如果交点有两个,则按面积大小依次输出三角形被直线分割成两部分的面积。若直线与三角形一条线重合,输出"The point is on the edge of the triangle"
5:输入四个点坐标,输出第一个是否在后三个点所构成的三角形的内部(输出in the triangle/outof triangle)。
必须使用射线法,原理:由第一个点往任一方向做一射线,射线与三角形的边的交点(不含点本身)数量如果为1,则在三角形内部。如果交点有两个或0个,则在三角形之外。若点在三角形的某条边上,输出"on the triangle"

输入格式:

基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。点的x、y坐标之间以英文","分隔,点与点之间以一个英文空格分隔。

输出格式:

基本输出格式见每种选项的描述。
异常情况输出:
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
如果输入的三个点无法构成三角形,输出"data error"。
注意:输出的数据若小数点后超过6位,只保留小数点后6位,多余部分采用四舍五入规则进到最低位。小数点后若不足6位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为 0.333333,1.0按格式输出为1.0

选项4中所输入线的两个点坐标重合,输出"points coincide",

输入样例1:

选项4,定义线的两点重合。例如:

4:1,0 1,0 0,0 2,0 4,0
 

输出样例:

在这里给出相应的输出。例如:

points coincide
 

输入样例2:

选项4,构成三角形的三个点在一条线上,无法构成三角形。例如:

4:1,0 0,2 0,0 0,0 4,0
 

输出样例:

在这里给出相应的输出。例如:

data error
 

输入样例3:

选项1,判断等腰、等边三角形。例如:

1:-2,0 2,0 0,4
 

输出样例:

两个判断结果。例如:

true false
 

输入样例4:

选项2,输出边长、面积、重心坐标。例如:

2:0,0 3,0 0,1
 

输出样例:

在这里给出相应的输出。例如:

7.162278 1.5 1.0,0.333333
 

输入样例5:

选项3,钝角、直角、锐角的判断。例如:

3:0,1 1,0 2,0
 

输出样例:

在这里给出相应的输出。例如:

true false false
 

输入样例6:

选项4,直线与三角形交点的数量等于2,输出数量值以及三角形被分割的两部分面积。例如:

4:1,0 0,2 0,0 0,2 4,0
 

输出样例:

在这里给出相应的输出。例如:

2 1.0 3.0
 

输入样例7:

选项4,直线与三角形交点的数量少于两个,只输出数量值。例如:

4:-1,0 1,2 0,1 0,-1 2,0
 

输出样例:

在这里给出相应的输出。例如:

1
 

输入样例8:

选项5,用射线法判断点是否在三角形内部。例如:

5:0.5,0.5 0,0 0,2 4,0
 

输出样例:

在这里给出相应的输出,交点坐标之间以英文","分隔,判断结果与坐标之间以一个英文空格分隔。例如:

in the triangle
 

输入样例9:

选项5,用射线法判断点是否在三角形内部。例如:

5:0,0 -1,-1 2,3 3,4
 

输出样例:

在这里给出相应的输出。例如:

outof the triangle

由于前一题未用类来编写,在编写这题发现代码量太大,删除后重写,但时间来不及,本题就完成部分。

posted @ 2022-10-02 21:14  CHXLAITY  阅读(79)  评论(0)    收藏  举报