OOP学习的第二次BLOG

发布时间 2023-04-27 23:43:43作者: 3starry

褚鑫豪

(1)前言:

  在完成了第四次到第六次的pta题目集作业后,进一步了解熟悉了对类以及对象的的使用。理解并实现类之间关系,类中方法的编写和使用。学会如何在多个类属于聚合关系时,如何去逐层调用不同类中的属性与方法。学会用Array类中自带的排序方法去排序,去简短排序时间。理解封装性的写法以及学会在面对私有属性如何调用。同时学习了正则表达式的部分语法。

  三次作业的题目量都不算多,但是每一次的作业难度都较大,尤其是题目集6的7-1以及题目集4的7-1,皆为迭代了多次之后所呈现出来的题目,需要花大量的时间去完成,个人认为难度较大,涉及的知识点很多,考察范围广。

(2)设计与分析:

题目及4的7-5:

  题目集4的7-1要求我们完成编写一个菜单计价程序,在初步阅读题目要求后,发现题目要求很多,并且是别人迭代了多次之后的题目之后,便没有了动手做下去的动力,于是不出意外的一0分收尾。在此之后,也是发现不应该以这样的心态去面对问题,不能还没动手就怕。

题目集5的7-5:

 

类图如下

源码如下:

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) {
            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.println(date.getNextNDays(m).showDate());
        } else if (choice == 2) {
            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.println(date.getPreviousNDays(n).showDate());
        } else if (choice == 3) {
            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(fromDate.getDaysofDates(toDate));
            } else {
                System.out.println("Wrong Format");
                System.exit(0);
            }
        }
        else{
            System.out.println("Wrong Format");
            System.exit(0);
        }        
    }
}

class DateUtil{
    Day day;
    
    DateUtil(){
        
    }
    
    DateUtil (int day,int month, int year){
           this.day = new Day(day, month, year);
    }
    
    Day getDay(){
        return this.day;
    }
    
    void setDay(Day day){
        this.day = day;
    }
    
    public boolean checkInputValidity() {
        
        if (getDay().validate() && getDay().getMonth().validate() && getDay().getMonth().getYear().validate())
            return true;
        else
            return false;
    }
    
    public boolean compareDates(DateUtil date) {
        if (getDay().getMonth().getYear().getValue() > date.getDay().getMonth().getYear().getValue())
            return true;
        else if (getDay().getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue() && getDay().getMonth().getValue() > date.getDay().getMonth().getValue())
            return true;
        else if (getDay().getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue() && getDay().getMonth().getValue() > date.getDay().getMonth().getValue() && getDay().getValue() > date.getDay().getValue())
            return true;
        else
            return false;
    }
    
    public boolean equalTwoDates(DateUtil date) {
        if (getDay().getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue() && getDay().getMonth().getValue() == date.getDay().getMonth().getValue() && getDay().getValue() == date.getDay().getValue())
            return true;
        else
            return false;
    }
    
    public String showDate() {
        return getDay().getMonth().getYear().getValue()+"-"+getDay().getMonth().getValue()+"-"+day.getValue();
    }
    
    public DateUtil getNextNDays(int n)//取得year-month-day的下n天日期
    {
        int year = getDay().getMonth().getYear().value;
        int month = getDay().getMonth().value;
        int day = getDay().value;
        for (int i = 0; i < n; i++) {
            day++;
            if (day > getDay().mon_maxnum[getDay().getMonth().value] && !(getDay().getMonth().getYear().isLeapYear())) {
                day = 1;
                month++;
            }
           if(getDay().getMonth().getYear().isLeapYear() && getDay().getMonth().value == 2 && day > 29) {
               day = 1;
               month++;
           }
           
           if (day > getDay().mon_maxnum[getDay().getMonth().value] && getDay().getMonth().getYear().isLeapYear() && getDay().getMonth().value != 2) {
               day = 1;
               month++;
           }
           if (month > 12) {
               month = 1;
               year++;
           }
            getDay().getMonth().value = month;
            getDay().getMonth().getYear().setValue(year);
        }
        return new DateUtil(year, month, day);
    }
    
    public DateUtil getPreviousNDays(int n) {
        int flag = 0;
        while(n != 0) {
            if (getDay().getValue() > n) {
                getDay().value -= n;
                flag++;
            }
            else {
                n = n - getDay().value;
                getDay().getMonth().monthReduction();
                if (getDay().getMonth().getValue() == 0) {
                    getDay().getMonth().resetMax();
                    getDay().getMonth().getYear().yearReduction();
                    }
                if (getDay().getMonth().getValue() == 2 && getDay().getMonth().getYear().isLeapYear())
                    getDay().value = 29;
                else
                    getDay().value = getDay().mon_maxnum[getDay().getMonth().getValue()];
            }
            for (int i = getDay().getMonth().getValue(); n > getDay().mon_maxnum[i]; i--) {
                if (i == 2 && getDay().getMonth().getYear().isLeapYear())
                    n -= 29;
                else
                    n -= getDay().mon_maxnum[i];
                getDay().getMonth().monthReduction();
                if (getDay().getMonth().getValue() == 0) {
                    getDay().getMonth().resetMax();
                    getDay().getMonth().getYear().yearReduction();
                    i = 13;
                    }
                if (getDay().getMonth().getValue() == 2 && getDay().getMonth().getYear().isLeapYear())
                    getDay().value = 29;
                else
                    getDay().value = getDay().mon_maxnum[getDay().getMonth().getValue()];
            }
            if (getDay().value > n && flag != 1) {
                getDay().value -= n;
                n = 0;
            }
            if (flag == 1)
                n = 0;
        }
        DateUtil date1 = new DateUtil(getDay().getMonth().getYear().getValue(), getDay().getMonth().getValue(), getDay().value);
        return date1;
    }
    
    public int getDaysofDates(DateUtil date) {
        DateUtil dateUtil1 = this;//较小的
        DateUtil dateUtil2 = date;//较大的
        if (this.compareDates(date)) {
            dateUtil1 = date;
            dateUtil2 = this;
        }

        int days = 0;
        int leapYearNum = 0;
        
        for (int i = dateUtil1.getDay().getMonth().getYear().getValue(); i < dateUtil2.getDay().getMonth().getYear().getValue(); i++) {
            if (i % 400 == 0 || i % 4 == 0 && i % 100 !=0 && i + 1 < dateUtil2.getDay().getMonth().getYear().getValue()) {
                leapYearNum++;
            }
        }

        if (dateUtil2.getDay().getMonth().getYear().getValue() - dateUtil1.getDay().getMonth().getYear().getValue() > 1) 
        days = 365 * (dateUtil2.getDay().getMonth().getYear().getValue() - dateUtil1.getDay().getMonth().getYear().getValue()-1) + leapYearNum;
        
        if(dateUtil1.getDay().getMonth().getYear().value != dateUtil2.getDay().getMonth().getYear().value){
        for (int i = dateUtil1.getDay().getMonth().value + 1; i <= 12; i++) {
            if(dateUtil1.getDay().getMonth().getYear().isLeapYear() && i == 2)
                    days += 29;
            else
                    days += dateUtil1.getDay().mon_maxnum[i];
        }
        for (int i = 1; i < dateUtil2.getDay().getMonth().value; i++) {
            if (dateUtil2.getDay().getMonth().getYear().isLeapYear() && i == 2)
                    days += 29;
            else
                    days += dateUtil2.getDay().mon_maxnum[i];
        }
        if (dateUtil1.getDay().getMonth().value == 2 && dateUtil1.getDay().getMonth().getYear().isLeapYear())
            days = days + 29 - dateUtil1.getDay().value + dateUtil2.getDay().value;
        else
            days = days + dateUtil1.getDay().mon_maxnum[dateUtil1.getDay().getMonth().value] - dateUtil1.getDay().value + dateUtil2.getDay().value;
        }
     if (dateUtil1.getDay().getMonth().getYear().value == dateUtil2.getDay().getMonth().getYear().value && dateUtil2.getDay().getMonth().value > dateUtil1.getDay().getMonth().value) {
        days += dateUtil2.getDay().value;
        if (dateUtil1.getDay().getMonth().getYear().isLeapYear() && dateUtil1.getDay().getMonth().value == 2)
            days = days + 29 - dateUtil1.getDay().value;
        else
            days = days + dateUtil1.getDay().mon_maxnum[dateUtil1.getDay().getMonth().value] - dateUtil1.getDay().getMonth().value;
        dateUtil1.getDay().getMonth().value += 1;
        for (int i = dateUtil1.getDay().getMonth().value; i < dateUtil2.getDay().getMonth().value; i++)
            if (i % 400 == 0 || i% 4 == 0 && i % 100 != 0) {
                if (i == 2)
                    days += 29;
                else
                    days += getDay().mon_maxnum[i];
            }
    }
    else
        days += dateUtil2.getDay().value - dateUtil1.getDay().value;
    return days;
    } 
}

class Day{
    int value;
    Month month;
    int[] mon_maxnum = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    
    Day(){
        
    }
    
    Day(int yearValue, int monthValue, int dayValue){
//        this.getMonth().getYear().setValue(yearValue);
//        this.getMonth().setValue(monthValue);
//        value = dayValue;
        this.month = new Month(yearValue, monthValue);
        value = dayValue;
    }
    
    int getValue() {
        return value;
    }
    
    void setValue(int value){
        this.value = value;
    }
    
    Month getMonth() {
        return month;
    }
    
    void setMonth(Month value) {
        this.month = value;
    }
    
    void reseMin() {
        this.value = 1;
    }
    
    void reseMax() {
        if(value > 0 && this.getMonth().getYear().isLeapYear()) {//闰年
            if(this.getMonth().getValue() == 2 && value <= 29) {//闰年二月
                this.value = 29;
            }
        }
        this.value = mon_maxnum[getValue()];//非闰年二月份时日期的最大值
    }
    
    boolean validate() {
        boolean a = false;
        if(this.getMonth().getValue() > 0 && this.getMonth().getValue() < 13) {
        if(this.value > 0 && this.getMonth().getYear().isLeapYear() && this.getMonth().getValue() == 2 && this.value <= 29) {//闰年
            a = true;
        }
        else if(value > 0 && value <= mon_maxnum[getMonth().value]){//除去二月的其他月份
            a = true;
            }
        }
        else
            a = false;
        return a;
        
    }
    
    void dayIncrement() {
        this.value++;
    }
    
    void dayReduction() {
        this.value--;
    }
}
    class Month{
        int value;
        Year year;
        
        Month(){
            
        }
        
        Month(int yearValue, int monthValue){
            this.year = new Year(yearValue);
            this.value = monthValue;
        }
        
        int getValue() {
            return this.value;
        }
        
        void setValue(int value){
            this.value = value;
        }
        
        Year getYear() {
            return this.year;
        }
        
        void setYear(Year value) {
            this.year = value;
        }
        
        void resetMin() {
            this.value = 1;
        }

        void resetMax(){
            this.value = 12;
        }
        
        boolean validate() {
            if(value > 0 && value < 13)
                return true;
            else
                return false;
        }
        
        void monthIncrement() {
            this.value++;
        }
        
        void monthReduction() {
            this.value--;
        }
    }
    
    class Year{
        int value;
        
        Year(){
            
        }
        
        Year(int value){
            this.value = value;
        }
        
        int getValue(){
            return value;
        }
        
        void setValue(int value) {
            this.value = value;
        }
        
        boolean isLeapYear() {
            if (value % 400 == 0 || value % 4 == 0 && value % 100 != 0)
                return true;
            else
                return false;
        }
        
        boolean validate() {
            if(value >= 1900 && value <= 2050)
                return true;
            else
                return false;
        }
        
        void yearIncrement() {
            this.value++;
        }
        
        void yearReduction() {
            this.value--;
        }
    }

首先我们需要实现dateutil,day,month,year这三个类之间的聚合关系,以降低类之间的耦合性,这就需要我去学会如何使用getter/setter方法去一层层调用不同类中的属性与方法。其中大部分的方法只需要按照上一次实验的代码为参照稍加修改,对各个属性的访问方法进行修改。

例如对于闰年的判断

需要从Month类中去一层层调用至year类中去才可实现

 相较于之前的日期问题的代码,在每个类中都增加了一个自增和自减以及判断是否需要复位的方法,这样能够更方便的对日期自增自减以及复位进行操作,

部分实现代码如下

 

 在基于之前的代码基础上修改的过程中,发现许多算法的不合理性,这也就导致在写这次题目时,有相当一部分的代码需要重新编写,花费了大量的时间,因此,在以后的题目中,我更应该对算法逻辑的合理性以及代码的复写性进行思考,以便以后对此代码的迭代扩充。

 

题目集4的7-6:

 

类图如下

 

 

源码如下:

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) {
            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().value + "-" + date.getMonth().value + "-" + date.getDay().value + " next " + m + " days is:");
            System.out.println(date.getNextNDays(m).showDate());
        } else if (choice == 2) {
            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().value + "-" + date.getMonth().value + "-" + date.getDay().value + " previous " + n + " days is:");
            System.out.println(date.getPreviousNDays(n).showDate());
        } else if (choice == 3) {
            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{
    Day day;
    Month month;
    Year year;
    int[] mon_maxnum = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    
    DateUtil(){
        
    }
    
    DateUtil (int year,int month, int day){
           this.day = new Day(day);
           this.month = new Month(month);
           this.year = new Year(year);
    }
    
    Year getYear() {
        return this.year;
    }
    
    void setYear(Year year) {
        this.year = year;
    }
    
    Month getMonth() {
        return this.month;
    }
    
    void setMonth(Month month) {
        this.month = month;
    }
    
    Day getDay(){
        return this.day;
    }
    
    void setDay(Day day){
        this.day = day;
    }
    
    public boolean checkInputValidity() {
        
        if (month.validate() && year.validate())
            return true;
        else
            return false;
    }
    
    public boolean compareDates(DateUtil date) {
        if (getYear().getValue() > getYear().getValue())
            return true;
        else if (getYear().getValue() == date.getYear().getValue() && getMonth().getValue() > date.getMonth().getValue())
            return true;
        else if (getYear().getValue() == date.getYear().getValue() && getMonth().getValue() > date.getMonth().getValue() && getDay().getValue() > date.getDay().getValue())
            return true;
        else
            return false;
    }
    
    public boolean equalTwoDates(DateUtil date) {
        if (getYear().getValue() == date.getYear().getValue() && getMonth().getValue() == date.getMonth().getValue() && getDay().getValue() == date.getDay().getValue())
            return true;
        else
            return false;
    }
    
    public String showDate() {
        return getYear().getValue()+"-"+getMonth().getValue()+"-"+day.getValue();
    }
    
    public DateUtil getNextNDays(int n)//取得year-month-day的下n天日期
    {
        int year = getYear().value;
        int month = getMonth().value;
        int day = getDay().value;
        for (int i = 0; i < n; i++) {
            day++;
            if (day > mon_maxnum[month] && !(getYear().isLeapYear())) {
                day = 1;
                month++;
            }
           if(getYear().isLeapYear() && getMonth().value == 2 && day > 29) {
               day = 1;
               month++;
           }
           
           if (month > 12) {
               month = 1;
               year++;
           }
           
           if (day > mon_maxnum[month] && getYear().isLeapYear() && getMonth().value != 2) {
               day = 1;
               month++;
           }

           if (month > 12) {
               month = 1;
               year++;
           }
           
            getMonth().value = month;
            getYear().setValue(year);
        }
        return new DateUtil(year, month, day);
    }
    
    public DateUtil getPreviousNDays(int n) {
        int flag = 0;
        while(n != 0) {
            if (getDay().getValue() > n) {
                getDay().value -= n;
                flag++;
            }
            else {
                n = n - getDay().value;
                getMonth().monthReduction();
                if (getMonth().getValue() == 0) {
                    getMonth().resetMax();
                    getYear().yearReduction();
                    }
                if (getMonth().getValue() == 2 && getYear().isLeapYear())
                    getDay().value = 29;
                else
                    getDay().value = mon_maxnum[getMonth().value];
            }
            for (int i = getMonth().getValue(); n > mon_maxnum[i]; i--) {
                if (i == 2 && getYear().isLeapYear())
                    n -= 29;
                else
                    n -= mon_maxnum[i];
                getMonth().monthReduction();
                if (getMonth().getValue() == 0) {
                    getMonth().resetMax();
                    getYear().yearReduction();
                    i = 13;
                    }
                if (getMonth().getValue() == 2 && getYear().isLeapYear())
                    getDay().value = 29;
                else
                    getDay().value = mon_maxnum[getMonth().getValue()];
            }
            if (getDay().value > n && flag != 1) {
                getDay().value -= n;
                n = 0;
            }
            if (flag == 1)
                n = 0;
        }
        DateUtil date1 = new DateUtil(getYear().getValue(), getMonth().getValue(), getDay().value);
        return date1;
    }
    
    public int getDaysofDates(DateUtil date) {
        DateUtil dateUtil1 = this;//较小的
        DateUtil dateUtil2 = date;//较大的
        if (this.compareDates(date)) {
            dateUtil1 = date;
            dateUtil2 = this;
        }

        int days = 0;
        int leapYearNum = 0;
        
        for (int i = dateUtil1.getYear().getValue(); i < dateUtil2.getYear().getValue(); i++) {
            if (i % 400 == 0 || i % 4 == 0 && i % 100 !=0 && i + 1 < dateUtil2.getYear().getValue()) {
                leapYearNum++;
            }
        }

        if (dateUtil2.getYear().getValue() - dateUtil1.getYear().getValue() > 1) 
        days = 365 * (dateUtil2.getYear().getValue() - dateUtil1.getYear().getValue()-1) + leapYearNum;
        
        if(dateUtil1.getYear().value != dateUtil2.getYear().value){
        for (int i = dateUtil1.getMonth().value + 1; i <= 12; i++) {
            if(dateUtil1.getYear().isLeapYear() && i == 2)
                    days += 29;
            else
                    days += dateUtil1.mon_maxnum[i];
        }
        for (int i = 1; i < dateUtil2.getMonth().value; i++) {
            if (dateUtil2.getYear().isLeapYear() && i == 2)
                    days += 29;
            else
                    days += dateUtil2.mon_maxnum[i];
        }
        if (dateUtil1.getMonth().value == 2 && dateUtil1.getYear().isLeapYear())
            days = days + 29 - dateUtil1.getDay().value + dateUtil2.getDay().value;
        else
            days = days + dateUtil1.mon_maxnum[dateUtil1.getMonth().value] - dateUtil1.getDay().value + dateUtil2.getDay().value;
        }
     if (dateUtil1.getYear().value == dateUtil2.getYear().value && dateUtil2.getMonth().value > dateUtil1.getMonth().value) {
        days += dateUtil2.getDay().value;
        if (dateUtil1.getYear().isLeapYear() && dateUtil1.getMonth().value == 2)
            days = days + 29 - dateUtil1.getDay().value;
        else
            days = days + dateUtil1.mon_maxnum[dateUtil1.getMonth().value] - dateUtil1.getMonth().value;
        dateUtil1.getMonth().value += 1;
        for (int i = dateUtil1.getMonth().value; i < dateUtil2.getMonth().value; i++)
            if (i % 400 == 0 || i% 4 == 0 && i % 100 != 0) {
                if (i == 2)
                    days += 29;
                else
                    days += mon_maxnum[i];
            }
    }
    else if(dateUtil1.getYear().value == dateUtil2.getYear().value && dateUtil1.getMonth().value == dateUtil2.getMonth().value)
        days += dateUtil2.getDay().value - dateUtil1.getDay().value;
    //else
        
    return days;
    } 
}

class Day{
    int value;
    
    Day(){
        
    }
    
    Day(int value){
        this.value = value;
    }
    
    int getValue() {
        return value;
    }
    
    void setValue(int value){
        this.value = value;
    }
    
    void dayIncrement() {
        this.value++;
    }
    
    void dayReduction() {
        this.value--;
    }
}
    class Month{
        int value;
        
        Month(){
            
        }
        
        Month(int value){
            this.value = value; 
        }
        
        int getValue() {
            return this.value;
        }
        
        void setValue(int value){
            this.value = value;
        }
        
        void resetMin() {
            this.value = 1;
        }

        void resetMax(){
            this.value = 12;
        }
        
        boolean validate() {
            if(value > 0 && value < 13)
                return true;
            else
                return false;
        }
        
        void monthIncrement() {
            this.value++;
        }
        
        void monthReduction() {
            this.value--;
        }
    }
    
    class Year{
        int value;
        
        Year(){
            
        }
        
        Year(int value){
            this.value = value;
        }
        
        int getValue(){
            return value;
        }
        
        void setValue(int value) {
            this.value = value;
        }
        
        boolean isLeapYear() {
            if (value % 400 == 0 || value % 4 == 0 && value % 100 != 0)
                return true;
            else
                return false;
        }
        
        boolean validate() {
            if(value >= 1820 && value <= 2020)
                return true;
            else
                return false;
        }
        
        void yearIncrement() {
            this.value++;
        }
        
        void yearReduction() {
            this.value--;
        }
    }

该题目要求与上一道又略有不同,year,month,day三个类各个都与dateutil类形成聚合关系,这也就使得程序在调用这三个类中的属性方法时,不需要一层层去调用可以直接调用,而在对代码进行修改的过程中,需要注意的就是将属性的访问方式修改以及,在算法上略微改动。同时需要需要注意,改题目的年份范围与上一题是有差异的

 

 

 心得:

  在对于以上两种聚合方式的编写,对不同的聚合方式的利与弊有了初步的认识,也知道了同一种题目要求可以拥有多种结构模式,而不同的结构模式,对于一个代码往后的修改有很大的影响,一个好的模式,能更好的服务于未来的各种需求。

 

题目集6的7-1:

  在得知题目集6的题目是之前题目集4的迭代时,就知道,这次大概率时完不成了的,再加之老师之前所说至少20h+,有所恐惧,但在题目集4第一题未作出的情况下,觉得自己还是要试一试,之后在eclipse上进行的部分功能的编写,也是花费了不少的时间,但是最后代码总是出现种种问题,同时对题目的要求也是有部分没能看懂,从而进一步导致对完成这道题失去了动力与信心。虽然没能完成该题,但我认为,也是跨出了自己不敢尝试的一步,希望下次,更加努力,去完成每一道题目。

(3)踩坑心得:

   在完成此次三次题目集之后,发现了自己对各种类之间的关系的不明确,不清楚各种关系的定义,就如在初次看到两种聚合关系类图时,根本不清楚要如何去实现,也是在后续的自主学习过程中逐步理解聚合,就光看第五次题目集的两道相,是较于另外没写的题来说算简单的,但是也是花了大量的时间去完成,期间不断的调试出现的问题,包括月份不能复位,或者是日期不能返回最大值。

public DateUtil getNextNDays(int n)//取得year-month-day的下n天日期
    {
        int year = getYear().value;
        int month = getMonth().value;
        int day = getDay().value;
        for (int i = 0; i < n; i++) {
            day++;
            if (day > mon_maxnum[month] && !(getYear().isLeapYear())) {
                day = 1;
                month++;
            }
           if(getYear().isLeapYear() && getMonth().value == 2 && day > 29) {
               day = 1;
               month++;
           }
           
           if (month > 12) {
               month = 1;
               year++;
           }
           
           if (day > mon_maxnum[month] && getYear().isLeapYear() && getMonth().value != 2) {
               day = 1;
               month++;
           }

           if (month > 12) {
               month = 1;
               year++;
           }
           
            getMonth().value = month;
            getYear().setValue(year);
        }
        return new DateUtil(year, month, day);
    }

在编写计算下n天日期的方法中,在判断完月份或者日期达到最大值时,经常忘记要将年份或者月份加一,这也就导致在调试过程中反复在同一个问题下进行多次的调试找错。在这类错误中,突出了我在编写代码时,对自己的逻辑不够清晰,或者是在面对较为复杂的逻辑算法时,需要去用笔写下来,及时提醒自己当心某类容易忽略的错误。

(4)改进建议:

   首先,格式问题,在代码量一大时,在写完之后,通篇去扫视代码,会觉得很乱,不能一眼看到自己想要的东西,这需要我在今后的学习中不断去学习如何将代码写的至少要清晰明了。代码的清晰不光方便自己之后的调试修改,同时养成这样一个好的习惯,我认为也是有利于以后的职业道路。

  其次就是逻辑的不清晰,尤其在面对较为复杂的问题时,会把自己绕晕,并且不能及时找到错误的地方在哪,因此,善于在纸上写写画画,就显得很有必要了。因为在之前学习c语言时,我们所面对的都是相对简单的问题,自己在脑中构思一下就够了,而现在面向对象呈现的要求,这是就不光是仅靠大脑去构思能解决的了,所有有必要拿起笔去多画。

(5)总结:

  完成了三次作业之后,也是深刻意识到学习java不再是和之前学习c语言那样,不仅是知识点难度上升了,同时知识量也大大增加。在每一次完成pta作业时不能有意识地督促自己尽快完成作业,而导致在最后三天来花大量的时间去完成,在经历这一次的叫教训之后,我应该想办法拿出更多的时间去及时完成作业,这样也就不会再次出现周末两天写整整两天的作业而得不到休息的情况。

  而这三次作业对我的练习来说,深刻意识到自己没能跟上学习进度,没能习惯java学习的节奏。不过在补充学习过程中,进一步的拓宽了我对Java这么语言以及这门课程的认知,想要学好,真的需要花大量的时间,不然最后跟不上的雪球只会越滚越大,只有在对相应的知识点有了系统的学习,之后再进行题目的训练,这样才能达到最大的效率,所有,在以后完成作业时,一定要先保证自己已经将所考察的知识点已经有了初步的学习。我认为这次作业我从中获得的不仅是这些java的知识,同样也锻炼了自己的耐心,在前两个周末的作业中,都可以让强迫自己静下心来去完成,尽管期间很痛苦,因为写了很久但是还没有完成题目要求,一坐就是一下午直到晚上。当然,我不知道是我能力的不太行还是哪方面,对于一些问题总是要花很长的时间去完成,长到我自己都不敢想,但我又是那种偏要做出来的性格,这也就导致了花大把的时间去完成最后一两道题。虽然题目最终没能拿到满分,但我认为,我已经尽力去完成了。而在完成题目集之后,及时去学习之前没能弄得很明白的一些知识点,学习到了很多东西,刷新了面向对象这门语言的认知,也更加知道了自己之前对许多概念的错误的理解,而学习到的大量的知识,也让我对学习好这门课程重新看到了希望,也是发现了这门语言的优越性,知道了语言不应该只有简简单单的语法,其中的一些结构,模式,等等才是重中之重。希望在接下来的java学习过程中能够保持对java知识的渴望,不要畏惧难题,不要随大流,要努力做好自己力所能及的每一件事,尽力去完成每一道题。