主頁 > 軟體工程 > pta第一次博客

pta第一次博客

2022-10-03 07:31:59 軟體工程

目錄
  • pta第一次博客
    • 1.前言
    • 2.設計與分析
      • 第二次作業第二題
      • 第三次作業第一題
      • 第三次作業第二題
      • 第三次作業第三題
    • 3.踩坑心得:
    • 4.改進建議
    • 5.總結

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上一些難題的思路以及一些平時觸及很少的一些測驗點,這樣可以在我們遇到一個測驗點測了很久都測不出來時節省一些時間,畢竟過于隱蔽或少見的測驗點對于提升我們的編程能力并沒有什么幫助,

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/510877.html

標籤:其他

上一篇:將來自同一物件的具有相同名稱的陣列組合成一個包含所有專案的物件

下一篇:面向物件的照妖鏡——UML類圖繪制指南

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more