前三次题目集总结
Java大作业后的阶段性总结
前言
前三次题目集的难度呈递增趋势,题目涉及的知识面广,在完成题目后收获颇丰。
设计与分析
第一题:
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
代码:
1 package com.sxt; 2 3 import java.util.Scanner; 4 5 public class work2 { 6 public static void main(String[] args) { 7 Scanner sc = new Scanner(System.in); 8 String a = sc.next(); 9 int c = 0; 10 boolean parity = false,validate = false; 11 for(int j = 0;j<a.length();j++) { 12 if(a.charAt(j)=='1') 13 c++; 14 } 15 if(a.length()==c||a.length()<11) { 16 System.out.print("null data"); 17 return; 18 } 19 int start = 0,i=0,num = 1,sum = 0; 20 for(start = 0;start<a.length()-10;start++) { 21 if(a.charAt(start)=='0') { 22 System.out.print(num+":"); 23 num++; 24 if(a.charAt(start+10)=='0') { 25 validate = false; 26 }else { 27 validate = true; 28 sum = 0; 29 for(i=start+1;i<start+9;i++) { 30 if(a.charAt(i)=='1') { 31 sum++; 32 } 33 } 34 if(sum%2==0) { 35 if(a.charAt(start+9)=='1') { 36 parity = true; 37 }else { 38 parity = false; 39 } 40 }else { 41 if(a.charAt(start+9)=='0') { 42 parity = true; 43 }else { 44 parity = false; 45 } 46 } 47 } 48 if(validate == true) { 49 if(parity == true) { 50 for(i=start+1;i<start+9;i++) { 51 System.out.print(a.charAt(i)); 52 } 53 System.out.print("\n"); 54 }else { 55 System.out.println("parity check error"); 56 } 57 }else { 58 System.out.println("validate error"); 59 } 60 start = start + 10; 61 } 62 } 63 } 64 65 }
设计思路:
1.判断起始位以及输入长度是否是长度大于最小结构:
1个起始位‘0’+八个有效数据+一个奇校验位+一个结束位 = 11位
2.判断是否有0:
通过记录‘1’的个数是否与输入的长度相同判断,可以通过正则表达式判断改进,效率会更高
3.遍历字符串开始找0:
找到0后开始对他后面10位做处理;
4.先判断最后一位是不是结束1
5.再判断是否奇校验正确;
6.通过两次判断结果来输出。
这个题只要是结尾错了,那就是“validate error”,所以可以先判断结尾,结尾正确再去判断是否奇校验正确。
SourceMonitor的生成报表
第二题:
输入连个点的坐标,计算两点之间的距离
输入格式:
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
代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); String point[] = s.split(" "); String num1[] = null; int cot = 0; for(String i:point) { num1 = i.split(","); for(String j:num1) { //正则表达式 if(!j.matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$")) { System.out.print("Wrong Format"); System.exit(0); } } } String[] str = s.split(",| "); double result=0,n; int t=0,j=0; double[] num = new double[str.length]; for(int m = 0; m < str.length; m++) { String M=str[m]; for (int i=0;i<M.length();i++) { if(M.charAt(i)=='0'&&M.charAt(i+1)!='.') { j=1; break; } } } try { for (int i = 0; i < str.length; i++) n = Double.parseDouble(String.valueOf(str[i])); }catch(Exception e){ t = 1; } if(t==0&&j==0){ for (int i = 0; i < str.length; i++) { num[i] = Double.parseDouble(String.valueOf(str[i])); } result=Math.sqrt(Math.abs((num[0]-num[2])*(num[0]-num[2]))+Math.abs((num[1]-num[3])*(num[1]-num[3]))); if(str.length==4) System.out.println(result); else System.out.println("wrong number of points"); } else { System.out.println("Wrong Format"); } sc.close(); } }
设计思路
1.首先得获取正确的数字。
2.如果输入非数字的话得输出Wrong Format,输入按字符串形式得到后转化成数字进行输出,如果无法转化成数字就输出Wrong Format。
3.若能通过Double.paresDouble转化为数字九通过split函数对字符串进行分割后获取对应数字,再通过math函数计算两点间的距离 。
SourceMonitor的生成报表

第三题:
用户输入一组选项和数据,进行与直线有关的计算。选项包括:
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",
输出格式:
见题目描述。
代码:
import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner sc= new Scanner(System.in); String s=sc.nextLine(); int len=s.length(); String sss=s.substring(2,len); String ss[]=sss.split(" "); String num[]=null; for(String Str:ss){ num=Str.split(","); for(String tt:num){ if(!tt.matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$")){ System.out.println("Wrong Format"); return; } } } // String[] str = sc.nextLine().split(":|,| "); String[] str = s.split(":|,| "); double[] position = new double[str.length]; double n=0; int t=0; try { for (int i = 0; i < str.length; i++) n = Double.parseDouble(String.valueOf(str[i])); }catch(Exception e){ t = 1; } if(t==0){ for (int i = 0; i < str.length; i++) position[i] = Double.parseDouble(String.valueOf(str[i]));} /* else if(position[0]<'1'||position[0]>'6') { System.out.println("Wrong Format"); return; } else if((position[2]!='+'&&position[2]!='-')&&(position[2]<'0'||position[2]>'9')) { System.out.println("Wrong Format"); return; }*/ else { System.out.println("Wrong Format"); return; } if(position[0]==1) { Fun1 sl=new Fun1(position[1],position[2],position[3],position[4]); if(str.length!=5) System.out.println("wrong number of points"); else if(position[1]==position[3]&&position[2]==position[4]) System.out.println("points coincide"); else if(position[1]==position[3]){ System.out.println("Slope does not exist"); return; } else System.out.println(sl.getFun1(position[1],position[2],position[3],position[4])); } if(position[0]==2) { Fun2 Fun2=new Fun2(position[1],position[2],position[3],position[4],position[5],position[6]); if(str.length!=7) System.out.println("wrong number of points"); else if(position[1]==position[3]&&position[2]==position[4]||position[1]==position[3]&&position[5]==position[6]||position[5]==position[6]&&position[2]==position[4]||position[1]==position[3]&&position[2]==position[4]&&position[1]==position[3]&&position[5]==position[6]) System.out.println("points coincide"); else System.out.println(Fun2.getFun2(position[1],position[2],position[3],position[4],position[5],position[6])); } if(position[0]==3) { Fun3 sd=new Fun3(position[1],position[2],position[3],position[4],position[5],position[6]); if(str.length!=7) System.out.println("wrong number of points"); else if(position[1]==position[3]&&position[2]==position[4]||position[1]==position[5]&&position[2]==position[6]||position[5]==position[3]&&position[6]==position[4]||position[1]==position[3]&&position[2]==position[4]&&position[1]==position[3]&&position[5]==position[6]) System.out.println("points coincide"); else System.out.println(sd.pd(position[1],position[2],position[3],position[4],position[5],position[6])); } if(position[0]==4){ Fun4 Fun4=new Fun4(position[1],position[2],position[3],position[4],position[5],position[6],position[7],position[8]); if(str.length!=9) System.out.println("wrong number of points"); else if(position[1]==position[3]&&position[2]==position[4]||position[5]==position[7]&&position[6]==position[8]||position[1]==position[3]&&position[2]==position[4]&&position[5]==position[7]&&position[6]==position[8]) System.out.println("points coincide"); else System.out.println(Fun4.pd(position[1],position[2],position[3],position[4],position[5],position[6],position[7],position[8])); } if(position[0]==5){ Fun5 Fun5=new Fun5(position[1],position[2],position[3],position[4],position[5],position[6],position[7],position[8]); if(str.length!=9) System.out.println("wrong number of points"); else if(position[1]==position[3]&&position[2]==position[4]||position[5]==position[7]&&position[6]==position[8]||position[1]==position[3]&&position[2]==position[4]&&position[5]==position[7]&&position[6]==position[8]) System.out.println("points coincide"); else Fun5.getFun5(position[1],position[2],position[3],position[4],position[5],position[6],position[7],position[8]); } } } class Fun1<x1, x2,y1,y2> { private double x1,x2,y1,y2; public Fun1(){} public Fun1(double x1,double y1,double x2,double y2){ this.x1=x1; this.x2=x2; this.y1=y1; this.y2=y2; } public void setX1(double x1) { this.x1=x1; } public void setX2(double x2) { this.x2=x2; } public void setY1(double y1) { this.y1=y1; } public void setY2(double y2) { this.y2=y2; } public double getX1() { return x1; } public double getX2() { return x2; } public double getY2() { return y2; } public double getY1() { return y1; } public Object getFun1(double x1, double y1, double x2, double y2){ double result=0; if(x1==x2){ System.out.println("Slope does not exist"); return this; } else { result=(y1-y2)/(x1-x2); return result; } } } class Fun2<x1,y1,x2,y2,x3,y3>{ private double x1,x2,y1,y2,x3,y3; public Fun2(){} public Fun2(double x1,double y1,double x2,double y2,double x3,double y3){ this.x1=x1; this.x2=x2; this.x3=x3; this.y1=y1; this.y2=y2; this.y3=y3; } public void setX1(double x1) { this.x1=x1; } public void setX2(double x2) { this.x2=x2; } public void setX3(double x3) { this.x3=x3; } public void setY1(double y1) { this.y1=y1; } public void setY2(double y2) { this.y2=y2; } public void setY3(double y3) { this.y3=y3; } public double getX1() { return x1; } public double getX2() { return x2; } public double getX3() { return x3; } public double getY2() { return y2; } public double getY1() { return y1; } public double getY3() { return y3; } public Object getFun2(double x1,double y1,double x2,double y2,double x3,double y3) { double height = 0; height = Math.abs((y2-y3)*x1+(x3-x2)*y1+x2*y3-y2*x3)/Math.sqrt((y2-y3)*(y2-y3)+(x2-x3)*(x2-x3)); return (float)height; } } class Fun3<x1,y1,x2,y2,x3,y3>{ private double x1,x2,y1,y2,x3,y3; public void setX1(double x1) { this.x1=x1; } public void setX2(double x2) { this.x2=x2; } public void setX3(double x3) { this.x3=x3; } public void setY1(double y1) { this.y1=y1; } public void setY2(double y2) { this.y2=y2; } public void setY3(double y3) { this.y3=y3; } public double getX1() { return x1; } public double getX2() { return x2; } public double getX3() { return x3; } public double getY2() { return y2; } public double getY1() { return y1; } public double getY3() { return y3; } public Fun3(){}; Fun3(double x1,double y1,double x2,double y2,double x3,double y3){ this.x1=x1; this.x2=x2; this.x3=x3; this.y1=y1; this.y2=y2; this.y3=y3; } public boolean pd(double x1,double y1,double x2,double y2,double x3,double y3) { double a,b,c; a = Math.sqrt(Math.abs((x2-x3)*(x2-x3))+Math.abs((y2-y3)*(y2-y3))); b = Math.sqrt(Math.abs((x1-x2)*(x1-x2))+Math.abs((y1-y2)*(y1-y2))); c = Math.sqrt(Math.abs((x1-x3)*(x1-x3))+Math.abs((y1-y3)*(y1-y3))); if(a==b+c||b==a+c||c==a+b) return true; else return false; } } class Fun4<x1,y1,x2,y2,x3,y3,x4,y4>{ private double x1,x2,y1,y2,x3,y3,x4,y4; public void setX1(double x1) { this.x1=x1; } public void setX2(double x2) { this.x2=x2; } public void setX3(double x3) { this.x3=x3; } public void setX4(double x4) { this.x4=x4; } public void setY1(double y1) { this.y1=y1; } public void setY2(double y2) { this.y2=y2; } public void setY3(double y3) { this.y3=y3; } public void setY4(double y4) { this.y4=y4; } public double getX1() { return x1; } public double getX2() { return x2; } public double getX3() { return x3; } public double getX4() { return x4; } public double getY2() { return y2; } public double getY1() { return y1; } public double getY3() { return y3; } public double getY4() { return y4; } public Fun4(){} public Fun4(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4){ this.x1=x1; this.x2=x2; this.x3=x3; this.y1=y1; this.y2=y2; this.y3=y3; this.x4=x4; this.y4=y4; } public boolean pd(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4) { double r1,r2; Fun1 sl = new Fun1(x1, y1, x2, y2); if(x1==x2) { r1=0; } else r1= (double) sl.getFun1(x1,y1,x2,y2); if(x3==x4) { r2=0; } else r2=(double) sl.getFun1(x3,y3,x4,y4); if(r1==r2) return true; else return false; } } class Fun5<x1,y1,x2,y2,x3,y3,x4,y4>{ private double x1,x2,y1,y2,x3,y3,x4,y4; public void setX1(double x1) { this.x1=x1; } public void setX2(double x2) { this.x2=x2; } public void setX3(double x3) { this.x3=x3; } public void setX4(double x4) { this.x4=x4; } public void setY1(double y1) { this.y1=y1; } public void setY2(double y2) { this.y2=y2; } public void setY3(double y3) { this.y3=y3; } public void setY4(double y4) { this.y4=y4; } public double getX1() { return x1; } public double getX2() { return x2; } public double getX3() { return x3; } public double getX4() { return x4; } public double getY2() { return y2; } public double getY1() { return y1; } public double getY3() { return y3; } public double getY4() { return y4; } public Fun5(){} public Fun5(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4){ this.x1=x1; this.x2=x2; this.x3=x3; this.y1=y1; this.y2=y2; this.y3=y3; this.x4=x4; this.y4=y4; } public Object getFun5(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4) { Fun1 sl = new Fun1(x1, y1, x2, y2); double r1=1,r2=1,a1 = 0,a2=0,b1=0,b2=0,x=0,y=0; if(x1==x2){ a1=x1; r1=0; } else if(r1!=0) { a1= (double) sl.getFun1(x1,y1,x2,y2); b1=y1-a1*x1; } if(x3==x4){ a2=x3; r2=0; } else if(r2!=0) { a2= (double) sl.getFun1(x3,y3,x4,y4); b2=y3-a2*x1; } if(r1==0&&r2==0||a1==a2) System.out.println("is parallel lines,have no intersection point"); else if(x1==x2) { x=x1; y = (a2 * x1) + b2; } else if(x3==x4) { x=x3; y=(a1*x3)+b1; } else { x=(b2-b1)/(a1-a2); y=a1*x+b1; } if(r1==0&&r2==0||a1==a2) r1=0; else if(x>=x1&&x<=x2||x<=x1&&x>=x2||x>=x3&&x<=x4||x<=x3&&x>=x4) System.out.println((float)x+","+(float)y+" ture"); else System.out.println((float)x+","+(float)y+" false"); return this; } }
设计思路:
1.正则表达式处理输入的字符串,确保格式正确。
2.设计五个类处理,通过用户输入选择对应的类。
3.数据处理方式和上一题差不多可以将第一题里的类复制过来,再构造题目里所需要的五种方法。
SourceMonitor的生成报表

第四题:
用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
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",
代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc= new Scanner(System.in); String s=sc.nextLine(); int len=s.length(); if(s.charAt(0)<'1'||s.charAt(0)>'5'||s.charAt(1)!=':'){ System.out.println("Wrong Format"); return; } int cnt=0; for(int i=0;i<len;i++){ if(s.charAt(i)==','){ cnt++; } } if(cnt==0){ System.out.println("Wrong Format"); return; } int pos=2; if((s.charAt(pos)!='+'&&s.charAt(pos)!='-')&&(s.charAt(pos)<'0'||s.charAt(pos)>'9')){ System.out.println("Wrong Format"); return; } String sss=s.substring(2,len); String ss[]=sss.split(" "); String num[]=null; for(String Str:ss){ num=Str.split(","); for(String tt:num){ if(!tt.matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$")){ System.out.println("Wrong Format"); return; } } } // String[] str = sc.nextLine().split(":|,| ");*/ String[] str = s.split(":|,| "); double[] position = new double[str.length]; double n=0; int t=0; try { for (int i = 0; i < str.length; i++) n = Double.parseDouble(String.valueOf(str[i])); }catch(Exception e){ t = 1; } if(t==0){ for (int i = 0; i < str.length; i++) position[i] = Double.parseDouble(String.valueOf(str[i]));} else { System.out.println("Wrong Format"); return; } if(position[0]==1) { Triangle sj =new Triangle(position[1],position[2],position[3],position[4],position[5],position[6]); /* if(sj.pd1(position[1],position[2],position[3],position[4],position[5],position[6])) { if (str.length != 7) System.out.println("wrong number of points"); else { System.out.println(sj.pd2(position[1],position[2],position[3],position[4],position[5],position[6])+" "+sj.pd3(position[1],position[2],position[3],position[4],position[5],position[6])); } } else System.out.println("data error");*/ if (str.length != 7){ System.out.println("wrong number of points"); return; } if(position[1]==position[3]&&position[2]==position[4]||position[1]==position[3]&&position[5]==position[6]||position[5]==position[6]&&position[2]==position[4]||position[1]==position[3]&&position[2]==position[4]&&position[1]==position[3]&&position[5]==position[6]){ System.out.println("points coincide"); return; } if(sj.pd1(position[1],position[2],position[3],position[4],position[5],position[6])) System.out.println(sj.pd2(position[1],position[2],position[3],position[4],position[5],position[6])+" "+sj.pd3(position[1],position[2],position[3],position[4],position[5],position[6])); else System.out.println("data error"); } if(position[0]==2) { Triangle sj =new Triangle(position[1],position[2],position[3],position[4],position[5],position[6]); /*if(sj.pd1(position[1],position[2],position[3],position[4],position[5],position[6])) { if (str.length != 7) System.out.println("wrong number of points"); else { sj.getMath(position[1],position[2],position[3],position[4],position[5],position[6]); } }*/ if (str.length != 7){ System.out.println("wrong number of points"); return; } if(position[1]==position[3]&&position[2]==position[4]||position[1]==position[3]&&position[5]==position[6]||position[5]==position[6]&&position[2]==position[4]||position[1]==position[3]&&position[2]==position[4]&&position[1]==position[3]&&position[5]==position[6]){ System.out.println("points coincide"); return; } if(sj.pd1(position[1],position[2],position[3],position[4],position[5],position[6])) sj.getMath(position[1],position[2],position[3],position[4],position[5],position[6]); else System.out.println("data error"); } if(position[0]==3) { Triangle sj =new Triangle(position[1],position[2],position[3],position[4],position[5],position[6]); /* if(sj.pd1(position[1],position[2],position[3],position[4],position[5],position[6])) { if (str.length != 7) System.out.println("wrong number of points"); else { System.out.println(sj.pd4(position[1],position[2],position[3],position[4],position[5],position[6])+" "+sj.pd5(position[1],position[2],position[3],position[4],position[5],position[6])+" "+sj.pd6(position[1],position[2],position[3],position[4],position[5],position[6])); } } else System.out.println("data error");*/ if (str.length != 7){ System.out.println("wrong number of points"); return; } if(position[1]==position[3]&&position[2]==position[4]||position[1]==position[3]&&position[5]==position[6]||position[5]==position[6]&&position[2]==position[4]||position[1]==position[3]&&position[2]==position[4]&&position[1]==position[3]&&position[5]==position[6]){ System.out.println("points coincide"); return; } if(sj.pd1(position[1],position[2],position[3],position[4],position[5],position[6])) System.out.println(sj.pd4(position[1],position[2],position[3],position[4],position[5],position[6])+" "+sj.pd5(position[1],position[2],position[3],position[4],position[5],position[6])+" "+sj.pd6(position[1],position[2],position[3],position[4],position[5],position[6])); else System.out.println("data error"); } if(position[0]==4) { Triangle sj =new Triangle(position[1],position[2],position[3],position[4],position[5],position[6]); if (str.length != 11){ System.out.println("wrong number of points"); return; } if(position[1]==position[3]&&position[2]==position[4]||position[1]==position[3]&&position[5]==position[6]||position[5]==position[6]&&position[2]==position[4]||position[1]==position[3]&&position[2]==position[4]&&position[1]==position[3]&&position[5]==position[6]){ System.out.println("points coincide"); return; } if(sj.pd1(position[5],position[6],position[7],position[8],position[9],position[10])) System.out.println(sj.pd4(position[5],position[6],position[7],position[8],position[9],position[10])+" "+sj.pd5(position[1],position[2],position[3],position[4],position[5],position[6])+" "+sj.pd6(position[1],position[2],position[3],position[4],position[5],position[6])); else System.out.println("data error"); } if(position[0]==5) { Triangle sj =new Triangle(position[1],position[2],position[3],position[4],position[5],position[6]); Point_positon sf=new Point_positon(position[1],position[2],position[3],position[4],position[5],position[6],position[7],position[8]); if(sj.pd1(position[3],position[4],position[5],position[6],position[7],position[8])) { if (str.length != 9) System.out.println("wrong number of points"); /* else if(position[1]==position[3]&&position[2]==position[4]||position[1]==position[3]&&position[5]==position[6]||position[5]==position[6]&&position[2]==position[4]||position[1]==position[3]&&position[2]==position[4]&&position[1]==position[3]&&position[5]==position[6]){ System.out.println("points coincide"); return; }*/ else if(!sf.getSf(position[1],position[2],position[3],position[4],position[5],position[6],position[7],position[8])) { double s1,s2,s3,s4; s1=sf.getSin(position[3],position[4],position[5],position[6],position[7],position[8]); s2=sf.getSin(position[1],position[2],position[5],position[6],position[7],position[8]); s3=sf.getSin(position[1],position[2],position[3],position[4],position[7],position[8]); s4=sf.getSin(position[1],position[2],position[5],position[6],position[3],position[4]); if(s1==s2+s3+s4) System.out.println("in the triangle"); else System.out.println("outof triangle"); } else System.out.println("on the triangle"); } else System.out.println("data error"); } } public static class Triangle<x1,y1,x2,y2,x3,y3> { private double x2; private double x1; private double y1; private double y2; private double y3; private double x3; public Triangle(){} public Triangle(double x1,double y1,double x2,double y2,double x3,double y3){ this.x1=x1; this.x2=x2; this.x3=x3; this.y1=y1; this.y2=y2; this.y3=y3; } public void setX1(double x1) { this.x1=x1; } public void setX2(double x2) { this.x2=x2; } public void setX3(double x3) { this.x3=x3; } public void setY1(double y1) { this.y1=y1; } public void setY2(double y2) { this.y2=y2; } public void setY3(double y3) { this.y3=y3; } public double getX1() { return x1; } public double getX2() { return x2; } public double getX3() { return x3; } public double getY2() { return y2; } public double getY1() { return y1; } public double getY3() { return y3; } public boolean pd1(double x1,double y1,double x2,double y2,double x3,double y3) { double a, b, c; a = Math.sqrt(Math.abs((x2 - x3) * (x2 - x3)) + Math.abs((y2 - y3) * (y2 - y3))); b = Math.sqrt(Math.abs((x1 - x2) * (x1 - x2)) + Math.abs((y1 - y2) * (y1 - y2))); c = Math.sqrt(Math.abs((x1 - x3) * (x1 - x3)) + Math.abs((y1 - y3) * (y1 - y3))); if(a==b+c||b==a+c||c==a+b||a==0||b==0||c==0||x1==x2&&y1==y2||x1==x3&&y3==y1||x2==x3&&y3==y2) return false; else return true; } public boolean pd2(double x1,double y1,double x2,double y2,double x3,double y3) { double a, b, c; a = Math.sqrt(Math.abs((x2 - x3) * (x2 - x3)) + Math.abs((y2 - y3) * (y2 - y3))); b = Math.sqrt(Math.abs((x1 - x2) * (x1 - x2)) + Math.abs((y1 - y2) * (y1 - y2))); c = Math.sqrt(Math.abs((x1 - x3) * (x1 - x3)) + Math.abs((y1 - y3) * (y1 - y3))); if(a==b||a==c||b==c||a==b&&b==c) return true; else return false; } public boolean pd3(double x1,double y1,double x2,double y2,double x3,double y3) { double a, b, c; a = Math.sqrt(Math.abs((x2 - x3) * (x2 - x3)) + Math.abs((y2 - y3) * (y2 - y3))); b = Math.sqrt(Math.abs((x1 - x2) * (x1 - x2)) + Math.abs((y1 - y2) * (y1 - y2))); c = Math.sqrt(Math.abs((x1 - x3) * (x1 - x3)) + Math.abs((y1 - y3) * (y1 - y3))); if(a==b&&b==c&&a==c) return true; else return false; } public Object getMath(double x1,double y1,double x2,double y2,double x3,double y3){ double a, b, c; a = Math.sqrt(Math.abs((x2-x3)*(x2-x3))+Math.abs((y2-y3)*(y2-y3))); b = Math.sqrt(Math.abs((x1-x2)*(x1-x2))+Math.abs((y1-y2)*(y1-y2))); c = Math.sqrt(Math.abs((x1-x3)*(x1-x3))+Math.abs((y1-y3)*(y1-y3))); double p = (a + b + c) / 2; double s = Math.sqrt(p * (p - a) * (p - b) * (p - c)); double x4,y4; x4=(x1+x2+x3)/3; y4=(y1+y2+y3)/3; String f =String.format("%.6f",2*p); p=Double.parseDouble(f)/2; String k =String.format("%.6f",s); s=Double.parseDouble(k); String n =String.format("%.6f",x4); x4=Double.parseDouble(n); String m =String.format("%.6f",y4); y4=Double.parseDouble(m); System.out.println(2*p+" "+s+" "+x4+","+y4); return this; } public boolean pd4(double x1,double y1,double x2,double y2,double x3,double y3){ double a, b, c; a = Math.sqrt(Math.abs((x2-x3)*(x2-x3))+Math.abs((y2-y3)*(y2-y3))); b = Math.sqrt(Math.abs((x1-x2)*(x1-x2))+Math.abs((y1-y2)*(y1-y2))); c = Math.sqrt(Math.abs((x1-x3)*(x1-x3))+Math.abs((y1-y3)*(y1-y3))); if(a*a>b*b+c*c||b*b>a*a+c*c||c*c>a*a+b*b) return true; else return false; } public boolean pd5(double x1,double y1,double x2,double y2,double x3,double y3){ double a, b, c; a = Math.sqrt(Math.abs((x2-x3)*(x2-x3))+Math.abs((y2-y3)*(y2-y3))); b = Math.sqrt(Math.abs((x1-x2)*(x1-x2))+Math.abs((y1-y2)*(y1-y2))); c = Math.sqrt(Math.abs((x1-x3)*(x1-x3))+Math.abs((y1-y3)*(y1-y3))); if(a*a==b*b+c*c||b*b==(a*a+c*c)||c*c==a*a+b*b) return true; else return false; } public boolean pd6(double x1,double y1,double x2,double y2,double x3,double y3){ double a, b, c; a = Math.sqrt(Math.abs((x2-x3)*(x2-x3))+Math.abs((y2-y3)*(y2-y3))); b = Math.sqrt(Math.abs((x1-x2)*(x1-x2))+Math.abs((y1-y2)*(y1-y2))); c = Math.sqrt(Math.abs((x1-x3)*(x1-x3))+Math.abs((y1-y3)*(y1-y3))); if(a*a<b*b+c*c&&b*b<a*a+c*c&&c*c<a*a+b*b) return true; else return false; } } } class Point_positon<x1,y1,x2,y2,x3,y3,x4,y4>{ private double x2; private double x1; private double y1; private double y2; private double y3; private double x3; private double x4; private double y4; public void setX1(double x1) { this.x1=x1; } public void setX2(double x2) { this.x2=x2; } public void setX3(double x3) { this.x3=x3; } public void setX4(double x4) { this.x4=x4; } public void setY1(double y1) { this.y1=y1; } public void setY2(double y2) { this.y2=y2; } public void setY3(double y3) { this.y3=y3; } public void setY4(double y4) { this.y4=y4; } public double getX1() { return x1; } public double getX2() { return x2; } public double getX3() { return x3; } public double getX4() { return x4; } public double getY2() { return y2; } public double getY1() { return y1; } public double getY3() { return y3; } public double getY4() { return y4; } public Point_positon(){} public Point_positon(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4){ this.x1=x1; this.x2=x2; this.x3=x3; this.y1=y1; this.y2=y2; this.y3=y3; this.x4=x4; this.y4=y4; } public boolean getSf(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4){ double r1=1,r2=1,r3=0,a1 = 0,a2=0,a3=0,b1=0,b2=0,b3=0,x=0,y=0; if(x3==x2){ a1=x2; r1=0; } else if(r1!=0) { a1= (y3-y2)/(x3-x2); b1=y2-a1*x2; } if(x3==x4){ a2=x3; r2=0; } else if(r2!=0) { a2=(y3-y4)/(x3-x4); b2=y3-a2*x3; } if(x2==x4){ a3=x2; r3=0; } else if(r3!=0) { a3=(y2-y4)/(x2-x4); b3=y2-a2*x2; } if(y1==a1*x1+b1||y1==a2*x1+b2||y1==a3*x1+b3) return true; else return false; } public Double getSin(double x1,double y1,double x2,double y2,double x3,double y3){ double a, b, c; a = Math.sqrt(Math.abs((x2-x3)*(x2-x3))+Math.abs((y2-y3)*(y2-y3))); b = Math.sqrt(Math.abs((x1-x2)*(x1-x2))+Math.abs((y1-y2)*(y1-y2))); c = Math.sqrt(Math.abs((x1-x3)*(x1-x3))+Math.abs((y1-y3)*(y1-y3))); double p = (a + b + c) / 2; float s = (float) Math.sqrt(p * (p - a) * (p - b) * (p - c)); return (double)s; } }
设计思路:
1.这道题也是上一题的进阶版,由点到线再到面。这题涉及到了更多的点需要处理,相应地字符串的分割也要更多了,难度也相应地增加了。
2.代码开头仍是“String”来输入字符串数组,在进行合法性的判断,接着在创建的“类”中通过不同的首个字符来根据题目需求来解决问题。
3.虽然整体与上一题的几乎无异“类”中的一些变量和方法也要相应地改变,而且方法中解决题目需求的算法逻辑更加难想到。代码开头仍是“String”来输入字符串数组,在进行合法性的判断,接着在创建的“类”中通过不同的首个字符来根据题目需求来解决问题。
4.需要奇妙的利用数学公式简化求解。
SourceMonitor的生成报表

踩坑心得
1.判断错误后要直接终止程序,不然程序继续运行会输出不需要的东西。
2.求字符串长度用length()方法,求数组长度用length方法。
3.相较于数学计算上的求直角三角形用勾股定理,由于Java中的的数据范围并不是数学上意义的范围,所以在计算比较时应该不能有等号,而是让两条边的平方减去另一条边的平方的绝对值来小于一个比较小的数,例如1e-6,即0.0000006,不然那样的话就无法识别等腰直角三角形这种特殊的直角三角形。
4.理清题目要求的各种非法格式的条件再动手。
改进建议
1.可以通过正则表达式判断改进,效率会更高
2.第一题只要是结尾错了,那就是“validate error”,所以可以先判断结尾,结尾正确再去判断是否奇校验正确。可以加快判断。
3.可以把“类”中每一个满足需求的方法中的一些判断也可以写成单独写成一个方法。
4.要学会使用调试功能。
总结
1.总体概括来说,通过本阶段三次题目集,让我学会了很多关于Java的字符串处理的语法和方法,包括巩固了在课堂上老师讲过的知识,还通过网上翻阅学习到了许多课堂外的知识还有自己在书上翻到的一些程序用法。
2.学会了类的使用和构造,更深刻的理解了一切皆类的概念。
3.加强面对对象理念,对进行相关的思考和训练。在课堂上老师也是很注重对我们面对对象理念的培养,经常要求我们设计类,得到了锻炼。
3.Java类的使用,private,protected,public关键字的含义,Java方法的使用,this.的操作,以及一些基础知识。

浙公网安备 33010602011771号