OOP1~3次作业心得体会

OOP 1~3次作业心得体会

22201709-刘隽涛 

目录

(1)对于面向对象程序设计的理解和想法

(2)对于oop前三次作业的理解

(3)设计与分析,测试分析性能,踩坑心得及下次改进的建议

(4)总结与看法:)

关于java与面对对象的个人理解

  从上个学期的C语言启蒙和一点点的python学习,我们在大一下学期开始了java面向对象程序设计的学习,

对于java的学习个人的理解与体会:

关于语法:

  1.第一次接触时,对于java的语法还不熟悉主函数和构造函数构造类时等茫然

对于封装和私有化,使用构造方法构造对象等的不熟悉。

  2.对于各类数据类型的存储范围还不够清晰。

  3.Boolean值的return应该写在哪里。

关于类:

  1.用多种类去解决问题,尽量做到类之间的低耦合,将问题拆分,各司其职。

  2.对于私有化,引用变量访问对象。

  3.封装后的顺序及引用

对于OOP前三次作业难点的理解和出错点分析

第一次作业

1.str:表示为分隔符,默认为空格,但是不能为空('')。若字符串中没有分隔符,则把整个字符串作为列表的一个元素

例如:s.split('')是不合法的表达
num:表示分割次数。如果存在参数num,则仅分隔成 num+1 个子字符串,并且每一个子字符串可以赋给新的变量
[n]:表示选取第n个分片

2.b.charAt(i)字符串的索引

3. char[] c = str.toCharArray();字符串转为字符数组

4.//Integer.toString将int类型转变为string类型

//Integer.parseInt(hh)将字符串看成hh输出

第二次作业

1.print输出是看清楚题干是输出俩位小数还是整个float浮点型

分别为(“%.2f”,a)和((float)a+......+......)

2.a.substring(0,2);//字符串内提取字符

括号内前一个数字代表字符串开头,后一个数字代表字符串结尾(但不包含)

s.substring(a, b)表示截取下标从a开始到b结束的字符,包含第a个字符但是不包含第b个字符,可以看成[a,b)。

3.判断直角三角形时不能直接使用x*x+y*y==z*z判断,得注意精度(double和float的使用),以及证明直角三角形存在误差。可以设置一个很小的误差比如0.000001.

第三次作业

1.构造含参,无参对象

2.私有化,使用this引用数据域,调用构造方法

3.数据域的封装

设计与分析

ps:SourceMonitor里图表的含义:

  • Lines: 指的是代码总行数
  • Statements:语句的行数,语句是以分号结尾的。这个C中有所不同。
  • Percent Branch Statement:分支数占总语句数的百分比
  • Method Call Statement:方法调用语句数
  • Percent Lines with Comments:注释语句占总语句数的百分比
  • Classes and Interfaces:类和接口数
  • Methods per Class:每个类平均包含函数个数
  • Average Statements per Method:每个函数平均包含的语句个数函数深度(Block Depth):函数深度是函数中分支嵌套的层数。
  • 对应有最大深度(Max Depth)和平均深度(Avg Depth)。
  • Line Number of Complex Method:最复杂函数的行号(最复杂指的是McCabe复杂度值为最高)
  • Maximum Complexity:该类中最复杂函数的复杂度(最复杂指的是McCabe复杂度值为最高)
  • Line Number of Deepest Block:最深层语句块的行号
  • 函数复杂度(Function Complexity)复杂度指1个函数可履行路径的数目,以下语句为复杂度的值贡献1:if/else/for/while语句,3元运算符语句,if/for/while判断条件中的"&&"或“||”,switch语句,

    后接break/goto/ return/throw/continue语句的case语句,catch/except语句等。对应有最大复杂度(Max Complexity)和平均复杂度(Avg Complexity)。

第一次作业

7-3 求定积分

作者:刘凤良       单位:天津仁爱学院

一、定积分的概念

 

 

 

 

 

 

 

 

 

 

 

 根据以上理论,求定积分:

 

 

 

输入格式:

输入定积分下限,定积分上限,区间[a,b]被分割的份数。

输出格式:

输出定积分的值,保留4位小数。

输入样例:

1 2 100

输出样例:

2.3334

代码展示:

import java.util.Scanner;

public class Main{

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        double from = in.nextDouble();
        double to = in.nextDouble();
        int count = in.nextInt();
        count = count*1000;
        double dx = (to-from)/count;//矩形的宽
        double s = 0.0;//面积
        for (int i = 1; i <=count; i++) {
            double y = from+i*dx;
            s = s + (y*y);
        }
        System.out.printf("%.4f",s*dx);
    }
}

 


踩坑心得:count范围扩大,使得积分近似值可以更准确,将需要积分的部分分为更多的小块,近似值更加准确。

改进建议:要需求入手将问题进行拆分,各司其职,虽然问题简单,但部分要求并未达到良好。

 

 

 

 

 

 

 

 

 

第二次作业

7-5 学号识别

作者:蔡轲      单位:南昌航空大学

学校的学号由8位数字组成,前两位是入学年份(省略了20);第3、4位是学院编号,01代表材料学院,02代表机械学院,03代表外语学院,20代表软件学院;第5、6位是学院内部班级编号,最后两位是班级内部学号。如:18011103,入学年份是2018年,材料学院,11班,03号

输入格式:

8位数字组成的学号。例如:18011103
注意:输入学号不是8位或者学院编号不是01、02、03、20其中之一,属于非法输入

输出格式:

学号每一项的完整说明。例如:
入学年份:2018年
学院:材料学院
班级:11
学号:03

注意:如非法输入,输出“Wrong Format"

输入样例:

在这里给出一组输入。例如:

18011103

输出样例:

在这里给出相应的输出。例如:

入学年份:2018年
学院:材料学院
班级:11
学号:03

输入样例1:

在这里给出一组输入。例如:

18013

输出样例1:

在这里给出相应的输出。例如:

Wrong Format

 

代码展示:

import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        String a;
        String year,college,clas,num;
        Scanner in = new Scanner(System.in);
        a = in.next();
        if(8!=a.length()) {
            System.out.print("Wrong Format");
            return;
        }
        year = a.substring(0,2);//字符串内提取字符
        college = a.substring(2,4);
        clas = a.substring(4,6);
        num = a.substring(6,8);
        if(college.equalsIgnoreCase("01")) {
            college = "材料学院";
        }else if(college.equalsIgnoreCase("02")) {
            college = "机械学院";
        }else if(college.equalsIgnoreCase("03")) {
            college = "外语学院";
        }else if(college.equalsIgnoreCase("20")) {
            college = "软件学院";
        }else {
            System.out.print("Wrong Format");
            return;
        }
        
        System.out.print("入学年份:20"+year+"年\n"
                + "学院:"+college+"\n"
                + "班级:"+clas+"\n"
                + "学号:"+num);
    }
 
}

 

踩坑心得:a.substring(0,2)--字符串内提取字符,括号内前一个数字代表字符串开头,后一个数字代表字符串结尾(但不包含);s.substring(a, b)表示截取下标从a开始到b结束的字符,包含第a个字符但是不包含第b个字符,可以看成[a,b)。

改进建议:最大复杂度(Max Complexity)和平均复杂度(Avg Complexity)几乎没有,要熟练java中的语法。

 

 

 

 

7-8 判断三角形类型

作者:段喜龙      单位:南昌航空大学

输入三角形三条边,判断该三角形为什么类型的三角形。

输入格式:

在一行中输入三角形的三条边的值(实型数),可以用一个或多个空格或回车分隔,其中三条边的取值范围均为[1,200]。

输出格式:

(1)如果输入数据非法,则输出“Wrong Format”;
(2)如果输入数据合法,但三条边不能构成三角形,则输出“Not a triangle”;
(3)如果输入数据合法且能够成等边三角形,则输出“Equilateral triangle”;
(3)如果输入数据合法且能够成等腰直角三角形,则输出“Isosceles right-angled triangle”;
(5)如果输入数据合法且能够成等腰三角形,则输出“Isosceles triangle”;
(6)如果输入数据合法且能够成直角三角形,则输出“Right-angled triangle”;
(7)如果输入数据合法且能够成一般三角形,则输出“General triangle”。

输入样例1:

在这里给出一组输入。例如:

50 50 50.0

输出样例1:

在这里给出相应的输出。例如:

Equilateral triangle

输入样例2:

在这里给出一组输入。例如:

60.2 60.2 80.56

输入样例3:

在这里给出一组输入。例如:

0.5 20.5 80

输出样例3:

在这里给出相应的输出。例如:

Wrong Format

 

代码展示:

import java.util.Scanner;
public class Main{
    public static void main(String args[]){
        Scanner in = new Scanner(System.in);
        double x,y,z,t;
        x = in.nextFloat();
        y = in.nextFloat();
        z = in.nextFloat();
        if(x>y){
            t=x;x=y;y=t;
        }
        if(x>z){
            t=x;x=z;z=t;
        }
        if(y>z){
            t=y;y=z;z=t;
        }
        if(x>=1&&x<=200&&y>=1&&y<=200&&z>=1&&z<=200){
            if(x+y>z) {


                if (x == y && y == z) {
                    System.out.print("Equilateral triangle\n");
                }else if (x * x + y * y - z * z < 0.000001 && x == y) {
                    System.out.print("Isosceles right-angled triangle\n");
                } else if ((x==y&&x!=z)||(x==z&&x!=y)||(y==z&&y!=x)) {
                    System.out.print("Isosceles triangle\n");
                } else if (x * x + y * y - z * z<0.000001 ) {
                    System.out.print("Right-angled triangle\n");
                } else {
                    System.out.print("General triangle\n");
                }
            }
            else
                System.out.print("Not a triangle\n");
        }
        else
            System.out.print("Wrong Format\n");
    }
}

 

 踩坑心得:在此处不能使用x*x+y*y==z*z进行判断会有误差,因使用x * x + y * y - z * z < 0.000001,注意精度(double和float的使用),以及证明直角三角形存在误差,设置一个很小的误差比如0.000001。

改进建议:最大复杂度(Max Complexity)和平均复杂度(Avg Complexity)远超良好,完全不合格(😓),类(class)太少,要学会将问题拆分,降低耦合度,每个模块的类和函数只干自己的部分,函数嵌套太深,减少函数嵌套,培养拆分问题能力,是面向对象oop课程的关键点之一,

加强自己的注释,要记得写注释。

 

 

 

 

 

 

第三次作业

7-3 定义日期类.

作者:段喜龙     单位:南昌航空大学

定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。
注意:不允许使用Java中和日期相关的类和方法,否则按0分处理。

要求:Date类结构如下图所示:

 

 

 

输入格式:

在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。

输出格式:

  • 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
  • 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日

输入样例1:

在这里给出一组输入。例如:

1912 12 25

  

输出样例1:

在这里给出相应的输出。例如:

Next day is:1912-12-26

 

输入样例2:

在这里给出一组输入。例如:

2001 2 30

输出样例2:

在这里给出相应的输出。例如:

Date Format is Wrong

 

代码展示:

import java.util.*;
class Date{
    private int day;
    private int month;
    private int year;
    int[] m = new int[] {0,31,28,31,30,31,30,31,31,31,30,31,30,31};
    //无参构造
    public void Date() {
       this.day = day;
    }
    public int getMonth() {
        return month;
    }
    public int getYear() {
        return year;
    }
    //含参构造
    public void Date(int year , int month, int day) {
        this.day = day;
        this.month = month;
        this.year = year;
    }
    public void setDay(int day) {
        this.day = day;
    }
    public void setMonth(int month) {
        this.month = month;
    }
    public void setYear(int year) {
        this.year = year;
    }
    public int getDay() {
        return day;
    }
    public boolean isLeapYear(int year) {
        if(year%400==0||(year%100!=0 && year%4 == 0)) {
            return true;
        }
        else
            return false;

    }
    public boolean checkInputValidity() {
        boolean result = false;
        if(this.year>=1900&&this.year<=2000&&this.month>=1&&this.month<=12&&this.day>=1&&this.day<=31) {
            if(this.isLeapYear(year)) {
                if(this.day>29&&this.month==2){
                    result = false;
                }
                else {
                    result = true;
                }

            }
            //闰年判定
            else if(!this.isLeapYear(year)) {
                if(this.day>28&&this.month==2){
                    result = false;
                }
                else {
                    result = true;
                }
            }
        }
        return result;
    }
    //具体日期+1情况讨论
    public void getNextDate() {
        if(!this.isLeapYear(year)) {
            this.m[2]=28;
        }
        else if(this.isLeapYear(year)) {
            this.m[2]=29;
        }
        if(this.month==12) {
            if(this.day==31) {
                this.year=year+1;
                this.month=1;
                this.day=1;
            }
            else {
                this.day=this.day+1;
                this.year=year;
                this.month=month;
            }
        }
        else {
            if(this.day==this.m[this.month]) {
                this.month=month+1;
                this.day=1;
                this.year=year;
            }
            else {
                this.year=year;
                this.month=month;
                this.day=day+1;
            }

        }
        System.out.printf("Next day is:%d-%d-%d\n",this.year,this.month,this.day);
    }
}
public class Main {
    public static void main(String[] args) {
        Scanner in =new Scanner(System.in);
        int year = in.nextInt();
        int month = in.nextInt();
        int day = in.nextInt();
        Date d = new Date();
        d.setDay(day);
        d.setMonth(month);
        d.setYear(year);
        d.isLeapYear(year);
        d.checkInputValidity();
        if(!d.checkInputValidity()) {
            System.out.println("Date Format is Wrong");
        }
        else if(d.checkInputValidity()) {
            d.getNextDate();
        }
    }

}

踩坑心得:题干需求此案构建一个Date的类,运用了有参构造与无参构造。类里的year,month,day都进行了私有化,这些私有变量将用this.来获取。再用题目中构造反对函数来进行构建函数。首先闰年判断,在实现闰年判断后,判断每个月份的合理(1~12月),再就判断每个月的日期是否合理(30日和31日/2月份分闰年和非闰年对应29和28),然后判断加一天后日期是否合理,需要跨月份,最后是12月跨年份进行增加。类Date编写完成后,在主类Main中构件对象date(Date date = new Date();)就可以通过date.调用类中的方法。
改进建议:根据SourceMonitor显示,该代码大部分在绿色合理区域,在算法和构造无参含参方面要更加熟练,调用私有化变量,进行封装也需要更加熟练,注释量要增加!

 

 

 

 

 

7-4 日期类设计

作者:段喜龙     单位:南昌航空大学

参考题目3和日期相关的程序,设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 除了创建该类的构造方法、属性的getter及setter方法外,需要编写如下方法:

public boolean checkInputValidity();//检测输入的年、月、日是否合法
public boolean isLeapYear(int year);//判断year是否为闰年
public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期
public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期
public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后)
public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等
public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数
public String showDate();//以“year-month-day”格式返回日期值

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

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

注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法(已提供,不需修改)

程序主方法如下:

import java.util.Scanner;

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

        int choice = input.nextInt();

        if (choice == 1) { // test getNextNDays method
            int m = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            m = input.nextInt();

            if (m < 0) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
            System.out.println(date.getNextNDays(m).showDate());
        } else if (choice == 2) { // test getPreviousNDays method
            int n = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            n = input.nextInt();

            if (n < 0) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(
                    date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
            System.out.println(date.getPreviousNDays(n).showDate());
        } else if (choice == 3) {    //test getDaysofDates method
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            int anotherYear = Integer.parseInt(input.next());
            int anotherMonth = Integer.parseInt(input.next());
            int anotherDay = Integer.parseInt(input.next());

            DateUtil fromDate = new DateUtil(year, month, day);
            DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);

            if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
                System.out.println("The days between " + fromDate.showDate() + 
                        " and " + toDate.showDate() + " are:"
                        + fromDate.getDaysofDates(toDate));
            } else {
                System.out.println("Wrong Format");
                System.exit(0);
            }
        }
        else{
            System.out.println("Wrong Format");
            System.exit(0);
        }        
    }
}

输入格式:

有三种输入方式(以输入的第一个数字划分[1,3]):

  • 1 year month day n //测试输入日期的下n天
  • 2 year month day n //测试输入日期的前n天
  • 3 year1 month1 day1 year2 month2 day2 //测试两个日期之间相差的天数

输出格式:

  • 当输入有误时,输出格式如下:
    Wrong Format
  • 当第一个数字为1且输入均有效,输出格式如下:
    year1-month1-day1 next n days is:year2-month2-day2
  • 当第一个数字为2且输入均有效,输出格式如下:
    year1-month1-day1 previous n days is:year2-month2-day2
  • 当第一个数字为3且输入均有效,输出格式如下:
    The days between year1-month1-day1 and year2-month2-day2 are:值

输入样例1:

在这里给出一组输入。例如:

3 2014 2 14 2020 6 14

输出样例1:

在这里给出相应的输出。例如:

The days between 2014-2-14 and 2020-6-14 are:2312

输入样例2:

在这里给出一组输入。例如:

2 1834 2 17 7821

输出样例2:

在这里给出相应的输出。例如:

1834-2-17 previous 7821 days is:1812-9-19

输入样例3:

在这里给出一组输入。例如:

1 1999 3 28 6543

输出样例3:

在这里给出相应的输出。例如:

1999-3-28 next 6543 days is:2017-2-24

输入样例4:

在这里给出一组输入。例如:

0 2000 5 12 30

输出样例4:

在这里给出相应的输出。例如:

Wrong Format

 

代码展示:

import java.util.Scanner;

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

        int choice = input.nextInt();

        if (choice == 1) { // test getNextNDays method
            int m = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            m = input.nextInt();

            if (m < 0) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
            System.out.println(date.getNextNDays(m).showDate());
        } else if (choice == 2) { // test getPreviousNDays method
            int n = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            n = input.nextInt();

            if (n < 0) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(
                    date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
            System.out.println(date.getPreviousNDays(n).showDate());
        } else if (choice == 3) {    //test getDaysofDates method
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            int anotherYear = Integer.parseInt(input.next());
            int anotherMonth = Integer.parseInt(input.next());
            int anotherDay = Integer.parseInt(input.next());

            DateUtil fromDate = new DateUtil(year, month, day);
            DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);

            if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
                System.out.println("The days between " + fromDate.showDate() +
                        " and " + toDate.showDate() + " are:"
                        + fromDate.getDaysofDates(toDate));
            } else {
                System.out.println("Wrong Format");
                System.exit(0);
            }
        }
        else{
            System.out.println("Wrong Format");
            System.exit(0);
        }
    }
}

class DateUtil{
    //私有化
    private int year;
    private int month;
    private int day;
    private int [] mon_maxnum = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
    //构造
    public DateUtil() {
    }
    public DateUtil(int year,int month,int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public int getYear() {
        return year;
    }
    public void setYear(int year) {
        this.year = year;
    }
    public int getMonth() {
        return month;
    }
    public void setMonth(int month) {
        this.month = month;
    }
    public int getDay() {
        return day;
    }
    public void setDay(int day) {
        this.day = day;
    }
    //判断
    public boolean checkInputValidity(){
        if(isLeapYear(year)){
            mon_maxnum[2]=29;
        }else{
            mon_maxnum[2]=28;
        }
        if(this.year<1820||this.year>2020||this.month<1||this.month>12||this.day<1||this.day>mon_maxnum[this.month]){
            return false;
        }else{
            return true;
        }
    }
    public boolean isLeapYear(int year){
        if(year%400==0||(year%4==0&&year%100!=0)){
            return true;
        }else{
            return false;
        }
    }//计算
    //
    //
    //

    public DateUtil getNextNDays(int n){
        if(isLeapYear(year)){
            mon_maxnum[2] = 29;
        }else{
            mon_maxnum[2] = 28;
        }
        if(n>2100000000){
            getNextNDays(2100000000);
            n -= 2100000000;
        }
        day = day + n;
        //***if或者while 等会测试
        while(day>mon_maxnum[month]) {
            day = day - mon_maxnum[month];
            month = month + 1;
            if (month == 13) {
                month = month - 12;//测试
                year = year + 1;
                if (isLeapYear(year)) {
                    mon_maxnum[2] = 29;
                } else {
                    mon_maxnum[2] = 28;
                }
            }
        }
        return this;
    }
    public DateUtil getPreviousNDays(int n){
        day = day - n;
        while(day<1){
            if(isLeapYear(year)){
                mon_maxnum[2]=29;
            }else{
                mon_maxnum[2]=28;
            }
            month = month - 1;
            if(month==0){
                month = month + 12;//测试
                year = year -1;
            }
            day =day + mon_maxnum[month];
        }
        return this;
    }
    public boolean compareDates(DateUtil date){
        if(this.year>date.year||(this.year==date.year&&this.month>date.month)||(this.year==date.year&&this.month==date.month&&this.day>date.day)) {
            return true;
        }else{
            return false;
        }
    }
    public boolean equalTwoDates(DateUtil date){
        if(this.year==date.year&&this.month==date.month&&this.day==date.day) {
            return true;
        }else{
            return false;
        }
    }
    public int getDaysofDates(DateUtil date){
        int d = date.day - this.day;
        if(this.month>date.month){
            for(int i = date.month;i<this.month;i++){
                if(isLeapYear(date.year)){
                    mon_maxnum[2]=29;
                }else{
                    mon_maxnum[2]=28;
                }
                d =d - mon_maxnum[i];
            }
        }else{
            for (int j = this.month; j < date.month; j++) {
                if(isLeapYear(date.year)){
                    mon_maxnum[2]=29;
                }else{
                    mon_maxnum[2]=28;
                }
                d =d + mon_maxnum[j];
            }
        }
        if(this.year > date.year) {
            int y = date.year;
            //测试
            if(y>this.year){
                if(isLeapYear(y)) {
                    d = d - 366;
                }else{
                    y = y - 365;
                }
                y = y+1;
            }
        }else{
            int y = this.year;
            while(date.year>y){
                if(isLeapYear(y)) {
                    d =d + 366;
                }else{
                    d =d + 365;
                }
                y = y+1;
            }
        }
        return d;
    }
    public String showDate(){
        return year+"-"+month+"-"+day;
    }
}

 踩坑心得:前n天以及后n天会不会超过年份范围,月份范围,日期范围的算法运算,以及最大整型的取值范围是否会“爆开”。最大值与最小值的范围运算。在改进的过程中发现int的最大取值范围2147483647会报错,而取到2100000000时不会报错,说明取到日期最大不超过21000000000,

对于测试点的通过还要一次一次的测试,一般数据下对于日期测试调试时都是通过,对于每月最大日期用数组来表示,前提是数组第一个数不为一月,更好表示各个月份所代表的最大日期。其他会踩坑点大体与7-3一致。

 改进建议:尽量减少代码繁琐,多加注释,测试数据要考虑极大值的取值,并且注意整型或浮点型是否能取得到,多思考算法考虑情况完全再进行提交,根据Source Monitor图标显示,平均复杂程度(Avg Complexity)与最大复杂度(Max Complexity)较高远超绿色良好范围,但函数嵌套不深,尽量减少函数复杂程度,注释量要达到良好水平。

 

 

 

总结

  三次作业有时候会遇到困难,主要方面还是语法积累不足,以及对上课内容并没有完全理解,课下应该多自学语法内容,并且及时预习,上课时就不会茫然不知;对于面向对象程序设计这门课,更多的要学会将问题拆分化,降低类与类之间的耦合性,

增加内聚性,对于代码的优劣判断并不只是通过了测试,更应该是学会如何使代码更具有高效性,可维护性,可发展性,后面的作业学着对自己的代码进行注释,增加可读性。对老师的内容及时进行巩固,在后面的作业中做到一提就对!

 

posted on 2023-03-26 09:31  桃止  阅读(62)  评论(0编辑  收藏  举报