PTA 7-7 日期类设计

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

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

注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法(已提供,不需修改)
(浩浩乎如冯虚御风,而不知其所止;飘飘乎如遗世独立,羽化而登仙)

看到这里,那没有其他的办法,只能快乐地coding了
(思路和细节分析见代码)

Update2022年10月3日
经计科2005班魏大哥提醒,样例一的天数少1天
已经在第120行代码修改

AC代码

import java.util.Scanner;
class DateUtil{
    int year,month,day;
    DateUtil(int a,int b,int c){
        this.year=a;this.month=b;this.day=c;
    }
    public int getYear() {return year;}//获取数据元素
    public int getMonth() {return month;}
    public int getDay() {return day;}
    public boolean checkInputValidity(){//检查日期是否合法:分两步
        int f=1;//标记数组

        if(this.year<1820||this.year>2020) f=0;//第一步1、判断年月日的范围
        if(this.month<1||this.month>12) f=0;
        if(this.day<1||this.day>31) f=0;

        boolean f_run=true;//判断是否为闰年
        int[] m=new int[15];int eryue=0;//月份数组
        f_run=isLeapYear(this.year);//第二步2、判断day是否超过了这一月的总天数

        if(f_run==true) eryue=29;//算每个月的天
        else eryue=28;
        m[1]=31;m[3]=31;m[4]=30;m[5]=31;m[6]=30;m[7]=31;m[8]=31;
        m[9]=30;m[10]=31;m[11]=30;m[12]=31;

        if(this.month==2) {if(this.day>eryue) f=0;} 
        else if(this.day>m[this.month]) f=0;

        if(f==1) return true;//返回
        return false;
    }
    public boolean isLeapYear(int year){//判断year是否为闰年
        if((year%4==0&&year%100!=0)||(year%400==0)) return true;
        return false;
    }
    public DateUtil getNextNDays(int n){//取得year-month-day的下n天日
        int a=this.year,b=this.month,c=this.day;
        while(n>0){//n不为0就一直往后算
            if(b==1||b==3||b==5||b==7||b==8||b==10||b==12){
                if(n<=(31-c)) {c+=n;n-=n;}
                注意这里有几个地方需要注意
                //1、当n除去当前这个月c的天数时,b需要加一
                //2、当月份b为13时,需要把年份加一,并且把月份b置为1
                else {n-=(31-c);c=0;b++;if(b==13){b=1;a++;}}
            }else if(b==4||b==6||b==9||b==11){
                if(n<=(30-c)) {c+=n;n-=n;}
                else {n-=(30-c);c=0;b++;}
            }else{
                if(isLeapYear(a)==true){
                    if(n<=(29-c)) {c+=n;n-=n;}
                    else {n-=(29-c);c=0;b++;}
                }else{
                    if(n<=(28-c)) {c+=n;n-=n;}
                    else {n-=(28-c);c=0;b++;}
                }
            }
        }
        DateUtil u=new DateUtil(a, b, c);
        return u;
    }
    public DateUtil getPreviousNDays(int n){//取得year-month-day的前n天日
        int a=this.year,b=this.month,c=this.day;
        while(n>0){
            if(n<=c) {c-=n;n-=n;}
            else{
                注意这里有几个地方需要注意
                //1、当n除去当前这个月c的天数时,b需要减一
                //2、当月份b为0时,需要把年份减一,并且把月份b置为12
                //3、注意c的取值是根据b的前一个月(也即b-1)决定的
                n-=c;b--;if(b==0){b=12;a--;}
                if(b==1||b==3||b==5||b==7||b==8||b==10||b==12){
                    c=31;
                }else if(b==4||b==6||b==9||b==11){
                c=30;
                }else{
                    if(isLeapYear(a)==true){c=29;}
                    else{c=28;}
                }
            }
        }
        DateUtil u=new DateUtil(a, b, c);
        return u;
    }
    //这两个函数没用上,就没写(嘻嘻)
    // public boolean compareDates(DateUtil date);//比较当前日期与date的大小
    // public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等
    public int getDaysofDates(DateUtil date){//求当前日期与date之间相差的天
        int t=0;
        int[] m=new int[15];//计算每月的天
        if(isLeapYear(this.year)==true) m[2]=29; else m[2]=28;
        m[1]=31;m[3]=31;m[4]=30;m[5]=31;m[6]=30;m[7]=31;m[8]=31;
        m[9]=30;m[10]=31;m[11]=30;m[12]=31;
        //这里需要注意几种情况:
        //1、两个日期同年不同月
        //2、两个日期不同年不同月
        //3、两个日期同年同月

        if(this.year<date.year||this.month<date.month){//防止同一个月
            if(this.month==1||this.month==3||this.month==5
            ||this.month==7||this.month==8||this.month==10||this.month==12){
                t+=(31-this.day);
            }else if(this.month==4||this.month==6||this.month==9||this.month==11){
                t+=(30-this.day);
            }else{
                if(isLeapYear(this.year)) t+=(29-this.day);
                else t+=(28-this.day);
            }
        }
        if(this.year<date.year){//防止同一年
            for(int i=this.month+1;i<=12;i++){t+=m[i];}
        }
        for(int i=this.year+1;i<=date.year-1;i++){
            if(isLeapYear(i)) t+=366;
            else t+=365;
        }
        if(this.year<date.year){
            for(int i=1;i<=date.month-1;i++){t+=m[i];}
        }
        if(this.month==date.month&&this.year==date.year) t=date.day-this.day;
        else t+=date.day;
        return (t);
    }
    public String showDate(){
        return this.year+"-"+this.month+"-"+this.day;
    }

}//以下为题目所给的主函数,照抄就行
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);
        }        
    }
}

你可能感兴趣的:(java程序设计,java,jvm,c++)