**

7-5 日期问题面向对象设计(聚合二) (40 分)

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

解题报告
写完程序后,想要测试三个功能点的正确性,可以参考Java8中的LocalDateTime类中的相关方法(在提交代码中不允许使用): 例如:

LocalDateTime today = LocalDateTime.now();//定义对象
//LocalDateTime today= LocalDateTime.of(2000,2,12);//定义对象 System.out.println(today.plusDays(10));//当前日期后十天
System.out.println(today.plusDays(-10));//当前日期前十天

注意,在使用Period求两个日期之间相差天数时,Period只能求同月日期的相差天数,因此要采用如下方法:

System.out.println(LocalDate.now().toEpochDay() -
LocalDate.now().minusDays(5).toEpochDay());

具体使用方法可参考Jdk1.8 API文档

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

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

输入格式:

有三种输入方式(以输入的第一个数字划分[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;//Year类
class Year{int value;//默认构造方法public Year(){}//带参构造方法public Year(int value){this.value=value;}//getterpublic int getValue(){return value;}//setterpublic void setValue(int value){this.value=value;}//判断year是否为闰年public  boolean isLeapYear(){if((value%4==0&&value%100!=0)||value%400==0)return true;elsereturn false;}//效验数据合法性public boolean validate(){if(value<=2020&&value>=1820)return true;elsereturn false;}//年份加一public void yearIncrement(){value=value+1;}//年份减一public void yearReduction(){value=value-1;}
}
//Month类
class Month{int value;//默认构造方法public Month(){}//带参构造方法public Month(int value){this.value=value;}//getterpublic int getValue(){return value;}//setterpublic void setValue(int value){this.value=value;}//日期复位(1)public void resetMin(){value=1;}//月份设置为12public void resetMax(){value=12;}//效验数据合法性public boolean validate(){if(value>=1&&value<=12)return true;elsereturn false;}//月份加一public void dayIncrement(){value=value+1;}//月份减一public void dayReduction(){value=value-1;}
}
//Day类
class Day{int value;//默认构造方法public Day(){}//带参构造方法public Day(int value){this.value=value;}//getterpublic int getValue(){return value;}//setterpublic void setValue(int value){this.value=value;}//日期加一public void dayIncrement() {value=value+1;}//日期减一public void dayReduction() {value=value-1;}
}
//DateUtil类
class DateUtil{Year year;Month month;Day day;int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//默认构造方法public DateUtil(){}//带参构造方法public DateUtil(int y,int m,int d){this.year = new Year(y);this.month = new Month(m);this.day = new Day(d);}//getterpublic Year getYear(){return year;}public Month getMonth(){return month;}public Day getDay(){return day;}//setterpublic void setYear(Year year){this.year = year;}public void setMonth(Month month){this.month = month;}public void setDay(Day d){this.day=d;}//设置日期最小值public void setDayMin() {this.day.value=1;}//设置日期最大值public void setDatMax() {if(this.year.isLeapYear())a[2]=29;this.day.value=a[this.month.value];}//效验数据合法性public boolean checkInputValidity(){if(this.year.isLeapYear())a[2]=29;if(this.year.validate()&&this.month.validate()&&this.day.value>=1&&this.day.value<=a[this.month.value])return true;elsereturn false;}//比较两个日期大小public boolean compareDates(DateUtil date){if(date.year.value<this.year.value)return false;else if(date.year.value==this.year.value&&date.month.value<this.month.value)return false;else if(date.year.value==this.year.value&&date.month.value==this.month.value&&date.day.value<this.day.value)return false;elsereturn true;}//判定两个日期是否相等public boolean equalTwoDates(DateUtil date){if(this.getDay().getValue()==date.getDay().getValue()&&this.getMonth().getValue()==date.getMonth().getValue()&&this.getYear().getValue()==date.getYear().getValue())return true;elsereturn false;}//日期值格式化public String showDate(){return this.getYear().getValue()+"-"+this.getMonth().getValue()+"-"+this.getDay().getValue();}//计算该年的剩余天数public int syts(DateUtil d){int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};int b=0,i;for(i=d.getMonth().getValue()+1;i<=12;i++){b=b+a[i];}b=b+a[d.getMonth().getValue()]-d.getDay().getValue();if(d.getYear().isLeapYear()&&d.getMonth().getValue()<=2)//闰年b++;return b;}//求下n天public DateUtil getNextNDays(int n){int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};int y=0,m=0,d=0;int i,j;int b=syts(this);//该年剩余天数if(b>n){//该年剩余天数大于ny=this.getYear().getValue();if(this.getYear().isLeapYear()){//如果是闰年a[2]=29;}int e=a[this.getMonth().getValue()];//该月的天数e=e-this.getDay().getValue();//本月剩余的天数if(e>=n){//如果n天后在本月m=this.getMonth().getValue();d=n+this.getDay().getValue();}else{//如果n天后不在本月n=n-e;m=this.getMonth().getValue()+1;i=m;while(n-a[i]>0){//找到月n=n-a[i];m++;i++;}d=n;//找到天}}else{//该年剩余天数小于nn=n-b;y=this.getYear().getValue()+1;int c=365;//平年天数if(new Year(y).isLeapYear()){//闰年天数c++;}while(n-c>0){//找到年n=n-c;y++;c=365;if(new Year(y).isLeapYear())c++;}i=1;while(n-a[i]>0&&i<=12){//找到月n=n-a[i];i++;}m=i;d=n;//找到天}return new DateUtil(y,m,d);}//求前n天public DateUtil getPreviousNDays(int n){int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};int y=0,m=0,d=0;int i,b;b=365-syts(this);//该日期所在年份已经过的天数if(this.getYear().isLeapYear()){//如果是闰年b++;}if (b>n){//如果前n天在该年y=this.getYear().getValue();int e=this.getDay().getValue();//本月已经过的天数if(e>n){//如果前n天在本月m=this.getMonth().getValue();d=e-n;}else{//如果前n天不在本月n=n-e;m=this.getMonth().getValue()-1;i=m;while(n-a[i]>0){//找到月n=n-a[i];m--;i--;}d=a[i]-n;//找到天if(new Year(y).isLeapYear()&&m==2){d++;}}}else{//如果前n天不在该年n=n-b;y=this.getYear().getValue()-1;int f=365;if(new Year(y).isLeapYear()){f++;}while(n-f>0){//找到年n=n-f;y--;f=365;if(new Year(y).isLeapYear())f++;}i=12;while(n-a[i]>0&&i>=0){//找到月n=n-a[i];i--;}m=i;d=a[i]-n;//找到天if(new Year(f).isLeapYear()&&m==2){d++;}}return new DateUtil(y, m, d);}//求两个日期之间的天数public int getDaysofDates(DateUtil date){DateUtil b1=this;DateUtil b2=date;if(this.equalTwoDates(date)){//如果两天的日期相等return 0;}else if(!this.compareDates(date)){//如果日期大小不对b1=date;b2=this;}int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};int i,j,ts=0;for(i=b1.getYear().getValue()+1;i<b2.getYear().getValue();i++){//两个日期的年数之和ts=ts+365;if(new Year(i).isLeapYear())ts++;}if(b1.getYear().getValue()==b2.getYear().getValue()&&b1.getMonth().getValue()==b2.getMonth().getValue()){//年份相同,月份相同,日不同ts=b2.getDay().getValue()-b1.getDay().getValue();}else if(b1.getYear().getValue()==b2.getYear().getValue()&&b1.getMonth().getValue()!=b2.getMonth().getValue()){//年份相同,月份不同if(b1.getYear().isLeapYear())//是闰年a[2]=29;ts=ts+a[b1.getMonth().getValue()]-b1.getDay().getValue();//小日期该月剩余的天数ts=ts+b2.getDay().getValue();//大日期的天数for(j=b1.getMonth().getValue()+1;j<=b2.getMonth().getValue()-1;j++)//月份天数和ts+=a[j];}else if(b1.getYear().getValue()!=b2.getYear().getValue()){//年份不同ts=ts+a[b1.getMonth().getValue()]-b1.getDay().getValue();//小日期在该月剩余的天数ts=ts+b2.getDay().getValue();//大日期在该月已经过的天数for(j=b1.getMonth().getValue()+1;j<=12;j++)//小日期在该年剩余的天数ts=ts+a[j];for(j=b2.getMonth().getValue()-1;j>0;j--)//大日期在该年已经过的天数ts=ts+a[j];if(b1.getYear().isLeapYear()&&b1.getMonth().getValue()<=2)//如果小日期该年为闰年且该天在1月或2月ts++;if(b2.getYear().isLeapYear()&&b2.getMonth().getValue()>2)//如果大日期该年为闰年且该天在1月或2月后ts++;}return ts;}
}
//主类
public class Main {public static void main(String[] args) {Scanner x=new Scanner(System.in);int year=0,month=0,day=0,a,b;a=x.nextInt();//输入判断类型year=x.nextInt();month= x.nextInt();day=x.nextInt();//输入年月日DateUtil c=new DateUtil(year,month,day);if(a==1){//求下n天b=x.nextInt();//输入nif(!c.checkInputValidity()||b<0){//如果数据不合法System.out.println("Wrong Format");}elseSystem.out.println(year+"-"+month+"-"+day+" next "+b+" days is:"+c.getNextNDays(b).showDate());}else if(a==2){b=x.nextInt();//输入nif(!c.checkInputValidity()||b<0){//如果数据不合法System.out.println("Wrong Format");}elseSystem.out.println(year+"-"+month+"-"+day+" previous "+b+" days is:"+c.getPreviousNDays(b).showDate());}else if(a==3){int y1,m1,d1;y1=x.nextInt();m1= x.nextInt();d1=x.nextInt();//输入第二个年月日DateUtil d=new DateUtil(y1,m1,d1);if(!c.checkInputValidity()||!d.checkInputValidity()){//如果数据不合法System.out.println("Wrong Format");}elseSystem.out.println("The days between "+year+"-"+month+"-"+day+" and "+y1+"-"+m1+"-"+d1+" are:"+c.getDaysofDates(d));}elseSystem.out.println("Wrong Format");}
}

7-5 日期问题面向对象设计(聚合二) (40 分)相关推荐

  1. 7-2 日期问题面向对象设计(聚合一) (35 分)

    ** 7-2 日期问题面向对象设计(聚合一) (35 分) ** 参考题目7-2的要求,设计如下几个类:DateUtil.Year.Month.Day,其中年.月.日的取值范围依然为:year∈[19 ...

  2. 设计模式(面向对象)设计的七大原则

    声明:本人设计模式模块是集合网上资料和老师课件总结的知识点,如本博客有侵权,本人即刻删. 设计模式(面向对象设计)原则,分别是: 1.开放封闭原则:对扩展开放,对修改关闭 2.单一职责原则:一个类只做 ...

  3. 面向对象设计(OOD)——设计指导编程,不要再半途而废啦

    面向对象设计 面向对象设计(OOD) 一.面向对象设计过程 二.面向对象设计原则 三.具体的设计过程 欢迎关注我.共勉:star: 面向对象设计(OOD) 一.面向对象设计过程 什么是软件工程的设计过 ...

  4. 算法设计与分析之分治法

    文章目录 前言 一.分治法设计思想 二.分治法与递归 三.分治法的适用条件 四.时间复杂度分析 五.分治法设计步骤 六.分治法示例 总结 前言 大家好,我是一只勤勤恳恳的程序猿.本篇文章小猿将跟您分享 ...

  5. uml图中的各种箭头_设计模式学习笔记(二):UML与面向对象设计原则

    1 UML 1.1 UML UML(Unified Modeling Language)是统一建模语言,1997年11月UML1.1版本提交给OMG并正式通过,成为建模语言的个那个也标准.2003年6 ...

  6. 技术图文:01 面向对象设计原则

    01 面向对象设计原则 知识结构: 一碟开胃的小菜 小菜今年计算机专业大四了,学了不少软件开发方面的东西,也学着编了些小程序,踌躇满志,一心要找一个好单位.当投递了无数简历后,终于收到了一个单位的面试 ...

  7. 程序员必备的七大面向对象设计原则(三)

    五.接口隔离原则 1. 定义 i.  客户端不应该依赖那些它不需要的接口. ii.  一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可. 2.分析 i. ...

  8. 对面向对象设计原则的总结

    正如牛顿三大定律在经典力学中的位置一样,"开-闭"原则(Open-Closed Principle)是面向对象的可复用设计(Object Oriented Design或OOD)的 ...

  9. 深入理解面向对象设计的七大原则

    一.面向对象设计的七大原则是什么? 1.开放封闭原则 2.里氏转换原则 3.依赖倒转原则 4.组合/聚合原则 5.接口隔离原则 6."迪米特"法则 7.单一职责原则 二.七大原则是 ...

最新文章

  1. uva 299 - Train Swapping
  2. poj2418map或者字典树
  3. Scrum立会报告+燃尽图(十一月十八日总第二十六次):功能开发与讨论贡献分配规则...
  4. Java使用RSA加密解密签名及校验
  5. go get国内解决办法汇总
  6. php为什么在变量前加,php中变量前加、@等符号是什么意思?
  7. I2c 诊断深入解析
  8. Cards BZOJ 1004
  9. 软考信息系统项目管理师_项目风险管理---软考高级之信息系统项目管理师019
  10. matlab调用库函数,Matlab调用函数的详细操作
  11. 斐讯k2p 月光银 硬件版本A2-软件版本22.7.8.5 刷官改系统
  12. cad命令栏还原默认_cad命令栏怎么还原 【设置办法】
  13. vue 非父子组件传值
  14. 人教版,北师大版,北京版和苏教版的四年级数学知识点对比(附视频)
  15. Sql Server 2008R2 安装教程
  16. 关于idea中提交svn时一直显示performing VCS refresh
  17. 如何用一个makefile编译多个目标
  18. 为什么大型高难度工程的首选支模架是盘扣架?
  19. 长期执业的顶尖领先律所ROSEN提醒Mylan N.V.投资者注意MYL证券集体诉讼的重要截止日期为8月25日
  20. 北京理工大学计算机考研资料汇总

热门文章

  1. [转]VirtualBox安装CentOS7
  2. 解释器模式 Interpreter
  3. 四大跨平台的APP分析
  4. Android(java)学习笔记69:短信发送器
  5. Java 中Iterator 、Vector、ArrayList、List 使用深入剖析
  6. JavaScript的中对象创建和继承原理
  7. mso-number-format
  8. [笔记]远程终端API,Terminal Services Administration
  9. 祝贺Terrylee博客园Post达到100篇
  10. Flutter 气泡背景效果 仿苹果桌面运动的气泡