nchu-software-oop-2022-3
输入连个点的坐标,计算两点之间的距离
输入格式:
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);
}
}
用户输入一组选项和数据,进行与直线有关的计算。选项包括:
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类的使用不太熟悉,所以本题用了面向过程的编程,所以代码量较大,冗余较大。
用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
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
由于前一题未用类来编写,在编写这题发现代码量太大,删除后重写,但时间来不及,本题就完成部分。
浙公网安备 33010602011771号