第一次博客作业

1.前言

2.设计与分析

3.踩坑心得

4.改进建议

5.总结

 

前言

这三次题目集的主要知识点是对于类的定义以及使用,而难度主要是题目集3的7-1,7-2,主要是其算法需要仔细思考。

而题目集1的题目量会稍微的更多一些,但也都较为简单,都是考查基础的。而题目集二属于题量适中,题目难度也适中。

以下是对于部分难题的具体分析

 

                                                                    7-2 串口字符解析 (50 分)
 

RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,

相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前

加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有

效数据是8位,奇偶校验位采用奇校验。

输入格式:

由0、1组成的二进制数据流。例如:11110111010111111001001101111111011111111101111

输出格式:

过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
如有多个数据,每个数据单独一行显示。
若数据不足11位或者输入数据全1没有起始位,则输出"null data",
若某个数据的结束符不为1,则输出“validate error”。
若某个数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。
如:11011或11111111111111111。
例如:
1:11101011
2:01001101
3:validate error

输入样例:

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

1111011101011111111111

输出样例:

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

1:11101011

输入样例1:

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

11110111010111111001001101111111011111111101111

输出样例1:

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

1:11101011
2:01001101
3:validate error

输入样例2:

输入数据不足11位。例如:

111101

输出样例2:

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

null data

输入样例3:

输入数据全1没有起始位。例如:

1111111111111111

输出样例3:

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

null data

输入样例4:

输入数据全1没有起始位。例如:

111101110101111111101111111101

输出样例4:

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

1:11101011
2:parity check error

输入样例5:

两组数据结束符和奇偶校验均不合格。例如:

111000000000000011100000000000000

输出样例5:

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

1:validate error
2:validate error

输入样例6:

两组数据,数据之间无空闲位。例如:

1110000000001100111000001

输出样例6:

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

1:00000000
2:01110000

我的答案:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) 
    {
        Scanner input = new Scanner(System.in);
        String str;
        str=input.next();
        int i,j,a=1;
        int flag=1,b=0;
        int t=0;
        for(i=0;i<str.length();i++)
        {
            if(str.charAt(i)=='0')
            {
                flag=0;
                break;
            }
            else
            {
                flag=1;
            }
        }
        if(str.length()>=11)//有11位
        {
            if(flag==0)//有起始位‘0’
                {
                for(i=0;i<str.length();i++)
                    {
                        if(str.charAt(i)=='0')
                        {
                            for(j=i;j<=i+8;j++)
                            {
                                if(str.charAt(j)=='1')
                                {
                                    b=b+1;
                                }
                            }
                            if(b%2==0)
                            {
                                if(str.charAt(i+10)=='1')//奇偶检验
                                {
                                    if(str.charAt(i+9)=='1')
                                    {
                                        System.out.printf("%d:%c%c%c%c%c%c%c%c\n",a,str.charAt(i+1),str.charAt(i+2),str.charAt(i+3),str.charAt(i+4),str.charAt(i+5),str.charAt(i+6),str.charAt(i+7),str.charAt(i+8));
//                                        i=i+11;
                                    }
                                    else
                                    {
                                        System.out.printf("%d:parity check error",a);
                                    }
                                }
                                else if(str.charAt(i+9)!='1')
                                {
                                    
                                    System.out.printf("%d:validate error",a);
                                }
                                else
                                    System.out.printf("%d:validate error",a);
                                a=a+1;
                            }
                            i+=10;
                        }
                        
                    }
                }
            else
            {
                System.out.println("null data");
            }
        }
        else
        {
            System.out.println("null data");
        }
    }
}

1.设计与分析:①这题我并没有使用到关于类之间的内容,而是根据题目的需求来一步步完成代码的编写。

                         ②首先我们判断输入数据是否不足11位即最小长度,若是则输出"null data"。

                         ③判断是否有‘0’,并且对其后面的10位数字处理。

                         ④判断输入数据的结束符是否为1,若否则输出“validate error”。

                         ⑤判断奇偶校验错误,若否则输出“parity check error”。

 

2.踩坑心得:总的来说此题并不算难,主要是看题,分析题,以及查阅奇偶校验的方法。

3.改进建议:步骤过程太为繁琐,可适当简化,并且编译习惯不够好,例如大括号的方法。

                                                                                 7-1 用类解一元二次方程式 (10 分)

定义一个代表一元二次方程ax2+bx+c=0的类QuadraticEquation,其属性为三个系数a、b、c(均为私有属性),

类中定义的方法参考main方法中的代码。main方法源码:

import java.util.Scanner;

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

        double a = Double.parseDouble(input.next());
        double b = Double.parseDouble(input.next());
        double c = Double.parseDouble(input.next());
        
        if(a == 0){
            System.out.println("Wrong Format");
            System.exit(0);
        }
        
        //create a QuadraticEquation object
        QuadraticEquation equation = new QuadraticEquation(a, b, c);
        //get value of b * b - 4 * a * c
        double discriminant = equation.getDiscriminant();
        
        System.out.println("a=" + equation.getA() +
                ",b=" + equation.getB() + 
                ",c=" + equation.getC()+":");

        if (discriminant < 0) {
          System.out.println("The equation has no roots.");
        }
        else if (discriminant == 0)
        {
          System.out.println("The root is " + 
                  String.format("%.2f", equation.getRoot1()));
        }
        else // (discriminant >= 0)
        {
          System.out.println("The roots are " + 
                  String.format("%.2f", equation.getRoot1()) 
            + " and " +  String.format("%.2f", equation.getRoot2()));
        }
    }
}

class QuadraticEquation{
        //your code
}

注意:须提交完整源码,包括Main类。

输入格式:

在一行中输入a、b、c的值,可以用一个或多个空格或回车符分开。

输出格式:

  1. 当输入非法时,输出“Wrong Format”
  2. 当有一个实根时,输出(2行):
  • a=值,b=值,c=值:
  • The root is 值(保留两位小数)
  1. 当有两个实根时,输出(2行):
  • a=值,b=值,c=值:
  • The roots are 值1 and 值2(均保留两位小数)

我的答案:

import java.util.Scanner;

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

        double a = Double.parseDouble(input.next());
        double b = Double.parseDouble(input.next());
        double c = Double.parseDouble(input.next());
        
        if(a == 0){
            System.out.println("Wrong Format");
            System.exit(0);
        }
        
        //create a QuadraticEquation object
        QuadraticEquation equation = new QuadraticEquation(a, b, c);
        //get value of b * b - 4 * a * c
        double discriminant = equation.getDiscriminant();
        
        System.out.println("a=" + equation.getA() +
                ",b=" + equation.getB() + 
                ",c=" + equation.getC()+":");

        if (discriminant < 0) {
          System.out.println("The equation has no roots.");
        }
        else if (discriminant == 0)
        {
          System.out.println("The root is " + 
                  String.format("%.2f", equation.getRoot1()));
        }
        else // (discriminant >= 0)
        {
          System.out.println("The roots are " + 
                  String.format("%.2f", equation.getRoot1()) 
            + " and " +  String.format("%.2f", equation.getRoot2()));
        }
    }
}

class QuadraticEquation{

    private double a;
    private double b;
    private double c;
    private double x;
    private double x1;
    private double x2;
    public QuadraticEquation(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }
    public double getDiscriminant() {
        x = b*b-4*a*c;
        return x;
    }
    public double getA() {
        return a;
    }
    public double getB() {
        return b;
    }
    public double getC() {
        return c;
    }
    public double getRoot1() {
        x = b*b-4*a*c;
        x1 = (-b+Math.sqrt(x))/(2*a);
        return x1;
    }
    public double getRoot2() {
        x = b*b-4*a*c;
        x2 = (-b-Math.sqrt(x))/(2*a);
        return x2;
    }
}

1.设计与分析:①由于题目的要求,此题需要按照题目要求分出几个类来完成。

                         ②首先我们判断输入数据是否输入合理或非法,若否则输出"Wrong Format"。

                         ③判断▲值,通过getDiscriminant()返回。

                         ④通过返回的▲值,判断有几个根,再通过getRoot1(),getRoot2()返回结果。

 

2.踩坑心得:这题题目基本已经给出了所需要的类,需要我们去判断这些类的作用,再把剩下的的代码补充完整。

3.改进建议:步骤过程太为繁琐,可适当简化。

                                                                                   7-2 日期类设计 (30 分)

参考题目集二中和日期相关的程序,设计一个类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:值

我的答案:

 

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;
    public DateUtil(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;

    }
    public DateUtil(DateUtil dateUtil) {
        // TODO Auto-generated constructor stub
    }
    int[] Month = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    public int getYear() {
        return year;
    }
    public int getMonth() {
        return month;
    }
    public int getDay() {
        return day;
    }
    public boolean checkInputValidity() {//检测输入的年、月、日是否合法
        if(year < 1820 || year > 2020)
            return false;
        if(month < 1 || month > 12)
            return false;
        if(this.isLeapYear(this.getYear())){
            if(month == 2){
                if(day < 1 || day > 29)
                    return false;
            }
            else
            if(day < 1 || day > Month[month])
                return false;
        }
        if(!this.isLeapYear(this.year)){
            if(day<1 || day > Month[month])
                return false;
        }
        return true;
    }
    public boolean isLeapYear(int year) {//判断year是否为闰年
        if(year%400==0||(year%4==0&&year%100!=0)) {
            //
            return true;

        }
        else return false;
    }
    public DateUtil getNextNDays(int m) {//取得year-month-day的下n天日期

        while(m > 365){
            if(isLeapYear(year) && month <= 2){
                if(month == 2 && day == 29){
                    day = 1;
                    month++;
                }
                year++;
                m = m - 366;
            }
            else if(isLeapYear(year+1)&&month>2){
                year++;
                m = m - 366;
            }
            else{
                year++;
                m = m - 365;
            }
        }
        {
            for (int i = 0; i < m; i++) {
                day++;
                if(isLeapYear(year)&&month == 2){
                    if(day ==30){
                        month++;
                        day = 1;
                    }
                }
                else if(day > Month[month]){
                    month++;
                    day = 1;
                    if(month==13){
                        year++;
                        month = 1;
                    }
                }
            }
        }
        DateUtil p = new DateUtil(year,month,day);
        return p;
    }
    public DateUtil getPreviousNDays(int n) {//取得year-month-day的前n天日期

        while(n > 365){
            if(isLeapYear( year) && month > 2){
                n = n - 366;
                year--;
            }
            else if(isLeapYear(year-1)&&month<= 2){
                n = n - 366;
                year--;
            }
            else{
                n = n - 365;
                year--;
            }
        }
        {
            for(int i = 0; i < n; i++){
                day--;
                if(day <= 0){
                    month--;
                    if(month <= 0){
                        month = 12;
                        year--;
                    }
                    if(isLeapYear(year) && month == 2)
                        day=29;
                    else
                        day = Month[month];
                }
            }
        }
        DateUtil q = new DateUtil(year,month,day);
        return q;
    }
    public boolean compareDates(DateUtil date) {//比较当前日期与date的大小(先后)
        if(year>date.year ) {
            return true;
        }else if(year==date.year&&month>date.year) {
            return true;
        }else if(year==date.year&&month==date.month&&day>date.day) {
            return true;
        }else
            return false;
    }
    public boolean equalTwoDates(DateUtil date) {//判断两个日期是否相等
        if(year==date.year&&month==date.month&&day==date.day) {
            return true;
        }else
            return false;
    }
    public int getDaysofDates(DateUtil date) {//求当前日期与date之间相差的天数
        int sum = 0;int sum1=0;int l=0;
        for(int i=0;i<this.year;i++) {
            sum=sum+365;
            if(isLeapYear(i)) {
                sum=sum+1;
            }
        }
        for(int j=0;j<this.month;j++) {
            if(isLeapYear(this.year)){
                Month[2]=29;
            }
            sum=sum+Month[j];
        }
        sum=sum+this.day;
        for(int i=0;i<date.year;i++) {
            sum1=sum1+365;
            if(isLeapYear(i)) {
                sum1=sum1+1;
            }
        }
        for(int j=0;j<date.month;j++) {
            if(isLeapYear(date.year)){
                Month[2]=29;
            }
            sum1=sum1+Month[j];
        }
        sum1=sum1+date.day;
        int num= Math.abs(sum-sum1);
        return num;
    }
    public String showDate() {
        return year + "-" + month + "-" + day;
    }
}

1.设计与分析:①由于题目的要求,我们要设计一个类DateUtil,该类有三个私有属性year、month、day。

                         ②先检测输入年月日是否为题目要求的合法,就根据题目给的要求来。

                         ③闰年的判断。

                         ④取得year-month-day的下n天日期。

                         ⑤取得year-month-day的前n天日期。

                         ⑥比较当前日期与date的大小(先后)。

                         ⑦判断两个日期是否相等。

                         ⑧求当前日期与date之间相差的天数。

                         ⑨格式返回日期值。

 

2.踩坑心得:①由于题目的要求,我们要设计一个类DateUtil,该类有三个私有属性year、month、day。

这样的话在类里面调用,整个程序的耦合性会很高,而我们写代码应该是尽量的去降低其耦合性。

而这样就需要设计多个类,这个后面会讲解。

                     ②在检测日期是,要注意日的检测,日的检测不只是题目所要求的【1,31】,而是要根据

具体输入的月份从而判断是否合法,这就需要一个按照月份顺序填好了最大日期的数组,并且这里面还有闰年

二月份的不同,所以也需要闰年的判断。

                     ③取得year-month-day的下n天日期以及前n天日期时,要注意跨年跨月跨日时年月日的转换,

以及闰年的特殊情况,从而设计算法,所以也是需要闰年的判断滴。

                     ④在求当前日期与date之间相差的天数时,也需要用到比较当前日期与date的大小的方法,

当然如果想偷懒的话可以直接应用绝对值函数Math.abs(),从而得到一个正确结果。

                     ⑤在求当前日期与date之间相差的天数和比较当前日期与date的大小时,一定要注意this.和

date.区别开来,不然就是一直错误的答案。

3.改进建议:算法不够简练,可思考更好的算法。

                                                                                                         7-3 日期问题面向对象设计(聚合一) (30 分)

参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

                                         

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

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

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

我的答案:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
         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.getDay().getMonth().getYear().getValue() + "-" + date.getDay().getMonth().getValue() + "-" +date.getDay().getValue()+ " 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.getDay().getMonth().getYear().getValue() + "-" + date.getDay().getMonth().getValue() + "-" + date.getDay().getValue() + " 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( 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;
    public DateUtil(int y, int m, int d) {
        this. day = new Day (y,m,d);
    }
    public DateUtil(DateUtil dateUtil) {

    }
//    int[] Month = {31,28,31,30,31,30,31,31,30,31,30,31};

    public Day getDay() {
        return day;
    }
    public void setDay(Day d) {
        this.day = d;
    }
    public boolean checkInputValidity() {//检测输入的年、月、日是否合法
        if(this.getDay().getMonth().getYear().validate()&&this.getDay().getMonth().validate()&&this.getDay().validate()) {
            return true;
        }else {
            return false;
        }
    }
    public DateUtil getNextNDays(int n) {
        //取得year-month-day的下n天日期
        int y = this.getDay().getMonth().getYear().getValue();
        int m = this.getDay().getMonth().getValue();
        int d = this.getDay().getValue();
        while(n > 365){
            if(this.getDay().getMonth().getYear().isLeapYear() && m <= 2){
                if(m == 2 && d == 29){
                    d = 1;
                    m++;
                }
                y++;
                n = n - 366;
            }
            else if((new Year(y+1).isLeapYear())&&m>2){
                y++;
                n = n - 366;
            }
            else{
                y++;
                n = n - 365;
            }
        }
        {
            for (int i = 0; i < n; i++) {
                d++;
                if(this.getDay().getMonth().getYear().isLeapYear()&&m == 2){
                    if(d ==30){
                        m++;
                        d = 1;
                    }
                }
                else if(d >this.getDay().mon_maxnum[m-1]){
                    m++;
                    d = 1;
                    if(m==13){
                        y++;
                        m = 1;
                    }
                }
            }
        }
        DateUtil p = new DateUtil(y,m,d);
        return p;
    }
    public DateUtil getPreviousNDays(int n) {//取得year-month-day的前n天日期
        int y = this.getDay().getMonth().getYear().getValue();
        int m = this.getDay().getMonth().getValue();
        int d = this.getDay().getValue();
        while(n > 365){
            if(this.getDay().getMonth().getYear().isLeapYear() && m> 2){
                n = n - 366;
                y--;
            }
            else if(new Year(y-1).isLeapYear()&&m<= 2){
                n = n - 366;
                y--;
            }
            else{
                n = n - 365;
                y--;
            }
        }
        {
            for(int i = 0; i < n; i++){
                d--;
                if(d <= 0){
                    m--;
                    if(m <= 0){
                        m = 12;
                        y--;
                    }
                    if(this.getDay().getMonth().getYear().isLeapYear() && m== 2)
                        d=29;
                    else
                        d = this.getDay().mon_maxnum[m-1];
                }
            }
        }
        DateUtil q = new DateUtil(y,m,d);
        return q;
    }
    public boolean compareDates(DateUtil date) {//比较当前日期与date的大小(先后)
        if(this.getDay().getMonth().getYear().getValue()>date.getDay().getMonth().getYear().getValue()) {
            return true;
        }else if(this.getDay().getMonth().getYear().getValue()==date.getDay().getMonth().getYear().getValue()&&this.getDay().getMonth().getValue()>date.getDay().getMonth().getValue()) {
            return true;
        }else if(this.getDay().getMonth().getYear().getValue()==date.getDay().getMonth().getYear().getValue()&&this.getDay().getMonth().getValue()==date.getDay().getMonth().getValue()&&this.getDay().getValue()>date.getDay().getValue()) {
            return true;
        }else
            return false;
    }
    public boolean equalTwoDates(DateUtil date) {//判断两个日期是否相等
        if(this.getDay().getMonth().getYear().getValue()==date.getDay().getMonth().getYear().getValue()&&this.getDay().getMonth().getValue()==date.getDay().getMonth().getValue()&&this.getDay().getValue()==date.getDay().getValue()) {
            return true;
        }else
            return false;
    }
    public int getDaysofDates(DateUtil date) {//求当前日期与date之间相差的天数
        int sum = 0;int sum1=0;
        for(int i=0;i<this.getDay().getMonth().getYear().getValue();i++) {
            sum=sum+365;
            if(new Year(i).isLeapYear()) {
                sum=sum+1;
            }
        }
        for(int j=0;j<this.getDay().getMonth().getValue();j++) {
            if(this.getDay().getMonth().getYear().isLeapYear()){
                this.getDay().mon_maxnum[1]=29;
            }
            sum=sum+this.getDay().mon_maxnum[j];
        }
        sum=sum+this.getDay().getValue();
        for(int i=0;i<date.getDay().getMonth().getYear().getValue();i++) {
            sum1=sum1+365;
            if(new Year(i).isLeapYear()) {
                sum1=sum1+1;
            }
        }
        for(int j=0;j<date.getDay().getMonth().getValue();j++) {
            if(date.getDay().getMonth().getYear().isLeapYear()){
                date.getDay().mon_maxnum[1]=29;
            }
            sum1=sum1+date.getDay().mon_maxnum[j];
        }
        sum1=sum1+date.getDay().getValue();
        int num= Math.abs(sum-sum1);
        return num;
    }
    public String showDate() {
        return this.getDay().getMonth().getYear().getValue()+ "-" + this.getDay().getMonth().getValue() + "-" + this.getDay().getValue();
    }
}

class Day {
    int value;
    Month month = new Month();
    int [] mon_maxnum = {31,28,31,30,31,30,31,31,30,31,30,31};
    public Day() {
        
    }
    public Day(int yearValue, int monthValue,int dayValue) {
        this.month=new Month(yearValue,monthValue);
        this.value=dayValue;
    }
    public int getValue() {
        return value;
    }
    public void change() {
        
        value = mon_maxnum[month.getValue()-1];
    }
    public void setValue(int value) {
        this.value = value;
    }
    public Month getMonth() {
        return month;
    }
    public void setMonth(Month value) {
        this.month = value ;
    }
    public void resetMin() {
        value=1;
    }
    public void resetMax() {
        if(this.getMonth().getYear().isLeapYear()) {
            mon_maxnum[1]=29;
        }
        value=mon_maxnum[month.getValue()-1];
        mon_maxnum[1]=28;
    }
    public boolean validate() {
        if(this.getMonth().getYear().isLeapYear()) {
            mon_maxnum[1]=29;
        }
        if(value>=1&&value<=mon_maxnum[month.getValue()-1]) {
            mon_maxnum[1]=28;
            return true;
        }else {
            return false;
            
        }
        
    }
    public void dayIncrement() {
        value ++;
    }
    public void dayReduction() {
        value --;
    }
}
class Month {
    int value;
//    Year =year;
    Year year = new Year();
    public Month() {
        
    }
    public Month(int yearValue, int monthValue) {
        this.year=new Year(yearValue);
        this.value=monthValue;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public Year getYear() {
        return year;
    }
    public void setYear(Year year) {
        this. year =year;
    }
    public void resetMin() {
        value = 1;
    }
    public void resetMax() {
        value = 12;
    }
    public boolean validate() {
        if(value>=1&&value<=12) {
            return true;
        }else {
            return false;
        }
    }
    public void monthIncrement() {
        value++;
    }
    public void monthReduction() {
        value--;
    }
    
}
class Year {
    int value;
    public Year() {
        
    }
    public Year(int value) {
        this.value = value;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public boolean isLeapYear() {
          if(value%400==0||(value%4==0&&value%100!=0)) {
                return true;
            }
            else{
               return false;
            }
        }
    public boolean validate() {
        if(value>=1900&&value<=2050) {
            return true;
        }else {
            return false;
        }
    }
    public void yearIncrement() {
        value ++;
    }
    public void yearReduction() {
        value --;
    }
}

1.设计与分析:①由于题目的要求,我们设计如下几个类:DateUtil、Year、Month、Day。

                         ②先检测输入年月日是否为题目要求的合法,就根据题目给的要求来。

                         ③闰年的判断。

                         ④取得year-month-day的下n天日期。

                         ⑤取得year-month-day的前n天日期。

                         ⑥比较当前日期与date的大小(先后)。

                         ⑦判断两个日期是否相等。

                         ⑧求当前日期与date之间相差的天数。

                         ⑨格式返回日期值。

 

2.踩坑心得:①由于题目的要求,我们要设计DateUtil、Year、Month、Day,而他们之间是有着不同的调用关系的。因此我们如果需要调用,应该先声明。

                     ②在检测日期是,要注意日的检测,这里同上题一致。

                     ③题目要求需要在该类里指定定义一些变量和数组,因此在每个类中都是通过定义value,来表示year,month,day。

                     ④根据题目要求,只有在month里面定义数组,通过month来调用此数组。

                     ⑤在求当前日期与date之间相差的天数和比较当前日期与date的大小时,一定要注意this.和date.区别开来,不然就是一直错误的答案。

                     ⑥记得看题目,年份要求改了,别出错了。

3.改进建议:步骤过程太为繁琐,可适当简化。

5.总结

总结:而通过这几次的题目练习,我学会了类的定义和使用,和部分函数的了解。而在很多方面都还需加强,例如在编码习惯方面,

应该多看看前辈的代码,从而纠正,还有在算法逻辑思考方面,总是思考的不够完善,总是会有纰漏,还有对于调试的使用等等。

那么对于这些情况,还是必须得重视起来,尽量改正过来。那么对于老师的教学方法我是十分认可的,这种模式的教学能让我们真

正的学到很多东西。另外对于课程,作业,以及课上课下的这种组织方式,都是安排的相当不错的。至于实验,我觉得可以加以讲

解,部分讲解可以让我们理解的更为透彻。

总结bug原因:①对题面理解的疏忽②对自己代码架构细节出现问题(使用错误方法)③不小心写错。

 

 

 

 

 

 

 

 

 

 

posted @ 2022-04-09 22:27  MnO2  阅读(66)  评论(0)    收藏  举报