[改进]基于决策表的函数predate_liangaliang96的博客-爱代码爱编程
之前在网上看到的代码套路基本一致,但是仔细分析后仍然存在问题:
它缺少了对所输入月份的天数的检查,就比如输入6月32日后仍然可以得到一个结果,但是很明显是与实际不符的。我在原有基础上进行了改进,现在已经实现了对所输入的年份 月份 日期的范围检查。主要就是对类似的月份进行相同的操作,不同类的月份要划分清晰。
代码如下:
package test;
import java.util.Scanner;public class PreDate {
public static void main(String[] args){
Scanner scancer=new Scanner(System.in);
System.out.println("请输入年 月 日:");
int year=scancer.nextInt();
int month=scancer.nextInt();
int day=scancer.nextInt();
//输入数据不合法
if(year<1812||year>2017||month<1||month>12||day<1||day>31){
System.out.println("输入的数据不符合题意");
System.exit(0);
}
//判断日期是否符合现实
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:{
if(day>=1&&day<=31)
break;
else
System.out.println("输入的数据不符合题意");
System.exit(0);
}
case 4:
case 6:
case 9:
case 11:{
if(day>=1&&day<=30)
break;
else
System.out.println("输入的数据不符合题意");
System.exit(0);
}
case 2:{
if((year%400==0)||(year%4==0&&year%100!=0)){
if(day>=1&&day<=29)
break;
else
System.out.println("输入的数据不符合题意");
System.exit(0);
}
else
if(day>=1&&day<=28)
break;
else
System.out.println("输入的数据不符合题意");
System.exit(0);
}
}
//计算输入日期的前一个日期
//当年份发生变化的情况
if(month==1&&day==1){
year=year-1;
month=12;
day=31;
}
//月份发生变化的情况
else if(month!=1&&day==1){
switch(month){
case 2:
case 4:
case 6:
case 8:
case 9:
case 11:{
month=month-1;
day=31;
break;
}
case 5:
case 7:
case 10:
case 12:{
month=month-1;
day=30;
break;
}
case 3:{
if((year%400==0)||(year%4==0&&year%100!=0)){
month=month-1;
day=29;
}
else{
month=month-1;
day=28;
}
break;
}
}
}
//只有日期发生变化的情况
else{
day=day-1;
}
System.out.println("The PreDay is "+year+"-"+month+"-"+day);
}
}
等价类划分如下:
M1={月份:4,6,9,11} M2={月份:5,7,10,12}
M3={月份:1} M4={月份:2}
M5={月份:3} M6={月份:8}
D1={日期:1} D2={日期:2〈=日期〈=27}
D3={日期:28} D4={日期:29}
D5={日期:30} D6={日期:31}
Y1={年:是闰年} Y2={年:不是闰年}
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
C1:月份在 | M1 | M1 | M1 | M2 | M2 | M3 | M3 | M4 | M4 | M4 | M4 | M4 | M5 | M5 | M5 | M6 | M6 |
C2:日期在 | D1 | D2-D5 | D6 | D1 | D2-D6 | D1 | D2-D6 | D1 | D2-D3 | D4 | D4 | D5-D6 | D1 | D1 | D2-D6 | D1 | D2-D6 |
C2:年份在 |
|
|
|
|
|
|
|
|
| Y1 | Y2 |
| Y1 | Y2 |
|
|
|
a1:不可能 |
|
| 1 |
|
|
|
|
|
|
| 1 | 1 |
|
|
|
|
|
a2:day减1 |
| 1 |
|
| 1 |
| 1 |
| 1 | 1 |
|
|
|
| 1 |
| 1 |
a3:day复位31 | 1 |
|
|
|
| 1 |
| 1 |
|
|
|
|
|
|
| 1 |
|
a4:day复位30 |
|
|
| 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
a5:day复位29 |
|
|
|
|
|
|
|
|
|
|
|
| 1 |
|
|
|
|
a6:day复位28 |
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
|
|
|
a7:月减1 | 1 |
|
| 1 |
|
|
| 1 |
|
|
|
| 1 | 1 |
| 1 |
|
a8:月复位12 |
|
|
|
|
| 1 |
|
|
|
|
|
|
|
|
|
|
|
a9:年减一 |
|
|
|
|
| 1 |
|
|
|
|
|
|
|
|
|
|
|
测试结果
用例ID | 输入数据 | 预期输出 | 实际输出 | 是否通过 | 备注 |
1 | 1799 6 15 | 无 | 无 | 否 | 输入年份无效 |
2 | 1812 6 13 | 1812 6 12 | 1812 6 12 | 是 |
|
3 | 2016 6 13 | 2016 6 12 | 2016 6 12 | 是 |
|
4 | 2018 6 13 | 无 | 无 | 否 | 输入年份无效 |
5 | 2012 5 1 | 2012 4 30 | 2012 4 30 | 是 |
|
6 | 2012 -3 1 | 无 | 无 | 否 | 输入月份无效 |
7 | 2012 13 1 | 无 | 无 | 否 | 输入月份无效 |
8 | 2012 3 -1 | 无 | 无 | 否 | 输入日期无效 |
9 | 2012 3 32 | 无 | 无 | 否 | 输入日期无效 |
10 | 2008 3 1 | 2008 2 29 | 2008 2 29 | 是 | 闰年2 月29天 |
11 | 2008 4 1 | 2008 3 31 | 2008 3 31 | 是 | 前一个月31天 |
12 | 2009 3 1 | 2009 2 28 | 2009 2 28 | 是 | 平年2月28天 |
13 | 2009 5 1 | 2009 4 30 | 2009 4 30 | 是 | 前一个月30天 |