1.前言
第一次作业难度相对较低,主要注重字符串的处理。第二次作业注重字符串的转换与匹配。第三次作业需要掌握正则表达式和代码复用,难度最高。
2.设计与分析
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
代码如下:
//串口字符解析
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str;
int pos=0, cnt=0;
boolean ok = false;
str = sc.nextLine();
int len = str.length();
if(len < 11){
System.out.println("null data");
return ;
} //位数不足一个信号
while(pos < len){
if(str.charAt(pos) == '1'){pos++;continue;}
if(str.charAt(pos) == '0'){ //0为信号的起始位
ok = true;
if( pos+11 > len){
return;
} //位数不足一个信号
if( str.charAt(pos+10) != '1' ){
System.out.printf("%d:validate error\n",++cnt);
} //最后一位不是1(优先级高于奇偶校验)
else if( cnt_chart_1(str.substring(pos+1,pos+9)) != (str.charAt(pos+9)-'0') ){
System.out.printf("%d:parity check error\n",++cnt);
} //奇偶校验失败
else {
System.out.printf("%d:%s\n",++cnt,str.substring(pos+1,pos+9));
} //有效信号
pos += 11;
}
}
if(!ok){
System.out.printf("null data\n");
} //没有信号,即全部是1的情况
}
//信号的奇偶检验
public static int cnt_chart_1(String str){
int res = 0;
for(int i=0;i<str.length();i++){
if(str.charAt(i) == '1') res++;
}
return 1^(res&1);
}
}
类图如下:
我的idea没有类图
SourceMonitor的代码分析图如下:
分析:
- 当位数不足11时,不足以一个信号,特判结束;
- 设置一个ok代表有无信号出现,在结束时特判;
- 先判断结束位是否为1,在判断奇偶位的正确性(注意:当数据位1的个数为奇数时,奇偶位为0,反之则为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
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
String run[] = input.split(" ");
String num[] = null;
int flag= 0;
for(String i:run) {
num = i.split(",");
for(String j:num) {
if(!j.matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$")) {
System.out.print("Wrong Format");
return;
}
}
}
if(run.length!=2) {
System.out.print("wrong number of points");
return;
}
//把输入的转成数字
num = run[0].split(",");
double a = Double.valueOf(num[0]);
double b = Double.valueOf(num[1]);
num = run[1].split(",");
double c = Double.valueOf(num[0]);
double d = Double.valueOf(num[1]);
if(a==c&&b==d){
System.out.print("Wrong Format");
return;
}
System.out.print(Math.sqrt((a-c)*(a-c)+(b-d)*(b-d)));
sc.close();
}
}
类图如下:
我的idea没有类图
SourceMonitor的代码分析图如下:
分析:
采用String.split函数将输入串分割;(将会生成一个tmpstr数组),其中数组长度代表值的个数(不合法输出“wrong number of points”)
采用正则表达式对数组中的每一个进行判断,有不满足的就输出“Wrong format”
采用Double.parsedouble函数将数组中的每一个转换为double型的num数组
将num数组中的值赋值给Point型的p数组
调用Point.distance函数即可
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",
输出格式:
见题目描述。
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
double m=0,x1=0,x2=0,y1=0,y2=0,x3=0,x4=0,y3=0,y4=0,t=0,sum=0;
String a = in.nextLine();
int choice=Integer.parseInt(a.substring(0,1));
for(int i=0;i<a.length()-1;i++) {
if(a.charAt(i)==' ') {
sum++;
}
}
for(int j=0;j<a.length()-1;j++){
if((a.charAt(j)=='+'&&a.charAt(j+1)=='+')||(a.charAt(j)=='-'&&a.charAt(j+1)=='-')||(a.charAt(j)=='+'&&a.charAt(j+1)=='-')||(a.charAt(j)=='-'&&a.charAt(j+1)=='+')||(a.charAt(j)=='.'&&a.charAt(j+1)==',')||(a.charAt(j)==','&&a.charAt(j+1)=='.')|| (a.charAt(j)=='0'&&a.charAt(j+1)=='0')||(a.charAt(j)=='.'&&a.charAt(j+1)==' ')||(a.charAt(j)==' '&&a.charAt(j+1)=='.')||(a.charAt(j)=='.'&&a.charAt(j+1)=='.')||(a.charAt(j)==' '&&a.charAt(j+1)==',')|| (a.charAt(j)==','&&a.charAt(j+1)==' ')||(a.charAt(j)==' '&&a.charAt(j+1)==' ')||(a.charAt(j)==','&&a.charAt(j+1)==',')||a.charAt(0)=='.'||a.charAt(0)==','||sum==0){
System.out.println("Wrong Format");
System.exit(0);
}
}
if(sum==0){
System.out.println("Wrong Format");
System.exit(0);
}
if(choice>5||choice<1) {
System.out.println("Wrong Format");
System.exit(0);
}
if(choice==1) {
String[] c = a.split(" ");
String[] d = c[0].split(",");
String[] f = c[1].split(",");
x1=Double.parseDouble(d[0].substring(2, d[0].length()));
y1=Double.parseDouble(d[1]);
x2=Double.parseDouble(f[0]);
y2=Double.parseDouble(f[1]);
if(x1==x2&&y1==y2) {
System.out.println("points coincide");
}
else if(sum!=1) {
System.out.println("wrong number of points");
}
else if((x1-x2)==0) {
System.out.println("Slope does not exist");
}
else {
m=(y1-y2)/(x1-x2);
System.out.println(m);
}
}
if(choice==2) {
String[] c = a.split(" ");
String[] d = c[0].split(",");
String[] f = c[1].split(",");
String[] e = c[2].split(",");
x1=Double.parseDouble(d[0].substring(2, d[0].length()));
y1=Double.parseDouble(d[1]);
x2=Double.parseDouble(f[0]);
y2=Double.parseDouble(f[1]);
x3=Double.parseDouble(e[0]);
y3=Double.parseDouble(e[1]);
//m=(y2-y3)/(x2-x3);
//t=(Math.abs(y1-m*x1-m*x3-y3))/(Math.sqrt(1+m*m));
t=Math.abs((y2-y3)*x1+(x3-x2)*y1+x2*y3-y2*x3)/Math.sqrt((y2-y3)*(y2-y3)+(x3-x2)*(x3-x2));
if((x2==x3&&y2==y3)) {
System.out.println("points coincide");
System.exit(0);
}
else if(sum!=2) {
System.out.println("wrong number of points");
System.exit(0);
}
else {
System.out.println(t);
System.exit(0);
}
}
if(choice==3) {
String[] c = a.split(" ");
String[] d = c[0].split(",");
String[] f = c[1].split(",");
String[] e = c[2].split(",");
x1=Double.parseDouble(d[0].substring(2, d[0].length()));
y1=Double.parseDouble(d[1]);
x2=Double.parseDouble(f[0]);
y2=Double.parseDouble(f[1]);
x3=Double.parseDouble(e[0]);
y3=Double.parseDouble(e[1]);
m=(y1-y2)/(x1-x2);
t=(y3-y2)/(x3-x2);
if(sum!=2) {
System.out.println("wrong number of points");
System.exit(0);
}
else if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3)) {
System.out.println("points coincide");
System.exit(0);
}
else if((x1==x2)&&(x1==x3)||(x1==x3)&&(x1==x2)||(x2==x3)&&(x2==x1)) {
System.out.println("true");
System.exit(0);
}
else if((x1==x2)&&(x1!=x3)||(x1==x3)&&(x1!=x2)||(x2==x3)&&(x2!=x1)) {
System.out.println("false");
System.exit(0);
}
else if(m==t){
System.out.println("true");
System.exit(0);
}
else {
System.out.println("false");
System.exit(0);
}
}
if(choice==4) {
String[] c = a.split(" ");
String[] d = c[0].split(",");
String[] f = c[1].split(",");
String[] e = c[2].split(",");
String[] g = c[3].split(",");
x1=Double.parseDouble(d[0].substring(2, d[0].length()));
y1=Double.parseDouble(d[1]);
x2=Double.parseDouble(f[0]);
y2=Double.parseDouble(f[1]);
x3=Double.parseDouble(e[0]);
y3=Double.parseDouble(e[1]);
x4=Double.parseDouble(g[0]);
y4=Double.parseDouble(g[1]);
m=(y1-y2)/(x1-x2);
t=(y4-y3)/(x4-x3);
if(sum!=3) {
System.out.println("wrong number of points");
System.exit(0);
}
else if((x1==x2&&y1==y2)||(x3==x4&&y3==y4)) {
System.out.println("points coincide");
System.exit(0);
}
else if((x1==x2)&&(y1!=y2)&&(x3==x4)&&(y3!=y4)) {
System.out.println("true");
System.exit(0);
}
else if((x1==x2)&&(x3!=x4)) {
System.out.println("false");
System.exit(0);
}
else if((x3==x4)&&(x1!=x2)) {
System.out.println("false");
System.exit(0);
}
else if(m==t){
System.out.println("true");
System.exit(0);
}
else {
System.out.println("false");
System.exit(0);
}
}
if(choice==5) {
String[] c = a.split(" ");
String[] d = c[0].split(",");
String[] f = c[1].split(",");
String[] e = c[2].split(",");
String[] g = c[3].split(",");
x1=Double.parseDouble(d[0].substring(2, d[0].length()));
y1=Double.parseDouble(d[1]);
x2=Double.parseDouble(f[0]);
y2=Double.parseDouble(f[1]);
x3=Double.parseDouble(e[0]);
y3=Double.parseDouble(e[1]);
x4=Double.parseDouble(g[0]);
y4=Double.parseDouble(g[1]);
m=(y1-y2)/(x1-x2);
t=(y4-y3)/(x4-x3);
float x=(float)((y1+m*x1-y3-t*x3)/(t-m));
float y=(float)(y1+m*(x-x1));
if(sum!=3) {
System.out.println("wrong number of points");
System.exit(0);
}
else if((x1==x2&&y1==y2)||(x3==x4&&y3==y4)) {
System.out.println("points coincide");
System.exit(0);
}
else if((x1==x2&&y1!=y2)&&(x3==x4&&y3!=y4)) {
System.out.println("is parallel lines,have no intersection point");
System.exit(0);
}
else if(m==t) {
System.out.println("is parallel lines,have no intersection point");
System.exit(0);
}
else if((x3==x4)&&(x1!=x2)) {
x=(float)(x3);
y=(float)(((y2-y1)/(x2-x1))*x3+y1-((y2-y1)/(x2-x1))*x1);
System.out.print(x+","+y+" ");
if((x>x1&&x<x2)&&((y>y1&&y<y2)||(y<y1&&y>y2))||(x<x1&&x>x2)&&((y<y1&&y>y2)||(y>y1&&y<y2))||(x>x3&&x<x4)&&((y>y3)&&(y<y4)||(y<y3&&y>y4))||(x<x3&&x>x4)&&((y<y3&&y>y4))||(y>y3)&&(y<y4)) {
System.out.println("true");
System.exit(0);
}
else{
System.out.println("false");
System.exit(0);
}
}
else if((x1==x2)&&(x3!=x4)) {
x=(float)(x1);
y=(float)(((y4-y3)/(x4-x3))*x1+y3-((y4-y3)/(x4-x3))*x3);
System.out.print(x+","+y+" ");
if((x>x1&&x<x2)&&((y>y1&&y<y2)||(y<y1&&y>y2))||(x<x1&&x>x2)&&((y<y1&&y>y2)||(y>y1&&y<y2))||(x>x3&&x<x4)&&((y>y3)&&(y<y4)||(y<y3&&y>y4))||(x<x3&&x>x4)&&((y<y3&&y>y4))||(y>y3)&&(y<y4)) {
System.out.println("true");
System.exit(0);
}
else{
System.out.println("false");
System.exit(0);
}
}
else {
System.out.print(x+","+y+" ");
if((x>x1&&x<x2)&&((y>y1&&y<y2)||(y<y1&&y>y2))||(x<x1&&x>x2)&&((y<y1&&y>y2)||(y>y1&&y<y2))||(x>x3&&x<x4)&&((y>y3)&&(y<y4)||(y<y3&&y>y4))||(x<x3&&x>x4)&&((y<y3&&y>y4))||(y>y3)&&(y<y4)) {
System.out.println("true");
System.exit(0);
}
else{
System.out.println("false");
System.exit(0);
}
}
}
}
}
类图如下:
我的idea没有类图
SourceMonitor的代码分析图如下:
分析:
单独实现每个情况的解决方法,代码的复用性较差
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",
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String a=in.nextLine();
int temp1=0;
char []b=a.toCharArray();
for(int i=0;i<b.length;i++)
{
if(b[i]==':')
temp1++;
}
//System.out.println(temp1);
if(temp1!=1)
System.out.println("Wrong Format");
else {
//System.out.println(b[0]);
if(b[0]=='1')
{
int flag1=1;
String[] sd1=null;
String[] sd2=null;
String[] f=a.split(":");
String[] o=f[1].split("\\s");
if(o.length!=2)
System.out.println("wrong number of points");
else
{
for(int i=0;i<o.length;i++)
{
if(i==0)
{
sd1=o[i].split(",");
char[] sz1=o[i].toCharArray();
if(sz1[0]=='+'&&sz1[1]=='+'||sz1[0]=='-'&&sz1[1]=='-'||sz1[0]=='+'&&sz1[1]=='-'||sz1[0]=='-'&&sz1[1]=='+')
flag1=0;
}
if(i==1)
{
sd2=o[i].split(",");
char[] sz2=o[i].toCharArray();
if(sz2[0]=='+'&&sz2[1]=='+'||sz2[0]=='-'&&sz2[1]=='-'||sz2[0]=='+'&&sz2[1]=='-'||sz2[0]=='-'&&sz2[1]=='+')
flag1=0;
}
}
if(flag1==0)
System.out.println("Wrong Format");
else
{
double x1=Double.parseDouble(sd1[0]);
double y1=Double.parseDouble(sd1[1]);
double x2=Double.parseDouble(sd2[0]);
double y2=Double.parseDouble(sd2[1]);
double k=(y2-y1)/(x2-x1);
if(x1==x2&&y1==y2)
System.out.println("points coincide");
else if(x1==x2)
System.out.println("Slope does not exist");
else
System.out.println(k);
}
}
}
if(b[0]=='2')
{
int flag1=1;
String[] sd1=null;
String[] sd2=null;
String[] sd3=null;
String[] f=a.split(":");
String[] o=f[1].split("\\s");
if(o.length!=3)
System.out.println("wrong number of points");
else
{
for(int i=0;i<o.length;i++)
{
if(i==0)
{
sd1=o[i].split(",");
char[] sz1=o[i].toCharArray();
if(sz1[0]=='+'&&sz1[1]=='+'||sz1[0]=='-'&&sz1[1]=='-'||sz1[0]=='+'&&sz1[1]=='-'||sz1[0]=='-'&&sz1[1]=='+')
flag1=0;
}
if(i==1)
{
sd2=o[i].split(",");
char[] sz2=o[i].toCharArray();
if(sz2[0]=='+'&&sz2[1]=='+'||sz2[0]=='-'&&sz2[1]=='-'||sz2[0]=='+'&&sz2[1]=='-'||sz2[0]=='-'&&sz2[1]=='+')
flag1=0;
}
if(i==2)
{
sd3=o[i].split(",");
char[] sz3=o[i].toCharArray();
if(sz3[0]=='+'&&sz3[1]=='+'||sz3[0]=='-'&&sz3[1]=='-'||sz3[0]=='+'&&sz3[1]=='-'||sz3[0]=='-'&&sz3[1]=='+')
flag1=0;
}
}
if(flag1==0)
System.out.println("Wrong Format");
else
{
double x1=Double.parseDouble(sd1[0]);
double y1=Double.parseDouble(sd1[1]);
double x2=Double.parseDouble(sd2[0]);
double y2=Double.parseDouble(sd2[1]);
double x3=Double.parseDouble(sd3[0]);
double y3=Double.parseDouble(sd3[1]);
if(x1==x2&&y1==y2||x1==x3&&y1==y3||x2==x3&&y2==y3)
System.out.println("points coincide");
else
{
double k=(y3-y2)/(x3-x2);
double m=y2-((y3-y2)/(x3-x2))*x2;
double jl1=Math.abs(k*x1-y1+m);
double jl2=Math.sqrt(k*k+1);
double jl=jl1/jl2;
System.out.println(jl);
}
}
}
}
if(b[0]=='3')
{
int flag1=1;
String[] sd1=null;
String[] sd2=null;
String[] sd3=null;
String[] f=a.split(":");
String[] o=f[1].split("\\s");
if(o.length!=3)
System.out.println("wrong number of points");
else
{
for(int i=0;i<o.length;i++)
{
if(i==0)
{
sd1=o[i].split(",");
char[] sz1=o[i].toCharArray();
if(sz1[0]=='+'&&sz1[1]=='+'||sz1[0]=='-'&&sz1[1]=='-'||sz1[0]=='+'&&sz1[1]=='-'||sz1[0]=='-'&&sz1[1]=='+')
flag1=0;
}
if(i==1)
{
sd2=o[i].split(",");
char[] sz2=o[i].toCharArray();
if(sz2[0]=='+'&&sz2[1]=='+'||sz2[0]=='-'&&sz2[1]=='-'||sz2[0]=='+'&&sz2[1]=='-'||sz2[0]=='-'&&sz2[1]=='+')
flag1=0;
}
if(i==2)
{
sd3=o[i].split(",");
char[] sz3=o[i].toCharArray();
if(sz3[0]=='+'&&sz3[1]=='+'||sz3[0]=='-'&&sz3[1]=='-'||sz3[0]=='+'&&sz3[1]=='-'||sz3[0]=='-'&&sz3[1]=='+')
flag1=0;
}
}
if(flag1==0)
System.out.println("Wrong Format");
else
{
double x1=Double.parseDouble(sd1[0]);
double y1=Double.parseDouble(sd1[1]);
double x2=Double.parseDouble(sd2[0]);
double y2=Double.parseDouble(sd2[1]);
double x3=Double.parseDouble(sd3[0]);
double y3=Double.parseDouble(sd3[1]);
double k1=0,k2=0,k3=0;
k1=(y2-y1)/(x2-x1);
k2=(y3-y1)/(x3-x1);
k3=(y3-y2)/(x3-x2);
if(k1==k2&&k1==k3&&k2==k3)
System.out.println("true");
else
System.out.println("false");
}
}
}
if(b[0]=='5')
{
int flag1=1;
String[] sd1=null;
String[] sd2=null;
String[] sd3=null;
String[] sd4=null;
String[] f=a.split(":");
String[] o=f[1].split("\\s");
if(o.length!=4)
System.out.println("wrong number of points");
else
{
for(int i=0;i<o.length;i++)
{
if(i==0)
{
sd1=o[i].split(",");
char[] sz1=o[i].toCharArray();
if(sz1[0]=='+'&&sz1[1]=='+'||sz1[0]=='-'&&sz1[1]=='-'||sz1[0]=='+'&&sz1[1]=='-'||sz1[0]=='-'&&sz1[1]=='+')
flag1=0;
}
if(i==1)
{
sd2=o[i].split(",");
char[] sz2=o[i].toCharArray();
if(sz2[0]=='+'&&sz2[1]=='+'||sz2[0]=='-'&&sz2[1]=='-'||sz2[0]=='+'&&sz2[1]=='-'||sz2[0]=='-'&&sz2[1]=='+')
flag1=0;
}
if(i==2)
{
sd3=o[i].split(",");
char[] sz3=o[i].toCharArray();
if(sz3[0]=='+'&&sz3[1]=='+'||sz3[0]=='-'&&sz3[1]=='-'||sz3[0]=='+'&&sz3[1]=='-'||sz3[0]=='-'&&sz3[1]=='+')
flag1=0;
}
if(i==3)
{
sd4=o[i].split(",");
char[] sz4=o[i].toCharArray();
if(sz4[0]=='+'&&sz4[1]=='+'||sz4[0]=='-'&&sz4[1]=='-'||sz4[0]=='+'&&sz4[1]=='-'||sz4[0]=='-'&&sz4[1]=='+')
flag1=0;
}
}
if(flag1==0)
System.out.println("Wrong Format");
else
{
double x1=Double.parseDouble(sd1[0]);
double y1=Double.parseDouble(sd1[1]);
double x2=Double.parseDouble(sd2[0]);
double y2=Double.parseDouble(sd2[1]);
double x3=Double.parseDouble(sd3[0]);
double y3=Double.parseDouble(sd3[1]);
double x4=Double.parseDouble(sd4[0]);
double y4=Double.parseDouble(sd4[1]);
double k1=(y2-y1)/(x2-x1);
double k2=(y4-y3)/(x4-x3);
if(k1==k2)
System.out.println("is parallel lines,have no intersection point");
else {
double b1=y1-k1*x1;
double b2=y4-k2*x4;
double x0=(b2-b1)/(k1-k2);
double y0=k1*x0+b1;
System.out.print(x0+","+y0);
double maxx1=0,maxx2=0,maxy1=0,maxy2=0,minx1=0,minx2=0,miny1=0,miny2=0;
if(x1>x2) {
maxx1=x1;
minx1=x2;
}
else {
maxx1=x2;
minx1=x1;
}
if(x3>x4)
{
maxx2=x3;
minx2=x4;
}
else {
maxx2=x4;
minx2=x3;
}
if(y1>y2) {
maxy1=y1;
miny1=y2;
}
else {
maxy1=y2;
miny1=y1;
}
if(y3>y4) {
maxy2=y3;
miny2=y4;
}
else {
maxy2=y4;
miny2=y3;
}
if(x0>minx1&&x0<maxx1&&y0>miny1&&y0<maxy1||x0>minx2&&x0<maxx2&&y0>miny2&&y0<maxy2)
System.out.println(" true");
else
System.out.println(" false");
}
}
}
}
if(b[0]=='4')
{
int flag1=1;
String[] sd1=null;
String[] sd2=null;
String[] sd3=null;
String[] sd4=null;
String[] f=a.split(":");
String[] o=f[1].split("\\s");
if(o.length!=4)
System.out.println("wrong number of points");
else
{
for(int i=0;i<o.length;i++)
{
if(i==0)
{
sd1=o[i].split(",");
char[] sz1=o[i].toCharArray();
if(sz1[0]=='+'&&sz1[1]=='+'||sz1[0]=='-'&&sz1[1]=='-'||sz1[0]=='+'&&sz1[1]=='-'||sz1[0]=='-'&&sz1[1]=='+')
flag1=0;
}
if(i==1)
{
sd2=o[i].split(",");
char[] sz2=o[i].toCharArray();
if(sz2[0]=='+'&&sz2[1]=='+'||sz2[0]=='-'&&sz2[1]=='-'||sz2[0]=='+'&&sz2[1]=='-'||sz2[0]=='-'&&sz2[1]=='+')
flag1=0;
}
if(i==2)
{
sd3=o[i].split(",");
char[] sz3=o[i].toCharArray();
if(sz3[0]=='+'&&sz3[1]=='+'||sz3[0]=='-'&&sz3[1]=='-'||sz3[0]=='+'&&sz3[1]=='-'||sz3[0]=='-'&&sz3[1]=='+')
flag1=0;
}
if(i==3)
{
sd4=o[i].split(",");
char[] sz4=o[i].toCharArray();
if(sz4[0]=='+'&&sz4[1]=='+'||sz4[0]=='-'&&sz4[1]=='-'||sz4[0]=='+'&&sz4[1]=='-'||sz4[0]=='-'&&sz4[1]=='+')
flag1=0;
}
}
if(flag1==0)
System.out.println("Wrong Format");
else
{
double x1=Double.parseDouble(sd1[0]);
double y1=Double.parseDouble(sd1[1]);
double x2=Double.parseDouble(sd2[0]);
double y2=Double.parseDouble(sd2[1]);
double x3=Double.parseDouble(sd3[0]);
double y3=Double.parseDouble(sd3[1]);
double x4=Double.parseDouble(sd4[0]);
double y4=Double.parseDouble(sd4[1]);
double k1=(y2-y1)/(x2-x1);
double k2=(y4-y3)/(x4-x3);
if(k1==k2)
System.out.println("true");
else
System.out.println("false");
}
}
}
}
}
}
类图如下:
我的idea没有类图
SourceMonitor的代码分析图如下:
分析:
本次正则表达式可以沿用第二题的正则表达式,基本思想不变,主要是判断每个数字是否符合筛选情况,在进入Switch前先判断格式错误情况,防止格式判断错误。
要求一我计算了三角形三条边,根据边长判断是否是等腰三角形、等边三角形,但是还有一个测试点过不去。要求二我计算了周长、面积、重心坐标,三个参数但是不能按输出的数据若小数点后超过6位,只保留小数点后6位,多余部分采用四舍五入规则进到最低位。小数点后若不足6位,按原始位数显示,不必补齐。
3.踩坑心得
写题目时没有先考虑类与类之间关系,只设计了一个类,写的时候很麻烦。不清楚正则表达式的使用
4.改进建议
以后写题目时要先考虑设计类图关系,多设计几个类。代码的SourceMonitor的代码分析图体现我的代码复杂度偏高,应避免for循环嵌套。
5.总结
要先学会设计类图,理清楚类与类之间的关系。了解了字符串处理的基本方法,学会正则表达式的基本使用方法。第三次第三题三角形只得了一分,对工具类的理解使用和四舍五入输出方式需要更深刻的学习和掌握。
标签:总结性,题目,Double,System,parseDouble,Blog,&&,x1,out From: https://www.cnblogs.com/tjsdx/p/16749631.html