7-4 日期问题面向对象设计(聚合二) (30分)
参考题目7-3的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:
应用程序共测试三个功能:
- 求下n天
- 求前n天
- 求两个日期相差的天数
注意:严禁使用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.showDate() + " 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.showDate() + " 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 boolean checkInputValidity(int year,int month,int day)
{
if(year<1820||year>2020||month<1||month>12||day<1||day>31)
{
return false;
}
else
{
if(!isLeapYear(year)&&month==2&&day>28)
{
return false;
}
else if(isLeapYear(year)&&month==2&&day>29)
{
return false;
}
else if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31)
{
return false;
}
else if((month==4||month==6||month==9||month==11)&&day>30)
{
return false;
}
else
return true;
}
}
public static int zontianshu(int year,int month ,int day)
{
int x=0;
int y=0;
int z=0;
if((year%4==0&&year%100!=0)||year%400==0)
z=1;
if(z==1)
x=year/4-1;
if(z!=1)
x=year/4;
if(month==1)
y=0;
if(month==2)
y=31;
if(month==3&&z==1)
y=60;
if(month==3&&z==0)
y=59;
if(month==4&&z==1)
y=91;
if(month==4&&z==0)
y=90;
if(month==5&&z==1)
y=121;
if(month==5&&z==0)
y=120;
if(month==6&&z==1)
y=152;
if(month==6&&z==0)
y=151;
if(month==7&&z==1)
y=182;
if(month==7&&z==0)
y=181;
if(month==8&&z==1)
y=213;
if(month==8&&z==0)
y=212;
if(month==9&&z==1)
y=244;
if(month==9&&z==0)
y=243;
if(month==10&&z==1)
y=274;
if(month==10&&z==0)
y=273;
if(month==11&&z==1)
y=305;
if(month==11&&z==0)
y=304;
if(month==12&&z==1)
y=335;
if(month==12&&z==0)
y=334;
return x*366+364+365*(year-2-x)+y+day;
};
public static boolean isLeapYear(int year)//判断闰年
{
if((year % 4 == 0 && year % 100 != 0 || year % 400 == 0))
{
return true;
}
else
{
return false;
}
}
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
int diji;
Main a=new Main();
int []xx= {31,31,28,31,30,31,30,31,31,30,31,30,31,31};
int year=0,month=0,day=0;
int h=0;
int n=0;
int d0=0;
int he=0;
int year1=0,month1=0,day1=0;
diji=in.nextInt();
switch (diji)
{
case 1:
year1=in.nextInt();
month1=in.nextInt();
day1=in.nextInt();
n=in.nextInt();
year=year1;
month=month1;
day=day1;
if(a.isLeapYear(year))
h=1;
if(checkInputValidity(year,month, day)==false||n<0)
{
System.out.println("Wrong Format");
}
else
{
he=n/2+day;
while(he>xx[month])
{
if(month==2&&a.isLeapYear(year))
{
xx[month]=29;
}
else if(month==2&&a.isLeapYear(year)==false)
{
xx[month]=28;
}
if(he>xx[month])
{
he=he-xx[month];
month++;
}
if(month==13)
{
year++;
month=1;
if(a.isLeapYear(year))
{
xx[2]=29;
}
else
{
xx[2]=28;
}
}
}
day=he;
he=n-n/2+day;
while(he>xx[month])
{
if(month==2&&a.isLeapYear(year))
{
xx[month]=29;
}
else if(month==2&&a.isLeapYear(year)==false)
{
xx[month]=28;
}
if(he>xx[month])
{
he=he-xx[month];
month++;
}
if(month==13)
{
year++;
month=1;
if(a.isLeapYear(year))
{
xx[2]=29;
}
else
{
xx[2]=28;
}
}
}
day=he;
System.out.println(year1+"-"+month1+"-"+ day1+" next "+n+" days is:"+year+"-"+month+"-"+day);
}
break;
case 2:
year1=in.nextInt();
month1=in.nextInt();
day1=in.nextInt();
n=in.nextInt();
year=year1;month=month1;day=day1;
if(a.isLeapYear(year))
{
h=1;
}
if(checkInputValidity(year,month,day)==false||n<0)
{
System.out.println("Wrong Format");
}
else
{
he=day-n;
while(he<0)
{
if(month==3&&a.isLeapYear(year))
{
xx[2]=29;
}
he=he+xx[month-1];
month--;
if(month==0)
{
year--;
month=12;
if(a.isLeapYear(year))
{
xx[2]=29;
}
else
{
xx[2]=28;
}
}
}
if(he==0&&month!=1)
{
day=xx[month-1];
month--;
}
else if (he==0&&month==1)
{
year--;
month=12;day=31;
}
else
day=he;
System.out.println(year1+"-"+month1+"-"+ day1+" previous "+n+" days is:"+year+"-"+month+"-"+day);
}
break;
case 3:
year=in.nextInt();
month=in.nextInt();
day=in.nextInt();
year1=in.nextInt();
month1=in.nextInt();
day1=in.nextInt();
if(a.isLeapYear(year))
{
h=1;
}
if(a.checkInputValidity(year,month, day)==false||n<0)
{
System.out.println("Wrong Format");
}
else
{
System.out.print("The days between "+year+"-"+month+"-"+day+" and "+year1+"-"+month1+"-"+ day1+" are:");
int year2,month2,day2;
if(year>year1||(year==year1&&month>month1)||(year==year1&&month==month1&&day>day1))
{
year2=year;
month2=month;
day2=day;
year=year1;
month=month1;
day=day1;
year1=year2;
month1=month2;
day1=day2;
}
he=a.zontianshu(year1, month1, day1)-a.zontianshu(year, month, day);
if(1900>year&&1900<year1)
{
System.out.print(he-1);
}
else
{
System.out.print(he);
}
}
break;
default:
System.out.println("Wrong Format");
}
}
}