pta第一次博客

pta第一次博客

1.前言

这三次pta里,第一次的难度是最低的,基本上只要会基础的格式,对java有一定的了解就能轻松解决,第二次难度较低,只要掌握一些字符串的相应函数就能解决,第三次作业难度就相对提升了很大一个阶段,需要熟悉并熟练运用正则表达式来处理字符串,还需要熟练对类的划分和引用。

2.设计与分析

第二次作业第二题

1.题目:
RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送58位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(58位,具体位数由通信双方提前设置)前加上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和结束符与奇偶校验均不合格时输出是一样的,所以可以先判断结束符是否合格,
源代码展示:

查看代码
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner input =new Scanner(System.in);
        String a=input.nextLine();
        int i,j=1,n,m=0;
        if(a.length()<11)
        {
            System.out.print("null data");
            return;
        }
        for(i=0;i<a.length();i++)
        {
            if(a.charAt(i)=='0')
                break;
            if(i==a.length()-1&&a.charAt(i)!='0')
            {
                System.out.print("null data");
                return;
            }
        }
        for(i=0;i<a.length();i++)
        {
            if(a.charAt(i)=='0')
            {
                if(a.length()-i<10)
                    return;
                m=0;
                for(n=i+1;n<i+10;n++)
                {
                    if(a.charAt(n)=='1')
                        m++;
                }
                if(a.charAt(i+10)!='1')
                {
                    System.out.println(j+":"+"validate error");
                    j++;i+=10;
                    continue;
                }
                else if(m%2==0)
                {
                    System.out.println(j+":"+"parity check error");
                    j++;i+=10;
                    continue;
                }
                else
                {
                    System.out.println(j+":"+a.substring(i+1,i+9));
                    j++;i+=10;
                }
            }
        }
    }
}

SourceMonitor生成的报表内容:
img
img
代码分析总结:
本题的难度不是很高,比较中等偏低,但因为刚开始接触java,还是按照当初C语言的方式就行编码,导致代码复用性较低,之后还是要多加改进。

第三次作业第一题

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
试题分析
本题主要考核正则表达式的使用,判断两点的数据是否合法以及点的数量是否合格,数据不合格则输出"Wrong Format“,坐标点的数量超过两个,输出“wrong number of points”
源代码展示:

查看代码
import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String input = in.nextLine();
        String[] point=input.split(" ");
        String s[]=null;
        if(point.length>2)
        {
            System.out.println("wrong number of points");
            return ;
        }
        int i=0,j=0;
        for(i=0;i<point.length;i++)
        {
            s=point[i].split(",");
            for(j=0;j<s.length;j++)
            {
                if(!s[j].matches("[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)"))
                {
                    System.out.println("Wrong Format");
                    return ;
                }
            }
        }
        double x1,y1,x2,y2,l;
        s=point[0].split(",");
        x1=((s[0]);
        y1=Double.valueOf(s[1]);
        s=point[1].split(",");
        x2=Double.valueOf(s[0]);
        y2=Double.valueOf(s[1]);
        if(x1==x2&&y1==y2)
        {
            System.out.println("Wrong Format");
            return ;
        }
        l=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
        System.out.println(l);
    }
}

SourceMonitor生成的报表内容:
img
img
代码分析总结:
本次写题还是因为习惯了C语言的写法,将主要算法全塞在main函数中,复用性不行。

第三次作业第二题

题目:
用户输入一组选项和数据,进行与直线有关的计算。选项包括:
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);
        String S= in.nextLine();
        if(S.charAt(1)!=':')
        {
            System.out.println("Wrong Format");
            return;
        }
        String[] str=S.split(":");
        if("1".equals(str[0]))
        {
            Point2 s1=new Point2();
            s1.input=str[1];
            s1.getpoint();
        }
        else if("2".equals(str[0]))
        {
            Point3 s2=new Point3();
            s2.input=str[1];
            s2.getpoint();
            System.out.println(s2.l);
        }
        else if("3".equals(str[0]))
        {
            Point3 s2=new Point3();
            s2.input=str[1];
            s2.getpoint();
            if(s2.p==1)
                System.out.println("true");
            else
                System.out.println("false");
        }
        else if("4".equals(str[0]))
        {
            Point4 s3=new Point4();
            s3.input=str[1];
            s3.getpoint();
            if(s3.p==1)
                System.out.println("true");
            else
                System.out.println("false");
        }
        else if("5".equals(str[0]))
        {
            Point4 s3=new Point4();
            s3.input=str[1];
            s3.getpoint();
            if(s3.p==1)
                System.out.println("is parallel lines,have no intersection point");
            else if(s3.n==1)
                System.out.println(s3.x0+","+s3.y0+" "+"true");
            else
                System.out.println(s3.x0+","+s3.y0+" "+"false");
        }
        else
        {
            System.out.println("Wrong Format");
        }
    }
}
class Point2 {
    String input;
    String[] point;
    String[] s;
    double x1,y1,x2,y2,k;

    public void getpoint() {
        int i,j;
        point=input.split(" ");
        for(i=0;i<point.length;i++)
        {
            s=point[i].split(",");
            if(s.length!=2)
            {
                System.out.println("Wrong Format");
                System.exit(0);
            }
            for(j=0;j<s.length;j++)
            {
                if(!s[j].matches("[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)"))
                {
                    System.out.println("Wrong Format");
                    System.exit(0);
                }
            }
        }
        if(point.length!=2)
        {
            System.out.println("wrong number of points");
            System.exit(0);
        }
        s=point[0].split(",");
        x1=Double.valueOf(s[0]);
        y1=Double.valueOf(s[1]);
        s=point[1].split(",");
        x2=Double.valueOf(s[0]);
        y2=Double.valueOf(s[1]);
        if(x1==x2&&y1==y2)
        {
            System.out.println("points coincide");
            System.exit(0);
        }
        if(x1==x2)
        {
            System.out.println("Slope does not exist");
            System.exit(0);
        }
        k=(y1-y2)/(x1-x2);
        System.out.println(k);
    }
}
class Point3 {
    String input;
    String[] point;
    String[] s;
    double x1,y1,x2,y2,x3,y3,l,p=0;

    public void getpoint() {
        int i,j;
        point = input.split(" ");
        for (i = 0; i < point.length; i++) {
            s = point[i].split(",");
            if(s.length!=2)
            {
                System.out.println("Wrong Format");
                System.exit(0);
            }
            for (j = 0; j < s.length; j++) {
                if (!s[j].matches("[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)")) {
                    System.out.println("Wrong Format");
                    System.exit(0);
                }
            }
        }
        if(point.length!=3)
        {
            System.out.println("wrong number of points");
            System.exit(0);
        }
        s = point[0].split(",");
        x1 = Double.valueOf(s[0]);
        y1 = Double.valueOf(s[1]);
        s = point[1].split(",");
        x2 = Double.valueOf(s[0]);
        y2 = Double.valueOf(s[1]);
        s = point[2].split(",");
        x3 = Double.valueOf(s[0]);
        y3 = Double.valueOf(s[1]);
        if((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3))
        {
            System.out.println("points coincide");
            System.exit(0);
        }
        if(x2==x3)
            l=x1-x2;
        else
            l=((y2-y3)*x1-(x2-x3)*y1-y2*x3+y3*x2)/(Math.sqrt((y2-y3)*(y2-y3)+(x2-x3)*(x2-x3)));
        l=Math.abs(l);
        if(l<0.001)
            p=1;
    }
}
package pta23;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String S = in.nextLine();
        if (S.charAt(1) != ':') {
            System.out.println("Wrong Format");
            return;
        }
        String[] str=S.split(":");
        if("1".equals(str[0]))
        {
            Point3 s1=new Point3();
            s1.input=str[1];
            s1.getpoint();
            if(s1.dy==1)
                System.out.print("true ");
            else
                System.out.print("false ");
            if(s1.db==1)
                System.out.print("true");
            else
                System.out.print("false");
        }
        if("2".equals(str[0])) {
            Point3 s1 = new Point3();
            s1.input = str[1];
            s1.getpoint();
            System.out.println(s1.C+" "+s1.S+" "+s1.x0+","+s1.y0);
        }
        if("3".equals(str[0]))
        {
            Point3 s1 = new Point3();
            s1.input = str[1];
            s1.getpoint();
            if(s1.d==1)
                System.out.print("true ");
            else
                System.out.print("false ");
            if(s1.z==1)
                System.out.print("true ");
            else
                System.out.print("false ");
            if(s1.r==1)
                System.out.print("true");
            else
                System.out.print("false");
        }
    }
}
class Point3 {
    String input;
    String[] point;
    String[] s;
    double x1, y1, x2, y2, x3, y3, l1,l2,l3,dy=0,db=0,C,S,x0,y0,z=0,d=0,r=0;

    public void getpoint() {
        int i, j;
        point = input.split(" ");
        for (i = 0; i < point.length; i++) {
            s = point[i].split(",");
            if (s.length != 2) {
                System.out.println("Wrong Format");
                System.exit(0);
            }
            for (j = 0; j < s.length; j++) {
                if (!s[j].matches("[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)")) {
                    System.out.println("Wrong Format");
                    System.exit(0);
                }
            }
        }
        if (point.length != 3) {
            System.out.println("wrong number of points");
            System.exit(0);
        }
        s = point[0].split(",");
        x1 = Double.valueOf(s[0]);
        y1 = Double.valueOf(s[1]);
        s = point[1].split(",");
        x2 = Double.valueOf(s[0]);
        y2 = Double.valueOf(s[1]);
        s = point[2].split(",");
        x3 = Double.valueOf(s[0]);
        y3 = Double.valueOf(s[1]);
        if ((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3)){
            System.out.println("points coincide");
            System.exit(0);
        }
        l1=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
        l2=Math.sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
        l3=Math.sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
        if(l1+l2-l3<=0)
        {
            System.out.println("data error");
            System.exit(0);
        }
        if(l1==l2||l2==l3||l1==l3)
            dy=1;
        if(l1==l2&&l2==l3)
            db=1;
        C=l1+l2+l3;
        S=Math.sqrt(C/2*(C/2-l1)*(C/2-l2)*(C/2-l3));
        x0=(x1+x2+x3)/3;
        y0=(y1+y2+y3)/3;
        String X0=String.format("%."+6+"f",x0);String Y0=String.format("%."+6+"f",y0);
        String C0=String.format("%."+6+"f",C);String S0=String.format("%."+6+"f",S);
        x0= Double.valueOf(X0);y0= Double.valueOf(Y0);C= Double.valueOf(C0);S= Double.valueOf(S0);
        double a,b,c;
        c=(l1*l1+l2*l2-l3*l3)/2*l1*l2;
        b=(l1*l1-l2*l2+l3*l3)/2*l1*l3;
        a=(-l1*l1+l2*l2+l3*l3)/2*l3*l2;
        if(Math.abs(a)<=0.001||Math.abs(b)<=0.001||Math.abs(c)<=0.001)
            z=1;
        else if(a<0||b<0||c<0)
            d=1;
        else if(a>0&&b>0&&c>0)
            r=1;
    }
}
        if((x1==x2&&x3!=x4)||(x1!=x2&&x3==x4))
        {
            A1=y1-y2;B1=x2-x1;C1=y2*x1-y1*x2;
            A2=y3-y4;B2=x4-x3;C2=y4*x3-y3*x4;
            x0=(B2*C1-B1*C2)/(B1*A2-B2*A1);
            y0=(A2*C1-A1*C2)/(A1*B2-A2*B1);
            if((x0>x1&&x0<x2)||(x0>x2&&x0<x1)||(x0<x3&&x0>x4)||(x0<x4&&x0>x3))
                n=1;
            return ;
        }
            
        if(x1==x2&&x3==x4)
        {
            p=1;
            return;
        }
        k1=(y1-y2)/(x1-x2);
        k2=(y3-y4)/(x3-x4);
        if(Math.abs(k1-k2)<=0.000001)
        {
            p=1;
            return;
        }
        if(p==0)
        {
            A1=y1-y2;B1=x2-x1;C1=y2*x1-y1*x2;
            A2=y3-y4;B2=x4-x3;C2=y4*x3-y3*x4;
            x0=(B2*C1-B1*C2)/(B1*A2-B2*A1);
            y0=(A2*C1-A1*C2)/(A1*B2-A2*B1);
            if((x0>x1&&x0<x2)||(x0>x2&&x0<x1)||(x0<x3&&x0>x4)||(x0<x4&&x0>x3))
                n=1;
        }
    }
}

SourceMonitor生成的报表内容:
img
img
代码分析总结:
写本题我对java的了解深入了一点,学会了将各个要求分为多个类,但还是不熟练,有些偷懒,例如把点与线的两个操作放到一个类里去判断,导致代码的复用性降低,复杂度提升,同时没有把正则表达式判断归到一个类里,导致有大量重复的代码。

第三次作业第三题

题目:
用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
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 S = in.nextLine();
        if (S.charAt(1) != ':') {
            System.out.println("Wrong Format");
            return;
        }
        String[] str=S.split(":");
        if("1".equals(str[0]))
        {
            Point3 s1=new Point3();
            s1.input=str[1];
            s1.getpoint();
            if(s1.dy==1)
                System.out.print("true ");
            else
                System.out.print("false ");
            if(s1.db==1)
                System.out.print("true");
            else
                System.out.print("false");
        }
        if("2".equals(str[0])) {
            Point3 s1 = new Point3();
            s1.input = str[1];
            s1.getpoint();
            System.out.println(s1.C+" "+s1.S+" "+s1.x0+","+s1.y0);
        }
        if("3".equals(str[0]))
        {
            Point3 s1 = new Point3();
            s1.input = str[1];
            s1.getpoint();
            if(s1.d==1)
                System.out.print("true ");
            else
                System.out.print("false ");
            if(s1.z==1)
                System.out.print("true ");
            else
                System.out.print("false ");
            if(s1.r==1)
                System.out.print("true");
            else
                System.out.print("false");
        }
        if("4".equals(str[0]))
        {
            Point5 s5 = new Point5();
            s5.input = str[1];
            s5.getpoint();
            String s1=String.format("%."+6+"f",s5.s1);String s2=String.format("%."+6+"f", s5.s2);
            s5.s1= Double.parseDouble(s1);s5.s2= Double.parseDouble(s2);
            if(s5.s1>s5.s2)
                System.out.println(2+" "+s5.s2+" "+s5.s1);
            else
                System.out.println(2+" "+s5.s1+" "+s5.s2);
        }
        if("5".equals(str[0])) {
            Point4 s4 = new Point4();
            s4.input = str[1];
            s4.getpoint();
            if (s4.in == 1)
                System.out.println("in the triangle");
            else
                System.out.println("outof the triangle");
        }
    }
}
class Point3 {
    String input;
    String[] point;
    String[] s;
    double x1, y1, x2, y2, x3, y3, l1,l2,l3,dy=0,db=0,C,S,x0,y0,z=0,d=0,r=0;

    public void getpoint() {
        int i, j;
        point = input.split(" ");
        for (i = 0; i < point.length; i++) {
            s = point[i].split(",");
            if (s.length != 2) {
                System.out.println("Wrong Format");
                System.exit(0);
            }
            for (j = 0; j < s.length; j++) {
                if (!s[j].matches("[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)")) {
                    System.out.println("Wrong Format");
                    System.exit(0);
                }
            }
        }
        if (point.length != 3) {
            System.out.println("wrong number of points");
            System.exit(0);
        }
        s = point[0].split(",");
        x1 = Double.valueOf(s[0]);
        y1 = Double.valueOf(s[1]);
        s = point[1].split(",");
        x2 = Double.valueOf(s[0]);
        y2 = Double.valueOf(s[1]);
        s = point[2].split(",");
        x3 = Double.valueOf(s[0]);
        y3 = Double.valueOf(s[1]);
        if ((x1==x2&&y1==y2)||(x1==x3&&y1==y3)||(x2==x3&&y2==y3)){
            System.out.println("points coincide");
            System.exit(0);
        }
        l1=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
        l2=Math.sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
        l3=Math.sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));

        if(l1+l2-l3<=0)
        {
            System.out.println("data error");
            System.exit(0);
        }
        if(l1==l2||l2==l3||l1==l3)
            dy=1;
        if(l1==l2&&l2==l3)
            db=1;
        C=l1+l2+l3;
        S=Math.sqrt(C/2*(C/2-l1)*(C/2-l2)*(C/2-l3));
        x0=(x1+x2+x3)/3;
        y0=(y1+y2+y3)/3;
        String X0=String.format("%."+6+"f",x0);String Y0=String.format("%."+6+"f",y0);
        String C0=String.format("%."+6+"f",C);String S0=String.format("%."+6+"f",S);
        x0= Double.valueOf(X0);y0= Double.valueOf(Y0);C= Double.valueOf(C0);S= Double.valueOf(S0);
        double a,b,c;
        c=(l1*l1+l2*l2-l3*l3)/2*l1*l2;
        b=(l1*l1-l2*l2+l3*l3)/2*l1*l3;
        a=(-l1*l1+l2*l2+l3*l3)/2*l3*l2;
        if(Math.abs(a)<=0.001||Math.abs(b)<=0.001||Math.abs(c)<=0.001)
            z=1;
        else if(a<0||b<0||c<0)
            d=1;
        else if(a>0&&b>0&&c>0)
            r=1;
    }

}
class Point5 {
    String input;
    String[] point;
    String[] s;
    double x1, y1, x2, y2, x3, y3, x4, y4,x5,y5,l1,l2,l3,s1,s2=0;
    int jd=0;
    public void getpoint() {
        int i, j;
        point = input.split(" ");
        for (i = 0; i < point.length; i++) {
            s = point[i].split(",");
            if (s.length != 2) {
                System.out.println("Wrong Format");
                System.exit(0);
            }
            for (j = 0; j < s.length; j++) {
                if (!s[j].matches("[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)")) {
                    System.out.println("Wrong Format");
                    System.exit(0);
                }
            }
        }
        if (point.length != 5) {
            System.out.println("wrong number of points");
            System.exit(0);
        }
        s = point[0].split(",");
        x1 = Double.valueOf(s[0]);
        y1 = Double.valueOf(s[1]);
        s = point[1].split(",");
        x2 = Double.valueOf(s[0]);
        y2 = Double.valueOf(s[1]);
        s = point[2].split(",");
        x3 = Double.valueOf(s[0]);
        y3 = Double.valueOf(s[1]);
        s = point[3].split(",");
        x4 = Double.valueOf(s[0]);
        y4 = Double.valueOf(s[1]);
        s = point[4].split(",");
        x5 = Double.valueOf(s[0]);
        y5 = Double.valueOf(s[1]);
        if (x1==x2&&y1==y2){
            System.out.println("points coincide");
            System.exit(0);
        }
        if((x3==x4&&y3==y4)||(x3==x5&&y3==y5)||x4==x5&&y4==y5)
        {
            System.out.println("data error");
            System.exit(0);
        }
        l1=Math.sqrt((x3-x4)*(x3-x4)+(y3-y4)*(y3-y4));
        l2=Math.sqrt((x3-x5)*(x3-x5)+(y3-y5)*(y3-y5));
        l3=Math.sqrt((x4-x5)*(x4-x5)+(y4-y5)*(y4-y5));
        if(l1+l2-l3<=0.000001)
        {
            System.out.println("data error");
            System.exit(0);
        }
        double A1,A2,A3,A4,B1,B2,B3,B4,C1,C2,C3,C4,x6,y6,x7,y7,x8,y8,S;
        A1=y1-y2;B1=x2-x1;C1=y2*x1-y1*x2;
        A2=y3-y4;B2=x4-x3;C2=y4*x3-y3*x4;
        A3=y3-y5;B3=x5-x3;C3=y5*x3-y3*x5;
        A4=y4-y5;B4=x5-x4;C4=y5*x4-y4*x5;
        double h=(A4*x3+B4*y3+C4)/(Math.sqrt(A4*A4+B4*B4));
        h=Math.abs(h);
        S=0.5*l3*h;
        x6=(B2*C1-B1*C2)/(B1*A2-B2*A1);
        y6=(A2*C1-A1*C2)/(A1*B2-A2*B1);
        x7=(B3*C1-B1*C3)/(B1*A3-B3*A1);
        y7=(A3*C1-A1*C3)/(A1*B3-A3*B1);
        x8=(B4*C1-B1*C4)/(B1*A4-B4*A1);
        y8=(A4*C1-A1*C4)/(A1*B4-A4*B1);
        double q1=A1*x3+B1*y3+C1,q2=A1*x4+B1*y4+C1,q3=A1*x5+B1*y5+C1;
        if((Math.abs(q1)<=0.000001&&Math.abs(q2)<=0.000001)||(Math.abs(q3)<=0.000001&&Math.abs(q1)<=0.000001)||(Math.abs(q3)<=0.000001&&Math.abs(q2)<=0.000001))
        {
            System.out.println("The point is on the edge of the triangle");
            System.exit(0);
        }
        if(Math.abs(q1)<=0.000001||Math.abs(q2)<=0.000001||Math.abs(q3)<=0.000001)
        {
            jd=jd+1;
        }
        if(A1/B1!=A2/B2)
        {
            if((x6<x3&&x6>x4)||(x6<x4&&x6>x3)||(y6<y3&&y6>y4)||(y6<y4&&y6>y3))
                jd=jd+1;
        }
        if(A1/B1!=A3/B3)
        {
            if((x7<x3&&x7>x5)||(x7<x5&&x7>x3)||(y7<y3&&y7>y5)||(y7<y5&&y7>y3))
                jd=jd+1;
        }
        if(A1/B1!=A4/B4)
        {
            if((x8<x5&&x8>x4)||(x8<x4&&x8>x5)||(y8<y5&&y8>y4)||(y8<y4&&y8>y5))
                jd=jd+1;
        }
        if(jd<2)
        {
            System.out.println(jd);
            System.exit(0);
        }
        else {
            if ((((x6 <= x3 && x6 >= x4) || (x6 <= x4 && x6 >= x3)) && ((x7 <= x3 && x7 >= x5) || (x7 <= x5 && x7 >= x3))&&x6!=x7)) {
                double len1=Math.sqrt(Math.pow(x6-x7,2)+Math.pow(y6-y7,2));
                double h1=Math.abs(A1*x3+B1*y3+C1)/Math.sqrt(Math.pow(A1,2)+Math.pow(B1,2));
                s1=len1*h1/2;
                s2=S-s1;
            }
            if (s2 <= 0.000001) {
                if (((x6 <= x3 && x6 >= x4) || (x6 <= x4 && x6 >= x3)) && ((x8 <= x4 && x8 >= x5) || (x8 <= x5 && x8 >= x4))&&x6!=x8) {
                    double z1 = Math.sqrt((x6 - x8) * (x6 - x8) + (y6 - y8) * (y6 - y8));
                    double z2 = Math.sqrt((x6 - x4) * (x6 - x4) + (y6 - y4) * (y6 - y4));
                    double z3 = Math.sqrt((x4 - x8) * (x4 - x8) + (y4 - y8) * (y4 - y8));
                    double c1 = z1 + z2 + z3;
                    s1 = Math.sqrt(c1 / 2 * (c1 / 2 - z1) * (c1 / 2 - z2) * (c1 / 2 - z3));
                    s2 = S - s1;
                }
                if (s2 <= 0.000001) {
                    if (((x7 <= x3 && x7 >= x5) || (x7 <= x5 && x7 >= x3)) && ((x8 <= x4 && x8 >= x5) || (x8 <= x5 && x8 >= x4))) {
                        double z1 = Math.sqrt((x8 - x7) * (x8 - x7) + (y8 - y7) * (y8 - y7));
                        double z2 = Math.sqrt((x7 - x5) * (x7 - x5) + (y7 - y5) * (y7 - y5));
                        double z3 = Math.sqrt((x5 - x8) * (x5 - x8) + (y5 - y8) * (y5 - y8));
                        double c1 = z1 + z2 + z3;
                        s1 = Math.sqrt(c1 / 2 * (c1 / 2 - z1) * (c1 / 2 - z2) * (c1 / 2 - z3));
                        s2 = S - s1;
                    }
                }
            }
        }
    }
}
class Point4 {
    String input;
    String[] point;
    String[] s;
    double x1, y1, x2, y2, x3, y3, x4, y4, l1, l2, l3, l4,l5,l6,s1,s2,s3,C,S;
    int in=1;
    public void getpoint() {
        int i, j;
        point = input.split(" ");
        for (i = 0; i < point.length; i++) {
            s = point[i].split(",");
            if (s.length != 2) {
                System.out.println("Wrong Format");
                System.exit(0);
            }
            for (j = 0; j < s.length; j++) {
                if (!s[j].matches("[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)")) {
                    System.out.println("Wrong Format");
                    System.exit(0);
                }
            }
        }
        if (point.length != 4) {
            System.out.println("wrong number of points");
            System.exit(0);
        }
        s = point[0].split(",");
        x1 = Double.valueOf(s[0]);
        y1 = Double.valueOf(s[1]);
        s = point[1].split(",");
        x2 = Double.valueOf(s[0]);
        y2 = Double.valueOf(s[1]);
        s = point[2].split(",");
        x3 = Double.valueOf(s[0]);
        y3 = Double.valueOf(s[1]);
        s = point[3].split(",");
        x4 = Double.valueOf(s[0]);
        y4 = Double.valueOf(s[1]);
        double A1,A2,A3,B1,B2,B3,C1,C2,C3;
        A1=y2-y3;B1=x3-x2;C1=y3*x2-y2*x3;
        A2=y2-y4;B2=x4-x2;C2=y4*x2-y2*x4;
        A3=y3-y4;B3=x4-x3;C3=y4*x3-y3*x4;
        double q1=A1*x1+B1*y1+C1,q2=A2*x1+B2*y1+C2,q3=A3*x1+B3*y1+C3;
        if(Math.abs(q1)==0||Math.abs(q2)==0||Math.abs(q3)==0)
        {
            System.out.println("on the triangle");
            System.exit(0);
        }
        l1=Math.sqrt((x2-x3)*(x2-x3)+(y3-y2)*(y3-y2));
        l2=Math.sqrt((x2-x4)*(x2-x4)+(y2-y4)*(y2-y4));
        l3=Math.sqrt((x4-x3)*(x4-x3)+(y4-y3)*(y4-y3));
        if(l1+l2-l3<=0)
        {
            System.out.println("data error");
            System.exit(0);
        }
        l4=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
        l5=Math.sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
        l6=Math.sqrt((x1-x4)*(x1-x4)+(y1-y4)*(y1-y4));
        double c1=l1+l4+l5,c2=l2+l4+l6,c3=l3+l5+l6;
        s1=Math.sqrt(c1/2*(c1/2-l1)*(c1/2-l4)*(c1/2-l5));
        s2=Math.sqrt(c2/2*(c2/2-l2)*(c2/2-l4)*(c2/2-l6));
        s3=Math.sqrt(c3/2*(c3/2-l3)*(c3/2-l5)*(c3/2-l6));
        C=l1+l2+l3;
        S=Math.sqrt(C/2*(C/2-l1)*(C/2-l2)*(C/2-l3));
        if(s1+s2+s3-S>0.000001)
            in=0;
    }
}

SourceMonitor生成的报表内容:
img
img
代码分析总结:
本题是我目前写过最难的一道题,选项四的各种特殊情况让我加入了大量的判断,且因为我对类的运用还不熟练,使用了大量的参数,选线四部分的代码可以说是没有一点复用性,非常的糟糕,后续必须对其中的类就行进一步的细致划分,选项五因为我实在是看不懂射线法的原理,所以偷懒了,用的面积比较法,勉强过了。

3.踩坑心得:

第二次作业第二题因为我理解错了奇偶校验的意思,误以为奇偶校验位是1就行,导致一直过不去,问了同学才改正过来;
改前
img
改后
img
第三次作业第一题只要是有一些阴间测试点,例如0.和0.0这两个坐标是不合格的,测试了很久才测试出来;
改前
img
改后
img
第三次作业第二题对线与线继续操作时利用了斜率,但却忘了斜率不存在的情况,导致某个测试点一直过不去;
改前
img
改后
img
第三次作业第三题中我在写选项四时因为判断直线过顶点时有漏洞,导致了误判,使得计算结果出错,改了4,5个小时一行行代码删删改改才找到问题,还有因为海伦公式在面对大数据的计算时很容易超出取值上限,导致了计算精度出错,也认识到了一昧的取巧还是会有坏处。,还有一个小插曲就是老师的题目有问题,选项5里题目里要求点不在三角形里时输出”outof triangle“,但测试点里却要求输出“outof the triangle”,这个测试点也花了我10多分钟。
改前
img
改后
img

4.改进建议

对类的定义和调用还是不熟练,7-2和7-3中的正则表达式其实可以额外定义一个类来实现,从而避免大量的相同代码,避免代码冗余,也提高了这一部分的复用性,同时将分割好的字符串转变为double类型的数时也使用了大量的重复代码,可以将这部分代码划分出一个类来提高复用性。

5.总结

1.这三次pta作业下来,我对Java的认知有了很大的提升,也认识到了java面向对象的好处以及重要性,在写出算法前,应该先将要实现的功能细划分为多个类,将各个类的功能任务分清楚,在去在类里编写主要算法,这样既可以提升写代码的速度,还可以提升代码的复用性以及自己的思维逻辑能力;
2.我对正则表达式有了较深的理解,也看到了在面对规定格式下正则表达式的实用性。
建议:希望老师上课时能讲一讲pta上一些难题的思路以及一些平时触及很少的一些测试点,这样可以在我们遇到一个测试点测了很久都测不出来时节省一些时间,毕竟过于隐蔽或少见的测试点对于提升我们的编程能力并没有什么帮助。

posted @ 2022-10-02 01:41  昌航小迷弟一号  阅读(225)  评论(3)    收藏  举报
/* 设置动态特效 */