目录
- 提出需求
- 代码实现
- 需求分析
- 单元测试
- 等价类划分
- 决策表
小划水,勿喷勿喷,近期有相关作业的同学看到我的文章,建议修改一下,别撞车了,哈哈哈~
提出需求
ChatGPT4分析出的语义:实现了输入日期输出前一天,并且考虑了闰年和非闰年、2月的天数、大月和小月等细节处理。如果输入的日期格式不正确,会有对应的提示。
代码实现
import java.util.Scanner;
public class TheDayBefore {
public static void main(String[] args {
Scanner scanner = new Scanner(System.in;
System.out.print("请输入一个日期(格式:yyyy-MM-dd):";
String inputString = scanner.nextLine(;
String[] inputArray = inputString.split("-";
int year, month, day;
if (inputArray.length == 3 {
try {
year = Integer.parseInt(inputArray[0];
month = Integer.parseInt(inputArray[1];
day = Integer.parseInt(inputArray[2];
} catch (NumberFormatException e {
System.out.println("日期格式不正确!";
return;
}
if (month < 1 || month > 12 {
System.out.println("月份不正确!";
return;
}
if (day < 1 || day > 31 {
System.out.println("日期不正确!";
return;
}
if ((day == 31 && (month == 4 || month == 6 || month == 9 || month == 11 ||
(day >= 30 && month == 2 ||
(day == 29 && month == 2 && !isLeapYear(year ||
(year < 0 {
System.out.println("日期不正确!";
return;
}
int prevYear = year;
int prevMonth = month;
int prevDay = day - 1;
if (prevDay == 0 {
prevMonth--;
if (prevMonth == 0 {
prevYear--;
prevMonth = 12;
}
if (prevMonth == 2 {
if (isLeapYear(prevYear {
prevDay = 29;
} else {
prevDay = 28;
}
} else {
if (prevMonth == 4 || prevMonth == 6 || prevMonth == 9 || prevMonth == 11 {
prevDay = 30;
} else {
prevDay = 31;
}
}
}
System.out.println("前一天是:" + prevYear + "-" + formatMonth(prevMonth + "-" + formatDay(prevDay;
} else {
System.out.println("日期格式不正确!";
}
}
private static boolean isLeapYear(int year {
return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
private static String formatMonth(int month {
if (month < 10 {
return "0" + month;
} else {
return String.valueOf(month;
}
}
private static String formatDay(int day {
if (day < 10 {
return "0" + day;
} else {
return String.valueOf(day;
}
}
}
需求分析
过于划水,不太行,还是得简单分析一下需求叭,哈哈哈~
- 首先将目标定义为java,从年开始划分,判断输入的年是否为闰年:为闰年则对于二月这个特殊月,闰年为29天,平年为28天。例如输入2023-02-28是正确的,因为2023年为平年。
- 输入的月份月大还是月小,若是月大则除去二月以外,月大有31天,月小有30天。例如输入2023-04-01,前一天month=month-1,day=31。
- 输入的月是否为三月,若是三月例如2023-03-01(平年)前一天month = month-1;润年类似。
- 输入的月份是否是1月,例如2023-01-01则前一天为2022-12-31
及year = year - 1,month = 12,day = 31。
单元测试
等价类划分
M2={月份:1、3、5、7、8、10、12}
D1={日期:1}
D3={日期:28}
D5={日期:30}
Y1={年:是闰年}
Y2={年:不是闰年}
决策表
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|
月份在 | M2 | M3 | M3 | M2 | M1 | M1 | M3 | M2 | M1 | M4 | M4 |
日期在 | D1 | D4 | D3 | D1 | D1 | D1 | D1 | D2-D6 | D2-D5 | D1 | D1 |
年份在 | Y1 | Y2 | Y1 | Y2 | |||||||
year-1 | √ | ||||||||||
moth-1 | √ | √ | √ | ||||||||
day-1 | √ | √ | √ | √ | |||||||
year复位12 | √ | ||||||||||
moth复位12 | √ | ||||||||||
day复位31 | √ | √ | √ | √ | |||||||
day复位30 | √ | √ | |||||||||
day复位28 | √ | ||||||||||
day复位29 | √ |