前言:
在最近发布的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,在写代码前,未进行类的划分,感觉时写到哪化到那,有些不可取。