lmlin  

前言:

此前对Java的了解很少,所以很多都是用C的方式来写。题目集二作业题量相对合理,也不难,量也比较少,较为容易完成。其中第二题较为难一点。但是题目集三,真的要命,第一题还好,没啥难度,后面两道题,要命,在输入要求方面设了大量测试点。

作业的难度从开始的简单(新手村)往后难度递增。

设计与分析:

题目7-2:串口字符解析#

RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。

输入格式:

由0、1组成的二进制数据流。例如:11110111010111111001001101111111011111111101111

输出格式:

过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
如有多个数据,每个数据单独一行显示。
若数据不足11位或者输入数据全1没有起始位,则输出"null data",
若某个数据的结束符不为1,则输出“validate error”。
若某个数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。
如:11011或11111111111111111。
例如:
1:11101011
2:01001101
3:validate error

输入样例:

在这里给出一组输入。例如:

1111011101011111111111
 

输出样例:

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

1:11101011
 

输入样例1:

在这里给出一组输入。例如:

11110111010111111001001101111111011111111101111
 

输出样例1:

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

1:11101011
2:01001101
3:validate error
 

输入样例2:

输入数据不足11位。例如:

111101
 

输出样例2:

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

null data
 

输入样例3:

输入数据全1没有起始位。例如:

1111111111111111
 

输出样例3:

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

null data
 

输入样例4:

输入数据全1没有起始位。例如:

111101110101111111101111111101
 

输出样例4:

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

1:11101011
2:parity check error
 

输入样例5:

两组数据结束符和奇偶校验均不合格。例如:

111000000000000011100000000000000
 

输出样例5:

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

1:validate error
2:validate error
 

输入样例6:

两组数据,数据之间无空闲位。例如:

1110000000001100111000001
 

输出样例6:

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

1:00000000
2:01110000

以下是我的代码:

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
String x=input.nextLine();


if(x.length()<11){//数据不足以11位
System.out.println("null data");
return;
}
int sum=0;
for(int j=0;j<x.length();j++){
if(x.charAt(j)=='1'){//数据全1
sum++;
}
}
if(sum==x.length()){
System.out.println("null data");
return;
}
int num=0;
for(int i=0;i<x.length();i++){
if(x.charAt(i)=='0'&&(x.length()-i>=11)){
num++;
System.out.print(num+":");
int count=0;
for(int k=i+1;k<i+9;k++){
if(x.charAt(k)=='1')
count++;//计算1的个数
}
String y="";
if(count%2==0)
y=y+1;//为偶数个结果为1
else
y=y+0;//为奇数个结果为0
String z="";
z=z+x.charAt(i+9);
if(x.charAt(i+10)!='1'&&(z.equals(y)))//判断数据的结束符不为1
System.out.println("validate error");
else if(x.charAt(i+10)=='1'&&(!z.equals(y)))//判断数据奇偶校验错误
System.out.println("parity check error");
else if(x.charAt(i+10)!='1'&&(!z.equals(y)))//判断据结束符和奇偶校验均不合格
System.out.println("validate error");
else{//数据正常
for(int k=i+1;k<i+9;k++)
System.out.print(x.charAt(k));
System.out.println();
}
i=i+10;//判断下一个数据
}

}
}
}

 

 

 

此题先判断数据是否满足11位,若满足,如果数据位全为1,输出null data,否则找到起始位0,若0后面数据大于10位,则按奇校验和结束符是否满足分4种情况。其实实际三种情结束符不为1,则直接输出“validate error”。若结束符为1,奇校验错误,则输出“parity check error”,否则输出validate error。

踩坑心得:

这里博主认为最容易被坑的一点就是你在判断完一个数据之后一定要要检测下一个数据是否满足11位,这里博主就是没意识到这一点,才被坑了。

设计与分析:

题目集三: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){
//Point p1=new Point();

Scanner input=new Scanner(System.in);
String x=input.nextLine();//输入点
String coor[]=x.split(" |[,]");//提出每个点的坐标x,y

for(int i=0;i<coor.length;i++)
{
if(!coor[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$")){
//判断格式是否合法,不合法则结束
System.out.print("Wrong Format");
return;
}
}
if(coor.length!=4){//点的数量超过两个
System.out.print("wrong number of points");
return;
}
double x1=Double.valueOf(coor[0]);
double y1=Double.valueOf(coor[1]);
double x2=Double.valueOf(coor[2]);
double y2=Double.valueOf(coor[3]);
Point a=new Point();
Point b=new Point();

a.setCoor(x1,y1);
b.setCoor(x2,y2);
System.out.print(a.getDistance(b));

}
}class Point{
double x;
double y;
public void setCoor(double x,double y){
this.x=x;
this.y=y;
}
public double getDistance(Point b){//计算两点距离
return Math.sqrt(Math.pow(b.x-this.x,2)+Math.pow(b.y-this.y,2));
}
}

 

 踩坑心得:

这题比较简单,注意正则表达式的使用就对了,不会的自行去B站找资源,我就不过多叙述了。

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){
//Point p1=new Point();

Scanner input=new Scanner(System.in);
String x=input.nextLine();//输入点
String coor[]=x.split(" |[,]|[:]");//提出每个点的坐标x,y
String coor1[]=x.split(" |,");

String coor2[]=x.split(" |:");

if(!coor1[0].matches("^[1-5]:[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$")){
System.out.print("Wrong Format");
return;
}

for(int i=0;i<coor.length;i++)
{
if(!coor[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$")){
//判断格式是否合法,不合法则结束
System.out.print("Wrong Format");
return;
}
}
double x1=Double.valueOf(coor[1]);
double y1=Double.valueOf(coor[2]);
double x2=Double.valueOf(coor[3]);
double y2=Double.valueOf(coor[4]);
Point a=new Point();
Point b=new Point();
a.x=x1;
a.y=y1;
b.x=x2;
b.y=y2;
Line l1=new Line();
l1.a.x=a.x;
l1.a.y=a.y;
l1.b.x=b.x;
l1.b.y=b.y;
if(coor[0].equalsIgnoreCase("1")){
if(coor.length==5){//
if(x1==x2){
if(y1!=y2)
System.out.print("Slope does not exist");
else
System.out.print("points coincide");
//return;
}
else{
System.out.print(l1.getSlope());
//return;
}
}else
System.out.print("wrong number of points");
return;
}

if(coor[0].equalsIgnoreCase("2")){

if(coor.length==7){//判断是否输入三个点
double x3=Double.valueOf(coor[5]);
double y3=Double.valueOf(coor[6]);
if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x3==x2&&y3==y2)){
System.out.print("points coincide");

}
else{
double distance=Math.abs((y3-y2)*x1+(x2-x3)*y1+x3*y2-y3*x2)/Math.sqrt((y3-y2)*(y3-y2)+(x3-x2)*(x3-x2));
System.out.print(distance);
}
}else
System.out.print("wrong number of points");
}
if(coor[0].equalsIgnoreCase("3")){

if(coor.length==7){//判断是否输入三个点
double x3=Double.valueOf(coor[5]);
double y3=Double.valueOf(coor[6]);p
if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x3==x2&&y3==y2))
System.out.print("points coincide");
else if(x1==x2){//斜率不存在时
if(x2==x3){
System.out.print("true");
}
else{
System.out.print("false");
}
}
else {

double slope1=(y1-y2)/(x1-x2),slope2=(y1-y2)/(x1-x3);
if(slope1-slope2<0.0000001)//平行
System.out.print("true");
else
System.out.print("false");
}
}
else
System.out.print("wrong number of points");
return;
}
if(coor[0].equalsIgnoreCase("4")){

if(coor.length==9){//判断是否输入四个点
double x3=Double.valueOf(coor[5]);
double y3=Double.valueOf(coor[6]);
double x4=Double.valueOf(coor[7]);
double y4=Double.valueOf(coor[8]);
if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x1==x4&&y1==y4)||(x3==x2&&y3==y2)||(x2==x4&&y2==y4)||(x3==x4&&y3==y4))
System.out.print("points coincide");//点重合
else{
double slope1=(y1-y2)/(x1-x2),slope2=(y3-y4)/(x3-x4);
if(slope1==slope2)//线平行
System.out.print("true");
else
System.out.print("false");
}
}else
System.out.print("wrong number of points");
return;
}
if(coor[0].equalsIgnoreCase("5")){
if(coor.length==9){//判断是否输入四个点
double x3=Double.valueOf(coor[5]);
double y3=Double.valueOf(coor[6]);
double x4=Double.valueOf(coor[7]);
double y4=Double.valueOf(coor[8]);
if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x1==x4&&y1==y4)||(x3==x2&&y3==y2)||(x2==x4&&y2==y4)||(x3==x4&&y3==y4))
System.out.print("points coincide");//点重合
else{
double slope1=(y1-y2)/(x1-x2),slope2=(y3-y4)/(x3-x4);
if(slope1==slope2)//线平行,不包括两线斜率不存在的情况
System.out.print("is parallel lines,have no intersection point");
else{
double x0=((x3-x4)*(y1*x2-x1*y2)-(x1-x2)*(y3*x4-x3*y4))/((y1-y2)*(x3-x4)-(y3-y4)*(x1-x2));
double y0=((y3-y4)*(y1*x2-x1*y2)-(y1-y2)*(y3*x4-x3*y4))/((y1-y2)*(x3-x4)-(y3-y4)*(x1-x2));
if((slope1==0&&x3==x4&&(x0!=x1&&x0!=x2))||(slope2==0&&x1==x2&&(x0!=x3&&x0!=x4)))
System.out.print(x0+","+y0+" "+"false");
if((x0>Math.min(x1,x2)&&x0<Math.max(x1,x2))||(x0>Math.min(x3,x4)&&x0<Math.max(x3,x4)))
System.out.print(x0+","+y0+" "+"true");
else
System.out.print(x0+","+y0+" "+"false");
}
}
}else
System.out.print("wrong number of points");
return;
}
}
}
class Point{
double x;
double y;
public double getDistance(Point b){//计算两点距离
return Math.sqrt(Math.pow(b.x-this.x,2)+Math.pow(b.y-this.y,2));
}
}
class Line{
Point a=new Point();
Point b=new Point();
public double getSlope(){
return (this.a.y-this.b.y)/(this.a.x-this.b.x);
}
public double juli(Point a){
return Math.abs((this.a.y-this.b.y)*a.x+(this.b.x-this.a.x)*a.y+this.a.x*this.b.y-this.a.y*this.b.x)/Math.sqrt((this.a.y-this.b.y)*(this.a.y-this.b.y)+(this.a.x-this.b.x)*(this.a.x-this.b.x));
}
}

 

 踩坑心得:

这里有几个测试点没过,没测出来。这题有好多坑,这里一定要用正则表达式,要不然容易出错,代码还长。提几个建议,读者做这题的时候一定要考虑斜率不存在但两条线平行的情况,有几个测试点都测了斜率不存在的情况。另外有两种输入格式问题最容易忽略。我给个样例,如下:

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

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

这就是这道题格式最不容易想到的地方。

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

以下是第四个和第五个选项的代码:

if(coor[0].equalsIgnoreCase("4")){
if(coor.length==11){
double x4 = Double.valueOf(coor[7]);
double y4 = Double.valueOf(coor[8]);
double x5 = Double.valueOf(coor[9]);
double y5 = Double.valueOf(coor[10]);
Point d=new Point();
Point e=new Point();

d.setCoor(x4,y4);
e.setCoor(x5,y5);
Line L=new Line();
L.setAB(d,e);
boolean judge=false;
if(x1==x2&&y1==y2)
System.out.print("points coincide");
else{
if((x3==x4&&y3==y4)||(x3==x5&&y3==y5)||(x4==x5&&y4==y5)||(x3==x4&&x3==x5))
judge =false;
else{
if(x3==x4&&x3==x5&&x4==x5)
judge=false;
else{
double slope4=(y3-y4)/(x3-x4);
double slope5=(y3-y5)/(x3-x5);
if(slope4!=slope5)
judge=true;
else
judge=false;
}
}
if(judge){
double distance1=((y1-y2)*x3+(x2-x1)*y3+x1*y2-y1*x2)/Math.sqrt((y1-y2)*(y1-y2)+(x1-x2)*(x1-x2));
double distance2=((y1-y2)*x4+(x2-x1)*y4+x1*y2-y1*x2)/Math.sqrt((y1-y2)*(y1-y2)+(x1-x2)*(x1-x2));
double distance3=((y1-y2)*x5+(x2-x1)*y5+x1*y2-y1*x2)/Math.sqrt((y1-y2)*(y1-y2)+(x1-x2)*(x1-x2));
if((distance1>0&&distance2>0&&distance3>0)||(distance1<0&&distance2<0&&distance3<0))
System.out.print("0");
else if((distance1==0&&distance2*distance3>0)||(distance2==0&&distance1*distance3>0)||(distance3==0&&distance1*distance2>0))
System.out.print("1");
else if((distance1==0&&distance2==0)||(distance1==0&&distance3==0)||(distance2==0&&distance3==0))
System.out.print("The point is on the edge of the triangle");
else {
System.out.print("2 ");
//求y=kx+b的表达式
double k1=a.getSlope(b);//该线斜率
//三角形的某条边斜率
double k2=c.getSlope(d);
double k3=c.getSlope(e);
double k4=d.getSlope(e);
double b1=y1-k1*x1;
double b2=y3-k1*x3;
double b3=y3-k1*x3;
double b4=y4-k1*x4;
double p1,p2,p3,q1,q2,q3;
if(a.vertical(b)){//该线垂直于x轴
p1=x1;
p2=x1;
p3=x1;
q1=k2*x1+b2;
q2=k3*x1+b3;
q3=k4*x1+b4;
}
else{//以下三种情况,分别是该线不垂直x轴,但是三角形的某条边垂直x轴

if(c.vertical(d)){
p1=x3;
p2=(b3-b1)/(k3-k1);
p3=(b4-b1)/(k4-k1);
q1=k1*x3+b1;
q2=k1*(b3-b1)/(k1-k3)+b1;
q3=k1*(b4-b1)/(k1-k4)+b1;
}
else if(c.vertical(e)){
p1=(b2-b1)/(k2-k1);
p2=x5;
p3=(b4-b1)/(k4-k1);
q1=k1*(b2-b1)/(k1-k2)+b1;
q2=k1*x5+b1;
q3=k1*(b4-b1)/(k1-k4)+b1;
}
else if(d.vertical(e)){
p1=(b2-b1)/(k2-k1);
p2=(b3-b1)/(k3-k1);
p3=x4;
q1=k1*(b2-b1)/(k1-k2)+b1;
q2=k1*(b3-b1)/(k1-k3)+b1;
q3=k1*x4+b1;
}
else{//都不垂直x轴
p1=(b2-b1)/(k2-k1);
p2=(b3-b1)/(k3-k1);
p3=(b4-b1)/(k4-k1);
q1=k1*(b2-b1)/(k1-k2)+b1;
q2=k1*(b3-b1)/(k1-k3)+b1;
q3=k1*(b4-b1)/(k1-k4)+b1;
}
}


double H=L.distance(c);
double D=Math.sqrt(Math.pow((x4-x5),2)+Math.pow((y4-y5),2));
double Snum=0.5*H*D;//三角形总面积
double snum=0;//被割后剩下的四边形面积
double g1=l1.distance(c);
double g2=l1.distance(d);
double g3=l1.distance(e);
// System.out.print(g);
if(((p1<=x3&&p1<=x4)||(p1>=x3&&p1>=x4))&&((p2<=x3&&p1<=x5)||(p2>=x3&&p1>=x5)))
{
snum=0.5*Math.sqrt(Math.pow((p1-p2),2)+Math.pow((q1-q2),2))*g1;

}

if(((p1<=x3&&p1<=x4)||(p1>=x3&&p1>=x4))&&((p3<=x4&&p3<=x5)||(p3>=x4&&p3>=x5)))
{
snum=0.5*Math.sqrt(Math.pow((p1-p3),2)+Math.pow((q1-q3),2))*g2;

}
if(((p2<=x3&&p2<=x5)||(p2>=x3&&p2>=x5))&&((p3<=x4&&p3<=x5)||(p3>=x4&&p3>=x5)))
{
snum=0.5*Math.sqrt(Math.pow((p2-p3),2)+Math.pow((q2-q3),2))*g3;

}
//System.out.print(snum);
double snum1=Snum-snum;
if(snum<snum1)
{
if(snum*1000000%10==0)
System.out.print(snum);
else
System.out.printf("%.6f",snum);
System.out.printf(" ");
if(snum1*1000000%10==0)
System.out.print(snum1);
else
System.out.printf("%.6f",snum1);

}
else
{
if(snum1*1000000%10==0)
System.out.print(snum1);
else
System.out.printf("%.6f",snum1);
System.out.printf(" ");
if(snum*1000000%10==0)
System.out.print(snum);
else
System.out.printf("%.6f",snum);
}

}

}
else System.out.print("data error");
}
}
else
System.out.print("wrong number of points");
return;
}
if(coor[0].equalsIgnoreCase("5")){
if(coor.length==9){
double x4 = Double.valueOf(coor[7]);
double y4 = Double.valueOf(coor[8]);
boolean judge=false;
if((x2==x3&&y2==y3)||(x2==x4&&y2==y4)||(x3==x4&&y3==y4)||(x2==x3&&x2==x4))
judge=false;
else {
if(x2==x3||x2==x4||x3==x4)
judge=true;
else {
double slope6=(y2-y3)/(x2-x3);
double slope7=(y2-y4)/(x2-x4);
if(slope6!=slope2)
judge=true;
}
}
if(judge) {
double distance1=((y2-y3)*x1+(x3-x2)*y1+x2*y3-y2*x3)/Math.sqrt((y2-y3)*(y2-y3)+(x2-x3)*(x2-x3));//
double distance2=((y2-y4)*x1+(x4-x2)*y1+x2*y4-y2*x4)/Math.sqrt((y2-y4)*(y2-y4)+(x2-x4)*(x2-x4));
double distance3=((y3-y4)*x1+(x4-x3)*y1+x3*y4-y3*x4)/Math.sqrt((y3-y4)*(y3-y4)+(x3-x4)*(x3-x4));
double ar=(x2*y3+x3*y4+x4*y2-x2*y4-x3*y2-x4*y3)/2;
double ar1=(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2)/2;
double ar2=(x1*y2+x2*y4+x4*y1-x1*y4-x2*y1-x4*y2)/2;
double ar3=(x1*y4+x4*y3+x3*y1-x1*y3-x4*y1-x3*y4)/2;
if(ar==(ar1+ar2+ar3)) {
if(distance1==0||distance2==0||distance3==0)System.out.print("on the triangle");
else System.out.print("in the triangle");
}
else System.out.print("outof the triangle");
}
else System.out.print("data error");
}
else System.out.print("wrong number of points");
}
}
}

class Point{
double x;
double y;
public void setCoor(double x,double y){
this.x=x;
this.y=y;
}
//斜率不存在
public boolean vertical(Point b){
if((this.x==b.x)&&(this.y!=b.y))
return true;
else
return false;
}
//两点的斜率
public double getSlope(Point b){
return (this.y-b.y)/(this.x-b.x);
}
public double getDistance(Point b){//计算两点距离
return Math.sqrt(Math.pow(b.x-this.x,2)+Math.pow(b.y-this.y,2));
}
}
class Line{
Point a=new Point();
Point b=new Point();

public void setAB(Point a,Point b){
this.a=a;
this.b=b;
}
//斜率不存在,线垂直x轴
// public boolean vertical(Point a,Point b){
// Line l1 = new Line();
// l1.setAB(a,b);
// if((this.a.x==this.b.x)&&(this.a.y!=this.b.y))
// return true;
// else
// return false;
// }
//斜率不存在,线垂直x轴
public boolean vertical(){

if((this.a.x==this.b.x)&&(this.a.y!=this.b.y))
return true;
else
return false;
}

//线的斜率
public double getSlope(){
return (this.a.y-this.b.y)/(this.a.x-this.b.x);
}
//点到直线的距离
public double distance(Point a){
return Math.abs((this.a.y-this.b.y)*a.x+(this.b.x-this.a.x)*a.y+this.a.x*this.b.y-this.a.y*this.b.x)/Math.sqrt((this.a.y-this.b.y)*(this.a.y-this.b.y)+(this.a.x-this.b.x)*(this.a.x-this.b.x));
}
//判断三点一线
boolean threeline(Point a, Point b, Point c) {
Line line1 = new Line();
Line line2 = new Line();
line1.setAB(a,b);
line2.setAB(b,c);
if(line2.getSlope() == line1.getSlope())
return true;
else
return false;
}

}


 踩坑心得:

由于我这里没有写三角形的类,导致代码很繁琐,而且还有一些测试点没过,写了很多,却没怎么得分。所以真的能写类就写类。要不然你就会像我这次作业一样,很难受,看着复杂,而后后面的作业与这一次紧密联系,不写类的代码就繁琐还不易懂,可读性不高。这里需要注意输出格式的精度问题,可以用该数据乘以1000000%10能不能整除来判断。因为这里的输出的数据若小数点后超过6位,只保留小数点后6位,多余部分采用四舍五入规则进到最低位。小数点后若不足6位,按原始位数显示,不必补齐。

可以如下判段

if(C*1000000%10==0)
System.out.print(C);
else
System.out.printf("%.6f",C);

改进建议:

说实话题目量有点大了,主要是测试点很多,有很多你要测试很久才能测出来,一时半会根本想不到,建议老师给点提示,或者给予相关样例。要不然就和无头苍蝇一样。

总结:

这三次作业让我对Java有了一定的理解和应用。对于类和对象有了更深的认识。了解到类可以叫问题分区块解决,让问题变得更简单,可读性更高。

不足:对于类的应用还不够,此次作业很多都是用的C来写,真的是复杂,所以我们在拿到题目时,不要一股脑的想着如何去实现功能,我们可以先将最终要设计出来的代码进行功能分解,进而设计出多个不同功能的类,每个类再根据应有的功能写出相应的代码,把问题简单化。从此次作业看出我需要多多加强类的应用,多去找例题练习练习。

posted on 2022-10-02 22:22  余语于玉  阅读(68)  评论(0编辑  收藏  举报