一、前言:

      第一次作业和第二次作业,是Java的入门题目,第一次作业题量较多,第二次作业题量适中,综合下来看两次作业均难度较低。写的时候基础薄弱,使用的逻辑更偏向c语言的面向过程。

      第三次作业题量适中,难度较大,写题逻辑逐渐从面向过程变成面向对象。

二、题目集2:

 7-2(1)题目:

   7-2 串口字符解析

  分数 40

  作者 蔡轲

  单位 南昌航空大学

  RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据

       发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假

       定有效数据  是8位,奇偶校验位采用奇校验。

  输入格式:

  由0、1组成的二进制数据流。例如:11110111010111111001001101111111011111111101111

  输出格式:

  过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
  如有多个数据,每个数据单独一行显示。
  若数据不足11位或者输入数据全1没有起始位,则输出"null data",
  若某个数据的结束符不为1,则输出“validate error”。
  若某个数据奇偶校验错误,则输出“parity check error”。
  若数据结束符和奇偶校验均不合格,输出“validate error”。
  如:11011或11111111111111111。
  例如:
  1:11101011
  2:01001101
  3:validate error

7-2(2)设计与分析:

  

Java PTA运行超时 java pta题库_Java PTA运行超时

import java.util.Scanner;
public class Main
{
    public static void main(String[] args)
    {
        Scanner in=new Scanner(System.in);
        String a=in.nextLine();
        int length=a.length();
        int[] arr=new int[length];
        int flag=0,s=0,q=0;
        
            if((length)<11){
                    System.out.println("null data");
                    return;
                }
 
        for(int i=0;i<length;i++)
        {
            if(a.charAt(i)=='0')
            {
                flag=1;
              if((length-i)<10){
                    return;
                }
                for(int j=i+1;j<i+9;j++)
                {
                    if(a.charAt(j)=='1')
                        s++;
                }
                if(a.charAt(i+9)=='1')
                {
                    s++;
                }
                if(s%2!=0&&a.charAt(i+10)=='1')
                {
                    q++;
                    System.out.print(q+":"+a.charAt(i+1));
                    i++;
                    for(int k=0;k<7;k++)
                    {
                        System.out.print(a.charAt(i+1));
                        i++;
                    }
                    System.out.println();
                    i=i+2;
                    s=0;
                }
                else if(a.charAt(i+10)!='1')
                {
                    q++;
                    System.out.println(q+":validate error");
                    i=i+10;
                    s=0;
                }
                else if(s%2==0&&a.charAt(i+10)=='1')
                {
                    q++;
                    System.out.println(q+":parity check error");
                    i=i+10;
                    s=0;
                }
              }
             /*   else if(s%2!=0&&a.charAt(i+10)!=1)
                {
                    q++;
                    System.out.println(q+".validate error");
                }*/
        }
      if(flag==0){
            System.out.print("null data");
      }
    }
}

 分析如下:

     平均复杂度较高,平均深度复杂度较高,最大复杂度较高,平均方法复杂度较高。可能是只用了一个类,一个方法很多if,else堆在一起复杂度就很高

7-2(3)踩坑心得:

遇到的问题:错误输出测试如下

Java PTA运行超时 java pta题库_数据_02

Java PTA运行超时 java pta题库_数据_03

 加入i=i+10;后答案正确

Java PTA运行超时 java pta题库_复杂度_04

    

心得及总结

  题目比较晦涩难懂,但如果看懂了题目意思,其实题目不难,但由于我写题时运用的if,else比较多,不仅增加了代码的复杂度,还很容易遗漏条件导致犯一些不易察觉到的逻辑错误。

7-2(4)改进建议:

    答题考虑写题简单的同时尽量考虑一些复杂度问题。

三、题目集3:

7-1(1) 题目:

  7-1 点线形系列1-计算两点之间的距离

  分数 10

  作者 蔡轲

  单位 南昌航空大学

  输入连个点的坐标,计算两点之间的距离

  输入格式:

  4个double类型的实数,两个点的x,y坐标,依次是x1、y1、x2、y2,两个点的坐标之间以空格分隔,每个点的x,y坐标以英文“,”分隔。例如:0,0 1,1或0.1,-0.3 +3.5,15.6。
  若输入格式非法,输出"Wrong Format"。
  若输入格式合法但坐标点的数量超过两个,输出“wrong number of points”。

7-1(2)设计与分析:

  

Java PTA运行超时 java pta题库_数据_05

import java.util.Scanner;
public class Main
{
    public static void main(String[] args)
    {
        Scanner in=new Scanner(System.in);
        String a=in.nextLine();
      //  string[] split=a.split("[,]")
        String[] coord0=a.split(" ");
   //     String[] coord1=new String[coord0.length*2];
    //     coord1=coord0[k].split(",");
        for(int i=0;i<coord0.length;i++)
        {
            if(!coord0[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
            {   System.out.print("Wrong Format");
                System.exit(0);
            }
        }
        if(coord0.length!=2)
        {
            System.out.print("wrong number of points");
            System.exit(0);
        }
           //coord1=new String[coord0.length*2];
          String[] coord1=coord0[0].split(",");
        String[] coord2=coord0[1].split(",");
         double x1,x2,y1,y2;
      //  int j=0;
        x1=Double.parseDouble(coord1[0]);
        y1=Double.parseDouble(coord1[1]);
        x2=Double.parseDouble(coord2[0]);
        y2=Double.parseDouble(coord2[1]);
        double s;
        s=Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2,2));
        System.out.print(s);
    }
}

 分析如下:

     平均方法复杂度高,其他复杂度一般。

 7-1.(3)踩坑心得:

遇到的问题:

刚开始用多个类和方法写时,不熟练且一堆报错

Java PTA运行超时 java pta题库_Java PTA运行超时_06

 

心得及总结:

     后面我放弃了用多个类和方法,而是采用面向过程来写题,虽然代码简单了很多,但是方法的复杂度很高

7-1(4)改进建议

尽量采用规范的运用类和方法,降低代码的复杂度。

7-2(1) 题目:

  7-2 点线形系列2-线的计算

  分数 42

  作者 蔡轲

  单位 南昌航空大学

  用户输入一组选项和数据,进行与直线有关的计算。选项包括:
  1:输入两点坐标,计算斜率,若线条垂直于X轴,输出"Slope does not exist"。
  2:输入三个点坐标,输出第一个点与另外两点连线的垂直距离。
  3:输入三个点坐标,判断三个点是否在一条线上,输出true或者false。
  4:输入四个点坐标,判断前两个点所构成的直线与后两点构成的直线是否平行,输出true或者false.
  5:输入四个点坐标,计算输出前两个点所构成的直线与后两点构成的直线的交点坐标,x、y坐标之间以英文分隔",",并输出交叉点是否在两条线段之内(不含四个端点)的判断结果(true/false),

       判断结果与坐标之间以一个英文空格分隔。若两条线平行,没有交叉点,则输出"is parallel lines,have no intersection point"。

  输入格式:

  基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。
  例如:1:0,0 1,1
  如果不符合基本格式,输出"Wrong Format"。
  如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
  不论哪个选项,如果格式、点数量都符合要求,但构成任一条线的两个点坐标重合,输出"points coincide",

7-2(2)设计与分析:

  

Java PTA运行超时 java pta题库_数据_07

 

import java.util.Scanner;

public class Main{
    public static void main(String[] args)
    {
        Scanner in=new Scanner(System.in);
        String a=in.nextLine();
        if(a.charAt(1)!=':')
        {
            System.out.print("Wrong Format");
                System.exit(0);
        }
        if(a.charAt(0)=='1')//输入情况1
        {
           String[] coord0=a.split(":| ");
           for(int i=1;i<coord0.length;i++)
          {
            if(!coord0[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
            {   System.out.print("Wrong Format");
                System.exit(0);
            }
          }
            if(coord0.length!=3)
           {
            System.out.print("wrong number of points");
            System.exit(0);
           }
            String[] coord1=coord0[1].split(",");
            String[] coord2=coord0[2].split(",");
        double x1,x2,y1,y2;
        x1=Double.parseDouble(coord1[0]);
        y1=Double.parseDouble(coord1[1]);
        x2=Double.parseDouble(coord2[0]);
        y2=Double.parseDouble(coord2[1]);
            if(x1==x2&&y1==y2)
            {
               System.out.print("points coincide");
               System.exit(0);
            }
            double k1=0;
            if(Math.abs(x1-x2)<0.001)
            {
               System.out.print("Slope does not exist");
               System.exit(0);
            }
            else{
                k1=(y1-y2)/(x1-x2);
                System.out.print(k1);
                System.exit(0);
            }
        }
       else if(a.charAt(0)=='2'||a.charAt(0)=='3')
        {
            String[] coord0=a.split(":| ");
           for(int i=1;i<coord0.length;i++)
          {
            if(!coord0[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
            {   System.out.print("Wrong Format");
                System.exit(0);
            }
          }
            if(coord0.length!=4)
           {
            System.out.print("wrong number of points");
            System.exit(0);
           }
            String[] coord1=coord0[1].split(",");
            String[] coord2=coord0[2].split(",");
            String[] coord3=coord0[3].split(",");
           double x1,x2,x3,y1,y2,y3;
           x1=Double.parseDouble(coord1[0]);
           y1=Double.parseDouble(coord1[1]);
           x2=Double.parseDouble(coord2[0]);
           y2=Double.parseDouble(coord2[1]);
           x3=Double.parseDouble(coord3[0]);
           y3=Double.parseDouble(coord3[1]);
            if((x1==x2&&y1==y2)||(x2==x3&&y2==y3)||(x1==x3&&y1==y3))
            {
               System.out.print("points coincide");
               System.exit(0);
            }
           if(a.charAt(0)=='2')
           {
               double k2,b,d;
               k2=(y3-y2)/(x3-x2);
               b=y2-k2*x2;
               if(x2==x3)
               {
                   d=Math.sqrt(x1-x2);
               }
               else
                   d=(Math.abs(y1-k2*x1-b)/(Math.sqrt(k2*k2+1)));
               System.out.print(d);
           }
           if(a.charAt(0)=='3')
           {
               double k31,k32;
               k31=(y2-y1)/(x2-x1);
               k32=(y3-y2)/(x3-x2);
               if(k31==k32)
                   System.out.print("true");
               else if(k31!=k32)
                   System.out.print("false");
           }
        }
       else if(a.charAt(0)=='4'||a.charAt(0)=='5')
        {
            String[] coord0=a.split(":| ");
           for(int i=1;i<coord0.length;i++)
          {
            if(!coord0[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
            {   System.out.print("Wrong Format");
                System.exit(0);
            }
          }
            if(coord0.length!=5)
           {
            System.out.print("wrong number of points");
            System.exit(0);
           }
           String[] coord1=coord0[1].split(",");
           String[] coord2=coord0[2].split(",");
           String[] coord3=coord0[3].split(",");
           String[] coord4=coord0[4].split(",");
           double x1,x2,x3,x4,y1,y2,y3,y4;
           x1=Double.parseDouble(coord1[0]);
           y1=Double.parseDouble(coord1[1]);
           x2=Double.parseDouble(coord2[0]);
           y2=Double.parseDouble(coord2[1]);
           x3=Double.parseDouble(coord3[0]);
           y3=Double.parseDouble(coord3[1]);
           x4=Double.parseDouble(coord4[0]);
           y4=Double.parseDouble(coord4[1]);
           if((x1==x2&&y1==y2)||(x3==x4&&y3==y4))
            {
               System.out.print("points coincide");
               System.exit(0);
            }
               double k41,k42;
               k41=(y2-y1)/(x2-x1);
               k42=(y4-y3)/(x4-x3);
           if(a.charAt(0)=='4')
           {
               if(x1==x2&&x3==x4)
               {
                System.out.print("true");
                System.exit(0);
               }
               if(k41==k42){
                System.out.print("true");
               System.exit(0);}
               else if(k41!=k42){
                System.out.print("false");
               System.exit(0);}
           }
           if(a.charAt(0)=='5')
           {
               
               double A1,A2,B1,B2,C1,C2;
               A1=y2-y1;
               B1=x1-x2;
               C1=x2*y1-x1*y2;
               A2=y4-y3;
               B2=x3-x4;
               C2=x4*y3-x3*y4;
               if((A1/A2==B1/B2)||(A1==A2&&A1==0)||(B1==B2&&B1==0)||(x1==x2&&x3==x4)||(y1==y2&&y3==y4))
               {
                   System.out.print("is parallel lines,have no intersection point");
                   System.exit(0);
               }
               double x5,y5;
              // System.out.println(A1+" "+B1+" "+C1+" "+A2+" "+B2+" "+C2);
               if(A1==0)
               {
                    y5=(-1)*C1/B1;
                    x5=(-1)*((C2/A2)-(B2*C1/B1*A2));
               }
               else{
               y5=(A1*C2-A2*C1)/(B1*A2-A1*B2);
               x5=(-1)*(B1/A1)*y5-C1/A1;}
               System.out.print(Math.round(x5*1000000000)/(double)1000000000+","+Math.round(y5*1000000000)/(double)1000000000+" ");
              // System.out.print(x5+","+y5+" ");
               if((x5==x1&&y5==y1)||(x5==x2&&y5==y2)||(x5==x3&&y5==y3)||(x5==x4&&y5==y4))
                  { System.out.print("false");
                   return;
                  }
               double d1,d2,d3,d4,d5,d6;
               d1=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
               d2=Math.sqrt((x3-x4)*(x3-x4)+(y3-y4)*(y3-y4));
               d3=Math.sqrt((x5-x1)*(x5-x1)+(y5-y1)*(y5-y1));
               d4=Math.sqrt((x5-x2)*(x5-x2)+(y5-y2)*(y5-y2));
               d5=Math.sqrt((x5-x3)*(x5-x3)+(y5-y3)*(y5-y3));
               d6=Math.sqrt((x5-x4)*(x5-x4)+(y5-y4)*(y5-y4));
               if((d1-(d3+d4))==0||(d2-(d5+d6))==0)
                   System.out.print("true");
               else
                   System.out.print("false");
           }
        }
        else{
            System.out.print("Wrong Format");
        }
    }
}

分析如下:

平均复杂度较高,平均深度复杂度较高,最大复杂度较高,平均方法复杂度较高。在题目稍微复杂的时候没有运用多个类和方法精简代码,而且堆在一个类里,导致复杂度高。

7-2(3)踩坑心得:对源码的提交过程中出现的问题及心得进行总结,务必做到详实,拿数据、源码及测试结果说话,切忌假大空

遇到的问题:

直接拆分:和空格导致,有格式错误的情况仍然能通过测试

Java PTA运行超时 java pta题库_System_08

Java PTA运行超时 java pta题库_Java PTA运行超时_09

 

 

 

心得及总结:

     由于没有运用多种类和方法不仅使得代码又臭又长,还在通过所有样例后却无法通过所有测试点,并且堆在一块的代码很难看出逻辑错误,导致这题有一分的点一直过不去。

7-2(4)改进建议:

没有运用多个类和方法,代码又臭又长,全部堆在一个类里边,如果运用多个类和方法,代码的复杂度应该会降低很多。

7-3(1) 题目:

  7-3 点线形系列3-三角形的计算

  分数 48

  作者 蔡轲

  单位 南昌航空大学

  用户输入一组选项和数据,进行与三角形有关的计算。选项包括:
  1:输入三个点坐标,判断是否是等腰三角形、等边三角形,判断结果输出true/false,两个结果之间以一个英文空格符分隔。
  2:输入三个点坐标,输出周长、面积、重心坐标,三个参数之间以一个英文空格分隔,坐标之间以英文","分隔。
  3:输入三个点坐标,输出是钝角、直角还是锐角三角形,依次输出三个判断结果(true/false),以一个英文空格分隔,
  4:输入五个点坐标,输出前两个点所在的直线与三个点所构成的三角形相交的交点数量,如果交点有两个,则按面积大小依次输出三角形被直线分割成两部分的面积。若直线与三角形一条

  线重合,输出"The point is on the edge of the triangle"
  5:输入四个点坐标,输出第一个是否在后三个点所构成的三角形的内部(输出in the triangle/outof triangle)。
  必须使用射线法,原理:由第一个点往任一方向做一射线,射线与三角形的边的交点(不含点本身)数量如果为1,则在三角形内部。如果交点有两个或0个,则在三角形之外。若点在三角形的某

  条边上,输出"on the triangle"

  输入格式:

  基本格式:选项+":"+坐标x+","+坐标y+" "+坐标x+","+坐标y。点的x、y坐标之间以英文","分隔,点与点之间以一个英文空格分隔。

  输出格式:

  基本输出格式见每种选项的描述。
  异常情况输出:
  如果不符合基本格式,输出"Wrong Format"。
  如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
  如果输入的三个点无法构成三角形,输出"data error"。
  注意:输出的数据若小数点后超过6位,只保留小数点后6位,多余部分采用四舍五入规则进到最低位。小数点后若不足6位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为

  0.333333,1.0按格式输出为1.0

  选项4中所输入线的两个点坐标重合,输出"points coincide",

7-3(2)设计与分析:

  

Java PTA运行超时 java pta题库_数据_10

import java.util.Scanner;

class dian{
    double x;
    double y;
}

class xian{
    double d1,d2,dcd,dec,ded;
    double A;
    double B;
    double C;
    public void liangdian(dian a,dian b,xian l)
    {//计算两点之间的距离
        l.d1=Math.sqrt(Math.pow(a.x-b.x,2)+Math.pow(a.y-b.y,2));
    }
    public void juli(dian a,dian b,dian c,xian l){
        //点到直线的距离
        l.A=b.y-c.y;
        l.B=c.x-b.x;
        l.C=b.x*c.y-c.x*b.y;
        l.d2=Math.abs((l.A*a.x+l.B*a.y+C)/Math.sqrt(Math.pow(l.A,2)+Math.pow(l.B,2)));
    }
    public void liangjiaodian(dian a,dian b,dian c,dian d,dian e,xian lab,xian lcd){
        //两直线的交点
        juli(c,a,b,lab);
        juli(a,c,d,lcd);
      //  e.y= (lab.A*lcd.C-lcd.A*lab.C)/(lab.B*lcd.A-lab.A*lcd.B);
      //  e.x=(-1)*(lab.B/lab.A)*e.y-lab.C/lab.A;
        e.x=(lab.B*lcd.C-lcd.B*lab.C)/(lab.A*lcd.B-lcd.A*lab.B);
        e.y=(lcd.A*lab.C-lab.A*lcd.C)/(lcd.B*lab.A-lcd.A*lab.B);
        e.y=Math.round(e.y*1000000000)/(double)1000000000;
        e.x=Math.round(e.x*1000000000)/(double)1000000000;
    }
    public boolean xiangjiao(dian e,dian c,dian d,xian lcd){
        //判断直线与线段是否相交
               lcd.dcd=Math.sqrt(Math.pow(c.x-d.x,2)+Math.pow(c.y-d.y,2));
               lcd.dec=Math.sqrt(Math.pow(e.x-c.x,2)+Math.pow(e.y-c.y,2));
               lcd.ded=Math.sqrt(Math.pow(e.x-d.x,2)+Math.pow(e.y-d.y,2));
        if((lcd.ded+lcd.dec-lcd.dcd)==0)
            return true;
        else
            return false;
    }
}

class triangle{
    double l1,s1,flag=0,cos1,cos2,cos3;
    public boolean shifou(xian lac,xian lbc,xian lab){
        //判断是否是三角形
        if((lac.d1+lbc.d1)>lab.d1&&(lab.d1+lbc.d1)>lac.d1&&(lac.d1+lab.d1)>lbc.d1)
            return true;
        else
            return false;
    }
    public boolean dengyao(xian lac,xian lbc,xian lab){
        //判断是否是等腰三角形
        if(lac.d1==lab.d1||lab.d1==lbc.d1||lbc.d1==lac.d1)
            return true;
        else
            return false;
    }
    public boolean dengbian(xian lac,xian lbc,xian lab){
        //判断是否是等边三角形
        if(lab.d1==lac.d1&&lac.d1==lbc.d1&&lab.d1==lbc.d1)
            return true;
        else
            return false;
    }
    public void zhouchang(xian lac,xian lbc,xian lab,triangle sanjiao){
       //计算周长
        sanjiao.l1=lac.d1+lbc.d1+lab.d1;
    }
    public void mianji(xian h,xian lbc,triangle sanjiao){
        //计算面积
        sanjiao.s1=0.5*h.d2*lbc.d1;
    }
    public boolean dunjiao(xian lab,xian lac,xian lbc,triangle sanjiao){
        //判断是否是钝角三角形
        sanjiao.cos1=(lac.d1*lac.d1+lab.d1*lab.d1-lbc.d1*lbc.d1)/(2*lac.d1*lab.d1);
        sanjiao.cos2=(lbc.d1*lbc.d1+lab.d1*lab.d1-lac.d1*lac.d1)/(2*lbc.d1*lab.d1);
        sanjiao.cos3=(lbc.d1*lbc.d1+lac.d1*lac.d1-lab.d1*lab.d1)/(2*lbc.d1*lac.d1);
        if(sanjiao.cos1<0.0001||sanjiao.cos2<0.0001||sanjiao.cos3<0.0001)
            return true;
        else
            
            return false;
    }
    public boolean zhijiao(xian lab,xian lac,xian lbc,triangle sanjiao){
        //判断是否是直角三角形
        sanjiao.cos1=(lac.d1*lac.d1+lab.d1*lab.d1-lbc.d1*lbc.d1)/(2*lac.d1*lab.d1);
        sanjiao.cos2=(lbc.d1*lbc.d1+lab.d1*lab.d1-lab.d1*lab.d1)/(2*lbc.d1*lab.d1);
        sanjiao.cos3=(lbc.d1*lbc.d1+lac.d1*lac.d1-lab.d1*lab.d1)/(2*lbc.d1*lac.d1);
        if(sanjiao.cos1==0||sanjiao.cos2==0||sanjiao.cos3==0)
            return true;
        else
            return false;
    }
    public boolean ruijiao(xian lab,xian lac,xian lbc,triangle sanjiao){
        //判断是否是锐角三角形
        sanjiao.cos1=(lac.d1*lac.d1+lab.d1*lab.d1-lbc.d1*lbc.d1)/(2*lac.d1*lab.d1);
        sanjiao.cos2=(lbc.d1*lbc.d1+lab.d1*lab.d1-lab.d1*lab.d1)/(2*lbc.d1*lab.d1);
        sanjiao.cos3=(lbc.d1*lbc.d1+lac.d1*lac.d1-lab.d1*lab.d1)/(2*lbc.d1*lac.d1);
        if(sanjiao.cos1>0&&sanjiao.cos2>0&&sanjiao.cos3>0)
            return true;
        else
            return false;
    }
    public boolean chonghe(xian l,xian lab,xian lac,xian lbc){
        //判断直线是否与三角形的一条边重合
        if((l.A==lab.A&&l.B==lab.B&&l.C==lab.C)||(l.A==lac.A&&l.B==lac.B&&l.C==lac.C)||(l.A==lbc.A&&l.B==lbc.B&&l.C==lbc.C))
            return true;
        else
            return false;
    }
}

public class Main{
    public static void main(String[] args)
    {
            Scanner in=new Scanner(System.in);
                String input=in.nextLine();
        if(input.charAt(1)!=':')
        {
            System.out.print("Wrong Format");
                System.exit(0);
        }
         if(input.charAt(0)=='1'||input.charAt(0)=='2'||input.charAt(0)=='3')//输入情况1
         {
             String[] coord0=input.split(":| ");
           for(int i=1;i<coord0.length;i++)
          {
            if(!coord0[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
            {   System.out.print("Wrong Format");
                System.exit(0);
            }
          }
            if(coord0.length!=4)
           {
            System.out.print("wrong number of points");
            System.exit(0);
           }
            String[] coord1=coord0[1].split(",");
            String[] coord2=coord0[2].split(",");
            String[] coord3=coord0[3].split(",");
           double x1,x2,x3,y1,y2,y3;
           x1=Double.parseDouble(coord1[0]);
           y1=Double.parseDouble(coord1[1]);
           x2=Double.parseDouble(coord2[0]);
           y2=Double.parseDouble(coord2[1]);
           x3=Double.parseDouble(coord3[0]);
           y3=Double.parseDouble(coord3[1]);
           dian a=new dian();
           dian b=new dian();
           dian c=new dian();
        a.x=x1;  a.y=y1;
        b.x=x2;  b.y=y2;
        c.x=x3;  c.y=y3;
        xian lac=new xian();
        xian lbc=new xian();
        xian lab=new xian();
        triangle sanjiao=new triangle();
        lab.liangdian(a,b,lab);
        lac.liangdian(a,c,lac);
        lbc.liangdian(b,c,lbc);
        if(!sanjiao.shifou(lac,lbc,lab))
        {
            System.out.print("data error");
            System.exit(0);
         }
        else{
            xian h=new xian();
            h.juli(a,b,c,h);
            if(input.charAt(0)=='1'){
                if(!sanjiao.dengyao(lac,lbc,lab))
                    System.out.print("false"+" ");
                else
                    System.out.print("true"+" ");

                if(!sanjiao.dengbian(lac,lbc,lab))
                    System.out.print("false");
                else
                    System.out.print("true");

            
            }
            if(input.charAt(0)=='2')
            {
                sanjiao.zhouchang(lac,lbc,lab,sanjiao);
                System.out.print(Math.round(sanjiao.l1*1000000)/(double)1000000+" ");
                sanjiao.mianji(h,lbc,sanjiao);
                System.out.print(Math.round(sanjiao.s1*1000000)/(double)1000000+" ");
             double ex,ey;
                /*   dian d=new dian();
                dian e=new dian();
                xian lcd=new xian();
                a.x=x1;
                a.y=y1;
                b.x=0.5*(x2+x3);
                b.y=0.5*(y2+y3);
                c.x=x2;
                c.y=y2;
                d.x=0.5*(x1+x3);
                d.y=0.5*(y1+y3);
                lab.liangjiaodian(a,b,c,d,e,lab,lcd);
                System.out.print(Math.round(e.x*1000000)/(double)1000000+","+Math.round(e.y*1000000)/(double)1000000);
                */
                ex=(x1+x2+x3)/3;
               ey=(y1+y2+y3)/3;
               System.out.print(Math.round(ex*1000000)/(double)1000000+","+Math.round(ey*1000000)/(double)1000000);
          
            }
            if(input.charAt(0)=='3')
            {
                if(!sanjiao.dunjiao(lab,lac,lbc,sanjiao))
                    System.out.print("false"+" ");
                else
                    System.out.print("true"+" ");

                if(!sanjiao.zhijiao(lac,lbc,lab,sanjiao))
                    System.out.print("false"+" ");
                else
                    System.out.print("true"+" ");
                 if(!sanjiao.ruijiao(lac,lbc,lab,sanjiao))
                    System.out.print("false");
                else
                    System.out.print("true");

            }
        }
             
    }
       else if(input.charAt(0)=='4')//输入情况4
         {
             String[] coord0=input.split(":| ");
           for(int i=1;i<coord0.length;i++)
          {
            if(!coord0[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
            {   System.out.print("Wrong Format");
                System.exit(0);
            }
          }
            if(coord0.length!=6)
           {
            System.out.print("wrong number of points");
            System.exit(0);
           }
            String[] coord1=coord0[1].split(",");
            String[] coord2=coord0[2].split(",");
            String[] coord3=coord0[3].split(",");
            String[] coord4=coord0[4].split(",");
            String[] coord5=coord0[5].split(",");
           double x1,x2,x3,x4,x5,y1,y2,y3,y4,y5;
           x1=Double.parseDouble(coord1[0]);
           y1=Double.parseDouble(coord1[1]);
           x2=Double.parseDouble(coord2[0]);
           y2=Double.parseDouble(coord2[1]);
           x3=Double.parseDouble(coord3[0]);
           y3=Double.parseDouble(coord3[1]);
           x4=Double.parseDouble(coord4[0]);
           y4=Double.parseDouble(coord4[1]);
           x5=Double.parseDouble(coord5[0]);
           y5=Double.parseDouble(coord5[1]);
           dian a=new dian();//组成直线的两点
           dian b=new dian();
           dian c=new dian();//组成三角形的三点
           dian d=new dian();
           dian f=new dian();
           dian e=new dian();//直线与三角形的交点
           a.x=x1;a.y=y1;
           b.x=x2;b.y=y2;
           c.x=x3;c.y=y3;
           d.x=x4;d.y=y4;
           f.x=x5;f.y=y5;
            xian lab=new xian();
            xian lcd=new xian();
            xian lce=new xian();
            xian lde=new xian();
            xian lcf=new xian();
            xian ldf=new xian();
            triangle sanjiao=new triangle();
           double A1,A2,A3,A4,B1,B2,B3,B4;
           lab.juli(c,a,b,lab);
           A1=lab.A;B1=lab.B;
           lcd.juli(a,c,d,lcd);
           A2=lcd.A;B2=lcd.B;
           lcf.juli(a,c,f,lcf);
           A3=lcf.A;B3=lcf.B;
           ldf.juli(a,d,f,ldf);
           A4=ldf.A;B4=ldf.B;
            if(x1==x2&&y1==y2)
            {
                System.out.print("points coincide");
                System.exit(0);
            }
            lcd.liangdian(c,d,lcd);
            lcf.liangdian(c,f,lcf);
            ldf.liangdian(d,f,ldf);
            if(!sanjiao.shifou(lcd,lcf,ldf))
            {
                System.out.print("data error");
                System.exit(0);
            }
            if(sanjiao.chonghe(lab,lcd,lcf,ldf))
            {
                System.out.print("The point is on the edge of the triangle");
                System.exit(0);
            }
           int count=0;
           
           int flag1=0,flag2=0,flag3=0;
           dian xx=new dian();
           dian yy=new dian();
           dian z=new dian();
           xian lxy=new xian();
           xian h=new xian();
           double Sb,sb1,sb2;
           ldf.liangdian(d,f,ldf);
           ldf.juli(c,d,f,ldf);

           if((A1/A2!=B1/B2)||(A1!=A2&&A1!=0)||(B1!=B2&&B1!=0))
           {
               lcd.liangjiaodian(a,b,c,d,e,lab,lcd);
               if(lcd.xiangjiao(e,c,d,lcd))
               {
                 count++; flag1=1;
                   xx.x=e.x;
                   xx.y=e.y;
               }
           }
           if((A1/A3!=B1/B3)||(A1!=A3&&A1!=0)||(B1!=B3&&B1!=0))
           {
               lcf.liangjiaodian(a,b,c,f,e,lab,lcf);
               if(lcf.xiangjiao(e,c,f,lcf))
               {
                 count++; flag2=1;
                   yy.x=e.x;
                   yy.y=e.y;
               }
           }
           if((A1/A4!=B1/B4)||(A1!=A4&&A1!=0)||(B1!=B4&&B1!=0))
           {
               ldf.liangjiaodian(a,b,d,f,e,lab,ldf);
               if(ldf.xiangjiao(e,d,f,ldf))
               {
                 count++; flag3=1;
                   z.x=e.x;
                   z.y=e.y; 
               }
           }
           if((xx.x==x3&&xx.y==y3)||(xx.x==x4&&xx.y==y4)||(xx.x==x5&&xx.y==y5)||(yy.x==x3&&yy.y==y3)||(yy.x==x4&&yy.y==y4)||(yy.x==x5&&yy.y==y5))
           {
               count--;
           }
           System.out.print(count+" ");
           if(count==2)
           {
               xian l=new xian();
               lde.liangdian(d,f,ldf);
               l.juli(c,d,f,l);
               sanjiao.mianji(l,ldf,sanjiao);
               Sb=sanjiao.s1;
               if(flag1==1&&flag2==1)
               {
                   ldf.liangdian(xx,yy,ldf);
                   lxy.juli(c,xx,yy,lxy);
                   sanjiao.mianji(lxy,ldf,sanjiao);
                   sb1=sanjiao.s1;
                   sb2=Sb-sb1;
                   if(sb1>sb2)
                       System.out.print(Math.round(sb2*1000000)/(double)1000000+" "+Math.round(sb1*1000000)/(double)1000000);
                   else
                       System.out.print(Math.round(sb1*1000000)/(double)1000000+" "+Math.round(sb2*1000000)/(double)1000000);
               }
               else if(flag1==1&&flag3==1)
               {
                   ldf.liangdian(xx,z,ldf);
                   lxy.juli(c,xx,z,lxy);
                   sanjiao.mianji(lxy,ldf,sanjiao);
                   sb1=sanjiao.s1;
                   sb2=Sb-sb1;
                   if(sb1>sb2)
                       System.out.print(sb2+" "+sb1);
                   else
                       System.out.print(sb1+" "+sb2);
               }
               else if(flag2==1&&flag3==1)
               {
                   ldf.liangdian(yy,z,ldf);
                   lxy.juli(c,yy,z,lxy);
                   sanjiao.mianji(lxy,ldf,sanjiao);
                   sb1=sanjiao.s1;
                   sb2=Sb-sb1;
                   if(sb1>sb2)
                       System.out.print(sb2+" "+sb1);
                   else
                       System.out.print(sb1+" "+sb2);
               }
           }

        }
       else if(input.charAt(0)=='5')//输入情况5
         {
             String[] coord0=input.split(":| ");
           for(int i=1;i<coord0.length;i++)
          {
            if(!coord0[i].matches("^[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?),[+-]?(0|(0\\.\\d+)?|[1-9][0-9]*(\\.\\d+)?)$"))
            {   System.out.print("Wrong Format");
                System.exit(0);
            }
          }
            if(coord0.length!=5)
           {
            System.out.print("wrong number of points");
            System.exit(0);
           }
            String[] coord1=coord0[1].split(",");
            String[] coord2=coord0[2].split(",");
            String[] coord3=coord0[3].split(",");
            String[] coord4=coord0[4].split(",");
           double x1,x2,x3,x4,y1,y2,y3,y4;
           x1=Double.parseDouble(coord1[0]);
           y1=Double.parseDouble(coord1[1]);
           x2=Double.parseDouble(coord2[0]);
           y2=Double.parseDouble(coord2[1]);
           x3=Double.parseDouble(coord3[0]);
           y3=Double.parseDouble(coord3[1]);
           x4=Double.parseDouble(coord4[0]);
           y4=Double.parseDouble(coord4[1]);
           dian a=new dian();
           dian b=new dian();
           dian c=new dian();
           dian d=new dian();
           a.x=x1;a.y=y1;
           b.x=x2;b.y=y2;
           c.x=x3;c.y=y3;
           d.x=x4;d.y=y4;
           xian lbc=new xian();
           xian lcd=new xian();
           xian lbd=new xian();
           lbc.juli(a,b,c,lbc); 
           if((lbc.A*a.x+lbc.B*a.y+lbc.C)==0)
           {
               if(lbc.xiangjiao(a,b,c,lbc))
               { 
                   System.out.print("on the triangle");
                   System.exit(0);
               }
              
           }
           lcd.juli(a,c,d,lcd);
            if((lcd.A*a.x+lcd.B*a.y+lcd.C)==0)
           {
                if(lcd.xiangjiao(a,c,d,lcd))
               { 
                   System.out.print("on the triangle");
                   System.exit(0);
               }
           }
           int count1=0;
           lbd.juli(a,b,d,lbd);
            if((lbd.A*a.x+lbd.B*a.y+lbd.C)==0)
           {
               if(lbd.xiangjiao(a,b,d,lbd))
               { 
                   System.out.print("on the triangle");
                   System.exit(0);
               }
           }
           dian e=new dian();
           xian lab=new xian();
           xian lac=new xian();
           xian lde=new xian();
           xian lad=new xian();
           
           lab.liangjiaodian(a,b,c,d,e,lab,lcd);
           if(lcd.xiangjiao(e,c,d,lcd))
               count1++;
           lab.liangjiaodian(a,c,b,d,e,lac,lde);
           if(lbd.xiangjiao(e,b,d,lbd))
               count1++;
           lab.liangjiaodian(a,d,b,c,e,lad,lbc);
           if(lbc.xiangjiao(e,b,c,lbc))
               count1++;
           if(count1==3)
           {
               System.out.print("in the triangle");
           }
           else{
                System.out.print("outof the triangle");
           }
        }
        else{
            System.out.print("Wrong Format");
                System.exit(0);
        }
 }
}

分析如下:

平均复杂度较高,平均深度复杂度较高,最大复杂度较高,平均方法复杂度较高。运用了多个类和方法后,代码精简了一些,但是由于写着写着还是会堆在一个类里边,导致很多复杂度还是很高。

7-3(3)踩坑心得:对源码的提交过程中出现的问题及心得进行总结,务必做到详实,拿数据、源码及测试结果说话,切忌假大空

遇到的问题:在第四点中

Java PTA运行超时 java pta题库_复杂度_11

Java PTA运行超时 java pta题库_复杂度_12

 心得及总结:

        类似的错误还有很多,由于题目比较复杂,很难考虑的全面,还是要多多测试其他特殊情况,可能就会发现其他的逻辑漏洞。因为对题目的考虑还是不够细致,导致过了所有测试样例却无法过测试点,并且难以察觉到哪里有逻辑错误。

7-3(4)改进建议:

    第一次正是尝试用多个类和方法,所以很多代码写的比较粗糙,并且写着写着还是会不由自主的将代码堆在一个类里边,还需要增强对类和方法的理解。

四、总结:

      通过前三次作业难度由浅到深,从初步接触Java作业基本的输入输出,到后面尝试着数组,字符串类型的转变等等。随着题目的复杂度增加,代码也越来越复杂。为了精简代码和进一步的学习,我更加熟悉了类是什么,方法是什么。第三次作业难度剧增,但正是这样被迫激励我去试着运用多个类和方法,去学习如何调用别的类的方法。题目的复杂度增加也伴随着需要考虑的情况越来越多,为了缩减if语句的使用,我学习了正则表达式,但是对于正则表达式的使用仍然不够灵活和熟练。第三次作业有两题我都没有得满分,除了我自身对类和方法使用不够熟悉外,我还希望老师能多多增加特殊的测试样例,或者增加一些测试点的提示,有时候当我过了所有测试样例却无法过所有测试点,代码又很复杂,不仅无法下手,也很难找到错的地方。