BLOG-1

一、前言

前三次题目集题量在减少,但是难度在逐步上升。题目集一题量九题,主要知识点是一些基础知识的使用,如:if,for,where语句的使用,数据的输入输出等等,比较简单。题目集二,和题目集三一样为三题,相较于题目集集一更难,但是基本知识没怎么变化。题目集三难度最大,因为涉及到了类的创建及应用的知识点。

二、设计与分析

1、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 in = new Scanner(System.in);
String n=in.nextLine();

int x = n.length();
int a=0;
int z=1;
char[]b=new char[100];
for(int i=0;i<x;i++){
b[i]=n.charAt(i);
if(b[i]=='1'){
a++;
}
}
if(a==x||x<11){
System.out.println("null data");
}
else{
for(int i=0;i<x;i++){
if(b[i]=='0'&&i+10<x){
int k=0;
String str =n.substring(i+1,i+9);
for(int j=i+1;j<=i+9;j++){
if(b[j]=='1'){
k++;
}
}
if(z!=1){
System.out.printf("\n");
}
if(k%2!=0&&b[i+10]=='1'){
System.out.printf("%d:%s",z,str);
z++;
}
else if(k%2==0&&b[i+10]=='1'){
System.out.printf("%d:parity check error",z);
z++;
}
else{
System.out.printf("%d:validate error",z);
z++;
}
i=i+10;
}
}
}
}
}

踩坑心得:本题找到起始的数据时,假定他为第i位则第i+10位应小于数据流总长度,而不是第i+9位,要注意判断条件。而且,要记得用倒数第二位的奇偶校验位与有效数据进行比对,要不然不能完全通过。

改进建议:可能可以简化一点代码,定义了太多参数,阅读起来可能要花点时间

 

2、7-1 点线形系列1-计算两点之间的距离

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

输入格式:

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) {
points a=new points();
a.show();
}
}

class points
{
Scanner in=new Scanner(System.in);
String s;
double [] nums=new double[10];
points()
{
s=in.nextLine();
getnums(s);

}

void getnums(String s)
{
String a[]=s.split("\\s");
int k=0;
if(a.length>1)
{
for(int i=0;i<a.length;i++)
{
String d[]=a[i].split(",");
if(d.length==2)
{
for(int j=0;j<d.length;j++)
{
nums[k]=num(d[j]);
k++;
}
}
else//格式非法
{
System.out.print("Wrong Format");
System.exit(0);
}
}
if(a.length>2)//输入格式合法但坐标点的数量超过两个
{
System.out.print("wrong number of points");
System.exit(0);
}

}
else//格式非法
{
System.out.print("Wrong Format");
System.exit(0);
}

}

void show()
{
System.out .print(Math.sqrt(Math.pow(nums[2]-nums[0], 2)+Math.pow(nums[3]-nums[1], 2)));

}

double num(String q)
{
double p=0;
int k=0,l=0,y=0,j=0;
for(int i=0;i<q.length();i++)
{
if(q.charAt(i)=='+'||q.charAt(i)=='-')
{
k=i;
y++;
}
if(q.charAt(i)=='.')
{
l=i;
j++;
}

if(j>1||y>1)
{
System.out.println("Wrong Format");
System.exit(0);
}
}
if(l==q.length()||k==q.length()||(q.charAt(0)=='.')||(k>0&&k<q.length()))
{
System.out.println("Wrong Format");
System.exit(0);
}
if((q.charAt(0)=='+'&&q.charAt(1)=='+')||(q.charAt(0)=='-'&&q.charAt(1)=='-')||(q.charAt(0)=='+'&&q.charAt(1)=='-')||(q.charAt(0)=='-'&&q.charAt(1)=='+')||(q.charAt(0)=='.'))
{
System.out.print("Wrong Format");
System.exit(0);
}
else
{
p=Double.parseDouble(q);
}
return p;
}
}

踩坑心得:本题虽然要求明了,但是要判断的正确的输入数据要有很高的要求,学习正则表达式的使用后,判断变得方便了点。

改进建议:无

 

3、7-2 点线形系列2-线的计算

用户输入一组选项和数据,进行与直线有关的计算。选项包括:
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

源码:

import java.util.Scanner;

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 n=s.substring(0,2);
s=s.substring(2);
int x;
x=option(n);
points_1 a=new points_1(s,x);
a.show();
}

static int option(String n)
{
int x=0;
if((n.charAt(0)>='1'||n.charAt(0)<='5')&&n.charAt(1)==':')
{
x=Integer.parseInt(n.substring(0,1));
return x;
}
else
{
System.out.println("Wrong Format");
System.exit(0);
return x;
}

}

}

class points_1
{
Scanner in=new Scanner(System.in);
String s;
int n;
int m;
double [] nums=new double[10];
points_1(String s,int x)
{
this.n=x;
switch(n)
{
case 1:
m=2;
break;
case 2:case 3:
m=3;
break;
case 4:case 5:
m=4;
break;
}
getnums(s);
}

void getnums(String s)
{
String a[]=s.split("\\s");
int k=0;
if(a.length>1)
{
for(int i=0;i<a.length;i++)
{
String d[]=a[i].split(",");
if(d.length==2)
{
for(int j=0;j<d.length;j++)
{
nums[k]=num(d[j]);
k++;
}
}
else//格式非法
{
System.out.println("Wrong Format");
System.exit(0);
}
}
if(a.length>m)
{
System.out.println("wrong number of points");
System.exit(0);
}

}
else//格式非法
{
System.out.println("Wrong Format");
System.exit(0);
}
option_1();
}

double num(String q)
{
double p=0;
if((q.charAt(0)=='+'&&q.charAt(1)=='+')||(q.charAt(0)=='-'&&q.charAt(1)=='-'))
{
System.out.println("Wrong Format");
System.exit(0);
}
else
{
p=Double.parseDouble(q);
}
return p;
}
void option_1()
{
switch(n)
{
case 1:
if(nums[0]==nums[2]&&nums[1]==nums[3])
{
System.out.println("points coincide");
System.exit(0);
}
break;
case 2:
if((nums[0]==nums[2]&&nums[1]==nums[3])||(nums[2]==nums[4]&&nums[3]==nums[5])||(nums[0]==nums[4]&&nums[1]==nums[5]))
{
System.out.println("points coincide");
System.exit(0);
}
break;
case 3:
if((nums[0]==nums[2]&&nums[1]==nums[3])||(nums[2]==nums[4]&&nums[3]==nums[5])||(nums[0]==nums[4]&&nums[1]==nums[5]))
{
System.out.println("points coincide");
System.exit(0);
}
break;
case 4:
if((nums[0]==nums[2]&&nums[1]==nums[3])||(nums[4]==nums[6]&&nums[5]==nums[7]))
{
System.out.println("points coincide");
System.exit(0);
}
break;
case 5:
if((nums[0]==nums[2]&&nums[1]==nums[3])||(nums[4]==nums[6]&&nums[5]==nums[7]))
{
System.out.println("points coincide");
System.exit(0);
}
break;
}
}
void show()
{
switch(n)
{
case 1:
show_1();
break;
case 2:
show_2();
break;
case 3:
show_3();
break;
case 4:
show_4();
break;
case 5:
show_5();
break;

}
}

void show_1()
{
double k=0;
k=(nums[3]-nums[1])/(nums[2]-nums[0]);
if(Math.abs(nums[2]-nums[0])<0.001)
{
System.out .print("Slope does not exist");
}
else
{
System.out .print(k);
}
}

void show_2()
{
double d=0,A,B,C;
A=nums[5]-nums[3];
B=nums[2]-nums[4];
C=nums[4]*nums[3]-nums[2]*nums[5];
d=Math.abs(A*nums[0]+B*nums[1]+C)/Math.sqrt(A*A+B*B);
System.out.print(d);
}

void show_3()
{
double A,B,C;
A=nums[5]-nums[3];
B=nums[2]-nums[4];
C=nums[4]*nums[3]-nums[2]*nums[5];
if((A*nums[0]+B*nums[1]+C)==0)
{
System.out.print("true");
}
else
{
System.out.print("false");
}

}

void show_4()
{
double A1,B1,C1,A2,B2,C2;
A1=nums[3]-nums[1];
B1=nums[0]-nums[2];
C1=nums[2]*nums[0]-nums[0]*nums[3];

A2=nums[7]-nums[5];
B2=nums[4]-nums[6];
C2=nums[5]*nums[6]-nums[4]*nums[7];
if(A1/B1==A2/B2)
{
System.out.print("true");
}
else
{
System.out.print("false");
}

}
void show_5()
{
double A1,B1,C1,A2,B2,C2,x,y;
A1=nums[3]-nums[1];
B1=nums[0]-nums[2];
C1=nums[2]*nums[0]-nums[0]*nums[3];

A2=nums[7]-nums[5];
B2=nums[4]-nums[6];
C2=nums[5]*nums[6]-nums[4]*nums[7];

y = (C1 * A2 - C2 * A1) / (A1 * B2 - A2 * B1);
x = (C2 * B1 - C1 * B2) / (A1 * B2 - A2 * B1);
if(A1/B1==A2/B2)
{
System.out.print("is parallel lines,have no intersection point");
}
else
{
if((x==nums[0]&&y==nums[1])||(x==nums[2]&&y==nums[3])||(x==nums[4]&&y==nums[5])||(x==nums[6]&&y==nums[7]))
{
System.out.print("false");
}
else
{
System.out.print(x+","+y+" true");
}
}
}

}

踩坑心得:substring()字符串函数很方便,可以之间截取想要的那部分。

改进建议:使用switch,判断用户的输入去五个对应需求的方法中,在那五个方法中解决问题就行

4、7-3 点线形系列3-三角形的计算

用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
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

源码:

import java.text.DecimalFormat;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String sj = input.nextLine();
String u=null,check=null;
int m = 0,i=0,k=0;
double[] zb = new double[10];
Pattern pattern = Pattern.compile("(\\+?\\-?\\d+\\.?\\d*)(\\,)(\\+?\\-?\\d+\\.?\\d*)");
Matcher matcher = pattern.matcher(sj);
Pattern pattern4 = Pattern.compile("([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)");
Matcher matcher4 = pattern.matcher(sj);
Pattern pattern1 = Pattern.compile("(\\d)(\\:)");
Matcher matcher1 = pattern1.matcher(sj);
while(matcher1.find()){
u=matcher1.group(1);
m=Integer.parseInt(u);
}
if(m==1||m==2||m==3){

while(matcher4.find()){
u=matcher4.group(1);
zb[k]=Double.parseDouble(u);
k++;
u=matcher4.group(3);
zb[k]=Double.parseDouble(u);
k++;
}
if(k<6||k>6){
System.out.println("wrong number of points");
System.exit(0);
}
}
i=0;
if(m==1||m==2||m==3){
Pattern pattern2 = Pattern.compile("(\\d)(\\:)([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)(\\ )([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)(\\ )([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)");
Matcher matcher2 = pattern2.matcher(sj);
while (matcher2.find()){
check=matcher2.group(0);
}
if(check==null){
System.out.println("Wrong Format");
}else{
while(matcher.find()){
u=matcher.group(1);
zb[i]=Double.parseDouble(u);
i++;
u=matcher.group(3);
zb[i]=Double.parseDouble(u);
i++;
}
if(i!=6){
System.out.println("wrong number of points");
}
else{
if((zb[0]==zb[2]&&zb[1]==zb[3])||(zb[0]==zb[4]&&zb[1]==zb[5])||(zb[4]==zb[2]&&zb[5]==zb[3])){
System.out.println("points coincide");
System.exit(0);
} else if((zb[0]-zb[2])/(zb[1]-zb[3])==(zb[0]-zb[4])/(zb[1]-zb[5])){
System.out.println("data error");
} else if((zb[0]-zb[2])*1.0/(zb[1]-zb[3])==(zb[0]-zb[4])*1.0/(zb[1]-zb[5])){
System.out.println("data error");
} else {
San f = new San();
f.san(m, zb[0], zb[1], zb[2], zb[3], zb[4], zb[5]);
}
}
}
}
if(m==4){
Pattern pattern5 = Pattern.compile("([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)");
Matcher matcher5 = pattern.matcher(sj);
while(matcher5.find()){
u=matcher5.group(1);
zb[i]=Double.parseDouble(u);
i++;
u=matcher5.group(3);
zb[i]=Double.parseDouble(u);
i++;
}
if(i!=10){
System.out.println("wrong number of points");
System.exit(0);
}
i=0;
Pattern pattern3 = Pattern.compile("(\\d)(\\:)([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)(\\ )([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)(\\ )([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)(\\ )([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)(\\ )([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)");
Matcher matcher3 = pattern3.matcher(sj);
while (matcher3.find()){
check=matcher3.group(0);
}
if(check==null){
System.out.println("Wrong Format");
}else{
while(matcher.find()){
u=matcher.group(1);
zb[i]=Double.parseDouble(u);
i++;
u=matcher.group(3);
zb[i]=Double.parseDouble(u);
i++;
}
if(i!=10){
System.out.println("wrong number of points");
}else{
if((zb[0]==zb[2]&&zb[1]==zb[3])){
System.out.println("points coincide");
System.exit(0);
}else if(((zb[4]-zb[6])/(zb[5]-zb[7])==(zb[4]-zb[8])/(zb[5]-zb[9]))||(zb[6]==zb[4]&&zb[7]==zb[5])||(zb[4]==zb[8]&&zb[5]==zb[9])||(zb[6]==zb[8]&&zb[7]==zb[9])){
System.out.println("data error");
} else {
// for(i=0;i<10;i++){
// System.out.println(zb[i]);
// }
San f2 = new San();
f2.s(zb[0], zb[1], zb[2], zb[3], zb[4], zb[5],zb[6],zb[7],zb[8],zb[9]);
}
}
}
}
if(m==5){
Pattern pattern6 = Pattern.compile("([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)");
Matcher matcher6 = pattern.matcher(sj);
while(matcher6.find()){
u=matcher6.group(1);
zb[i]=Double.parseDouble(u);
i++;
u=matcher6.group(3);
zb[i]=Double.parseDouble(u);
i++;
}
if(i<8){
System.out.println("wrong number of points");
System.exit(0);
}
i=0;
Pattern pattern3 = Pattern.compile("(\\d)(\\:)([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)(\\ )([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)(\\ )([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)(\\ )([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)");
Matcher matcher3 = pattern3.matcher(sj);
while (matcher3.find()){
check=matcher3.group(0);
}
if(check==null){
System.out.println("Wrong Format");
}else{
while(matcher.find()){
u=matcher.group(1);
zb[i]=Double.parseDouble(u);
i++;
u=matcher.group(3);
zb[i]=Double.parseDouble(u);
i++;
}
if(i!=8){
System.out.println("wrong number of points");
}else{
if((zb[4]==zb[6]&&zb[5]==zb[7])||(zb[2]==zb[4]&&zb[3]==zb[5])||(zb[6]==zb[2]&&zb[7]==zb[3])){
System.out.println("points coincide");
System.exit(0);
}else {

San f2 = new San();
f2.wu(zb[0], zb[1], zb[2], zb[3], zb[4], zb[5],zb[6],zb[7]);
}
}
}
}
}
}
class San {
public void san(int choice, double x1, double y1, double x2, double y2, double x3, double y3) {
boolean u = false;
if ((x2 - x1) * 1.0 / (x3 - x1) == (y2 - y1) * 1.0 / (y3 - y1)||((x1==x2)&&(y1==y2))||((x1==x3)&&(y1==y3))||((x2==x3)&&(y2==y3))) {
System.out.println("data error");
u = false;
} else {
u = true;
switch (choice) {
case 1:
double a,b,c;
a=Math.sqrt(Math.pow(x1-x2*1.0,2)+Math.pow(y1-y2*1.0,2));
b=Math.sqrt(Math.pow(x1-x3*1.0,2)+Math.pow(y1-y3*1.0,2));
c=Math.sqrt(Math.pow(x2-x3*1.0,2)+Math.pow(y2-y3*1.0,2));
if(a==b||a==c||b==c){
System.out.print("true ");
}
else System.out.print("false ");
if(a==b&&a==c){
System.out.print("true");
}
else System.out.print("false");
break;
case 2:
double D,o1,o2,S;
a=Math.sqrt(Math.pow(x1-x2*1.0,2)+Math.pow(y1-y2*1.0,2));
b=Math.sqrt(Math.pow(x1-x3*1.0,2)+Math.pow(y1-y3*1.0,2));
c=Math.sqrt(Math.pow(x2-x3*1.0,2)+Math.pow(y2-y3*1.0,2));
D=a+b+c;
o1=(x1+x2+x3)/3.0;
o2=(y1+y2+y3)/3.0;
S=(x1*y2-x1*y3+x2*y3-x2*y1+x3*y1-x2*y2)/2;
DecimalFormat d=new DecimalFormat();
String style="#.######";
/*
S= (1/2)* (x1y2+x2y3+x3y1-x1y3-x2y1-x3y2)
*/
d.applyLocalizedPattern(style);
System.out.println(d.format(D)+" "+d.format(S)+" "+d.format(o1)+","+d.format(o2));
break;
case 3:
double number1,number2,number,number3;
number1=Math.sqrt(Math.pow(x1-x2*1.0,2)+Math.pow(y1-y2*1.0,2));
number2=Math.sqrt(Math.pow(x1-x3*1.0,2)+Math.pow(y1-y3*1.0,2));
number3=Math.sqrt(Math.pow(x2-x3*1.0,2)+Math.pow(y2-y3*1.0,2));
if (number1 <= number2) {
number = number1;
number1 = number2;
number2 = number;
}
if (number1 <= number3) {
number = number1;
number1 = number3;
number3 = number;
}
if (number2 <= number3) {
number = number2;
number2 = number3;
number3 = number;
}
number=(number2*number2+number3*number3-number1*number1)*1.0/(2*number2*number3);
if(number==0){
System.out.println("false true false");
}else if(number>0){
System.out.println("false false true");
}else{
System.out.println("true false false");
}
break;
}
}
}
public void s(double x1, double y1, double x2, double y2, double x3, double y3,double x4,double y4,double x5,double y5) {
Lines l1=new Lines(x3,y3,x4,y4);
Lines l2=new Lines(x4,y4,x5,y5);
Lines l3=new Lines(x3,y3,x5,y5);
Lines l =new Lines(x1,y1,x2,y2);
if((l.a*x3+l.c+l.b*y3==0&&l.a*x4+l.c+l.b*y4==0)||(l.a*x3+l.c+l.b*y3==0&&l.a*x5+l.c+l.b*y5==0)||(l.a*x4+l.c+l.b*y4==0&&l.a*x4+l.c+l.b*y4==0)){
System.out.println("The point is on the edge of the triangle");
// double x11,x21,x31;
// x11=l.k*x3+l.c+l.b*y3;
// x21=l.k*x4+l.c+l.b*y4;
// x31=l.k*x5+l.c+l.b*y5;
// System.out.println(x11);
// System.out.println(x21);
// System.out.println(x31);
// System.out.println("k:"+l.k);
// System.out.println("a:"+l.a);
// System.out.println("b:"+l.b);
// System.out.println("c:"+l.c);
// System.out.println("x1:"+l.x1);
// System.out.println("x2:"+l.x2);
// System.out.println("y1:"+l.y1);
// System.out.println("y2:"+l.y2);
}else if(l.k==l1.k||l.k==l2.k||l.k==l3.k){
if((l1.a*x1+l1.b+l1.c==0)||(l2.a*x1+l2.b+l2.c==0)||(l3.a*x1+l3.b+l3.c==0)){
System.out.println("The point is on the edge of the triangle");
}
else {
System.out.println(0);
}
}else if(l.a*x3+l.c+l.b*y3==0||l.a*x4+l.c+l.b*y4==0||l.a*x5+l.c+l.b*y5==0){
System.out.println(1);
}else{
// double x11,x21,x31;
// x11=l.k*x3+l.c+l.b*y3;
// x21=l.k*x4+l.c+l.b*y4;
// x31=l.k*x5+l.c+l.b*y5;
// System.out.println(x11);
// System.out.println(x21);
// System.out.println(x31);
// System.out.println("k:"+l.k);
// System.out.println("b:"+l.b);
//System.out.println("x1:"+l.x1);
//System.out.println("x2:"+l.x2);
//System.out.println(l.x1-l.x2);
//System.out.println(l.y1-l.y2);
//System.out.println(l.a);
// System.out.println("y1:"+l.y1);
// System.out.println("y2:"+l.y2);
//System.out.println("c"+l.c);
}
}
public void wu(double x1, double y1, double x2, double y2, double x3, double y3,double x4,double y4){
Lines k1=new Lines(x1,y1,x2,y2);
Lines k2=new Lines(x2,y2,x3,y3);
Lines k3=new Lines(x3,y3,x4,y4);
Lines k4 =new Lines(x4,y4,x2,y2);
if(x1==x2&&y1==y2){
System.out.println("on the triangle");
}else if(k1.k==k2.k){
if(x1<=Max(x2,x3)&&x1>=Min(x2,x3)){
System.out.println("on the triangle");
}else {
System.out.println("outof the triangle");
}
}else if(k1.k==k4.k){
if(x1<=Max(x2,x3)&&x1>=Min(x2,x3)){
System.out.println("on the triangle");
}else {
System.out.println("outof the triangle");
}
}else if(k1.k==k3.k){
System.out.println("outof the triangle");
} else if(k3.a*x1+k3.b*y1+k3.c==0){
if(x1<Max(x3,x4)&&x1>Min(x3,x4)){
System.out.println("on the triangle");
}else {
System.out.println("outof the triangle");
}
} else {
double x;
x=(k1.k*x1-k3.k*x3+y3-y1)*1.0/(k1.k-k3.k);
double y=k1.k*(x-x1)+y1;
if(x<Max(x1,x2)&&x>Max(x1,x2)){
System.out.println("outof triangle");
}else {
System.out.println("in the triangle");
}
}
}
public double Max(double z,double c){
if(z>c){
return z;
}
else return c;
}
public double Min(double z,double c){
if(z>c){
return c;
}
else return z;
}
}
class Lines {
double x1;
double x2;
double y2;
double y1;
double k;
double a,b,c;
public Lines(double x1, double y1, double x2, double y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.k=(y1 - y2)*1.0 / (x1-x2);
this.a=y1-y2;
this.b=x2-x1;
this.c=(x1-x2)*y1-(y1-y2)*x1;
}
}

踩坑心得:本题和第二题联系很大,多出来几个坐标点,但是“类”中的一些变量和方法要改变

改进建议:代码未完全实现

三、总结

通过这三次的作业,初学了java的相关知识,而且第一次的作业还有和C语言相似的语句if,for,where等,可以说从C过度到JAVA题目的设计很合理。通过这三次作业,我清晰了我对一些常用方法的不熟悉,如split()方法使用,而且代码不够简介,十分繁冗,我应该不断学习主动去查询,在完成作业过程中,学习了正则表达式的使用,split()方法,substring()等等。第三次作业对我来说十分困难,因此在之后学习中,我应加强对类和对象的学习。

posted @ 2022-10-02 23:11  Cornfield  阅读(82)  评论(0)    收藏  举报