第一次博客作业
1.前言
2.设计与分析
3.踩坑心得
4.改进建议
5.总结
前言
这三次题目集的主要知识点是对于类的定义以及使用,而难度主要是题目集3的7-1,7-2,主要是其算法需要仔细思考。
而题目集1的题目量会稍微的更多一些,但也都较为简单,都是考查基础的。而题目集二属于题量适中,题目难度也适中。
以下是对于部分难题的具体分析
RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,
相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前
加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有
效数据是8位,奇偶校验位采用奇校验。
输入格式:
由0、1组成的二进制数据流。例如:11110111010111111001001101111111011111111101111
输出格式:
过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
如有多个数据,每个数据单独一行显示。
若数据不足11位或者输入数据全1没有起始位,则输出"null data",
若某个数据的结束符不为1,则输出“validate error”。
若某个数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。
如:11011或11111111111111111。
例如:
1:11101011
2:01001101
3:validate error
输入样例:
在这里给出一组输入。例如:
1111011101011111111111
输出样例:
在这里给出相应的输出。例如:
1:11101011
输入样例1:
在这里给出一组输入。例如:
11110111010111111001001101111111011111111101111
输出样例1:
在这里给出相应的输出。例如:
1:11101011 2:01001101 3:validate error
输入样例2:
输入数据不足11位。例如:
111101
输出样例2:
在这里给出相应的输出。例如:
null data
输入样例3:
输入数据全1没有起始位。例如:
1111111111111111
输出样例3:
在这里给出相应的输出。例如:
null data
输入样例4:
输入数据全1没有起始位。例如:
111101110101111111101111111101
输出样例4:
在这里给出相应的输出。例如:
1:11101011 2:parity check error
输入样例5:
两组数据结束符和奇偶校验均不合格。例如:
111000000000000011100000000000000
输出样例5:
在这里给出相应的输出。例如:
1:validate error
2:validate error
输入样例6:
两组数据,数据之间无空闲位。例如:
1110000000001100111000001
输出样例6:
在这里给出相应的输出。例如:
1:00000000 2:01110000
我的答案:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); String str; str=input.next(); int i,j,a=1; int flag=1,b=0; int t=0; for(i=0;i<str.length();i++) { if(str.charAt(i)=='0') { flag=0; break; } else { flag=1; } } if(str.length()>=11)//有11位 { if(flag==0)//有起始位‘0’ { for(i=0;i<str.length();i++) { if(str.charAt(i)=='0') { for(j=i;j<=i+8;j++) { if(str.charAt(j)=='1') { b=b+1; } } if(b%2==0) { if(str.charAt(i+10)=='1')//奇偶检验 { if(str.charAt(i+9)=='1') { System.out.printf("%d:%c%c%c%c%c%c%c%c\n",a,str.charAt(i+1),str.charAt(i+2),str.charAt(i+3),str.charAt(i+4),str.charAt(i+5),str.charAt(i+6),str.charAt(i+7),str.charAt(i+8)); // i=i+11; } else { System.out.printf("%d:parity check error",a); } } else if(str.charAt(i+9)!='1') { System.out.printf("%d:validate error",a); } else System.out.printf("%d:validate error",a); a=a+1; } i+=10; } } } else { System.out.println("null data"); } } else { System.out.println("null data"); } } }
1.设计与分析:①这题我并没有使用到关于类之间的内容,而是根据题目的需求来一步步完成代码的编写。
②首先我们判断输入数据是否不足11位即最小长度,若是则输出"null data"。
③判断是否有‘0’,并且对其后面的10位数字处理。
④判断输入数据的结束符是否为1,若否则输出“validate error”。
⑤判断奇偶校验错误,若否则输出“parity check error”。
2.踩坑心得:总的来说此题并不算难,主要是看题,分析题,以及查阅奇偶校验的方法。
3.改进建议:步骤过程太为繁琐,可适当简化,并且编译习惯不够好,例如大括号的方法。
定义一个代表一元二次方程ax2+bx+c=0的类QuadraticEquation,其属性为三个系数a、b、c(均为私有属性),
类中定义的方法参考main方法中的代码。main方法源码:
import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner input = new Scanner(System.in); double a = Double.parseDouble(input.next()); double b = Double.parseDouble(input.next()); double c = Double.parseDouble(input.next()); if(a == 0){ System.out.println("Wrong Format"); System.exit(0); } //create a QuadraticEquation object QuadraticEquation equation = new QuadraticEquation(a, b, c); //get value of b * b - 4 * a * c double discriminant = equation.getDiscriminant(); System.out.println("a=" + equation.getA() + ",b=" + equation.getB() + ",c=" + equation.getC()+":"); if (discriminant < 0) { System.out.println("The equation has no roots."); } else if (discriminant == 0) { System.out.println("The root is " + String.format("%.2f", equation.getRoot1())); } else // (discriminant >= 0) { System.out.println("The roots are " + String.format("%.2f", equation.getRoot1()) + " and " + String.format("%.2f", equation.getRoot2())); } } } class QuadraticEquation{ //your code }
注意:须提交完整源码,包括Main类。
输入格式:
在一行中输入a、b、c的值,可以用一个或多个空格或回车符分开。
输出格式:
- 当输入非法时,输出“Wrong Format”
- 当有一个实根时,输出(2行):
- a=值,b=值,c=值:
- The root is 值(保留两位小数)
- 当有两个实根时,输出(2行):
- a=值,b=值,c=值:
- The roots are 值1 and 值2(均保留两位小数)
我的答案:
import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner input = new Scanner(System.in); double a = Double.parseDouble(input.next()); double b = Double.parseDouble(input.next()); double c = Double.parseDouble(input.next()); if(a == 0){ System.out.println("Wrong Format"); System.exit(0); } //create a QuadraticEquation object QuadraticEquation equation = new QuadraticEquation(a, b, c); //get value of b * b - 4 * a * c double discriminant = equation.getDiscriminant(); System.out.println("a=" + equation.getA() + ",b=" + equation.getB() + ",c=" + equation.getC()+":"); if (discriminant < 0) { System.out.println("The equation has no roots."); } else if (discriminant == 0) { System.out.println("The root is " + String.format("%.2f", equation.getRoot1())); } else // (discriminant >= 0) { System.out.println("The roots are " + String.format("%.2f", equation.getRoot1()) + " and " + String.format("%.2f", equation.getRoot2())); } } } class QuadraticEquation{ private double a; private double b; private double c; private double x; private double x1; private double x2; public QuadraticEquation(double a, double b, double c) { this.a = a; this.b = b; this.c = c; } public double getDiscriminant() { x = b*b-4*a*c; return x; } public double getA() { return a; } public double getB() { return b; } public double getC() { return c; } public double getRoot1() { x = b*b-4*a*c; x1 = (-b+Math.sqrt(x))/(2*a); return x1; } public double getRoot2() { x = b*b-4*a*c; x2 = (-b-Math.sqrt(x))/(2*a); return x2; } }
1.设计与分析:①由于题目的要求,此题需要按照题目要求分出几个类来完成。
②首先我们判断输入数据是否输入合理或非法,若否则输出"Wrong Format"。
③判断▲值,通过getDiscriminant()返回。
④通过返回的▲值,判断有几个根,再通过getRoot1(),getRoot2()返回结果。
2.踩坑心得:这题题目基本已经给出了所需要的类,需要我们去判断这些类的作用,再把剩下的的代码补充完整。
3.改进建议:步骤过程太为繁琐,可适当简化。
参考题目集二中和日期相关的程序,设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),
其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 除了创建该类的构造方法、属性的getter及setter方法外,
需要编写如下方法:
public boolean checkInputValidity();//检测输入的年、月、日是否合法 public boolean isLeapYear(int year);//判断year是否为闰年 public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期 public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期 public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后) public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等 public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数 public String showDate();//以“year-month-day”格式返回日期值
应用程序共测试三个功能:
- 求下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.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); } } }
输入格式:
有三种输入方式(以输入的第一个数字划分[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:值
我的答案:
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.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); } } } class DateUtil{ private int year; private int month; private int day; public DateUtil(int year, int month, int day) { this.year = year; this.month = month; this.day = day; } public DateUtil(DateUtil dateUtil) { // TODO Auto-generated constructor stub } int[] Month = {0,31,28,31,30,31,30,31,31,30,31,30,31}; public int getYear() { return year; } public int getMonth() { return month; } public int getDay() { return day; } public boolean checkInputValidity() {//检测输入的年、月、日是否合法 if(year < 1820 || year > 2020) return false; if(month < 1 || month > 12) return false; if(this.isLeapYear(this.getYear())){ if(month == 2){ if(day < 1 || day > 29) return false; } else if(day < 1 || day > Month[month]) return false; } if(!this.isLeapYear(this.year)){ if(day<1 || day > Month[month]) return false; } return true; } public boolean isLeapYear(int year) {//判断year是否为闰年 if(year%400==0||(year%4==0&&year%100!=0)) { // return true; } else return false; } public DateUtil getNextNDays(int m) {//取得year-month-day的下n天日期 while(m > 365){ if(isLeapYear(year) && month <= 2){ if(month == 2 && day == 29){ day = 1; month++; } year++; m = m - 366; } else if(isLeapYear(year+1)&&month>2){ year++; m = m - 366; } else{ year++; m = m - 365; } } { for (int i = 0; i < m; i++) { day++; if(isLeapYear(year)&&month == 2){ if(day ==30){ month++; day = 1; } } else if(day > Month[month]){ month++; day = 1; if(month==13){ year++; month = 1; } } } } DateUtil p = new DateUtil(year,month,day); return p; } public DateUtil getPreviousNDays(int n) {//取得year-month-day的前n天日期 while(n > 365){ if(isLeapYear( year) && month > 2){ n = n - 366; year--; } else if(isLeapYear(year-1)&&month<= 2){ n = n - 366; year--; } else{ n = n - 365; year--; } } { for(int i = 0; i < n; i++){ day--; if(day <= 0){ month--; if(month <= 0){ month = 12; year--; } if(isLeapYear(year) && month == 2) day=29; else day = Month[month]; } } } DateUtil q = new DateUtil(year,month,day); return q; } public boolean compareDates(DateUtil date) {//比较当前日期与date的大小(先后) if(year>date.year ) { return true; }else if(year==date.year&&month>date.year) { return true; }else if(year==date.year&&month==date.month&&day>date.day) { return true; }else return false; } public boolean equalTwoDates(DateUtil date) {//判断两个日期是否相等 if(year==date.year&&month==date.month&&day==date.day) { return true; }else return false; } public int getDaysofDates(DateUtil date) {//求当前日期与date之间相差的天数 int sum = 0;int sum1=0;int l=0; for(int i=0;i<this.year;i++) { sum=sum+365; if(isLeapYear(i)) { sum=sum+1; } } for(int j=0;j<this.month;j++) { if(isLeapYear(this.year)){ Month[2]=29; } sum=sum+Month[j]; } sum=sum+this.day; for(int i=0;i<date.year;i++) { sum1=sum1+365; if(isLeapYear(i)) { sum1=sum1+1; } } for(int j=0;j<date.month;j++) { if(isLeapYear(date.year)){ Month[2]=29; } sum1=sum1+Month[j]; } sum1=sum1+date.day; int num= Math.abs(sum-sum1); return num; } public String showDate() { return year + "-" + month + "-" + day; } }
1.设计与分析:①由于题目的要求,我们要设计一个类DateUtil,该类有三个私有属性year、month、day。
②先检测输入年月日是否为题目要求的合法,就根据题目给的要求来。
③闰年的判断。
④取得year-month-day的下n天日期。
⑤取得year-month-day的前n天日期。
⑥比较当前日期与date的大小(先后)。
⑦判断两个日期是否相等。
⑧求当前日期与date之间相差的天数。
⑨格式返回日期值。
2.踩坑心得:①由于题目的要求,我们要设计一个类DateUtil,该类有三个私有属性year、month、day。
这样的话在类里面调用,整个程序的耦合性会很高,而我们写代码应该是尽量的去降低其耦合性。
而这样就需要设计多个类,这个后面会讲解。
②在检测日期是,要注意日的检测,日的检测不只是题目所要求的【1,31】,而是要根据
具体输入的月份从而判断是否合法,这就需要一个按照月份顺序填好了最大日期的数组,并且这里面还有闰年
二月份的不同,所以也需要闰年的判断。
③取得year-month-day的下n天日期以及前n天日期时,要注意跨年跨月跨日时年月日的转换,
以及闰年的特殊情况,从而设计算法,所以也是需要闰年的判断滴。
④在求当前日期与date之间相差的天数时,也需要用到比较当前日期与date的大小的方法,
当然如果想偷懒的话可以直接应用绝对值函数Math.abs(),从而得到一个正确结果。
⑤在求当前日期与date之间相差的天数和比较当前日期与date的大小时,一定要注意this.和
date.区别开来,不然就是一直错误的答案。
3.改进建议:算法不够简练,可思考更好的算法。
参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

应用程序共测试三个功能:
- 求下n天
- 求前n天
- 求两个日期相差的天数
注意:严禁使用Java中提供的任何与日期相关的类与方法,并提交完整源码,包括主类及方法(已提供,不需修改)
我的答案:
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub 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.getDay().getMonth().getYear().getValue() + "-" + date.getDay().getMonth().getValue() + "-" +date.getDay().getValue()+ " 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.getDay().getMonth().getYear().getValue() + "-" + date.getDay().getMonth().getValue() + "-" + date.getDay().getValue() + " 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( fromDate.getDaysofDates(toDate)); } else { System.out.println("Wrong Format"); System.exit(0); } } else{ System.out.println("Wrong Format"); System.exit(0); } } } class DateUtil { Day day; public DateUtil(int y, int m, int d) { this. day = new Day (y,m,d); } public DateUtil(DateUtil dateUtil) { } // int[] Month = {31,28,31,30,31,30,31,31,30,31,30,31}; public Day getDay() { return day; } public void setDay(Day d) { this.day = d; } public boolean checkInputValidity() {//检测输入的年、月、日是否合法 if(this.getDay().getMonth().getYear().validate()&&this.getDay().getMonth().validate()&&this.getDay().validate()) { return true; }else { return false; } } public DateUtil getNextNDays(int n) { //取得year-month-day的下n天日期 int y = this.getDay().getMonth().getYear().getValue(); int m = this.getDay().getMonth().getValue(); int d = this.getDay().getValue(); while(n > 365){ if(this.getDay().getMonth().getYear().isLeapYear() && m <= 2){ if(m == 2 && d == 29){ d = 1; m++; } y++; n = n - 366; } else if((new Year(y+1).isLeapYear())&&m>2){ y++; n = n - 366; } else{ y++; n = n - 365; } } { for (int i = 0; i < n; i++) { d++; if(this.getDay().getMonth().getYear().isLeapYear()&&m == 2){ if(d ==30){ m++; d = 1; } } else if(d >this.getDay().mon_maxnum[m-1]){ m++; d = 1; if(m==13){ y++; m = 1; } } } } DateUtil p = new DateUtil(y,m,d); return p; } public DateUtil getPreviousNDays(int n) {//取得year-month-day的前n天日期 int y = this.getDay().getMonth().getYear().getValue(); int m = this.getDay().getMonth().getValue(); int d = this.getDay().getValue(); while(n > 365){ if(this.getDay().getMonth().getYear().isLeapYear() && m> 2){ n = n - 366; y--; } else if(new Year(y-1).isLeapYear()&&m<= 2){ n = n - 366; y--; } else{ n = n - 365; y--; } } { for(int i = 0; i < n; i++){ d--; if(d <= 0){ m--; if(m <= 0){ m = 12; y--; } if(this.getDay().getMonth().getYear().isLeapYear() && m== 2) d=29; else d = this.getDay().mon_maxnum[m-1]; } } } DateUtil q = new DateUtil(y,m,d); return q; } public boolean compareDates(DateUtil date) {//比较当前日期与date的大小(先后) if(this.getDay().getMonth().getYear().getValue()>date.getDay().getMonth().getYear().getValue()) { return true; }else if(this.getDay().getMonth().getYear().getValue()==date.getDay().getMonth().getYear().getValue()&&this.getDay().getMonth().getValue()>date.getDay().getMonth().getValue()) { return true; }else if(this.getDay().getMonth().getYear().getValue()==date.getDay().getMonth().getYear().getValue()&&this.getDay().getMonth().getValue()==date.getDay().getMonth().getValue()&&this.getDay().getValue()>date.getDay().getValue()) { return true; }else return false; } public boolean equalTwoDates(DateUtil date) {//判断两个日期是否相等 if(this.getDay().getMonth().getYear().getValue()==date.getDay().getMonth().getYear().getValue()&&this.getDay().getMonth().getValue()==date.getDay().getMonth().getValue()&&this.getDay().getValue()==date.getDay().getValue()) { return true; }else return false; } public int getDaysofDates(DateUtil date) {//求当前日期与date之间相差的天数 int sum = 0;int sum1=0; for(int i=0;i<this.getDay().getMonth().getYear().getValue();i++) { sum=sum+365; if(new Year(i).isLeapYear()) { sum=sum+1; } } for(int j=0;j<this.getDay().getMonth().getValue();j++) { if(this.getDay().getMonth().getYear().isLeapYear()){ this.getDay().mon_maxnum[1]=29; } sum=sum+this.getDay().mon_maxnum[j]; } sum=sum+this.getDay().getValue(); for(int i=0;i<date.getDay().getMonth().getYear().getValue();i++) { sum1=sum1+365; if(new Year(i).isLeapYear()) { sum1=sum1+1; } } for(int j=0;j<date.getDay().getMonth().getValue();j++) { if(date.getDay().getMonth().getYear().isLeapYear()){ date.getDay().mon_maxnum[1]=29; } sum1=sum1+date.getDay().mon_maxnum[j]; } sum1=sum1+date.getDay().getValue(); int num= Math.abs(sum-sum1); return num; } public String showDate() { return this.getDay().getMonth().getYear().getValue()+ "-" + this.getDay().getMonth().getValue() + "-" + this.getDay().getValue(); } } class Day { int value; Month month = new Month(); int [] mon_maxnum = {31,28,31,30,31,30,31,31,30,31,30,31}; public Day() { } public Day(int yearValue, int monthValue,int dayValue) { this.month=new Month(yearValue,monthValue); this.value=dayValue; } public int getValue() { return value; } public void change() { value = mon_maxnum[month.getValue()-1]; } public void setValue(int value) { this.value = value; } public Month getMonth() { return month; } public void setMonth(Month value) { this.month = value ; } public void resetMin() { value=1; } public void resetMax() { if(this.getMonth().getYear().isLeapYear()) { mon_maxnum[1]=29; } value=mon_maxnum[month.getValue()-1]; mon_maxnum[1]=28; } public boolean validate() { if(this.getMonth().getYear().isLeapYear()) { mon_maxnum[1]=29; } if(value>=1&&value<=mon_maxnum[month.getValue()-1]) { mon_maxnum[1]=28; return true; }else { return false; } } public void dayIncrement() { value ++; } public void dayReduction() { value --; } } class Month { int value; // Year =year; Year year = new Year(); public Month() { } public Month(int yearValue, int monthValue) { this.year=new Year(yearValue); this.value=monthValue; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public Year getYear() { return year; } public void setYear(Year year) { this. year =year; } public void resetMin() { value = 1; } public void resetMax() { value = 12; } public boolean validate() { if(value>=1&&value<=12) { return true; }else { return false; } } public void monthIncrement() { value++; } public void monthReduction() { value--; } } class Year { int value; public Year() { } public Year(int value) { this.value = value; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public boolean isLeapYear() { if(value%400==0||(value%4==0&&value%100!=0)) { return true; } else{ return false; } } public boolean validate() { if(value>=1900&&value<=2050) { return true; }else { return false; } } public void yearIncrement() { value ++; } public void yearReduction() { value --; } }
1.设计与分析:①由于题目的要求,我们设计如下几个类:DateUtil、Year、Month、Day。
②先检测输入年月日是否为题目要求的合法,就根据题目给的要求来。
③闰年的判断。
④取得year-month-day的下n天日期。
⑤取得year-month-day的前n天日期。
⑥比较当前日期与date的大小(先后)。
⑦判断两个日期是否相等。
⑧求当前日期与date之间相差的天数。
⑨格式返回日期值。
2.踩坑心得:①由于题目的要求,我们要设计DateUtil、Year、Month、Day,而他们之间是有着不同的调用关系的。因此我们如果需要调用,应该先声明。
②在检测日期是,要注意日的检测,这里同上题一致。
③题目要求需要在该类里指定定义一些变量和数组,因此在每个类中都是通过定义value,来表示year,month,day。
④根据题目要求,只有在month里面定义数组,通过month来调用此数组。
⑤在求当前日期与date之间相差的天数和比较当前日期与date的大小时,一定要注意this.和date.区别开来,不然就是一直错误的答案。
⑥记得看题目,年份要求改了,别出错了。
3.改进建议:步骤过程太为繁琐,可适当简化。
5.总结
总结:而通过这几次的题目练习,我学会了类的定义和使用,和部分函数的了解。而在很多方面都还需加强,例如在编码习惯方面,
应该多看看前辈的代码,从而纠正,还有在算法逻辑思考方面,总是思考的不够完善,总是会有纰漏,还有对于调试的使用等等。
那么对于这些情况,还是必须得重视起来,尽量改正过来。那么对于老师的教学方法我是十分认可的,这种模式的教学能让我们真
正的学到很多东西。另外对于课程,作业,以及课上课下的这种组织方式,都是安排的相当不错的。至于实验,我觉得可以加以讲
解,部分讲解可以让我们理解的更为透彻。
总结bug原因:①对题面理解的疏忽②对自己代码架构细节出现问题(使用错误方法)③不小心写错。

浙公网安备 33010602011771号