第1-3次作业总结

1. 前言:

(1) 题量、难度:

    前三次作业题量总体来说不算太多,一共9+3+3=15道题,但是给的时间很充裕。前两次作业可能是刚开始接触,所以题目会比较简单一点,拿来练练手,但是第三次作业难度比前两次作业难度一下提升了很多,第三次作业的最后一题一共五个功能,最后两个功能都因太难而无从下手,导致最后没写完就提交了。

    第一次作业一共九道题,难倒不算太难,但是因为是刚接触,跟c的写法还是有很多不同的,所有会费时间去了解Java的写法。

    第二次作业一共三道题,个人认为,第二题是需要去花时间的。因为题目所讲内容之前未了解过,需要一定时间去读懂题目,理解题意。

    第三次作业一共三道题,也是我认为最难的一次作业,比起前两次作业,难度跨阶级增长。我也未能完整写完这次作业。

(2) 知识点:

    主要涉及到Java的一些基础语法:Scanner的使用、String类的方法使用、数据的输出等。

    对类的封装。

    第三次作业涉及到正则表达式的使用。

 

2.设计与分析:

 (1)大作业一

    7-7 判断三角形类型

    

核心代码如下:

if(a+b>c&&a+c>b&&b+c>a){   //判断是否为三角形
    if(a==b&&a==c&&b==c){   //等边三角形
        System.out.print("Equilateral triangle");
    }
    else if(a==b||a==c||b==c){ 
        if(((a*a+b*b)-c*c)<0.00001||((a*a+c*c)-b*b)<0.00001||((b*b+c*c)-a*a)<0.00001){  //等腰直角三角形
            System.out.print("Isosceles right-angled triangle");
        }
        else{  //等腰三角形
            System.out.print("Isosceles triangle");
        }
    }
    else if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a){  //直角三角形
        System.out.print("Right-angled triangle");
    }
    else{
        System.out.print("General triangle");
    }
}
else{
    System.out.print("Not a triangle");
}

   SourceMonitor报表:

    本题为一个较为简单的三角形类型判断,所有只有一个主类用if-else语句来实现,没有另写类。因为多用if-else语句,所以圈复杂度会较高。

    在做题的时候,一开始总是没能拿满分,后面去上网搜索了一下,发现判断直角三角形时使用勾股定理,用a2+b2=c2是不够准确的,因为数据类型为浮点型小数,在计算时会产生浮点误差,故将等号改为a+ b c2 <0.00001。

 

(2)大作业二

 7-2 串口字符解析

核心代码如下:

if(s.length()<11)  //判断数据错误情况
{
    System.out.print("null data");
}
else{
    int flag=0;
    for(i=0;i<s.length();i++)
    {
        int cnt=0;
        if("0".equals(a[i]))  //寻找起始位
        {
            flag=1;    //表示起始位已找到方便后面输出数据
            if(i+11<=s.length())   //判断是否符合数据长度需求
            {
                if("1".equals(a[i+10]))   //判断是否有结束位
                {
                    for(int m=i+1;m<i+10;m++)   //计算有效数据为奇数的个数
                    {
                        if("1".equals(a[m]))
                        {
                            cnt++;
                        }
                    }
                    if(cnt%2!=0)      //奇偶校验
                    {
                        System.out.print(num+":");
                        for(n=i+1;n<i+9;n++)
                        {
                            System.out.print(a[n]);
                        }
                        System.out.println();
                        num++;
                        i=n+1;
                    }
                    else
                    {
                        System.out.println(num+":"+"parity check error");
                        i=i+10;
                        num++;
                    }
                }
                else
                {
                    System.out.println(num+":"+"validate error");
                    i=i+10;
                    num++;
                }
            }
        }
    }
    if(flag==0)  //无起始位
    {
        System.out.print("null data");
    }
}

 SourceMonitor报表:

    本题一开始拿到时花了大量时间读题去理解,题目给出一串数字,我首先判断该串数字是否大于11位(因为只有大于等于11位时才能进入下一层判断,否则直接输出”null data“),接着寻找该串数字是否有起始位,如果没有则输出"null data",有再接着判断起始位后是否存在十位及以上数字(可能会出现该组数据不满11位的情况),然后判断结束位是否为奇数(否则输出"validate error"),是则判断奇偶校验是否正确(否则输出"parity check error"),正确则输出该组数据,然后通过for循环进入下一组数据的判断。同时用num来计数,共有多少组合法数据(有起始位的11位数字)。

    一开始做的时候理解错了题意,我以为奇偶验证是第十位为奇数还是偶数,结果一直过不了测试点,改了好久,后来去找同学问了一下,才发现是判断有效数据为奇数的个数是奇数还是偶数。

 

 

(3)大作业三

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

核心代码如下:

//正则表达式判断数据的合法性
String regex = "([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)\\s+([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)";
String regex1 = "(([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)\\s){2,}([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)";

if(str.matches(regex1)) {
    System.out.println("wrong number of points");
}
else if(str.matches(regex)) {
    String str1[]=str.split("\\s+|\\,");     //将字符串拆分成字符数组
    double x1 = Double.parseDouble(str1[0]);  //将字符数据转换成double数据
    double y1 = Double.parseDouble(str1[1]);
    double x2 = Double.parseDouble(str1[2]);
    double y2 = Double.parseDouble(str1[3]);
    Point2D p1=new Point2D(x1,y1);    
    Point2D p2=new Point2D(x2,y2);
    double result = p1.distance(p2);  //计算两个点距离
    System.out.print(result);
}
else {
    System.out.println("Wrong Format");
}
class Point2D{
    double x,y;
    public Point2D(double x,double y){   //有参构造器
        this.x = x;
        this.y = y;
    }
    public double distance(Point2D point) {  //构造方法计算距离
        double result ;
        result = Math.sqrt(Math.pow((x-point.x),2)+Math.pow((y-point.y),2));
        return result;
    }
}

 SourceMonitor报表:

 

类图:

 

 

class point2D

    本题我设置了一个类,定义了一个有参构造器用于接收传入的值,并构造了一个方法来计算点到点的距离。

    该题的数据输入格式判断较为复杂,若是用if条件语句去判断会使得代码可读性下降,因此我去学习了正则表达式来判断输入数据是否合法,并且是否符合点的数量。如果数据非法则输出“Wrong Format”,如果点的数量不为2,则输出“wrong number of points”,然后构造两个point2D对象p1,p2。通过p1调用distance方法,将p2传参进方法进行计算,再将结果返回。

    刚开始做的时候没用正则表达式,是直接拿if去判断条件,结果写着写着越写越多,越写越复杂,而且还不能完全正确判断。后来去花了一下午时间学习了一下正则表达式,发现这东西学起来是真的难,会了之后也是真的好用,之前用if判断的时候几十行代码,现在正则表达式只需要几行代码就可以正确判断数据输入合不合法。

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

 

 核心代码如下:

  实现五个功能代码

class Functions {
    public void slope(double x1,double y1,double x2,double y2) {   //计算斜率
        double k;
        if(x1 == x2 && y1 == y2) {
            System.out.println("points coincide");
        }
        else if(x1 == x2) {
            System.out.println("Slope does not exist");
        }
        else {
            k = (y1-y2) / (x1-x2);
            if((y1-y2) == 0) {
                System.out.println("0.0");
            }
            else {
                System.out.println(k);
            }
        }
    }

    public void distance(double x1,double y1,double x2,double y2,double x3,double y3) {  //计算点到线的距离
        double distance;
        if(x3 == x2 && y3 == y2) {
            System.out.println("points coincide");
        }
        else if(x2 == x3) {
            distance = Math.abs(x1-x2);
            System.out.println(distance);
        }
        else if(y2 == y3) {
            distance = Math.abs(y1-y2);
            System.out.println(distance);
        }
        else {
            distance = Math.abs(x1*(y2-y3)-y1*(x2-x3)+y3*(x2-x3)-x3*(y2-y3))/Math.sqrt(Math.pow(y2-y3,2)+Math.pow(x2-x3,2));
            System.out.println(distance);
        }
    }
    public void line(double x1,double y1,double x2,double y2,double x3,double y3) {  //判断三点是否共线
        if((x1 ==x2 && y1 == y2) || (x1 ==x3 && y1 == y3) || (x2 ==x3 && y3 == y2)) {
            System.out.println("points coincide");
        }
        else if((x1 == x2 && x1 == x3) || (y1 == y2 && y1 == y3)) {
            System.out.println("true");
        }
        else {
            double k1,k2,k3;
            k1 = (y1-y2) / (x1-x2);
            k2 = (y1-y3) / (x1-x3);
            k3 = (y3-y2) / (x3-x2);
            if(k1 == k2 && k1 == k3) {
                System.out.println("true");
            }
            else {
                System.out.println("false");
            }
        }
    }
    public int parallel(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4) {  //判断两条线是否平行
        int flag = 0;
        if((x1 == x2 && y1 == y2) || (x3 == x4 && y3 == y4)) {
            flag = 1;
        }
        else if(x1 == x2 && x3 == x4) {
            if(x1 == x3) {
                flag = 2;
            }
            else {
                flag = 2;
            }
        }
        else if(x1 == x2 || x3 == x4) {
            flag = 0;
        }
        else {
                double k1,k2;
                k1 = (y2-y1) / (x2-x1);
                k2 = (y4-y3) / (x4-x3);
                if(k1 == k2) {
                    flag = 2;
                }
                else {
                    flag = 0;
                }
        }
        return flag;
    }
    public void parallel1(int flag) {   //输出是否平行结果
        if(flag == 1) {
            System.out.println("points coincide");
        }
        else if(flag == 2) {
            System.out.println("true");
        }
        else {
            System.out.println("false");
        }
    }

    public void intersection(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4) {   //计算交点
        Functions fct = new Functions();   //创建对象方便调用此类方法
        int flag;
        double x,y;
        boolean flag1 = false;
        flag = fct.parallel(x1, y1, x2, y2, x3, y3,x4,y4);
        if(flag == 2) {
            System.out.println("is parallel lines,have no intersection point");
        }
        else if(flag == 1) {
            System.out.println("points coincide");
        }
        else {
            if(x1 == x2) {     //一条线段平行于y轴
                x = x1;
                y = ((x1-x3)*(y4-y3)+y3*(x4-x3)) / (x4-x3);
                if((y>=y1 && y>=y2) ||(y<=y1 && y<=y2)){   //判断交点是否在线段上
                    flag1 = false;
                }
                else {
                    flag1 = true;
                }
            }
            else if(x3 == x4) {    //一条线段平行于y轴
                x = x3;
                y = ((x3-x1)*(y2-y1)+y1*(x2-x1)) / (x2-x1);
                if((y>=y3 && y>=y4) ||(y<=y3 && y<=y4)){    //判断交点是否在线段上
                    flag1 = false;
                }
                else {
                    flag1 = true;
                }
            }
            else {      //两条线段都有交点
                double k1,k3;
                k1 = (y1-y2) / (x1-x2);
                k3 = (y4-y3) / (x4-x3);
                x = (y3-y1+k1*x1-k3*x3) / (k1-k3);
                y = (k1*y3-k3*y1+(x1-x3)*k1*k3) / (k1-k3);
                System.out.print(x+","+y+" ");
                if((((x>x1 && x<x2) || (x>x2 && x<x1)) && ((y>y1 && y<y2) || (y>y2 && y<y1)))  ||  (((x>x3 && x<x4) || (x>x4 && x<x3)) && ((y>y3 && y<y4) || (y>y4 && y<y3)))){
                    flag1 = true;
                }
                if(flag1) {
                    System.out.println("true");
                }
                else {
                    System.out.println("false");
                }
            }
        }
    }
}

SourceMonitor报表:

类图:

 

class Functions

    本题我设置了一个类,构造了六个方法来实现题目要求

//正则表达式判断数据的合法性
String regex = "([1]\\:)([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)\\s([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)";
String regex1 = "([1]\\:)(([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)\\s){2,}([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)";
String regex11 = "([1]\\:)([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)";
String regex2 = "([23]\\:)([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)\\s([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)\\s+([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)";
String regex3 = "([23]\\:)(([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)\\s){3,}([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)";
String regex33 = "([23]\\:)(([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)\\s){0,1}([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)";
String regex4 = "([45]\\:)([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)\\s([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)\\s+([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)\\s+([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)";
String regex5 = "([45]\\:)(([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)\\s){4,}([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)";
String regex55 = "([45]\\:)(([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)\\s){0,2}([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)[,]([+-]?(([1-9]\\d*)|0)(\\.\\d+)?)";
switch(a) {
            case 1:fun.slope(x1,y1,x2,y2);break;    //计算斜率
            case 2:fun.distance(x1,y1,x2,y2,x3,y3);break;    //计算点到线的距离
            case 3:fun.line(x1, y1, x2, y2, x3, y3);break;   //判断三点是否共线
            case 4:flag = fun.parallel(x1, y1, x2, y2, x3, y3,x4,y4);fun.parallel1(flag);break;  //判断两线是否平行
            case 5:fun.intersection(x1,y1, x2, y2, x3, y3,x4,y4);break;   //计算交点
            }

    该题格式较为复杂,不同功能输入点的数量不同,故写了多条正则表达式以判断数据输入格式的正确与否。如果格式不正确,则输出"Wrong Format",如果格式正确,但点的数量不对,则输出"wrong number of points",如果都正确则将选项及点的数据通过split方法存入字符数组,再转换为int或double型,然后进入switch语句调用Functions类方法以实现功能。

第一个功能:给出两点计算斜率。首先判断两点是否重合,如果重合则输出"points coincide",如果不重合但是垂直x轴则输出"Slope does not exist",不然根据公式算出斜率。

第二个功能:给出三点计算第一个点到后两点形成的直线距离。同上先判断后两点是否重合,再判断是否垂直坐标轴,如果垂直的话则第一点和第二点或第三点的横坐标或纵坐标相减的绝对值即为距离,否则运用点到直线距离公式求取。

第三个功能:判断三点是否共线。首先判断三点是否有重合点,有则输出"points coincide",然后判断三点横坐标是否相同,如果三点全相同,则输出"true",如果三点都不相同,则计算任意两条斜率,如果斜率相等,则输出"true",如果以上情况都不满足,则输出"false"。

第四个功能:给出四点,判断前两点与后两点构成直线是否平行。首先判断点是否重合,若是都能构成直线,则判断两条直线是否同时垂直x轴,是则输出"true",如果只有一条垂直则输出"false",如果都不垂直则计算两直线斜率,若斜率相等,则输出"true",否则输出"false"。(本人认为这题有点问题,因为如果斜率相同但线重合则不算平行,但是本题好像未考虑重合情况)

第五个功能:给出四点,计算前两点与后两点所形成直线交点坐标,并判断是否在两线段内。首先判断点是否重合,其次判断线是否平行,是则输出"is parallel lines,have no intersection point",如果不是,则判断是否有一条直线垂直x轴,若是则交点x坐标为垂直x轴直线的x坐标,然后根据公式计算y坐标,因为交点一定在垂直x轴直线上,故只需判断一条线段。如果两直线都不垂直x轴,则计算两直线解析式再求交点,然后判断交点是否在两线段上。(这个功能我的代码有点问题,但是我没找到,错了三个测试点,没做到全对)

    上面也说了,在实现第四个功能的时候因为考虑了重合的问题,导致测试点一直过不去,花了大量时间去找错修改也没找出来,后来突发奇想就把重合的情况给删了,结果居然过了,虽然不知道这道题是声明情况,但好像有的时候想的越复杂,越过不了。

    然后就是在实现第一个功能计算斜率的时候,会有分子为零,但分母为负数的情况,这个时候计算机输出的数据会为-0.0,而不会把负号省略,后来发现问题后就把这种情况单拎出来了,直接输出"0.0"。

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

核心代码如下:

(由于本人太菜了,第四个功能和第五个功能未能实现,只是简单写了一点三角形是否构成之类的东西,所有就不放上来丢人现眼了)

class Functions1{
    
    public int triangle(double x1,double y1,double x2,double y2,double x3,double y3) {   //判断是否构成三角形
        int flag = 0;
        if(x1 == x2 || x1 == x3 || x2 == x3) {  //判断是否有直线垂直x轴
            if(x1 == x2 && x1 == x3) {    //判断三点是否共线
                flag = 0;
            }
            else {   //计算三线长度并判断是否构成三角
                double l1 = Math.sqrt(Math.pow(x1-x2, 2) + Math.pow(y1-y2, 2));
                double l2 = Math.sqrt(Math.pow(x3-x1, 2) + Math.pow(y3-y1, 2));
                double l3 = Math.sqrt(Math.pow(x3-x2, 2) + Math.pow(y3-y2, 2));
                if(l1+l2>l3 && l1+l3>l2 &&l2+l3>l1) {
                    flag = 1;
                }
            }
        }
        else {
            double k1 = (y1-y2) / (x1-x2);
            double k2 = (y1-y3) / (x1-x3);
            double k3 = (y2-y3) / (x2-x3);
            //判断三点是否共线
            if(k1 == k2 || k1 == k3 || k2 == k3) {  
                flag = 0;
            }
            else {
                double l1 = Math.sqrt(Math.pow(x2-x3, 2) + Math.pow(y2-y3, 2));
                double l2 = Math.sqrt(Math.pow(x1-x3, 2) + Math.pow(y1-y3, 2));
                double l3 = Math.sqrt(Math.pow(x1-x2, 2) + Math.pow(y1-y2, 2));
                if(l1+l2>l3 && l1+l3>l2 &&l2+l3>l1) {
                    flag = 1;
                }
            }    
        }
        return flag;
    }
    
    public void triangle1(double x1,double y1,double x2,double y2,double x3,double y3) {  //判断等腰、等边三角
        Functions1 fct = new Functions1();    // 声明对象方便调用此类方法
        int flag = fct.triangle(x1, y1, x2, y2, x3, y3);   //判断是否构成三角形
        double l1 = 0,l2 = 0,l3 = 0;
        if(flag == 1) {
            l1 = Math.sqrt(Math.pow(x2-x3, 2) + Math.pow(y2-y3, 2));
            l2 = Math.sqrt(Math.pow(x1-x3, 2) + Math.pow(y1-y3, 2));
            l3 = Math.sqrt(Math.pow(x1-x2, 2) + Math.pow(y1-y2, 2));
            //判断是否为等腰三角形
            if(l1 == l2 || l1 == l3 || l2 == l3) {
                System.out.print("true"+ " ");
                if(l1 == l2 && l1 == l3) {  //判断是否为等边三角形
                    System.out.print("true");
                }
                else {
                    System.out.print("false");
                }
            }
            else {
                System.out.print("false"+ " "+ "false");
            }
        }
        else {
            System.out.print("data error");
        }
    }
    public void csz (double x1,double y1,double x2,double y2,double x3,double y3) {  //计算三角形周长,面积和重心
        Functions1 fct = new Functions1();
        int flag = fct.triangle(x1, y1, x2, y2, x3, y3);
        double l1 = 0,l2 = 0,l3 = 0;
        if(flag == 1) {
            l1 = Math.sqrt(Math.pow(x2-x3, 2) + Math.pow(y2-y3, 2));
            l2 = Math.sqrt(Math.pow(x1-x3, 2) + Math.pow(y1-y3, 2));
            l3 = Math.sqrt(Math.pow(x1-x2, 2) + Math.pow(y1-y2, 2));
            String aa = "([+-]?(([1-9]\\d*)|0)(\\.\\d{0,6})?)";
            
            double c = l1+l2+l3;
            double s = Math.sqrt((c/2)*(c/2-l1)*(c/2-l2)*(c/2-l3));
            double x = (x1+x2+x3) / 3;
            double y = (y1+y2+y3) / 3;
            
            //使用正则表达式判断数据小数点后是否大于六位数字
            if(String.valueOf(c).matches(aa)) {
                System.out.print(c+" ");
            }
            else {
                System.out.printf("%.6f ",c);
            }
            if(String.valueOf(s).matches(aa)) {
                System.out.print(s+" ");
            }
            else {
                System.out.printf("%.6f ",s);
            }
            if(String.valueOf(x).matches(aa)) {
                System.out.print(x+",");
            }
            else {
                System.out.printf("%.6f",x);
                System.out.print(",");
            }
            if(String.valueOf(y).matches(aa)) {
                System.out.print(y);
            }
            else {
                System.out.printf("%.6f",y);
            }
        }
        else {
            System.out.print("data error");
        }
    }
    public void triangle2(double x1,double y1,double x2,double y2,double x3,double y3) {  //判断钝角,直角,锐角三角形
        Functions1 fct = new Functions1();
        int flag = fct.triangle(x1, y1, x2, y2, x3, y3);
        double l1 = 0,l2 = 0,l3 = 0;
        if(flag == 1) {
            l1 = Math.sqrt(Math.pow(x2-x3, 2) + Math.pow(y2-y3, 2));
            l2 = Math.sqrt(Math.pow(x1-x3, 2) + Math.pow(y1-y3, 2));
            l3 = Math.sqrt(Math.pow(x1-x2, 2) + Math.pow(y1-y2, 2));
            if(l1*l1 + l2*l2 == l3*l3 || l1*l1 + l3*l3 == l2*l2 || l3*l3 + l2*l2 == l1*l1) {  //判断是否为直角三角形
                System.out.print("false true false");
            }
            else if(l1*l1 + l2*l2 > l3*l3 && l1*l1 + l3*l3 > l2*l2 && l3*l3 + l2*l2 > l1*l1) {  //判断是否为锐角三角形
                System.out.print("false false true");
            }
            else {  
                System.out.print("true false false");
            }
        }
        else {
            System.out.print("data error");
        }
    }
}

 

SourceMonitor报表:

类图:

class Functions

    本题我设置了一个类,构造了六个方法来实现题目要求(虽然只实现了三个功能,最后两个方法也没写完)

    本题正则表达式的创建同上题差不多,也是通过switch语句来实现功能。

第一个功能:给出三点判断是否为等边、等腰三角形。三点两两成线段,判断线段是否垂直x轴,若有且三点横坐标都相同,则输出"data error",否则算出三条线段长度,并判断能否构成三角形。若没有线段垂直x轴,则算出三条线段斜率,若两条斜率相等,则输出"data error",否则算出三条线段长度,并判断能否构成三角形。若能构成三角形,则判断三条线段长度是否相等,若都不相等则输出"false false",若只有两条相等,则输出"true false",若三边都相等,则输出"true true"。

第二个功能:给出三点计算三角形的周长、面积和重心。同上先判断三角形是否能构成,不能则输出"data error",能则计算三条线段长度,再计算周长、面积和重心。再通过正则表达式判断前面的计算结果小数点后是否大于六位,如果不是则直接输出,如果是则用System.out.printf控制六位小数的输出。

第三个功能:判断三角形为钝角、直角还是锐角三角形。同上先判断三角形是否能构成,不能则输出"data error",能则计算三条线段长度,通过勾股定理判断是否为直角,再判断锐角和钝角。

第四个功能和第五个功能未能实现。

    正则表达式由于是复制粘贴前一题再修改的,所以很容易造成符号的丢失或者增加,然后导致数据合法性无法正确判断过不了测试点,又因为表达式比较长而且全是符号组成,所以找错改错真的是很困难的一件事。

 3.踩坑心得:

    这三次作业给我的感受大概就是让我体验了学习java的大起大落吧,从第一次作业的简单,到第三次作业的完虐。第一次的简单,我可能只是觉得因为是第一次,老师先让我们练练手。第二次的中规中矩,让我开始产生了java跟c一样好学的错觉。我自信的以为我掌握的还不错,结果到了第三次作业才发现我结论下得太早了。就目前来看我掌握的知识还是太少,甚至刚开始写的时候连其他类都不想用,为了省事。现在发现,这种偷懒不愿学习并练习新知识带来的后果就是在时间本就不充裕的情况下还要运用不熟悉的东西,然后导致代码报错你还无从下手去改。就像一开始不知道正则表达式的时候,用了if条件句去判断,在知道正则表达式之后,我粗略看几眼发现还是if简单一点,就继续修改if的语句,结果得不偿失,我没成功修改出来if条件句的判断,浪费了大量的时间和精力之后,我还得去学习正则表达式。所以说在学习的道路上永远不要怕学习新知识是一件麻烦的事情,现在不学为难的是以后的自己。

4.改进建议:

    在类中调用此类方法不必声明新的对象,直接使用this关键字即可调用,如下图左到右。

           

    SourceMonitor生成的报表显示我的每个代码圈复杂度都很高,而if/else/for/while语句,if/for/while判断条件中的"&&"或“||”,switch语句,都是会增加圈复杂度的语句。而圈复杂度越大,存在的出错风险就越大,程序代码的判断逻辑复杂,可能质量低且难于测试和维护。以下是我找的一些降低圈复杂度的方法:

  1. 提炼函数,将复杂的分支隔离,换成call func()调用函数。

  2. 使用break,return代替控制标记。

  3. 使用数据结构,算法。

  4. 多态取代条件式,设计模式替换。

  5. 简化条件判断。

    虽然我现在还没有办法使得其值降低在预期之内,这也是我以后需要学习的地方。

5.总结:

  1. 学习了使用Scanner方法来从控制台获取数据。
  2. 区别了next()和nextLine()的不同之处。
  3. 加强了对类的概念和一些特有属性,在类,属性,方法三者之间的关系上有了新的认识。
  4. 学会了正则表达式的书写及运用,提高了代码的可读性。
  5. 学会了许多String类方法的运用以及String和String[]之间的转换。
  6. 对this关键字的使用不是很透彻

    通过这三次作业学到了很多东西,也让我认清了学习Java不是那么简单的一件事,还是需要多下功夫的。除了课堂跟着老师一起学之外,还需要课后多努力,查缺补漏,多动手实践。

posted @ 2022-04-10 06:46  Ash_vin  阅读(121)  评论(0)    收藏  举报