一、前言:
第一次作业和第二次作业,是Java的入门题目,第一次作业题量较多,第二次作业题量适中,综合下来看两次作业均难度较低。写的时候基础薄弱,使用的逻辑更偏向c语言的面向过程。
第三次作业题量适中,难度较大,写题逻辑逐渐从面向过程变成面向对象。
二、题目集2:
7-2(1)题目:
7-2 串口字符解析
分数 40
作者 蔡轲
单位 南昌航空大学
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
7-2(2)设计与分析:
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
String a=in.nextLine();
int length=a.length();
int[] arr=new int[length];
int flag=0,s=0,q=0;
if((length)<11){
System.out.println("null data");
return;
}
for(int i=0;i<length;i++)
{
if(a.charAt(i)=='0')
{
flag=1;
if((length-i)<10){
return;
}
for(int j=i+1;j<i+9;j++)
{
if(a.charAt(j)=='1')
s++;
}
if(a.charAt(i+9)=='1')
{
s++;
}
if(s%2!=0&&a.charAt(i+10)=='1')
{
q++;
System.out.print(q+":"+a.charAt(i+1));
i++;
for(int k=0;k<7;k++)
{
System.out.print(a.charAt(i+1));
i++;
}
System.out.println();
i=i+2;
s=0;
}
else if(a.charAt(i+10)!='1')
{
q++;
System.out.println(q+":validate error");
i=i+10;
s=0;
}
else if(s%2==0&&a.charAt(i+10)=='1')
{
q++;
System.out.println(q+":parity check error");
i=i+10;
s=0;
}
}
/* else if(s%2!=0&&a.charAt(i+10)!=1)
{
q++;
System.out.println(q+".validate error");
}*/
}
if(flag==0){
System.out.print("null data");
}
}
}
分析如下:
平均复杂度较高,平均深度复杂度较高,最大复杂度较高,平均方法复杂度较高。可能是只用了一个类,一个方法很多if,else堆在一起复杂度就很高
7-2(3)踩坑心得:
遇到的问题:错误输出测试如下
加入i=i+10;后答案正确
心得及总结
题目比较晦涩难懂,但如果看懂了题目意思,其实题目不难,但由于我写题时运用的if,else比较多,不仅增加了代码的复杂度,还很容易遗漏条件导致犯一些不易察觉到的逻辑错误。
7-2(4)改进建议:
答题考虑写题简单的同时尽量考虑一些复杂度问题。
三、题目集3:
7-1(1) 题目:
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”。
7-1(2)设计与分析:
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
String a=in.nextLine();
// string[] split=a.split("[,]")
String[] coord0=a.split(" ");
// String[] coord1=new String[coord0.length*2];
// coord1=coord0[k].split(",");
for(int i=0;i<coord0.length;i++)
{
if(!coord0[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
{ System.out.print("Wrong Format");
System.exit(0);
}
}
if(coord0.length!=2)
{
System.out.print("wrong number of points");
System.exit(0);
}
//coord1=new String[coord0.length*2];
String[] coord1=coord0[0].split(",");
String[] coord2=coord0[1].split(",");
double x1,x2,y1,y2;
// int j=0;
x1=Double.parseDouble(coord1[0]);
y1=Double.parseDouble(coord1[1]);
x2=Double.parseDouble(coord2[0]);
y2=Double.parseDouble(coord2[1]);
double s;
s=Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2,2));
System.out.print(s);
}
}
分析如下:
平均方法复杂度高,其他复杂度一般。
7-1.(3)踩坑心得:
遇到的问题:
刚开始用多个类和方法写时,不熟练且一堆报错
心得及总结:
后面我放弃了用多个类和方法,而是采用面向过程来写题,虽然代码简单了很多,但是方法的复杂度很高
7-1(4)改进建议
尽量采用规范的运用类和方法,降低代码的复杂度。
7-2(1) 题目:
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",
7-2(2)设计与分析:
import java.util.Scanner;
public class Main{
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
String a=in.nextLine();
if(a.charAt(1)!=':')
{
System.out.print("Wrong Format");
System.exit(0);
}
if(a.charAt(0)=='1')//输入情况1
{
String[] coord0=a.split(":| ");
for(int i=1;i<coord0.length;i++)
{
if(!coord0[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
{ System.out.print("Wrong Format");
System.exit(0);
}
}
if(coord0.length!=3)
{
System.out.print("wrong number of points");
System.exit(0);
}
String[] coord1=coord0[1].split(",");
String[] coord2=coord0[2].split(",");
double x1,x2,y1,y2;
x1=Double.parseDouble(coord1[0]);
y1=Double.parseDouble(coord1[1]);
x2=Double.parseDouble(coord2[0]);
y2=Double.parseDouble(coord2[1]);
if(x1==x2&&y1==y2)
{
System.out.print("points coincide");
System.exit(0);
}
double k1=0;
if(Math.abs(x1-x2)<0.001)
{
System.out.print("Slope does not exist");
System.exit(0);
}
else{
k1=(y1-y2)/(x1-x2);
System.out.print(k1);
System.exit(0);
}
}
else if(a.charAt(0)=='2'||a.charAt(0)=='3')
{
String[] coord0=a.split(":| ");
for(int i=1;i<coord0.length;i++)
{
if(!coord0[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
{ System.out.print("Wrong Format");
System.exit(0);
}
}
if(coord0.length!=4)
{
System.out.print("wrong number of points");
System.exit(0);
}
String[] coord1=coord0[1].split(",");
String[] coord2=coord0[2].split(",");
String[] coord3=coord0[3].split(",");
double x1,x2,x3,y1,y2,y3;
x1=Double.parseDouble(coord1[0]);
y1=Double.parseDouble(coord1[1]);
x2=Double.parseDouble(coord2[0]);
y2=Double.parseDouble(coord2[1]);
x3=Double.parseDouble(coord3[0]);
y3=Double.parseDouble(coord3[1]);
if((x1==x2&&y1==y2)||(x2==x3&&y2==y3)||(x1==x3&&y1==y3))
{
System.out.print("points coincide");
System.exit(0);
}
if(a.charAt(0)=='2')
{
double k2,b,d;
k2=(y3-y2)/(x3-x2);
b=y2-k2*x2;
if(x2==x3)
{
d=Math.sqrt(x1-x2);
}
else
d=(Math.abs(y1-k2*x1-b)/(Math.sqrt(k2*k2+1)));
System.out.print(d);
}
if(a.charAt(0)=='3')
{
double k31,k32;
k31=(y2-y1)/(x2-x1);
k32=(y3-y2)/(x3-x2);
if(k31==k32)
System.out.print("true");
else if(k31!=k32)
System.out.print("false");
}
}
else if(a.charAt(0)=='4'||a.charAt(0)=='5')
{
String[] coord0=a.split(":| ");
for(int i=1;i<coord0.length;i++)
{
if(!coord0[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
{ System.out.print("Wrong Format");
System.exit(0);
}
}
if(coord0.length!=5)
{
System.out.print("wrong number of points");
System.exit(0);
}
String[] coord1=coord0[1].split(",");
String[] coord2=coord0[2].split(",");
String[] coord3=coord0[3].split(",");
String[] coord4=coord0[4].split(",");
double x1,x2,x3,x4,y1,y2,y3,y4;
x1=Double.parseDouble(coord1[0]);
y1=Double.parseDouble(coord1[1]);
x2=Double.parseDouble(coord2[0]);
y2=Double.parseDouble(coord2[1]);
x3=Double.parseDouble(coord3[0]);
y3=Double.parseDouble(coord3[1]);
x4=Double.parseDouble(coord4[0]);
y4=Double.parseDouble(coord4[1]);
if((x1==x2&&y1==y2)||(x3==x4&&y3==y4))
{
System.out.print("points coincide");
System.exit(0);
}
double k41,k42;
k41=(y2-y1)/(x2-x1);
k42=(y4-y3)/(x4-x3);
if(a.charAt(0)=='4')
{
if(x1==x2&&x3==x4)
{
System.out.print("true");
System.exit(0);
}
if(k41==k42){
System.out.print("true");
System.exit(0);}
else if(k41!=k42){
System.out.print("false");
System.exit(0);}
}
if(a.charAt(0)=='5')
{
double A1,A2,B1,B2,C1,C2;
A1=y2-y1;
B1=x1-x2;
C1=x2*y1-x1*y2;
A2=y4-y3;
B2=x3-x4;
C2=x4*y3-x3*y4;
if((A1/A2==B1/B2)||(A1==A2&&A1==0)||(B1==B2&&B1==0)||(x1==x2&&x3==x4)||(y1==y2&&y3==y4))
{
System.out.print("is parallel lines,have no intersection point");
System.exit(0);
}
double x5,y5;
// System.out.println(A1+" "+B1+" "+C1+" "+A2+" "+B2+" "+C2);
if(A1==0)
{
y5=(-1)*C1/B1;
x5=(-1)*((C2/A2)-(B2*C1/B1*A2));
}
else{
y5=(A1*C2-A2*C1)/(B1*A2-A1*B2);
x5=(-1)*(B1/A1)*y5-C1/A1;}
System.out.print(Math.round(x5*1000000000)/(double)1000000000+","+Math.round(y5*1000000000)/(double)1000000000+" ");
// System.out.print(x5+","+y5+" ");
if((x5==x1&&y5==y1)||(x5==x2&&y5==y2)||(x5==x3&&y5==y3)||(x5==x4&&y5==y4))
{ System.out.print("false");
return;
}
double d1,d2,d3,d4,d5,d6;
d1=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
d2=Math.sqrt((x3-x4)*(x3-x4)+(y3-y4)*(y3-y4));
d3=Math.sqrt((x5-x1)*(x5-x1)+(y5-y1)*(y5-y1));
d4=Math.sqrt((x5-x2)*(x5-x2)+(y5-y2)*(y5-y2));
d5=Math.sqrt((x5-x3)*(x5-x3)+(y5-y3)*(y5-y3));
d6=Math.sqrt((x5-x4)*(x5-x4)+(y5-y4)*(y5-y4));
if((d1-(d3+d4))==0||(d2-(d5+d6))==0)
System.out.print("true");
else
System.out.print("false");
}
}
else{
System.out.print("Wrong Format");
}
}
}
分析如下:
平均复杂度较高,平均深度复杂度较高,最大复杂度较高,平均方法复杂度较高。在题目稍微复杂的时候没有运用多个类和方法精简代码,而且堆在一个类里,导致复杂度高。
7-2(3)踩坑心得:对源码的提交过程中出现的问题及心得进行总结,务必做到详实,拿数据、源码及测试结果说话,切忌假大空
遇到的问题:
直接拆分:和空格导致,有格式错误的情况仍然能通过测试
心得及总结:
由于没有运用多种类和方法不仅使得代码又臭又长,还在通过所有样例后却无法通过所有测试点,并且堆在一块的代码很难看出逻辑错误,导致这题有一分的点一直过不去。
7-2(4)改进建议:
没有运用多个类和方法,代码又臭又长,全部堆在一个类里边,如果运用多个类和方法,代码的复杂度应该会降低很多。
7-3(1) 题目:
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",
7-3(2)设计与分析:
import java.util.Scanner;
class dian{
double x;
double y;
}
class xian{
double d1,d2,dcd,dec,ded;
double A;
double B;
double C;
public void liangdian(dian a,dian b,xian l)
{//计算两点之间的距离
l.d1=Math.sqrt(Math.pow(a.x-b.x,2)+Math.pow(a.y-b.y,2));
}
public void juli(dian a,dian b,dian c,xian l){
//点到直线的距离
l.A=b.y-c.y;
l.B=c.x-b.x;
l.C=b.x*c.y-c.x*b.y;
l.d2=Math.abs((l.A*a.x+l.B*a.y+C)/Math.sqrt(Math.pow(l.A,2)+Math.pow(l.B,2)));
}
public void liangjiaodian(dian a,dian b,dian c,dian d,dian e,xian lab,xian lcd){
//两直线的交点
juli(c,a,b,lab);
juli(a,c,d,lcd);
// e.y= (lab.A*lcd.C-lcd.A*lab.C)/(lab.B*lcd.A-lab.A*lcd.B);
// e.x=(-1)*(lab.B/lab.A)*e.y-lab.C/lab.A;
e.x=(lab.B*lcd.C-lcd.B*lab.C)/(lab.A*lcd.B-lcd.A*lab.B);
e.y=(lcd.A*lab.C-lab.A*lcd.C)/(lcd.B*lab.A-lcd.A*lab.B);
e.y=Math.round(e.y*1000000000)/(double)1000000000;
e.x=Math.round(e.x*1000000000)/(double)1000000000;
}
public boolean xiangjiao(dian e,dian c,dian d,xian lcd){
//判断直线与线段是否相交
lcd.dcd=Math.sqrt(Math.pow(c.x-d.x,2)+Math.pow(c.y-d.y,2));
lcd.dec=Math.sqrt(Math.pow(e.x-c.x,2)+Math.pow(e.y-c.y,2));
lcd.ded=Math.sqrt(Math.pow(e.x-d.x,2)+Math.pow(e.y-d.y,2));
if((lcd.ded+lcd.dec-lcd.dcd)==0)
return true;
else
return false;
}
}
class triangle{
double l1,s1,flag=0,cos1,cos2,cos3;
public boolean shifou(xian lac,xian lbc,xian lab){
//判断是否是三角形
if((lac.d1+lbc.d1)>lab.d1&&(lab.d1+lbc.d1)>lac.d1&&(lac.d1+lab.d1)>lbc.d1)
return true;
else
return false;
}
public boolean dengyao(xian lac,xian lbc,xian lab){
//判断是否是等腰三角形
if(lac.d1==lab.d1||lab.d1==lbc.d1||lbc.d1==lac.d1)
return true;
else
return false;
}
public boolean dengbian(xian lac,xian lbc,xian lab){
//判断是否是等边三角形
if(lab.d1==lac.d1&&lac.d1==lbc.d1&&lab.d1==lbc.d1)
return true;
else
return false;
}
public void zhouchang(xian lac,xian lbc,xian lab,triangle sanjiao){
//计算周长
sanjiao.l1=lac.d1+lbc.d1+lab.d1;
}
public void mianji(xian h,xian lbc,triangle sanjiao){
//计算面积
sanjiao.s1=0.5*h.d2*lbc.d1;
}
public boolean dunjiao(xian lab,xian lac,xian lbc,triangle sanjiao){
//判断是否是钝角三角形
sanjiao.cos1=(lac.d1*lac.d1+lab.d1*lab.d1-lbc.d1*lbc.d1)/(2*lac.d1*lab.d1);
sanjiao.cos2=(lbc.d1*lbc.d1+lab.d1*lab.d1-lac.d1*lac.d1)/(2*lbc.d1*lab.d1);
sanjiao.cos3=(lbc.d1*lbc.d1+lac.d1*lac.d1-lab.d1*lab.d1)/(2*lbc.d1*lac.d1);
if(sanjiao.cos1<0.0001||sanjiao.cos2<0.0001||sanjiao.cos3<0.0001)
return true;
else
return false;
}
public boolean zhijiao(xian lab,xian lac,xian lbc,triangle sanjiao){
//判断是否是直角三角形
sanjiao.cos1=(lac.d1*lac.d1+lab.d1*lab.d1-lbc.d1*lbc.d1)/(2*lac.d1*lab.d1);
sanjiao.cos2=(lbc.d1*lbc.d1+lab.d1*lab.d1-lab.d1*lab.d1)/(2*lbc.d1*lab.d1);
sanjiao.cos3=(lbc.d1*lbc.d1+lac.d1*lac.d1-lab.d1*lab.d1)/(2*lbc.d1*lac.d1);
if(sanjiao.cos1==0||sanjiao.cos2==0||sanjiao.cos3==0)
return true;
else
return false;
}
public boolean ruijiao(xian lab,xian lac,xian lbc,triangle sanjiao){
//判断是否是锐角三角形
sanjiao.cos1=(lac.d1*lac.d1+lab.d1*lab.d1-lbc.d1*lbc.d1)/(2*lac.d1*lab.d1);
sanjiao.cos2=(lbc.d1*lbc.d1+lab.d1*lab.d1-lab.d1*lab.d1)/(2*lbc.d1*lab.d1);
sanjiao.cos3=(lbc.d1*lbc.d1+lac.d1*lac.d1-lab.d1*lab.d1)/(2*lbc.d1*lac.d1);
if(sanjiao.cos1>0&&sanjiao.cos2>0&&sanjiao.cos3>0)
return true;
else
return false;
}
public boolean chonghe(xian l,xian lab,xian lac,xian lbc){
//判断直线是否与三角形的一条边重合
if((l.A==lab.A&&l.B==lab.B&&l.C==lab.C)||(l.A==lac.A&&l.B==lac.B&&l.C==lac.C)||(l.A==lbc.A&&l.B==lbc.B&&l.C==lbc.C))
return true;
else
return false;
}
}
public class Main{
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
String input=in.nextLine();
if(input.charAt(1)!=':')
{
System.out.print("Wrong Format");
System.exit(0);
}
if(input.charAt(0)=='1'||input.charAt(0)=='2'||input.charAt(0)=='3')//输入情况1
{
String[] coord0=input.split(":| ");
for(int i=1;i<coord0.length;i++)
{
if(!coord0[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
{ System.out.print("Wrong Format");
System.exit(0);
}
}
if(coord0.length!=4)
{
System.out.print("wrong number of points");
System.exit(0);
}
String[] coord1=coord0[1].split(",");
String[] coord2=coord0[2].split(",");
String[] coord3=coord0[3].split(",");
double x1,x2,x3,y1,y2,y3;
x1=Double.parseDouble(coord1[0]);
y1=Double.parseDouble(coord1[1]);
x2=Double.parseDouble(coord2[0]);
y2=Double.parseDouble(coord2[1]);
x3=Double.parseDouble(coord3[0]);
y3=Double.parseDouble(coord3[1]);
dian a=new dian();
dian b=new dian();
dian c=new dian();
a.x=x1; a.y=y1;
b.x=x2; b.y=y2;
c.x=x3; c.y=y3;
xian lac=new xian();
xian lbc=new xian();
xian lab=new xian();
triangle sanjiao=new triangle();
lab.liangdian(a,b,lab);
lac.liangdian(a,c,lac);
lbc.liangdian(b,c,lbc);
if(!sanjiao.shifou(lac,lbc,lab))
{
System.out.print("data error");
System.exit(0);
}
else{
xian h=new xian();
h.juli(a,b,c,h);
if(input.charAt(0)=='1'){
if(!sanjiao.dengyao(lac,lbc,lab))
System.out.print("false"+" ");
else
System.out.print("true"+" ");
if(!sanjiao.dengbian(lac,lbc,lab))
System.out.print("false");
else
System.out.print("true");
}
if(input.charAt(0)=='2')
{
sanjiao.zhouchang(lac,lbc,lab,sanjiao);
System.out.print(Math.round(sanjiao.l1*1000000)/(double)1000000+" ");
sanjiao.mianji(h,lbc,sanjiao);
System.out.print(Math.round(sanjiao.s1*1000000)/(double)1000000+" ");
double ex,ey;
/* dian d=new dian();
dian e=new dian();
xian lcd=new xian();
a.x=x1;
a.y=y1;
b.x=0.5*(x2+x3);
b.y=0.5*(y2+y3);
c.x=x2;
c.y=y2;
d.x=0.5*(x1+x3);
d.y=0.5*(y1+y3);
lab.liangjiaodian(a,b,c,d,e,lab,lcd);
System.out.print(Math.round(e.x*1000000)/(double)1000000+","+Math.round(e.y*1000000)/(double)1000000);
*/
ex=(x1+x2+x3)/3;
ey=(y1+y2+y3)/3;
System.out.print(Math.round(ex*1000000)/(double)1000000+","+Math.round(ey*1000000)/(double)1000000);
}
if(input.charAt(0)=='3')
{
if(!sanjiao.dunjiao(lab,lac,lbc,sanjiao))
System.out.print("false"+" ");
else
System.out.print("true"+" ");
if(!sanjiao.zhijiao(lac,lbc,lab,sanjiao))
System.out.print("false"+" ");
else
System.out.print("true"+" ");
if(!sanjiao.ruijiao(lac,lbc,lab,sanjiao))
System.out.print("false");
else
System.out.print("true");
}
}
}
else if(input.charAt(0)=='4')//输入情况4
{
String[] coord0=input.split(":| ");
for(int i=1;i<coord0.length;i++)
{
if(!coord0[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
{ System.out.print("Wrong Format");
System.exit(0);
}
}
if(coord0.length!=6)
{
System.out.print("wrong number of points");
System.exit(0);
}
String[] coord1=coord0[1].split(",");
String[] coord2=coord0[2].split(",");
String[] coord3=coord0[3].split(",");
String[] coord4=coord0[4].split(",");
String[] coord5=coord0[5].split(",");
double x1,x2,x3,x4,x5,y1,y2,y3,y4,y5;
x1=Double.parseDouble(coord1[0]);
y1=Double.parseDouble(coord1[1]);
x2=Double.parseDouble(coord2[0]);
y2=Double.parseDouble(coord2[1]);
x3=Double.parseDouble(coord3[0]);
y3=Double.parseDouble(coord3[1]);
x4=Double.parseDouble(coord4[0]);
y4=Double.parseDouble(coord4[1]);
x5=Double.parseDouble(coord5[0]);
y5=Double.parseDouble(coord5[1]);
dian a=new dian();//组成直线的两点
dian b=new dian();
dian c=new dian();//组成三角形的三点
dian d=new dian();
dian f=new dian();
dian e=new dian();//直线与三角形的交点
a.x=x1;a.y=y1;
b.x=x2;b.y=y2;
c.x=x3;c.y=y3;
d.x=x4;d.y=y4;
f.x=x5;f.y=y5;
xian lab=new xian();
xian lcd=new xian();
xian lce=new xian();
xian lde=new xian();
xian lcf=new xian();
xian ldf=new xian();
triangle sanjiao=new triangle();
double A1,A2,A3,A4,B1,B2,B3,B4;
lab.juli(c,a,b,lab);
A1=lab.A;B1=lab.B;
lcd.juli(a,c,d,lcd);
A2=lcd.A;B2=lcd.B;
lcf.juli(a,c,f,lcf);
A3=lcf.A;B3=lcf.B;
ldf.juli(a,d,f,ldf);
A4=ldf.A;B4=ldf.B;
if(x1==x2&&y1==y2)
{
System.out.print("points coincide");
System.exit(0);
}
lcd.liangdian(c,d,lcd);
lcf.liangdian(c,f,lcf);
ldf.liangdian(d,f,ldf);
if(!sanjiao.shifou(lcd,lcf,ldf))
{
System.out.print("data error");
System.exit(0);
}
if(sanjiao.chonghe(lab,lcd,lcf,ldf))
{
System.out.print("The point is on the edge of the triangle");
System.exit(0);
}
int count=0;
int flag1=0,flag2=0,flag3=0;
dian xx=new dian();
dian yy=new dian();
dian z=new dian();
xian lxy=new xian();
xian h=new xian();
double Sb,sb1,sb2;
ldf.liangdian(d,f,ldf);
ldf.juli(c,d,f,ldf);
if((A1/A2!=B1/B2)||(A1!=A2&&A1!=0)||(B1!=B2&&B1!=0))
{
lcd.liangjiaodian(a,b,c,d,e,lab,lcd);
if(lcd.xiangjiao(e,c,d,lcd))
{
count++; flag1=1;
xx.x=e.x;
xx.y=e.y;
}
}
if((A1/A3!=B1/B3)||(A1!=A3&&A1!=0)||(B1!=B3&&B1!=0))
{
lcf.liangjiaodian(a,b,c,f,e,lab,lcf);
if(lcf.xiangjiao(e,c,f,lcf))
{
count++; flag2=1;
yy.x=e.x;
yy.y=e.y;
}
}
if((A1/A4!=B1/B4)||(A1!=A4&&A1!=0)||(B1!=B4&&B1!=0))
{
ldf.liangjiaodian(a,b,d,f,e,lab,ldf);
if(ldf.xiangjiao(e,d,f,ldf))
{
count++; flag3=1;
z.x=e.x;
z.y=e.y;
}
}
if((xx.x==x3&&xx.y==y3)||(xx.x==x4&&xx.y==y4)||(xx.x==x5&&xx.y==y5)||(yy.x==x3&&yy.y==y3)||(yy.x==x4&&yy.y==y4)||(yy.x==x5&&yy.y==y5))
{
count--;
}
System.out.print(count+" ");
if(count==2)
{
xian l=new xian();
lde.liangdian(d,f,ldf);
l.juli(c,d,f,l);
sanjiao.mianji(l,ldf,sanjiao);
Sb=sanjiao.s1;
if(flag1==1&&flag2==1)
{
ldf.liangdian(xx,yy,ldf);
lxy.juli(c,xx,yy,lxy);
sanjiao.mianji(lxy,ldf,sanjiao);
sb1=sanjiao.s1;
sb2=Sb-sb1;
if(sb1>sb2)
System.out.print(Math.round(sb2*1000000)/(double)1000000+" "+Math.round(sb1*1000000)/(double)1000000);
else
System.out.print(Math.round(sb1*1000000)/(double)1000000+" "+Math.round(sb2*1000000)/(double)1000000);
}
else if(flag1==1&&flag3==1)
{
ldf.liangdian(xx,z,ldf);
lxy.juli(c,xx,z,lxy);
sanjiao.mianji(lxy,ldf,sanjiao);
sb1=sanjiao.s1;
sb2=Sb-sb1;
if(sb1>sb2)
System.out.print(sb2+" "+sb1);
else
System.out.print(sb1+" "+sb2);
}
else if(flag2==1&&flag3==1)
{
ldf.liangdian(yy,z,ldf);
lxy.juli(c,yy,z,lxy);
sanjiao.mianji(lxy,ldf,sanjiao);
sb1=sanjiao.s1;
sb2=Sb-sb1;
if(sb1>sb2)
System.out.print(sb2+" "+sb1);
else
System.out.print(sb1+" "+sb2);
}
}
}
else if(input.charAt(0)=='5')//输入情况5
{
String[] coord0=input.split(":| ");
for(int i=1;i<coord0.length;i++)
{
if(!coord0[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
{ System.out.print("Wrong Format");
System.exit(0);
}
}
if(coord0.length!=5)
{
System.out.print("wrong number of points");
System.exit(0);
}
String[] coord1=coord0[1].split(",");
String[] coord2=coord0[2].split(",");
String[] coord3=coord0[3].split(",");
String[] coord4=coord0[4].split(",");
double x1,x2,x3,x4,y1,y2,y3,y4;
x1=Double.parseDouble(coord1[0]);
y1=Double.parseDouble(coord1[1]);
x2=Double.parseDouble(coord2[0]);
y2=Double.parseDouble(coord2[1]);
x3=Double.parseDouble(coord3[0]);
y3=Double.parseDouble(coord3[1]);
x4=Double.parseDouble(coord4[0]);
y4=Double.parseDouble(coord4[1]);
dian a=new dian();
dian b=new dian();
dian c=new dian();
dian d=new dian();
a.x=x1;a.y=y1;
b.x=x2;b.y=y2;
c.x=x3;c.y=y3;
d.x=x4;d.y=y4;
xian lbc=new xian();
xian lcd=new xian();
xian lbd=new xian();
lbc.juli(a,b,c,lbc);
if((lbc.A*a.x+lbc.B*a.y+lbc.C)==0)
{
if(lbc.xiangjiao(a,b,c,lbc))
{
System.out.print("on the triangle");
System.exit(0);
}
}
lcd.juli(a,c,d,lcd);
if((lcd.A*a.x+lcd.B*a.y+lcd.C)==0)
{
if(lcd.xiangjiao(a,c,d,lcd))
{
System.out.print("on the triangle");
System.exit(0);
}
}
int count1=0;
lbd.juli(a,b,d,lbd);
if((lbd.A*a.x+lbd.B*a.y+lbd.C)==0)
{
if(lbd.xiangjiao(a,b,d,lbd))
{
System.out.print("on the triangle");
System.exit(0);
}
}
dian e=new dian();
xian lab=new xian();
xian lac=new xian();
xian lde=new xian();
xian lad=new xian();
lab.liangjiaodian(a,b,c,d,e,lab,lcd);
if(lcd.xiangjiao(e,c,d,lcd))
count1++;
lab.liangjiaodian(a,c,b,d,e,lac,lde);
if(lbd.xiangjiao(e,b,d,lbd))
count1++;
lab.liangjiaodian(a,d,b,c,e,lad,lbc);
if(lbc.xiangjiao(e,b,c,lbc))
count1++;
if(count1==3)
{
System.out.print("in the triangle");
}
else{
System.out.print("outof the triangle");
}
}
else{
System.out.print("Wrong Format");
System.exit(0);
}
}
}
分析如下:
平均复杂度较高,平均深度复杂度较高,最大复杂度较高,平均方法复杂度较高。运用了多个类和方法后,代码精简了一些,但是由于写着写着还是会堆在一个类里边,导致很多复杂度还是很高。
7-3(3)踩坑心得:对源码的提交过程中出现的问题及心得进行总结,务必做到详实,拿数据、源码及测试结果说话,切忌假大空
遇到的问题:在第四点中
心得及总结:
类似的错误还有很多,由于题目比较复杂,很难考虑的全面,还是要多多测试其他特殊情况,可能就会发现其他的逻辑漏洞。因为对题目的考虑还是不够细致,导致过了所有测试样例却无法过测试点,并且难以察觉到哪里有逻辑错误。
7-3(4)改进建议:
第一次正是尝试用多个类和方法,所以很多代码写的比较粗糙,并且写着写着还是会不由自主的将代码堆在一个类里边,还需要增强对类和方法的理解。
四、总结:
通过前三次作业难度由浅到深,从初步接触Java作业基本的输入输出,到后面尝试着数组,字符串类型的转变等等。随着题目的复杂度增加,代码也越来越复杂。为了精简代码和进一步的学习,我更加熟悉了类是什么,方法是什么。第三次作业难度剧增,但正是这样被迫激励我去试着运用多个类和方法,去学习如何调用别的类的方法。题目的复杂度增加也伴随着需要考虑的情况越来越多,为了缩减if语句的使用,我学习了正则表达式,但是对于正则表达式的使用仍然不够灵活和熟练。第三次作业有两题我都没有得满分,除了我自身对类和方法使用不够熟悉外,我还希望老师能多多增加特殊的测试样例,或者增加一些测试点的提示,有时候当我过了所有测试样例却无法过所有测试点,代码又很复杂,不仅无法下手,也很难找到错的地方。