首页 > 其他分享 >Blog2

Blog2

时间:2023-06-30 18:44:37浏览次数:48  
标签:false Point 代码 Blog2 points Line true

一、前言

1.题量及难度

这几次作业的题量适中,题目数量适中,不过也不过少,能够提供足够的练习机会。在PTA上的大作业中,一共有三道题。其中第一题和第三题难度不大,但第二题属于点线形系列的题目,是之前得分不高的PTA作业中的重点题型,占据了70分,而我只得到了39分。在期中考试中虽然只有三道题,但难度不算太大,每道题在前一题的基础上稍作修改。不过,由于对写题时间的把握不好,导致第三题没有写完就考试结束了。对于实验一来说,只有两道题,一道是自己编写程序,另一道是修改给定的代码。个人感觉第二题稍微比第一道题难一点,因为需要先理解给定代码,然后在此基础上进行修改。对于刚学不久的Java来说,修改别人的代码确实有一定难度。总体上题目难度不会像作业一样大,都能够完整地完成题目,并且给定的时间也足够充裕。

2.知识点

在知识点方面,PTA作业涉及到正则表达式的使用、类的设计和方法的调用。期中考试涉及到继承与多态、容器类以及与点线相关的简单处理。实验一涉及到类的构造方法、方法的调用、参数传递、对象的构造与使用、循环结构和控制结构。实验二涉及到方法重载、private、protected、public等关键字的使用场景和使用方法,以及方法调用时引用类型参数的传递过程。

二、设计与分析

1.大作业四

7-2 点线形系列4-凸四边形的计算

代码如下:

 View Code

 

   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 点与线(类设计)

核心代码如下:

 View Code

 

SourceMonitor报表:

 本题一共设计了两个类。一个是Point类,一个是Line类。

    Point类用来定义一个点,构造一个有参构造器,里面设置判断条件,如果成立则构造点,如果不成立则输出"Wrong Format"并结束进程。该类中还构造了一个display方法,方便后续输出点坐标。Line类用来定义一条线,构造有参构造器来接收Point类和String类数据,构造getDistance方法来计算线段长度,构造display方法输出结果。

7-2 点线面问题重构(继承与多态)

 

核心代码如下:

 View Code

   SourceMonitor报表:

  

     本题一共设计了四个类。在第一题的基础上,增加一个抽象类Element作为Point、Line、Plane的父类,其中只定义一个抽象方法display。在每个子类中重写display方法以实现不同的输出内容。

    一开始写的时候没看到题干中给出的实现多态特性的那段代码,虽然不影响最后结果的输出。 

 

7-3 点线面问题再重构(容器类)

 代码如下:

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

         一个农夫带着一匹狼、一只羊、一颗白菜要过河,河上只有一条船能够渡河,而且农夫每次最多只能带一个动物或物品过河。当农夫不在的时候狼会吃羊,羊会吃白菜。

代码如下:

 View Code

 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

相关文章

  • BLOG2-PTA题目集4、5以及期中考试
    (1)前言本次博客主要涵盖了Java题目的几个主要知识点,包括:1.面向对象的基础知识:这部分主要包括了类和对象的基本概念,构造方法,访问权限和成员变量的相关内容。在面向对象编程中,对这些基础知识的理解至关重要。2.面向对象的设计原则:这个题目强调了两个重要的设计原则,即继承和组......
  • blog2
    第四次题目集7-1菜单计价程序-4分数100作者蔡轲单位南昌航空大学本体大部分内容与菜单计价程序-3相同,增加的部分用加粗文字进行了标注。设计点菜计价程序,根据输入的信息,计算并输出总价格。输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。菜单由一条或多条菜品记......
  • blog2
    本体大部分内容与菜单计价程序-3相同,增加的部分用加粗文字进行了标注。设计点菜计价程序,根据输入的信息,计算并输出总价格。输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。菜单由一条或多条菜品记录组成,每条记录一行每条菜品记录包含:菜名、基础价格两个信息。订单......
  • blog2
    PTA题目集4,5及期中考试总结Blog 一.前言;      大一下学期开始,我们开始接触java这门语言,Java具有大部分编程语言所共有的一些特征,被特意设计用于互联网的分布式环境。Java具有类似于C++语言的形式和感觉,但它要比C++语言更易于使用,而且在编程时彻底采用了一种以对象为......
  • 面向对象程序设计题目集总结blog2-22206110-胡瑞杰
    一、前言第二次在博客园上发布面向对象程序设计题目集的总结博客。经过几周的学习,面向对象的理念更加深入。虽然已经学了些面向对象程序设计,学好这部分内容还是有较大难度。关于知识点本次的题目集所体现的知识点已经不仅限于Java的语法知识,还需要考虑设计问题,不......
  • 题目集4~6的总结性Blog2
    目录1、前言2、设计与分析3、踩坑心得4、改进建议5、总结题目集4:1、菜单计价程序-32、有重复数据3、去掉重复数据4、单词系统与排序5、面向对象编程(封装性)6、GPS测绘中度分秒转换7、判断两个日期的先后、计算间隔天数、周数 题目集5:1、正则......
  • JavaBlog2
    一、前言本次博客文章主要是关于java课程第二阶段关于PTA题目集、超星作业以及期中考试的总结。相较于第一阶段的作业总结而言此次作业更加针对于总结在面向对象过程中的三大技术特性,即封装性、继承性和多态性,以及相关一些面向对象设计过程中的一些基本原则的理解和分析此阶段作......
  • MyBlog2:初识N皇后
    初识N皇后前置知识:如图在9*9的棋盘正中央有一颗皇后棋子。颜色加深位置代表该皇后的攻击范围,可以发现攻击范围是该皇后所在的行,所在的列,以及以皇后为中心的主对角线和次......
  • Blog2:nchu-software-oop-2022-4+5+期中
    Blog2:nchu-software-oop-2022-4+5+期中一、前言两次大作业是关于四边形和五边形的相关操作,类似于之前的三角形,但由于图形边数的变化,难度大大增加。对数学知识的运用考察......
  • xxqJava-Blog2
    一、前言(1)题目集四之凸四边形的计算:此次的题目集基于第三次作业三角形的判断又做了很大的提升。(2)题目集五:凸五边形的计算,这次题目集两道题可以算是是一道题,我猜老师觉得......