前言:

  在最近发布的2次作业中,有很多新的提升,由面向对象到面向过程开始转变了。前三次我是几乎全是面向过程,但从第四次开始,我渐渐使用了面向对象的思想,开始把方法进行多封装。我发现确实可以有很大的重复使用率,在第四次作业到第五边形的转变中,我成功的使用了四边形!很多的方法可以再次使用来完成五边形的讨论,特别是还可以使用之前定义的四边形和三角形,这很方便的,对于像判断是否为五边形的情况,我便可以直接引用四边形的判断。大大节约了我的思考时间。

第四次作业:

  第四次作业我还被困在基础的判断中,导致后面基本上没有开动太多。特别是正则表达式,我是完全没看懂所以不知道咋用,只能依葫芦画瓢借鉴了一下他人的,但还是不知道具体的使用方法。

String pattern = "(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?(\\,)(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?(\\ )(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?(\\,)(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?(\\ )(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?(\\,)(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?(\\ )(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?(\\,)(\\+|-)?(0|[1-9]\\d*)(\\.\\d+)?";

对比第五次的作业

//判断输入的字符串中点的坐标部分格式是否合格。若不符合,报错并退出程序。
    public static void wrongPointFormat(String s) {
        if (!s.matches("[+-]?([1-9]\\d*|0)(\\.\\d+)?,[+-]?([1-9]\\d*|0)(\\.\\d+)?")) {
            System.out.print("Wrong Format");
            System.exit(0);
        }
    }

很明显,第五次的使用方法简洁很多,并且复用率高很多,在多边形的这种类型的题目都可以使用的。

对于知识点:

1.在对后面的四边形的一些规则的判断,我开始就计划用一个类来完成,但在想了很久后放弃了这个不可行的方法,于是尝试了新的方法:把所有的小点都放在一个类中,但判断都放在一个类中,除了一些判断放在单独的类以外(可以更好地利用)。此时我就放在了叫做四边形的类中。这样真的很好。

2.在写代码时,一定要给出随时的提示,表面自己这一步是啥意思,这是很重要的,特别是在使用上一次的代码上,不进行标记的话,很难知道你可以使用那些,甚至会浪费很多时间。所以记住:这很重要!

3.对于第四次作业,我觉得就是第五次的缩减版,所以我针对这个,多讨论第五次的作业。

第五次作业:

 第五次作业中,很多的内容都可以在第四次的基础上进行改进得到,并且如果你类使用的好可以大大降低代码的难度,在使用以前的代码的情况下。如第一种:

public static void choice1(ArrayList<Point> ps) {
            JudgePoint.wrongNumberOfPoints(ps, 5);
            Cross t = new Cross(ps.get(0),ps.get(1),ps.get(2),ps.get(3),ps.get(4));
            //判断是否为五边形。
            if(t.isPentagon()) {
                System.out.println("true");
            }
            else 
                System.out.println("false"); 
        }

1.在第一个判定中,很明显,比第四次方便很多。在Main类中,我尽力简化了以前的方法中的代码量,在Cross类中进行一系列的判断,再在Main方法进行使用。思路明显清晰了很多的。分割,放入,调用,每一步都很清楚的。

public static void choice2(ArrayList<Point> ps) {
            JudgePoint.wrongNumberOfPoints(ps, 5);
            Cross t = new Cross(ps.get(0),ps.get(1),ps.get(2),ps.get(3),ps.get(4));
            if(t.isPentagon()==false){
                System.out.println("not a pentagon");
                //System.exit(0);
            }else{
                if(t.ConvexOrConcave()==true){
                    //凸五边形(true),输出五边形周长、面积,结果之间以一个英文空格符分隔。
                    System.out.print("true " + OutFormat.doubleFormat(t.perimeter()) + " " + OutFormat.doubleFormat(t.area()));
                }else{
                    System.out.println("false");
                }
            }
        }

2.在第二个判定中,我又再次使用了集合,集合很方便,解决了我很长时间的疑惑,对于数组的疑惑。为啥每次都要给出准确的数组数才能赋值?这个终于解答了我的问题,使用了这个方法,我便可以轻松的解决了这个问题,可以不用考虑放入的个数。

public class OutFormat {
    //按要求格式化实数的输出,保留三位小数。
        public static Double doubleFormat(double b) {
            DecimalFormat df = new DecimalFormat("#.000");
            Double output = Double.valueOf(df.format(b));
            return output;
        }
}

3.在多于保存,我是储存在单独一个类中,方便调用。在利用以下方法进行使用:

System.out.print(num + " " + OutFormat.doubleFormat(ds[0]) + " " + OutFormat.doubleFormat(ds[1]));

很简明,也很实用。

但在第五次作业中出现了很多的报错信息如下:

at org.jmlspecs.openjml.Main.execute(Main.java:417)
at org.jmlspecs.openjml.Main.execute(Main.java:375)
at org.jmlspecs.openjml.Main.execute(Main.java:362)
at org.jmlspecs.openjml.Main.main(Main.java:334)
java.lang.NullPointerException

特别是最后一个报错,我是找了非常久的,但一无所获。经过1个半小时的思考与run,我发现了问题:

public boolean isquadr(){
        Triangle trian1 = new Triangle(p1, p2, p3);
        Triangle trian2 = new Triangle(p1, p2, p4);
        Triangle trian3 = new Triangle(p2, p3, p4);
        Triangle trian4 = new Triangle(p1, p3, p4);    
        if(trian1.isTriangle()&&trian2.isTriangle()&&trian3.isTriangle()&&trian4.isTriangle()){
            Point n = l12.getIntersection(l34);
            Point m = l23.getIntersection(l41);
            if(n==null||(!l12.isBetween(n)||!l34.isBetween(n))) {
                if(m==null||(!l23.isBetween(m)||!l41.isBetween(m)))
                    return true;
                else
                    return false;
            }
            else
                return false;
        }
        else 
            return false;
    }

在最后,我返回了一个null,这便是空指针的源由。一旦改成false便正确了!不论如何,我们应当完全考虑好每一步,尽管你觉得代码不会跑到这一步,但实际上代码还是会判定到这一步的。所以这就是我的错误点,虽然很小的一步,但就是这一步花了我很多时间。在每一个choice中都使用了集合,并且调用了以前所使用的。很方便。

类:

 

 

 

 

 

 

 

 

 

最后来补充一下正则表达式吧:

* 表示前一个表达式可以出现0、1、多次
+ 表示前一个表达式可以出现1、多次
? 表示前一个表达式可以出现0、1次
^ 表示是否以指定字符串开头,如果在[]前面使用,表示不接受该字符集合
$ 表示是否以指定字符串结尾
| 表示两者间的选择
. 匹配除换行(\n)外的任意一个字符

{n}表示前一个表达式出现确定的 n 次
{n,}表示前一个表达式至少出现n 次
{n,m}最少出现 n 次且最多出现 m 次
注:以上n和m都是非负整数
注:表达式可以是小括号括起来的式子,也可以是单个字符。。

采坑心得:

在出现多次错误时,一定要看一下自己是否保存,这很重要,有些时候可能不知道为啥会报错也是这个原因。在测试时,不要太盲目的使用爬虫,这有时候会花费跟多的时间!

总结:

1.对于这几次作业,我完全没有使用继承与多态,这是很不好的,说明我在这方面掌握的真的不好。

2.对于一些重复的代码,我并不能完全的进行改进,减少重复性,很遗憾。

3.在寻找错误点时,我并不能很好,很快的找到目标,浪费了大量的时间,哎,很遗憾。

4.对于题目的理解有时候会出现偏差,这个偏差很要命的哎,希望自己多理解一下吧。

5,在写代码前,未进行类的划分,感觉时写到哪化到那,有些不可取。