草庐IT

pta第一次博客

wmshyk 2023-03-28 原文

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生成的报表内容:


代码分析总结:
本题的难度不是很高,比较中等偏低,但因为刚开始接触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生成的报表内容:


代码分析总结:
本次写题还是因为习惯了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生成的报表内容:


代码分析总结:
写本题我对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生成的报表内容:


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

3.踩坑心得:

第二次作业第二题因为我理解错了奇偶校验的意思,误以为奇偶校验位是1就行,导致一直过不去,问了同学才改正过来;
改前

改后

第三次作业第一题只要是有一些阴间测试点,例如0.和0.0这两个坐标是不合格的,测试了很久才测试出来;
改前

改后

第三次作业第二题对线与线继续操作时利用了斜率,但却忘了斜率不存在的情况,导致某个测试点一直过不去;
改前

改后

第三次作业第三题中我在写选项四时因为判断直线过顶点时有漏洞,导致了误判,使得计算结果出错,改了4,5个小时一行行代码删删改改才找到问题,还有因为海伦公式在面对大数据的计算时很容易超出取值上限,导致了计算精度出错,也认识到了一昧的取巧还是会有坏处。,还有一个小插曲就是老师的题目有问题,选项5里题目里要求点不在三角形里时输出”outof triangle“,但测试点里却要求输出“outof the triangle”,这个测试点也花了我10多分钟。
改前

改后

4.改进建议

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

5.总结

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

有关pta第一次博客的更多相关文章

  1. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  2. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  3. ruby-on-rails - Rake 任务仅调用一次时执行两次 - 2

    我写了一个非常简单的rake任务来尝试找到这个问题的根源。namespace:foodotaskbar::environmentdoputs'RUNNING'endend当在控制台中执行rakefoo:bar时,输出为:RUNNINGRUNNING当我执行任何rake任务时会发生这种情况。有没有人遇到过这样的事情?编辑上面的rake任务就是写在那个.rake文件中的所有内容。这是当前正在使用的Rakefile。requireFile.expand_path('../config/application',__FILE__)OurApp::Application.load_tasks这里

  4. ruby - 我怎样才能只写一次 "Text"并同时检查 path_info 是否包含 'A' ? - 2

    -if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc

  5. ruby-on-rails - CarrierWave - PDF - 只选择第一页 - 2

    我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful

  6. ruby - 如何跳过 CSV 文件的第一行并将第二行作为标题 - 2

    有没有办法跳过CSV文件的第一行,让第二行作为标题?我有一个CSV文件,第一行是日期,第二行是标题,所以我需要能够在遍历它时跳过第一行。我尝试使用slice但它会将CSV转换为数组,我真的很想将其读取为CSV,以便我可以利用header。 最佳答案 根据您的数据,您可以使用另一种方法和skip_lines-option此示例跳过所有以#开头的行require'csv'CSV.parse(DATA.read,:col_sep=>';',:headers=>true,:skip_lines=>/^#/#Markcomments!)do|

  7. ruby-on-rails - 使用 Ruby 正确处理 Stripe 错误和异常以实现一次性收费 - 2

    我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)

  8. arrays - 在一行中选择数组的第一个和最后一个元素 - 2

    我的任务是从数组中选择最高和最低的数字。我想我很清楚我想做什么,但只是努力以正确的格式访问信息以满足通过标准。defhigh_and_low(numbers)array=numbers.split("").map!{|x|x.to_i}array.sort!{|a,b|ba}putsarray[0,-1]end数字可能看起来像"80917234100",要通过,我需要输出"9234"。我正在尝试putsarray.first.last,但一直无法弄明白。 最佳答案 有Array#minmax完全满足您需要的方法:array=[80,

  9. ruby-on-rails - Ruby 或 Rails 有只将第一个字符大写的方法吗? - 2

    或者好像我必须自己写方法?(保持DHA不变):ruby-1.9.2-p180:001>s='omega-3(DHA)'=>"omega-3(DHA)"ruby-1.9.2-p180:002>s.capitalize=>"Omega-3(dha)"ruby-1.9.2-p180:003>s.titleize=>"Omega3(Dha)"ruby-1.9.2-p180:005>s[0].upcase+s[1..-1]=>"Omega-3(DHA)" 最佳答案 如果我的回答只是垃圾,我深表歉意(我不做ruby)。但我相信我已经为您找到了答

  10. ruby - gsub 删除第一个逗号前的所有内容 - 2

    我有这个字符串:auteur="comtedeFlandreetHainaut,Baudouin,Jacques,Thierry"我想删除第一个逗号之前的所有内容,即在这种情况下保留“Baudouin,Jacques,Thierry”试过这个:nom=auteur.gsub(/.*,/,'')但这会删除最后一个逗号之前的每个逗号,只保留“Thierry”。 最佳答案 auteur.partition(",").last#=>"Baudouin,Jacques,Thierry" 关于rub

随机推荐