java

面向对象程序设计—第三次总结性Blog

前言

      对10~16周学习的内容,由本次博客来进行一个总结。

      1.随着学期尾声的不断接近,作业的难度也逐渐回落,但电信收费系统的难度有点让人无从下手,感觉java的残酷在这个系列题上尽数体现了。最近的几次作业,所涉及的知识点仍然包含正则表达式、继承与多态还有抽象类与接口、集合框架等等。从题量上来说不是很大,但是难度比较大。有时候花几个小时做不出一道题目。

      2.对于课程来说,主要讲解了javafx和集合框架,javafx相对于集合框架来说比较简单。

      3.集合框架的内容虽然不会考,但是其实也会有所涉及,就像ArrayList和HashSet其实都是经常使用的。

第六次作业——题目集06 7-1

      难度:偏大    

  整体思路分析

       本题的难度偏大,我在拿到这个题目之后,首先想到的是对输入五个点的是否冗杂的判断,只有判断了这个出来之后才能进行后续是五边形,四边形亦或是三角形的计算。

      这道题我一直只使用了一个点类,我感觉这是十分限制我这道题后续的一个点。7-1的类图我都是这个,并没有将每个选项中的功能写成方法。

      

  度量分析

      圈复杂度54,可以看出来这题的难度很大,代码质量很差。

      

   核心代码分析

      下面是对点是否冗杂的判断,先看有没有点重复,将不重复的点加入ArrayList中,然后再对其中的点进行是否在一条边上的判断。

复制代码
public static ArrayList<Dot> checkDot(Dot dot[])
    {
        ArrayList<Dot> dots=new ArrayList<Dot>();
        for(int i=0;i<dot.length;i++)
        {
            if(dots.size()==0)
            {
                dots.add(dot[i]);
            }
            for(int j=0;j<dots.size();j++)
            {
                if(isSame(dots.get(j),dot[i]))
                    break;
                if(j==dots.size()-1) {
                    dots.add(dot[i]);
                }
            }
        }
        for(int i=0;i<dots.size();i++)
        {
            if(dots.size()<3)
                break;
            else
            {
                if(i-1>=0&&i+1<dots.size())
                {
                    if(isLine(dots.get(i-1),dots.get(i),dots.get(i+1)))
                        dots.remove(i);
                    if(isLine(dots.get(i-1),dots.get(i),dots.get(i+1)))
                        dots.remove(i);
                }
            }
        }
        return dots;
复制代码

 

 

  采坑分析

      这题最大的坑就是在某高校课程从性质上分为:必修课、选修课时候,会存在分不清楚的情况,而这个时候用循环去计算,就会有不存在的情况,也会存在计算错误,在网上学习过之后,我采用了分布法对其进行计算。

  改进建议

      1.这题写字符串格式是否合法的那个方法时,总会有测试点过不去,还多了对前面选项已经冒号的判断,但我还发现还多了对连续两个空格或者逗号的测试点。

第七次作业——题目集07 7-3

      题目集07 7-3对图形的的考察。

  整体思路介绍

      题目集 7-3已经被大大的降低了难度,题目已经给出了各个板块的类图。

 

 

       这类图已经将整个题目的大体框架给出来了,只需要我们在对其进行代码实现,然后实现相应的功能即可。

      对于功能来说,题目集 7-3题目需要我们匹配正确的输入格式,输入数字并进行计算。其中的主要类就是CallRecord和CallChargeRule,对于CallRecord来说,需要在构造函数时,就传入相应的startTime,endTime,callingNumberAreaCode,answerNumberAreaCode,number1,number2这六个参数。其中需要使用到一个SimpleDateFormat类对字符串形式的时间进行转化,使其变成计算机可以识别的Date类型。

  度量分析

      

       从Kiviat Graph可以看出来自己写的代码虽然现在全复杂度变低了但是各种数据依旧不是在优秀的范围之中,说明代码依旧是比较垃圾的代码。

  核心代码分析

复制代码

import java.util.Scanner;

// 抽象父类 Shape
abstract class Shape {
// 抽象方法,计算图形的面积
abstract double calculateArea();
}

// 圆类
class Circle extends Shape {
private double radius;

public Circle(double radius) {
this.radius = radius;
}

// 重写父类的抽象方法
@Override
double calculateArea() {
return Math.PI * radius * radius;
}
}

// 矩形类
class Rectangle extends Shape {
private Point leftTopPoint;
private Point lowerRightPoint;

public Rectangle(Point leftTopPoint, Point lowerRightPoint) {
this.leftTopPoint = leftTopPoint;
this.lowerRightPoint = lowerRightPoint;
}

// 重写父类的抽象方法
@Override
double calculateArea() {
double width = Math.abs(lowerRightPoint.getX() - leftTopPoint.getX());
double height = Math.abs(lowerRightPoint.getY() - leftTopPoint.getY());
return width * height;
}
}

// 点类
class Point {
private double x;
private double y;

public Point(double x, double y) {
this.x = x;
this.y = y;
}

public double getX() {
return x;
}

public double getY() {
return y;
}
}

public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);

int choice = input.nextInt();

switch (choice) {
case 1: // Circle
double radius = input.nextDouble();
Shape circle = new Circle(radius);
printArea(circle);
break;
case 2: // Rectangle
double x1 = input.nextDouble();
double y1 = input.nextDouble();
double x2 = input.nextDouble();
double y2 = input.nextDouble();

Point leftTopPoint = new Point(x1, y1);
Point lowerRightPoint = new Point(x2, y2);

Shape rectangle = new Rectangle(leftTopPoint, lowerRightPoint);

printArea(rectangle);
break;
}

}

// 多态方法,接收 Shape 类型的参数
public static void printArea(Shape shape) {
double area = shape.calculateArea();
System.out.printf("%.2f\n", area);
}
}

  改进建议

      可以利用一些方法减少代码的重复,因为在后续还会有这个系列的题目发布,需要代码具有可拓展性和较高的可修改性。

 第八次作业——题目集08 

      难度:中等

  整体思路分析

      7-1 容器-ArrayList-排序

      7-2 课程成绩统计程序-3

      7-3 jmu-Java-02基本语法-03-身份证排序

      7-4 jmu-Java-04面向对象进阶-03-接口-自定义接口ArrayIntegerStack

           7-5 jmu-Java-03面向对象基础-05-覆盖

  度量分析

      从度量分析中其实可以看出来相比于题目集题的平均复杂度已经变小了,但整体的代码依旧可用性不高。

      

  核心代码分析

      

 

其难度在于第二题的课程成绩统计程序。

  采坑分析

      在写这个题目的时候,出现了我写题目集06 7-1没有出现过的情况。在题目集96 7-1中对于区号我是再使用一遍正则表达式来进行提取。其实这样没错,但在区别区号是否在省内的时候,我是使用了matcher.find()这个方法来进行识别,即若匹配到(079[2-9])|(0701)中的一个就为true,但经过调试我发现,这个方法只会进行一次,在之后就变成了false,在之后我就修改了我的代码,先将其转化为整形数,再进行比较。

  改进建议

      在正则表达式上可以更加的简略一些,可以将regex1和regex4写成一个正则表达式,同理匹配通话记录的也是这样,这样可以大大的减少代码的复杂性。在另一方面,其实可以不需要按照题目所给类图这样来进行代码编写,因为我发现在通过所有测试点之后依旧有一些方法是从来没有使用过的。这会显的代码十分的复杂,提高了代码量,应该想办法改变这一过程。

  度量分析

      

  核心代码分析

      

 

 

 本题最主要就是对于数字,字符,空格,英文逗号,英文句号组成的短信进行正则表达式的匹配。

  改进建议

      后面经过和同学讨论发现,这类题目不按照类图写其实可以大大的减少代码量。



总结

   经过了10~16周的学习,我学习到了:

    1.对于面向对象程序设计,尽可能的从对象的角度出发来设计自己的程序,只有这样才能减少代码的复杂度。

    2.能写成方法的地方一定要写成方法。

    3.多使用继承和多态,能够提高代码的复用性。

    4.构造方法在子类中的重写和与父类的关系。

    5.对于集合框架,有了一个较为清晰的了解,较为清晰的知道了什么是ArrayList,什么是HashSet,什么是HashMap,也能够在适当的地方进行使用。

    6.在写程序时,要尽最大的可能减少类于类之间的耦合,对于面向对象程序设计来说,类与类之间的耦合越低越好。

    7.泛型类之间也能够进行继承,但只能有一个类,且这个类必须在第一位,类是对象的模板,泛型类是类的模板。当我们需要不知道某一具体类型时,就可以用泛型类。

   经过了10~16周的学习,需要进一步研究的地方:

    1.如何降低类与类之间耦合。

    2.在接触到一个题目时,如何先有一个大体的思路。

    3.对于代码实现的能力还有待欠缺。

    4.数学思维能力明显不足,需要进一步提高。

    5.在对于多边形这一类题目时,经常会觉得这是数学题目然后不太想去写代码,但其实这种想法是错误的,只有在有了良好的算法之后才能更好成为一名优秀的程序员。

   教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见:

    在pta平台上发布的题目如果题目较难的话,希望可以多给一点测试点的提示。

posted @ 2022-05-09 22:29  九又四分之三  阅读(66)  评论(0)    收藏  举报