一、前言
1.题量及难度
这几次作业的题量适中,题目数量适中,不过也不过少,能够提供足够的练习机会。在PTA上的大作业中,一共有三道题。其中第一题和第三题难度不大,但第二题属于点线形系列的题目,是之前得分不高的PTA作业中的重点题型,占据了70分,而我只得到了39分。在期中考试中虽然只有三道题,但难度不算太大,每道题在前一题的基础上稍作修改。不过,由于对写题时间的把握不好,导致第三题没有写完就考试结束了。对于实验一来说,只有两道题,一道是自己编写程序,另一道是修改给定的代码。个人感觉第二题稍微比第一道题难一点,因为需要先理解给定代码,然后在此基础上进行修改。对于刚学不久的Java来说,修改别人的代码确实有一定难度。总体上题目难度不会像作业一样大,都能够完整地完成题目,并且给定的时间也足够充裕。
2.知识点
在知识点方面,PTA作业涉及到正则表达式的使用、类的设计和方法的调用。期中考试涉及到继承与多态、容器类以及与点线相关的简单处理。实验一涉及到类的构造方法、方法的调用、参数传递、对象的构造与使用、循环结构和控制结构。实验二涉及到方法重载、private、protected、public等关键字的使用场景和使用方法,以及方法调用时引用类型参数的传递过程。
二、设计与分析
1.大作业四
7-2 点线形系列4-凸四边形的计算
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
SourceMonitor报表:
类图:
在此题中,我使用了多个正则表达式来判断数据输入格式的正确与否,对不同功能输入点的数量进行了不同的判断。如果格式不正确,则输出"Wrong Format";如果格式正确,但点的数量不对,则输出"wrong number of points";如果格式和点的数量都是正确的,则将选项及点的数据通过split方法存入字符数组,再转换为int或double类型,然后通过switch语句调用Functions类的方法来实现功能。
在此题中,我创建了四个类:Line类、Point类、Functions类和Match类。Line和Point类用于定义平面上的点和线,Functions类中构建了多个方法来实现题目的五个功能(尽管只实现了三个功能,最后两个方法也未完全编写),Match类用于匹配输入格式是否合法。
第一个功能:首先调用pointSame方法判断四个点是否有重合点,如果有,则输出"points coincide";否则将四个点转换为四条线段,通过parallel方法判断相邻两条直线是否平行,如果平行,则输出"false false";否则通过intersection方法计算相邻两条直线的交点是否为线段上的点。如果不是,则输出"false, false";如果是,则再判断不相邻的两条边是否平行,如果平行,则输出"true true";否则输出"true false"。
第二个功能:首先判断点是否有重合,然后判断是否构成四边形,如果不构成,则输出"not a quadrilateral";然后判断对边是否平行,如果不平行,则输出"false false false";如果平行,则判断任意一组相邻线段的长度是否相等,如果不等,则输出"false true false";如果相等,则通过vertical方法判断任意一组相邻边是否垂直,如果垂直,则输出"true true true";否则输出"true false false"。
第三个功能:首先判断点是否有重叠,然后判断是否构成四边形,如果不是,则输出"not a quadrilateral"。将四个点进行两两相连,构成边的线段数组。然后构成对角线,每条对角线将四边形分为两个三角形,分别计算这四个三角形的面积。如果第一条对角线构成的三角形的面积之和等于第二条对角线构成的三角形的面积之和,则是凸四边形;如果不相等,则是凹四边形,且四边形的面积是两个三角形面积之和较小的那个。
第四个功能和第五个功能未能完整实现。
代码如下:
复制代码 1 boolean pointSame(Point[] points) { //判断点重合 2 for(int i = 0;i<4;i++) { 3 for(int j = i+1;j<4;j++) { 4 if(points[i].x == points[j].x && points[i].y == points[j].y) { 5 return false; 6 } 7 } 8 } 9 return true; 10 } 11 12 float area(Line a,Line b,Line c) { //计算三角形面积 13 double p = (a.distance() + b.distance() + c.distance())/2; 14 float s = (float)(Math.sqrt(p*(p-a.distance())*(p-b.distance())*(p-c.distance()))); 15 return s; 16 } 17 18 public String judgmentString(double c) { //输出三位小数 19 String tokenString = String.valueOf(c); 20 tokenString = tokenString.substring(tokenString.indexOf(".") + 1); 21 int len = tokenString.length(); 22 len = Math.min(len, 3); 23 return String.format("%." + len + "f", c); 24 } 25 26 public boolean Tria(Point[] points) { //判断三角形 27 int a = 0,sum = 0; 28 for(int i = 2;i<6;i++) { 29 for(int j = i+1;j<6;j++) { 30 if(points[i].x == points[j].x && points[i].y == points[j].y) { 31 a = i; 32 sum++; 33 } 34 } 35 } 36 if(sum == 1) { 37 if(a == 2) { 38 if(Tria(points[3],points[4],points[5])) { 39 return true; 40 } 41 } 42 else if(a == 3) { 43 if(Tria(points[2],points[4],points[5])) { 44 return true; 45 } 46 } 47 else if(a == 4) { 48 if(Tria(points[2],points[3],points[5])) { 49 return true; 50 } 51 } 52 return false; 53 54 } 55 else if(sum>1) { 56 return false; 57 } 58 else { 59 Point[] point = new Point[4]; 60 for(int i = 0,j = 2;i<4;i++) { 61 point[i] = points[j]; 62 j++; 63 } 64 if(!(Quad(point) == 3 || Quad(point) == 4)) { 65 66 if(Tria(points[2],points[4],points[5])) { 67 if((points[3].x-points[2].x)*(points[4].x-points[3].x) >=0 && (points[3].y-points[2].y)*(points[4].y-points[3].y) >=0) { 68 return true; 69 } 70 } 71 else if(Tria(points[2],points[3],points[5])) { 72 if((points[3].x-points[4].x)*(points[4].x-points[5].x) >=0 && (points[3].y-points[4].y)*(points[4].y-points[5].y) >=0) { 73 return true; 74 } 75 } 76 else if(Tria(points[4],points[3],points[5])) { 77 if((points[3].x-points[2].x)*(points[2].x-points[5].x) >=0 && (points[3].y-points[2].y)*(points[2].y-points[5].y) >=0) { 78 return true; 79 } 80 } 81 else if(Tria(points[4],points[3],points[2])) { 82 if((points[2].x-points[5].x)*(points[5].x-points[4].x) >=0 && (points[2].y-points[5].y)*(points[5].y-points[4].y) >=0) { 83 return true; 84 } 85 } 86 } 87 return false; 88 89 } 90 } 91 92 boolean Tria(Point m,Point n,Point k) { 93 Line a = new Line(m,n); 94 Line b = new Line(n,k); 95 Line c = new Line(k,m); 96 if(a.parallel(c) || a.parallel(b) || b.parallel(c)) 97 return false; 98 else if(a.intersection(b).equals(n) && b.intersection(c).equals(k) && c.intersection(a).equals(m)) { 99 return true; 100 } 101 return false; 102 }
2.期中考
7-1 点与线(类设计)
核心代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
SourceMonitor报表:
本题一共设计了两个类。一个是Point类,一个是Line类。
Point类用来定义一个点,构造一个有参构造器,里面设置判断条件,如果成立则构造点,如果不成立则输出"Wrong Format"并结束进程。该类中还构造了一个display方法,方便后续输出点坐标。Line类用来定义一条线,构造有参构造器来接收Point类和String类数据,构造getDistance方法来计算线段长度,构造display方法输出结果。
7-2 点线面问题重构(继承与多态)
核心代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
SourceMonitor报表:
本题一共设计了四个类。在第一题的基础上,增加一个抽象类Element作为Point、Line、Plane的父类,其中只定义一个抽象方法display。在每个子类中重写display方法以实现不同的输出内容。
一开始写的时候没看到题干中给出的实现多态特性的那段代码,虽然不影响最后结果的输出。
7-3 点线面问题再重构(容器类)
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
abstract class Element{ public abstract void display(); } class Point extends Element{ private double x,y; Point() { } Point(double x,double y){ if(x>0 && x<=200 && y>0 && y<=200) { this.x = x; this.y = y; } else { System.out.println("Wrong Format"); System.exit(0); } } public double getX() { return x; } public void setX(double x) { this.x = x; } public double getY() { return y; } public void setY(double y) { this.y = y; } @Override public void display() { String x1 = String.format("%.2f", x); String y1 = String.format("%.2f", y); System.out.println("("+x1+","+y1+")"); } } class Line extends Element{ private Point point1,point2; private String color; Line(Point point1,Point point2,String color){ this.point1 = point1; this.point2 = point2; this.color = color; } Line(){ } public Point getPoint1() { return point1; } public void setPoint1(Point point1) { this.point1 = point1; } public Point getPoint2() { return point2; } public void setPoint2(Point point2) { this.point2 = point2; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public double getDistance() { double dis = Math.sqrt(Math.pow((point1.getX() - point2.getX()),2) + Math.pow((point1.getY() - point2.getY()),2)); return dis; } @Override public void display() { System.out.println("The line's color is:"+color); System.out.println("The line's begin point's Coordinate is:"); point1.display(); System.out.println("The line's end point's Coordinate is:"); point2.display(); String dis = String.format("%.2f", getDistance()); System.out.println("The line's length is:"+dis); } } class Plane extends Element{ private String color; Plane(){ } Plane(String color){ this.color = color; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } @Override public void display() { System.out.println("The Plane's color is:"+color); } }View Code
3.实验二
农夫过河1
一个农夫带着一匹狼、一只羊、一颗白菜要过河,河上只有一条船能够渡河,而且农夫每次最多只能带一个动物或物品过河。当农夫不在的时候狼会吃羊,羊会吃白菜。
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
SourceMonitor报表:
类图:
该程序首先要判断农夫与所带物品在同一侧,不然无法进行过河操作。然后还要判断那个当狼和羊在同一侧,羊和白菜在同一侧时,农夫是否在,要是农夫不在的话,有一个被吃则游戏结束。由于狼不会被吃,所以狼的存活状态一直都是true。
当时写的时候没考虑过农夫与所带物品位置还需要判断,所以hasCross这个成员一直没用上。
三、踩坑心得
在这次作业中,大部分问题似乎都是因为以下几个方面:
1. 题目理解和注意力:
- 没有仔细阅读题目或忽略了题目中的强制格式要求。
2. 独立思考和创造力:
- 按照自己的思路编写代码,可能忽略了题目要求的特定格式或规则。
3. 多态的应用:
- 可能没有注意到题目中多态的要求,导致没有正确体现多态性的代码。
4. 代码复用和重用:
- 在解决类似问题时,没有充分利用已有的代码或逻辑,导致需要重复编写相似的代码。
5. 注意审题和细节处理:
- 没有在执行之前仔细审题,忽略了一些细节或重要的要求。
四、改进建议
为了避免这些问题,可以采取以下措施:
1. 仔细阅读和理解题目:
- 在开始编写代码之前,确保对题目要求和格式有清晰的理解。
2. 注重题目要求的细节和格式:
- 注意题目中的强制格式要求,并确保代码和结果符合要求。
3. 使用注释和文档:
- 在编写代码时,适当添加注释和文档
五、总结
在七到十周的学习过程中,通过实验、考试和作业,我进一步巩固了在课堂上学习到的知识。这些知识包括类的声明、方法的创建和使用、构造方法的定义和使用、引用变量和对象实例之间的关系、方法重载等。同时,通过这些实践,我填补了上课听不懂或理解不深的知识点,比如期中考试的第三题涉及到的容器类。然而,在构造对象数组的过程中,我仍然有一些困惑,还有抽象父类中方法是否需要使用抽象方法或空方法体等问题需要进一步了解。因此,我打算花时间深入研究和学习这些方面的差异和细节。
标签:false,Point,代码,Blog2,points,Line,true From: https://www.cnblogs.com/renhongyu/p/17517596.html