题目集4-6的总结性blog

一、前言

题目集四

第四次题目集共有三道题目。其中第一题水文数据校验及处理知识点主要关于正则表达式以及字符串的运用,第二题主要考察类的构造,类与类之间的关系以及日期问题,另外还需要去学会看类图,第三题考察到了类的继承,父类与子类的关系以及父类方法的重写。总体难度偏难,其中第一题与第二题最难。第一题测试点过多,并且输入太大,过程太过繁琐。而第二题需要实现三个功能,并且日期的判断容易出错。而第三题最简单,只需要掌握了继承的基本概念便可以完成。

题目集五

第五次题目集共有五道题目。第一题考察对字符串的应用,第二题知识点为数组以及数组的排序,第三题知识点为对数据的三种排序方式,插入排序,选择排序以及冒泡排序,而第四题考察字符串,Java关键字以及接口,第五题依旧是日期问题,考察了类与类之间的关系及调用。此次题目集难度中等,有简单的题目也有难的题目。第四题和第五题较难,第四题的输入为一大段代码,需要考虑的情况非常多,并且十分容易出错,而第五题是对于题目集四第二题的另一种解法。

题目集六

第六次题目集共有六道题目。其中第一题,第三题,第四题都是考察了正则表达式的运用,难度逐渐稍微增加。第二题的知识点为字符串的应用,对字符串的转换以及排序,第五题考察的是继承与多态以及toString()方法,而第六题则是关于接口的使用来解决问题以及了解类与类之间的关系和类的构造。此次题目集难度偏容易,第五题与第六题较复杂,第五题需要输入多个三种图形并且还要计算出面积与面积和并且对其排序,输出的要求也比较严格,而第六题则需要掌握接口的使用才能够完成。

设计与分析

题目集四、题目集五两种日期类聚合设计的优劣比较

题目集四7-2

首先分析题目集四的日期类聚合设计。设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

首先输入年月日以及选择的功能

如果选择的是功能1,则先输入求的下n天的n,然后判断输入是否合法,如果合法就调用求下n天的方法,否则输出“Wrong Format”

if(num == 1)
        {
            n = in.nextInt();
            if(DateUtil.checkInputValidity(year,month,day) == true || n < 0)
            {
                System.out.println("Wrong Format");
                System.exit(0);
            }
            System.out.println(DateUtil.getNextNDays(n));
        }

如果选择的是功能2,则先输入求的前n天的n,然后判断输入是否合法,如果合法就调用求前n天的方法,否则输出“Wrong Format”

else if(num == 2)
        {
            n = in.nextInt();
            if(DateUtil.checkInputValidity(year,month,day) == true || n < 0)
            {
                System.out.println("Wrong Format");
                System.exit(0);
            }
            System.out.println(DateUtil.getPreviousNDays(n));
        }

如果选择的是功能3,则先输入另一个日期的年月日后判断输入是否合法,如果合法就调用求两个日期相差的天数的方法,否则输出“Wrong Format”

else if(num == 3)
        {
            year1 = in.nextInt();
            month1 = in.nextInt();
            day1 = in.nextInt();
            if(DateUtil.checkInputValidity(year,month,day) == true || DateUtil.checkInputValidity(year1,month1,day1) == true)
            {
                System.out.println("Wrong Format");
                System.exit(0);
            }
            System.out.println(DateUtil.getDaysofDates(year1, month1, day1));
        }

如果输入的num不属于1、2、3则输出“Wrong Format”

else
        {
            System.out.println("Wrong Format");
            System.exit(0);
        }

isLeapYear()是判断输入的年份是否为闰年的方法

public static boolean isLeapYear() {
        if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

checkInputValidity()是判断输入是否合法的方法,年份应该在1900年和2050年之间,月份应该在1月和12月之间,日期应该在1和该月最大日期之间

public static boolean checkInputValidity(int year,int month,int day) {
        if(isLeapYear() == true)
        {
            mon_maxnum[2] = 29;
        }
        if(year < 1900 || year > 2050 || month < 0 || month > 12 || day < 0 || day > mon_maxnum[month])
        {
            return true;
        }
        else
        {
            return false;
        }
    }

getNextNDays()是求后n天的方法

public static String getNextNDays(int n) {    
        for(int i=0;i<n;i++)
        {
            day ++;
            if(isLeapYear() == true)
            {
                mon_maxnum[2] = 29;
            }
            else if(isLeapYear() == false)
            {
                mon_maxnum[2] = 28;
            }
            if(month == 12)
            {
                if(day == mon_maxnum[12] + 1)
                {
                    year ++;
                    month = 1;
                    day = 1;
                }
            }
            else 
            {
                if(day == mon_maxnum[month] + 1)
                {
                    month ++;
                    day = 1;
                }
            }
        }
        return year+"-"+month+"-"+day;
    }

getPreviousNDays()是求前n天的方法

public static String getPreviousNDays(int n) {
        for(int i=0;i<n;i++)
        {
            day --;
            if(isLeapYear() == true)
            {
                mon_maxnum[2] = 29;
            }
            else if(isLeapYear() == false)
            {
                mon_maxnum[2] = 28;
            }
            if(month == 1)
            {
                if(day == 0)
                {
                    year --;
                    month = 12;
                    day = 31;
                }
            }
            else 
            {
                if(day == 0)
                {
                    month --;
                    day = mon_maxnum[month];
                }
            }
        }
        return year+"-"+month+"-"+day;
    }

getDaysofDates()是求两个日期之间的天数的方法

public static int getDaysofDates(int year1,int month1,int day1) {
        int numofDays = 0;
        String str = year1+"-"+month1+"-"+day1;
        if(year > year1 || year == year1 && month > month1 || year == year1 && month == month1 && day > day1)
        {
            while(getPreviousNDays(numofDays).equals(str)==false)
            {
                year = main.year;
                month = main.month;
                day = main.day;
                numofDays = numofDays + 1;
            }
        }
        else if(year < year1 || year == year1 && month < month1 || year == year1 && month == month1 && day < day1)
        {
            while(getNextNDays(numofDays).equals(str)==false)
            {
                year = main.year;
                month = main.month;
                day = main.day;
                numofDays = numofDays + 1;
            }
        }
        return numofDays;
    }

如果输入的num不属于1、2、3则输出“Wrong Format”

else
        {
            System.out.println("Wrong Format");
            System.exit(0);
        }

isLeapYear()是判断输入的年份是否为闰年的方法

public static boolean isLeapYear(int year) {
        if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

checkInputValidity()是判断输入是否合法的方法,年份应该在1820年和2020年之间,月份应该在1月和12月之间,日期应该在1和该月最大日期之间

public static boolean checkInputValidity(int year,int month,int day) {
        if(isLeapYear(year) == true)
        {
            mon_maxnum[2] = 29;
        }
        if(year < 1820 || year > 2020 || month < 0 || month > 12 || day < 0 || day > mon_maxnum[month])
        {
            return true;
        }
        else
        {
            return false;
        }
    }

 

题目集五7-5

分析题目集五的日期类聚合设计。设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

首先输入年月日及选择的功能

如果选择的是功能1,则先输入求的下n天的n,然后判断输入是否合法,如果合法就调用求下n天的方法,否则输出“Wrong Format”

if(num == 1)
        {
            n = in.nextInt();
            if(DateUtil.checkInputValidity(year,month,day) == true || n < 0)
            {
                System.out.println("Wrong Format");
                System.exit(0);
            }
            System.out.println(year+"-"+month+"-"+day+" next "+n+" days is:"+DateUtil.getNextNDays(n));
        }

如果选择的是功能2,则先输入求的前n天的n,然后判断输入是否合法,如果合法就调用求前n天的方法,否则输出“Wrong Format”

else if(num == 2)
        {
            n = in.nextInt();
            if(DateUtil.checkInputValidity(year,month,day) == true || n < 0)
            {
                System.out.println("Wrong Format");
                System.exit(0);
            }
            System.out.println(year+"-"+month+"-"+day+" previous "+n+" days is:"+DateUtil.getPreviousNDays(n));
        }

如果选择的是功能3,则先输入另一个日期的年月日后判断输入是否合法,如果合法就调用求两个日期相差的天数的方法,否则输出“Wrong Format”

else if(num == 3)
        {
            year1 = in.nextInt();
            month1 = in.nextInt();
            day1 = in.nextInt();
            if(DateUtil.checkInputValidity(year,month,day) == true || DateUtil.checkInputValidity(year1,month1,day1) == true)
            {
                System.out.println("Wrong Format");
                System.exit(0);
            }
            System.out.println("The days between "+year+"-"+month+"-"+day+" and "+year1+"-"+month1+"-"+day1+" are:"+DateUtil.getDaysofDates(year1, month1, day1));
        }

getNextNDays()是求后n天的方法

public static String getNextNDays(int m) {
        int numofYear = 0;
        numofYear = m / 146097;
        int n = m % 146097;
        for(int i=0;i<n;i++)
        {
            day ++;
            if(isLeapYear(year) == true)
            {
                mon_maxnum[2] = 29;
            }
            else if(isLeapYear(year) == false)
            {
                mon_maxnum[2] = 28;
            }
            if(month == 12)
            {
                if(day == mon_maxnum[12] + 1)
                {
                    year ++;
                    month = 1;
                    day = 1;
                }
            }
            else 
            {
                if(day == mon_maxnum[month] + 1)
                {
                    month ++;
                    day = 1;
                }
            }
        }
        year = year + numofYear * 400;
        return year+"-"+month+"-"+day;
    }

getPreviousNDays()是求前n天的方法

public static String getPreviousNDays(int m) {
        int numofYear = 0;
        numofYear = m / 146097;
        int n = m % 146097;
        for(int i=0;i<n;i++)
        {
            day --;
            if(isLeapYear(year) == true)
            {
                mon_maxnum[2] = 29;
            }
            else if(isLeapYear(year) == false)
            {
                mon_maxnum[2] = 28;
            }
            if(month == 1)
            {
                if(day == 0)
                {
                    year --;
                    month = 12;
                    day = 31;
                }
            }
            else 
            {
                if(day == 0)
                {
                    month --;
                    day = mon_maxnum[month];
                }
            }
        }
        year = year - numofYear * 400;
        return year+"-"+month+"-"+day;
    }

getDaysofDates()是求两个日期之间的天数的方法

public static int getDaysofDates(int year1,int month1,int day1) {
        int numofDays = 0;
        int numofDays1 = 0;
        int numofDays2 = 0;
        
        if(year > year1 || year == year1 && month > month1 || year == year1 && month == month1 && day > day1)
        {
            String str = (year-1)+"-"+month1+"-"+day1;
            for(int i=0;i<year-year1-1;i++)
            {
                if(isLeapYear(year1+i)==true)
                {
                    numofDays1 = numofDays1 +366;
                }
                else
                {
                    numofDays1 = numofDays1 + 365;
                }
            }
            while(getPreviousNDays(numofDays2).equals(str)==false)
            {
                year = main.year;
                month = main.month;
                day = main.day;
                numofDays2 = numofDays2 + 1;
            }
        }
        else if(year < year1 || year == year1 && month < month1 || year == year1 && month == month1 && day < day1)
        {
            String str = (year+1)+"-"+month1+"-"+day1;
            for(int i=0;i<year1-year-1;i++)
            {
                if(isLeapYear(year1-i)==true)
                {
                    numofDays1 = numofDays1 +366;
                }
                else
                {
                    numofDays1 = numofDays1 + 365;
                }
            }
            while(getNextNDays(numofDays2).equals(str)==false)
            {
                year = main.year;
                month = main.month;
                day = main.day;
                numofDays2 = numofDays2 + 1;
            }
        }
        numofDays = numofDays1 + numofDays2;
        return numofDays;
    }

优劣比较

题目集四的7-2中代码更加简明清晰,内容也更加直观,但是却如果计算更大数值的日期耗费的时间过长容易超时,题目集五中的7-5虽然代码较为复杂,但是它能够更快速的计算更大的日期,比题目集四的7-2更加节省时间。所以如果计算的日期不大时可以用题目集四7-2的方法,而如果是日期数据很大的话应该使用题目集五的7-5。

题目集四、题目集六三种渐进式图形继承设计的思路与技术运用

题目集四7-3设计思路

本题需要实现图形类继承,并定义相应类对象并进行测试。

主方法内,主要实现四个功能(1-4): 从键盘输入1,则定义圆类,从键盘输入圆的半径后,主要输出圆的面积; 从键盘输入2,则定义矩形类,从键盘输入矩形的宽和长后,主要输出矩形的面积; 从键盘输入3,则定义球类,从键盘输入球的半径后,主要输出球的表面积和体积; 从键盘输入4,则定义立方体类,从键盘输入立方体的宽、长和高度后,主要输出立方体的表面积和体积;

假如数据输入非法(包括圆、矩形、球及立方体对象的属性不大于0和输入选择值非1-4),系统输出Wrong Format。

首先输入选择的功能,如果选择功能1,输入圆的半径并判断输入是否合法,若合法则调用Circle类,并按要求输出,若不合法,则输出“Wrong Format”并终止程序。如果选择功能2,功能3,功能4,与功能1思路类似。以下是选择功能1的代码。

int num = in.nextInt();
        if(num == 1)
        {
            radius = in.nextDouble();
            Circle circle = new Circle();
            if(radius < 0)
            {
                System.out.println("Wrong Format");
                System.exit(0);
            }
            System.out.println("Constructing Shape");
            System.out.println("Constructing Circle");
            System.out.println("Circle's area:" + String.format("%.2f",circle.getArea()));
        }

之后设置一个包含getArea()方法的class Shape来作为图形的父类。

class Shape{
    public double getArea() {
        return 0.0;
    }
}

class Circle 继承class Shape。包含radius这个私有属性,从父类继承来的getArea()方法用于求圆的面积。

class Circle extends Shape{
    private static double radius;
    public static double getRadius() {
        return radius;
    }

    public static void setRadius(double radius) {
        Circle.radius = radius;
    }
    
    public double getArea() {
        Main main = new Main();
        this.radius = main.radius;
        double area;
        area = Math.PI * this.radius * this.radius;
        return area;
    }
}

class Rectangle也继承class Shape,class Rectangle有width和length这两个私有属性,getArea()方法用于求矩形的面积。

class Rectangle extends Shape{
    private static double width;
    private static double length;
    public static double getWidth() {
        return width;
    }
    public static void setWidth(double width) {
        Rectangle.width = width;
    }
    public static double getLength() {
        return length;
    }
    public static void setLength(double length) {
        Rectangle.length = length;
    }
    public double getArea() {
        Main main = new Main();
        this.width = main.width;
        this.length = main.length;
        double area;
        area = this.width * this.length;
        return area;
    }
}

class Ball继承class Circle,class Box 继承class Rectangle,其中class Box除了继承了class Rectangle的两个私有属性以外,还有一个私有属性height。

求表面积的方法getArea()

//球的求表面积的方法
public double getArea() {
        Main main = new Main();
        super.setRadius(main.radius);
        double area;
        area = 4 * Math.PI * getRadius() * getRadius();
        return area;
    }
//箱子的求表面积的方法
public double getArea() {
        Main main = new Main();
        super.setWidth(main.width);
        super.setLength(main.length);
        this.height = main.height;
        double area;
        area = 2 * (this.height * getWidth() + this.height * getLength() + getLength() * getWidth());
        return area;
    }

求体积的方法getVolume()

//球的求体积方法
public double getVolume() {
        Main main = new Main();
        super.setRadius(main.radius);
        double volume;
        volume = (4 * Math.PI * Math.pow(getRadius(), 3)) / 3;
        return volume;
    }
//箱子的求体积方法
public double getVolume() {
        double volume;
        volume = getWidth() * getLength() * this.height;
        return volume;
    }

题目集六7-5设计思路

本题要求掌握类的继承、多态性及其使用方法。图形类的继承层次结构如下图所示。

要求程序实现功能 : 求各图形的面积; 根据面积的大小对图形进行排序; 求所有图形的面积之和;输出各图形面积及总面积

首先输入想要创建的对象的数量a,b,c,并判断输入是否合法,首先是a,b,c都等于0的情况

int a = in.nextInt();
        int b = in.nextInt();
        int c = in.nextInt();
        if(a < 0 || b < 0 || c < 0 )
        {
            System.out.println("Wrong Format");
            System.exit(0);
        }
        if(a==0&&b==0&&c==0)
        {
            System.out.println("Original area:");
            System.out.println("");
            System.out.println("Sum of area:0.00");
            System.out.println("Sorted area:");
            System.out.println("");
            System.out.println("Sum of area:0.00");
            System.exit(0);
        }

将a个圆对象,b个矩形对象,c个三角形对象求的面积存入数组中,如下是圆对象对应的代码

for(int i=0;i<a;i++)
        {
            radius = in.nextDouble();
            Circle cir = new Circle(radius);
            if(cir.validte()==false)
            {
                System.out.println("Wrong Format");
                System.exit(0);
            }
            area[i] = cir.getArea();
        }

最后求出面积总和,对面积排序后按要求输出

double sum = 0.0;
        for(int i=0;i<a+b+c;i++)
        {
            sum += area[i];
        }
        System.out.println("Original area:");
        for(int i=0;i<a+b+c-1;i++)
        {
            System.out.print(String.format("%.2f", area[i])+" ");
        }
        System.out.println(String.format("%.2f", area[a+b+c-1])+" ");
        System.out.println("Sum of area:" + String.format("%.2f", sum));
        double m = 0;
        for(int i=0;i<a+b+c-1;i++)
        {
            for(int j=0;j<a+b+c-i-1;j++)
            {
                if(area[j]>area[j+1])
                {
                    m = area[j];
                    area[j] = area[j+1];
                    area[j+1] = m;
                }
            }
        }
        System.out.println("Sorted area:");
        for(int i=0;i<a+b+c-1;i++)
        {
            System.out.print(String.format("%.2f", area[i]) + " ");
        }
        System.out.println(String.format("%.2f", area[a+b+c-1]) + " ");
        System.out.println("Sum of area:" + String.format("%.2f", sum));
    }

创建父类class Shape,包含求面积的方法getArea(),判断输入是否合法的方法validte(),toString()方法

class Shape{
    public static double getArea() {
        return 0.0;
    }
    public static boolean validte() {
        return true;
    }
    public String toString() {
        return null;
    }
}

class Circle,class Rectangle,class Triangle都继承class Shape,class Circle有私有属性radius,class Rectangle有私有属性width和length,class Triangle有私有属性side1,side2,side3;以下是class Circle对应的代码

class Circle extends Shape{
    private static double radius;
    
    public Circle(double radius) {
        this.radius = radius;
    }
    public static double getArea() {
        return Math.PI * radius * radius;
    }
    public static boolean validte() {
        if(radius < 0 || radius == 0)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    public String toString() {
        return null;
    }
}

题目集六7-6设计思路、

本题要求使用接口及类实现多态性,类图结构如下所示:

其中:

  • GetArea为一个接口,无属性,只有一个GetArea(求面积)的抽象方法;
  • Circle及Rectangle分别为圆类及矩形类,分别实现GetArea接口
  • 要求:在Main类的主方法中分别定义一个圆类对象及矩形类对象(其属性值由键盘输入),使用接口的引用分别调用圆类对象及矩形类对象的求面积的方法,直接输出两个图形的面积值。(要求只保留两位小数)

首先输入半径以及长和宽后判断输入是否合法,若合法则调用类输出面积

double radius = in.nextDouble();
        double width = in.nextDouble();
        double length = in.nextDouble();
        Circle cir = new Circle(radius);
        Rectangle rect = new Rectangle(width,length);
        if(radius < 0 || radius == 0 || width < 0 || width == 0 || length < 0 || length == 0)
        {
            System.out.println("Wrong Format");
        }
        else
        {
            System.out.println(String.format("%.2f", cir.getArea()));
            System.out.println(String.format("%.2f", rect.getArea()));
        }

创建GetArea接口,包含getArea()方法

interface GetArea{
    public static double getArea() {
        return 0.0;
    }
}

class Circle,class Rectangle执行GetArea接口,求出面积

//求圆的面积
public static double getArea() {
        return Math.PI * getRadius() * getRadius();
    }
//求矩形的面积
public static double getArea() {
        return getWidth() * getLength();
    }

技术运用

这三道题虽然都是图形继承类题目,但是他们所用的设计思路是完全不同的。首先是题目集四的7-3,这一题用到了连续继承,在class Circle和class Rectangle继承了class Shape后,又让class Ball和class Box分别继承他们。题目集六的7-5则是只用三个类class Circle,class Rectangle和class Triangle都继承了class Shape,除此之外还直接用到了class toString。而题目集六的7-6则使用的是接口来实现对图形求面积的方法。三者各有各的不同。

对三次题目集中用到的正则表达式技术的分析总结

三次题目集中运用到正则表达式的题目有题目集四的7-1水文数据校验及处理,题目集六的7-1,7-3和7-4.

在题目集四的7-1中,分别要对输入的水文数据的测量时间,目标水位,实际水位,目标开度,实际开度和流量使用正则表达式来判断输入是否合法。

由于水文数据有多行,首先把各行数据用字符串数组来储存,随后将各行数据分别判断

for(i=0;;i++)
        {
            Datas[i] = in.nextLine();
            if(Datas[i].equals("exit"))
            {
                n = i;
                break;
            }
        }

判断输入是否为空也使用到了正则表达式

if(Datas[i].matches("^\\s*|\\s*$"))
            {
                System.out.println("Max Actual Water Level:0.00");
                System.out.println("Total Water Flow:0.00");
                System.exit(1);
            }

如果要把六个数据分别和正则表达式匹配,因为他们使用了|分隔,所以可以使用String.split("|")来把他们分开

String[] gateopen = datas[3].split("[/]");

除去字符串首尾空格后字符串匹配正则表达式

measureDateTime = measureDateTime.trim();
String regex = "([1-9]\\d{3}||[1-9]\\d{2}||[1-9]\\d{1}||[1-9])/" + "((([13578]||1[02])/([1-9]||1[0-9]||2[0-9]||3[01]))" + "||(([2])/([1-9]||1[0-9]||2[0-9]))" + "||(([469])||(1[1])/([1-9]||1[0-9]||2[0-9]||3[0])))" + "\\s([02468]||1[02468]||2[02]):00"; boolean b = Pattern.matches(regex,measureDateTime); if(b == true) { return true; } else { return false; }

而题目集六的三道题较为简单

如7-1是QQ号校验,7-3是验证码校验,7-4是学号校验,只需使用正确的正则表达式再将输入的字符串与其进行匹配就可

创建正则表达式

//学号
String regex = "2020(1[1-7]||61||7[1-3]||8[12])([0-3][1-9]||40)";
//验证码
String regex = "[A-Za-z0-9]+";
//QQ号
String regex = "[^0]\\d+";

匹配正则表达式

boolean b = Pattern.matches(regex, nums);

题目集五中Java集合框架应用的分析总结

题目集五中Java集合框架应用的题目为7-4.该题要求:

编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下:

  • Java中共有53个关键字(自行百度)
  • 从键盘输入一段源码,统计这段源码中出现的关键字的数量
  • 注释中出现的关键字不用统计
  • 字符串中出现的关键字不用统计
  • 统计出的关键字及数量按照关键字升序进行排序输出
  • 未输入源码则认为输入非法

这道题难度较大,我并没有拿到满分。首先我创建了两个ArrayList<String>,然后输入需要求的代码

ArrayList<String> List = new ArrayList<String>();
        ArrayList<String> keyword = new ArrayList<String>();
        Scanner in = new Scanner(System.in);
        String str = "";
        int[] nums = new int[53];
        int a = 0;
        while(!str.equals("exit"))
        {
            str = in.nextLine();
            List.add(str);
        }

判断输入代码是否为空,即输入是否合法

for(int i=0;i<List.size()-1;i++)
        {
            if(List.get(i).isEmpty()==true)
            {
                a ++;
            }
        }
        if(a == List.size()-1)
        {
            System.out.println("Wrong Format");
            System.exit(0);
        }

check方法用于检测出代码中包含的字符串,注释等等并把他们移除

private static void check(ArrayList<String> list) {
        int j = 0;
        for(int i=0;i<list.size();i++)
        {
            if(list.get(i).contains("//"))
            {
                list.remove(list.get(i));
            }
            if(list.get(i).contains("\""))
            {
                int a = list.get(i).indexOf("\"");
                int b = list.get(i).lastIndexOf("\""); 
                String str = list.get(i).substring(a, b+1);
                if(a != b)
                {
                    list.add(list.get(i).replaceAll(str, " "));
                    list.remove(list.get(i));
                }
            }
        }
        for(int i=0;i<list.size();i++)
        {
            if(list.get(i).contains("/*"))
            {
                for(j=i;j<list.size();j++)
                {
                    if(list.get(j).contains("*/"))
                    {
                        for(int k=i;k<=j;k++)
                        {
                            list.remove(list.get(0));
                        }
                    }
                }
            }
        }
    }

getKeyword()方法将所有Java关键词存入List中

getNums()方法用于找出代码中的Java关键词并按顺序存入数组中,同时计算数量

private static int[] getNums(ArrayList<String> list,ArrayList<String> keyword) {
int[] nums = new int[53];
        for(int i=0;i<53;i++)
        {
            nums[i] = 0;
            for(int j=0;j<list.size();j++)
            {
                String str = list.get(j);
                for(int k=0;k<str.length();)
                {
                    int c = -1;
                    c = str.indexOf(keyword.get(i));
                    if(c != -1)
                    {
                        str = str.substring(c+1);
                        nums[i] ++;
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }
        return nums;
    }
}

在主类中,先用getKeyword()方法将所有Java关键词存入List中,之后判断输入是否合法,若合法再用check()方法把代码中的注释和字符串全部移除,最后则用getNums()方法找出含有的Java关键词以及数量,最后按题目要求输出。

采坑心得

在这三次题目集中,对源码的提交过程出现了许多问题,有几道题目甚至并未解决完成,在解决问题的过程中本人也获得了许多心得。

首先是题目集四的7-1,有两个测试点一直过不去,也找不到错误的地方,又加上我太过懒惰,后面几天便直接放弃了这一题

 

题目集五的7-4我也只得到了5分,和上题相同,我也由于太过懒惰而直接放弃该题。

题目集五的7-5中,我由于算法太过麻烦,题目几个测试点一直运行超时,无法正常输出数据。

 

 

需要等待几秒才能够输出数据。后来将年份四百年除一次后再计算才能够按时输出。

题目集六中题目都较为简单。但是在完成7-5时也出现了错误。当图形数均为0时我并没有考虑到这一情况,所以输出直接出现错误

 

 后来提前输出了当图形数均为0时的情况才正确。

通过这三次题目集,我了解到我自己面对困难时容易放弃,不会去面对他。或许如果我坚持完成那两道题,我能通过更多测试点,拿到更高的分。另外我还会容易忽略各种情况,考虑不够周全。

改进建议

此次题目集用到了更多类与类之间的关系,题目中的测试点有许多,但是有许多情况程序应该如何按格式输出题目中并未给出,这给我们解题带来了极大的麻烦。

例如题目集六的7-5中,题目中并未给出若图形数均为0时程序是应该输出输入错误还是按照什么样的格式输出,导致我在这卡了很长的时间才将答案试出来。所以希望以后的题目能够更加详细,能够把各种不同的输出格式都给出。

总结

这三次题目集难度老师在听取同学建议后稍微降低。本阶段我们主要学习的是类与类之间的关系,继承与多态,日期问题的解决方式,字符串的更加复杂的计算以及正则表达式的使用。以后我们应该继续更加深入地学习类的使用,类与类之间的关系等等。

对于本课程的建议是作业量还是稍微有点多,我们需要完成多个平台上的任务,慕课,blog,实验以及pta,但是pta上的题目难度也稍微降低了所以我们同时也省出来了更多的时间。所以对于本课程我还没有更加使用的建议。

posted @ 2021-04-27 23:55  睡觉嫌疑人  阅读(48)  评论(0)    收藏  举报