题目集4-6次总结
Posted purelove2022
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题目集4-6次总结相关的知识,希望对你有一定的参考价值。
(1)前言:
第四次的题目集有七道题,它主要考察我们一些一维数组的定义、创建及使用,利用arrays.sort(数组命)的方式给数组从小到大排序,利用sqlit将一个字符串按特定的符号分割并穿入一个数组当中,初步尝试对象的封装,初步了解Integer类中的parsenInt方法(用于将一个字符类型的变量转换成整形类型的变量),Local类中的of()、isAfter()、isBefore()、until()等方法(它们分别是创建一个LocalDate类型的值,判断2个LocalDate类型的日期的先后,2个LocalDate类型日期中间的天数),ChronoUnit类中DAYS、WEEKS、MONTHS等方法(分别求2个日期的天数,周数、月数),总体上难度适中,所接触的新方法比较多。第五次的题目集一共有六道题 ,这次的题目集主要考察我们对于正则表达式的使用,以及对日期类设计的迭代。这次根据特定的有条理的类图来写程序,考察父类子类的关系及运用,难度也适中。第六次题目集只有一道题,为菜单程序设计,要求对于父类子类的运用熟练,难度较大。
(2)设计与分析:
题目集四 7-5
参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:
应用程序共测试三个功能: 求下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且输入均有效,输出格式如下: year-month-day 当第一个数字为2且输入均有效,输出格式如下: year-month-day 当第一个数字为3且输入均有效,输出格式如下: 天数值
看到题目我会先考虑main函数里面应该会有什么,之后从Year类开始,慢慢递增写Month类、Day类、DateUtil类。
Year类:
根据类图写函数从无参构造方法和有参构造方法到闰年的判断、数据是否合法、年份的增减这与之前的日期类多了年份的增减其次年月日种种类全都放在一个Date类里,不符合单一原则。
class Year int value; //默认构造方法 Year() //带参构造方法 Year(int value) this.value = value; //value getter int getValue() return this.value; //value setter void setValue (int value) this.value = value; //判断是否为闰年 public boolean isLeapYear() boolean a; if((value % 4 == 0 && value % 100 != 0) || value % 400 == 0) a = true; else a = false; return a; //检验数据是否合法 boolean validate() boolean a; if(value >= 1900 && value <= 2050) a = true; else a = false; return a; //年份加一 void yearIncrement() this.value = this.value + 1; //年份减一 void yearReduction() this.value = this.value - 1;
Month类:
这次的year类型不再是int而是Year,这样其中year可以用到Year里面的方法,会更加简便。在带参构造方法时应该用Year里面的带参构造方法去构造year。
class Month int value; Year year; //无参构造方法 Month() //带参构造方法 Month(int yearValue , int monthValue) this.value = monthValue; this.year = new Year(yearValue); //value getter int getValue() return this.value; //value setter void setValue (int value) this.value = value; //year getter Year getYear() return this.year; //year setter void setYear (Year year) this.year = year; //月份复位(1) void resetMin() this.value = 1; //月份设置为12 void reserMax() this.value = 12; //校验数据合法性 boolean validate() boolean a; if(value >= 1 && value <= 12) a = true; else a = false; return a; //月份加一 void monthIncrement() this.value = this.value + 1; //月份减一 void monthReduction() this.value = this.value - 1;
Day类:
其中在建立对象时,不在有Year类型的变量,因为在构造Month时包含了Year类型的变量,同时应该构建一个含每个月天数的数组,这样可以更加实现resetMax和validate这2个方法。
class Day int value; Month month; int[] mon_maxnum = 31,28,31,30,31,30,31,31,30,31,30,31; //默认构造方法 Day() //带参构造方法 Day(int yearValue,int monthValue,int dayValue) this.value = dayValue; this.month = new Month(yearValue,monthValue); //value getter int getValue() return this.value; //value setter void setValue (int value) this.value = value; //month getter Month getMonth() return this.month; //month setter void setMonth (Month month) this.month = month; //日期复位(1) void resetMin() this.value = 1; //日期设为该为的最大值 void resetMax() this.value = mon_maxnum[month.value-1]; //校验日期的合法性 public boolean validate() boolean a = false; if(month.value<=12&&month.value>=1) if(this.getMonth().getYear().isLeapYear()) mon_maxnum[1]=29; if(value>=1&&value<=mon_maxnum[month.getValue()-1]) a = true; else a = false; return a; //日期加1 void dayIncrement() this.value = this.value + 1; //日期减1 void dayReduction() this.value = this.value - 1;
DateUtil类:
这个类时实现求前n天、后n天以及2个日期之间天数的类。这一次较之前的题目,在整体结构上差距不大,主要不同在变量的表达方式上。
class DateUtil Day day; //默认构造方法 DateUtil() //带参构造方法 DateUtil(int d,int m,int y) this.day = new Day(d,m,y); //day getter Day getDay() return day; //day setter void setDay(Day d) this.day = d; //检查数据合法性 boolean checkInputValidity() boolean a; if(this.getDay().validate()&&this.getDay().getMonth().validate()&&this.getDay().getMonth().getYear().validate()) a=true; else a=false; return a; //比较2个日期的大小 boolean compareDates(DateUtil date) boolean a; if(date.getDay().getMonth().getYear().getValue()<this.getDay().getMonth().getYear().getValue()) a = false; else if(date.getDay().getMonth().getYear().getValue()==this.getDay().getMonth().getYear().getValue()&&date.getDay().getMonth().getValue()<this.getDay().getMonth().getValue()) a = false; else if(date.getDay().getMonth().getYear().getValue()==this.getDay().getMonth().getYear().getValue()&&date.getDay().getMonth().getValue()==this.getDay().getMonth().getValue()&&date.getDay().getValue()<this.getDay().getValue()) a = false; else a = true; return a; //判断2个日期是否相等 boolean equalTwoDates(DateUtil date) boolean a; if(this.getDay().getValue()==date.getDay().getValue()&&this.getDay().getMonth().getValue()==date.getDay().getMonth().getValue()&& this.getDay().getMonth().getYear().getValue()==date.getDay().getMonth().getYear().getValue()) a = true; else a = false; return a; //日期值格式化 String showDate() return this.getDay().getMonth().getYear().getValue()+"-"+this.getDay().getMonth().getValue()+"-"+this.getDay().getValue(); //求下n天 public DateUtil getNextNDays(int n) int year2 = 0,month2 = 0,day2 = 0; int i = 1; year2 = this.getDay().getMonth().getYear().getValue(); month2 = this.getDay().getMonth().getValue(); day2 = this.getDay().getValue(); while(i<=n) if(!new Year(year2).isLeapYear()) this.getDay().mon_maxnum[1]=28; else this.getDay().mon_maxnum[1]=29; if(day2+1<=this.getDay().mon_maxnum[month2-1]) day2++; else if(month2+1<=12) month2++; day2=1; else year2++; month2=1; day2=1; i++; return new DateUtil(year2,month2,day2); //求前n天 public DateUtil getPreviousNDays(int n) int year2 = 0,month2 = 0,day2 = 0; int i = 1; year2 = this.getDay().getMonth().getYear().getValue(); month2 = this.getDay().getMonth().getValue(); day2 = this.getDay().getValue(); while(i<=n) if(!new Year(year2).isLeapYear()) this.getDay().mon_maxnum[1]=28; else this.getDay().mon_maxnum[1]=29; if(day2-1>0) day2--; else if(month2-1>=1) month2--; day2=this.getDay().mon_maxnum[month2-1]; else year2--; month2=12; day2=31; i++; return new DateUtil(year2,month2,day2); //求2个日期之间的天数 public int getDaysofDates(DateUtil date) int i,j,d = 0; int year1=0,month1=0,day1=0; int year2=0,month2=0,day2=0; DateUtil newDate1 = new DateUtil(year2,month2,day2); DateUtil newDate2 = new DateUtil(year2,month2,day2); if (this.equalTwoDates(date)) return 0; else if (!this.compareDates(date)) year1=this.getDay().getMonth().getYear().getValue(); month1=this.getDay().getMonth().getValue(); day1=this.getDay().getValue(); year2=date.getDay().getMonth().getYear().getValue(); month2=date.getDay().getMonth().getValue(); day2=date.getDay().getValue(); else year2=this.getDay().getMonth().getYear().getValue(); month2=this.getDay().getMonth().getValue(); day2=this.getDay().getValue(); year1=date.getDay().getMonth().getYear().getValue(); month1=date.getDay().getMonth().getValue(); day1=date.getDay().getValue(); for(i=year2+1;i<year1;i++) newDate2.getDay().getMonth().getYear().yearIncrement(); if(newDate2.getDay().getMonth().getYear().isLeapYear()) d=d+366; else d=d+365; if (year1!=year2) for(j=month2+1;j<=12;j++) if(new Year(year2).isLeapYear()) this.getDay().mon_maxnum[1]=29; d=d+this.getDay().mon_maxnum[j-1]; d+=this.getDay().mon_maxnum[month2-1]-day2; for(j=1;j<month1;j++) if(newDate1.getDay().getMonth().getYear().isLeapYear()) this.getDay().mon_maxnum[1]=29; d+=this.getDay().mon_maxnum[j-1]; d+=day1; else if(year2==year1&&month2!=month1) for(j=month2+1;j<=month1-1;j++) if(new Year(year2).isLeapYear()) this.getDay().mon_maxnum[1]=29; d+=this.getDay().mon_maxnum[j-1]; d+=day1+this.getDay().mon_maxnum[month2-1]-day2; else if(year1==year2&&month1==month2) d=day1-day2; return d;
Main类:
主函数还是和之前一样,只在输出格式上改动一下。
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.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.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);
题目集四 7-6
参考题目7-3的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:
应用程序共测试三个功能: 求下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:值
这次不像7-5一般,是Year和Month关联、Month和Day关联、Day和DateUtil关联、最后Main和DateUtil关联,依次关联。7-6是直接Day、Month、Year、Main与DateUtil关联,这样在引用year和month不用那么麻烦,同时year、month、day相互没有关联。
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); class DateUtil Year year; Month month; Day day; int[] mon_maxnum = 31,28,31,30,31,30,31,31,30,31,30,31; //默认构造方法 DateUtil() //带参构造方法 DateUtil(int y,int m,int d) this.year = new Year(y); this.month = new Month(m); this.day = new Day(d); //year getter Year getYear() return year; //year setter void setYear(Year year) this.year = year; //month getter Month getMonth() return this.month; //month setter void setMonth(Month month ) this.month = month; //day getter Day getDay() return day; //day setter void setDay(Day d) this.day = d; //日期复位(1) void resetMin() this.day = new Day(1); //日期设为该为的最大值 void resetMax() this.day = new Day(mon_maxnum[month.value-1]); //检查数据合法性 boolean checkInputValidity() boolean a = false; if(month.value<=12&&month.value>=1) if(this.getYear().isLeapYear()) mon_maxnum[1]=29; if(this.getDay().getValue()>=1&&this.getDay().getValue()<=mon_maxnum[month.getValue()-1]&&this.getMonth().validate()&&this.getYear().validate()) a=true; else a=false; return a; //比较2个日期的大小 boolean compareDates(DateUtil date) boolean a; if(date.getYear().getValue()<this.getYear().getValue()) a = false; else if(date.getYear().getValue()==this.getYear().getValue()&&date.getMonth().getValue()<this.getMonth().getValue()) a = false; else if(date.getYear().getValue()==this.getYear().getValue()&&date.getMonth().getValue()==this.getMonth().getValue()&&date.getDay().getValue()<this.getDay().getValue()) a = false; else a = true; return a; //判断2个日期是否相等 boolean equalTwoDates(DateUtil date) boolean a; if(this.getDay().getValue()==date.getDay().getValue()&&this.getMonth().getValue()==date.getMonth().getValue()&& this.getYear().getValue()==date.getYear().getValue()) a = true; else a = false; return a; //日期值格式化 String showDate() return this.getYear().getValue()+"-"+this.getMonth().getValue()+"-"+this.getDay().getValue(); //求下n天 public DateUtil getNextNDays(int n) int year2 = 0,month2 = 0,day2 = 0; int i = 1; year2 = this.getYear().getValue(); month2 = this.getMonth().getValue(); day2 = this.getDay().getValue(); while(i<=n) if(!new Year(year2).isLeapYear()) this.mon_maxnum[1]=28; else this.mon_maxnum[1]=29; if(day2+1<=this.mon_maxnum[month2-1]) day2++; else if(month2+1<=12) month2++; day2=1; else year2++; month2=1; day2=1; i++; return new DateUtil(year2,month2,day2); //求前n天 public DateUtil getPreviousNDays(int n) int year2 = 0,month2 = 0,day2 = 0; int i = 1; year2 = this.getYear().getValue(); month2 = this.getMonth().getValue(); day2 = this.getDay().getValue(); while(i<=n) if(!new Year(year2).isLeapYear()) this.mon_maxnum[1]=28; else this.mon_maxnum[1]=29; if(day2-1>0) day2--; else if(month2-1>=1) month2--; day2=this.mon_maxnum[month2-1]; else year2--; month2=12; day2=31; i++; return new DateUtil(year2,month2,day2); //求2个日期之间的天数 public int getDaysofDates(DateUtil date) int i,j,d = 0; int year1=0,month1=0,day1=0; int year2=0,month2=0,day2=0; DateUtil newDate1 = new DateUtil(year2,month2,day2); DateUtil newDate2 = new DateUtil(year2,month2,day2); if (this.equalTwoDates(date)) return 0; else if (!this.compareDates(date)) year1=this.getYear().getValue(); month1=this.getMonth().getValue(); day1=this.getDay().getValue(); year2=date.getYear().getValue(); month2=date.getMonth().getValue(); day2=date.getDay().getValue(); else year2=this.getYear().getValue(); month2=this.getMonth().getValue(); day2=this.getDay().getValue(); year1=date.getYear().getValue(); month1=date.getMonth().getValue(); day1=date.getDay().getValue(); for(i=year2+1;i<year1;i++) newDate2.getYear().yearIncrement(); if(newDate2.getYear().isLeapYear()) d=d+366; else d=d+365; if (year1!=year2) for(j=month2+1;j<=12;j++) if(new Year(year2).isLeapYear()) this.mon_maxnum[1]=29; d=d+this.mon_maxnum[j-1]; d+=this.mon_maxnum[month2-1]-day2; for(j=1;j<month1;j++) if(newDate1.getYear().isLeapYear()) this.mon_maxnum[1]=29; d+=this.mon_maxnum[j-1]; d+=day1; else if(year2==year1&&month2!=month1) for(j=month2+1;j<=month1-1;j++) if(new Year(year2).isLeapYear()) this.mon_maxnum[1]=29; d+=this.mon_maxnum[j-1]; d+=day1+this.mon_maxnum[month2-1]-day2; else if(year1==year2&&month1==month2) d=day1-day2; return d; class Day int value; //默认构造方法 Day() //带参构造方法 Day(int Value) this.value = Value; //value getter int getValue() return this.value; //value setter void setValue (int value) this.value = value; //日期加1 void dayIncrement() this.value = this.value + 1; //日期减1 void dayReduction() this.value = this.value - 1; class Month int value; //无参构造方法 Month() //带参构造方法 Month(int Value) this.value = Value; //value getter int getValue() return this.value; //value setter void setValue (int value) this.value = value; //月份复位(1) void resetMin() this.value = 1; //月份设置为12 void reserMax() this.value = 12; //校验数据合法性 boolean validate() boolean a; if(value >= 1 && value <= 12) a = true; else a = false; return a; //月份加一 void monthIncrement() this.value = this.value + 1; //月份减一 void monthReduction() this.value = this.value - 1; class Year int value; //默认构造方法 Year() //带参构造方法 Year(int value) this.value = value; //value getter int getValue() return this.value; //value setter void setValue (int value) this.value = value; //判断是否为闰年 public boolean isLeapYear() boolean a; if((value % 4 == 0 && value % 100 != 0) || value % 400 == 0) a = true; else a = false; return a; //检验数据是否合法 boolean validate() boolean a; if(value >= 1820 && value <= 2020) a = true; else a = false; return a; //年份加一 void yearIncrement() this.value = this.value + 1; //年份减一 void yearReduction() this.value = this.value - 1;
但这次较之前在实现3个方法时,改变了方法,例如后2天,采用了一天一天加,n天就n次循环,如果该天在该年的最后一天,则该年加1,月份和天数都变为1,如果该天在该月的最后一天,则天数变为1,月份加1,可以采用年,月,日数值加一的方法,还有数值变为1和上月最大天数的方法,但是在做题目的时候没有用,是直接采用year++或者day=1的方法去增加数值或者改变数值。在做这道题的时候我是先从year、month和year3个类方法入手,因为DateUtil这个类许多的方法需要用到这3个类的方法,其次这3个类都是独立存在的,都只与DateUtil有依赖的关系,所以改动会更加容易一些,这3个类改完之后,DateUtil类改动最大的我认为是年月日数值的表示,以及对象的构造方法,在方法整体结构上与上一题没有太大差异。
对于5-1和7-1,在答案上我没有做出来,在创造解决问题的方法没有完全做出来,加上我认为这2道题在整体上,关系是比较紧密的,这2个方法没出来,可能导致整体没办法实现,虽然我没有做出来,但是在eclipse上也花费了大量的时间,在其中我也了解到了许多方法,更加熟练的理解如何根据一个需求去创造类,以及更加熟练去的去分析一个类一个方法,但可能在实现方法上存在一些欠缺,这也让更加明白了自己的不足之处和自己应该努力的方向。
(3)踩坑心得
1.在7-5中有参创造Month函数时,直接用
year = yearValue;
这样会导致编译错误因为year是Year类型的变量,而yearValue是整型的数值,不能直接用=去赋值;
year = (Year)yearValue;
之后尝试用强制转换,但明显不合理;
this.year = new Year(yearValue);
之后想到year是Year类型的变量,而Year里有构造对象的方法。
2.在7-5中在引用年份的值时一开始直接用this.year后来用this.getYear().getValue().
year2 = this.year; year2 = this.getYear().getValue();
应该按照层层递进的方法读取year的值
year2 = this.getDay().getMonth().getYear().getValue();
3.在之前的日期类设计中是用isLeapYear(year2)进行闰年的判断,在这次设计中一开始我直接用year2.isLeapYear(),后来发现这个是Year类里面的方法,得用
New Year(Year2)先去创建对象,再去引用isLeapYear()这个方法。
new Year(year2).isLeapYear()
4.在判断数据是否合理时,总是在月份上判断失误,因为在判断日数据是否合理时,采用的是一个存了12个数字的数组,如果月份大于12或者为负数是,数组超限等等错误就会出来,所以在判断日数据是否合理时,加了一个if语句来阻止这种错误的发生。
if(month.value<=12&&month.value>=1) if(this.getYear().isLeapYear()) mon_maxnum[1]=29; if(this.getDay().getValue()>=1&&this.getDay().getValue()<=mon_maxnum[month.getValue()-1]&&this.getMonth().validate()&&this.getYear().validate()) a=true; else a=false;
(4)改进建议
我觉得我编码了类中,有许多好的方法但是我并没有去用,换句话说并没有第一时间想到去使用所设计的方法,导致许多代码重复写,导致很累赘,给自己增加负担,就像是日期类设计,2道题明明都会在Year类,Day类、Month类写了一些数值增加数值减少以及数值化1,数值化为最大的方法,但是在实现求前n天、后n天、2个日期之间天数这3个方法时仍然自己重新写一遍代码,重复多余,其次自己写代码,一开始并没有条理性,总是不加思考就去写,还好先在eclipse上写,能清楚的告诉我错在哪里,不然要想好久,其次在引用类方法里面的数值时,一开始不懂得怎么去引用,但是现在更加明白和理解,。
(5)总结
在这三次题目集中我认为我收获最大的就是在写代码时不能把什么东西放在一个类里面,根据特性的不同,设计多个类,在利用关联、聚合等关系来达到实现方法的目的。这样可以减少类与类之间的高依赖性,同时增加了程序的高复用性,类的重用性。其次更加了解LocalDate类中函数的使用以及正则表达式的使用,明白里如何用一个函数将一个数组排序,如何用函数将一个字符串按特定的结构分割。我对正则表达式的运用不够熟练只知道初步使用,稍微难一点,需要灵活运用时,就无从下手。对于LocalDate类和integer类中许多方法应该深入了解。对于课程、实验和作业方面,我认为比较好的,在课后适当的布置作业,可以提高我们的学习的积极性,加速我们吸收课堂的知识,我认为可以多组织一些课上的活动。
7-9次题目集总结
7-9次题目集总结
一、 前言
这三次题目集的难度都比较大,涉及的知识内容比较深,题目数量不多,每个题目集只有一两道,这几次题目集要求对类图中类与类之间的联系要有一定的分析,理解每个类在代码中的功效以及发挥的作用。
二、 设计与分析
1、 第七次题目集7-1题图形卡片排序游戏,该题目需要在输入一串数字作为不同图形之后再输入一串数字为其相关参数后能够对输入的图形做出排序最后再输出所有图形的面积之和。这道题目首先要对输入的数据判断是否符合规则,若不符合则输出wrong Format,若输入数据正确,则接收相应的数据进行面积的计算,最后通过比较来进行排序。通过对代码的分析可以看出来,目前对于代码的注释还是偏低了,需要后期不断地进行改进,其它的都还行
2、 第七次题目集的7-2图形卡片分组,这道题目是在本次题目集的7-1上做出改进,要求能够对卡片以图形进行分类,此外输出不同类型卡片之间的排序,难度较之有所提升。这两道题目在递进式设计方面,首先建立一个shape的抽象类,在类里建立一个获取面积的抽象方法和判断输入数据是否符合规则的抽象方法,之后建立了四中图形类继承shape抽象类实现抽象类中的抽象方法;用一个列表记下输入的图形数据,在一个类中对列表中的数据进行分类,之后在这个类里创建一个方法对各图形按照面积进行排序。
3、 第八次题目集7-1ATM机类结构设计(一)中,要求编写一个银行ATM机的模拟程序,能够完成用户的存款、取款和查询余额的功能。题目所给的设计书中有提醒到需要设计银联、银行、银行账户、银行卡、ATM等实体类,此外还有业务类,但是在写的时候并没有注意到,所以并没有编写业务类,而是将业务写在了实体类里面。首先将输入的数据以空格进行分割之后,放在一个列表中,让后逐条分析每个用户输入数据,判断用户输入数据是想查询余额还是存取款,在存取款上通过判断输入金额的正负来确定用户是想要存钱还是取钱,在Main类和账户类的一起作用下,完成了存取款功能,这样子耦合度比较大。同时在处理用户输入数据方面也是很繁琐,通过多层循环来查找数据进行判断,同时有些判断部分还重复了几次。下图为代码分析图,可能是因为那几处繁琐的代码导致了代码的最大深度和最大复杂度比较高。
4、 第九次题目集ATM机结构设计(二)是在第八次题目集的基础上改进,银行账户分为了借记账户和贷记账户两种,其中贷记账户可以透支取款,透支取款有一定的额度且需要收取一定的费用,银行卡也相应的分为了借记卡和贷记卡两种,此外相比于第八次题目集的ATM模拟程序,这次的取款能够跨行,只是要收取一定的手续费同时新添加了一个银行和几个用户。在这道题目的编写过程中在上次题目的许多地方都做出了改进,新添加了一个校验类里面写有校验数据是否正确的方法还有一个判断取钱是否透支的方法、一个存取款类里面有存钱和取钱两个方法,此外还有一个获取余额类里面只有一个获取余额信息的方法。在许多实体类的属性成员里添加了它的上一级的属性,这样在代码的许多地方需要查找该属性所属的银行或者账户用户等都比较方便,省去了许多繁琐的步骤。下图为改题目代码的分析图可以看出,经过改进之后代码吗的最大深度和最大复杂度是有明显的下降,在平均复杂度上,或许是因为代码需要进行的初始化数据比较多,使许多行代码都在进行输入初始数据使得平均复杂度不高。
5、 对于第八次和第九次题目集中两道ATM机仿真题目的设计思路上。首先银联类管理着所有的银行,其属性成员只有自己的名称和一个银行类型的列表,让所有银行作为其成员,在方法上也只有对银行列表添加成员和返回银行列表。银行类中属性成员有字符串类型的name记录本银行的名称、ATM类型的列表记录属于本银行的ATM机、用户类型的列表记录在本银行注册过的用户信息,此外相比较于第八次题目集在第九次题目集中还有一个手续费的比例记录着跨行在本银行取款所需要额外支付取款金额的百分比,该类中的方法也都是属性成员的set和get方法。用户类中的属性成员包括了一个字符串类型成员用来记录用户的名称,一个账户类型的列表记录用户所创建的账户。账户类中包括一个card类型的列表记录所属于这个账户的银行卡、一个字符串类型的number用以记录该账户的编号、一个double类型的money记录账户中的金额、一个type记录账户种类、字符串类型的bank记录该账户所属银行的名称、字符串类型的name记录该账户所属的用户名称。在银行卡类中包括一个字符串类型的number记录该银行卡的卡号、字符串类型的password记录银行卡的密码还有一个账户类型的account记录该银行卡所隶属的账户。在ATM机类中的属性成员包括一个字符串类型的num来记录ATM机的编号、一个银行类型的bank记录该ATM机所属银行。上述所有的实体类中的方法都只包含了属性成员的get和set方法。在存取款的类中的属性成员有一个银联和一个校验数据的成员,方法有存款,若输入的金额为负数即进行存款,通过银行卡卡号找到所隶属的账户然后将账户的余额加上要存的金额数;还有一个取款的方法,在编写该方法时首先要判断取款是否有跨行,若有跨行行为则需要另外收取跨行手续费,之后需要判断取款银行卡是否为贷记卡且是否有透支取款。在校验类中只有一个银联作为属性成员,在该类中有找银行卡的方法,通过输入的银行卡账号参数来找到卡号对应的银行卡并且返回银行卡;有找ATM机的方法,通过传入的ATM编号找到ATM机并且返回;有布尔类型的卡号校验方法,通过遍历各个银行的所有银行卡卡号比较传进来的参数来判断该卡号是否存在,若存在则返回true;布尔类型的ATM机编号校验,通过遍历各银行所有的ATM机编号来校验传入参数的编号是否存在;密码校验方法,先通过遍历卡号查找到对应的银行卡之后获取密码对比传入的参数判断是否正确;透支校验方法,先判断账户类型再分别编写两种账户类型的情况。获取余额方法中有属性成员银联,还有一个获取余额的方法,通过遍历对比卡号,找到卡号后返回卡号所属账户的余额。在main函数里则是对数据的初始化,然后是对输入用户输入指令的分析处理。
三、 踩坑心得
1、 在编写代码的时候复制前段代码中的一段排序方法时有些数据未进行更改导致了输出数据出错;
2、 在第七次题目集中比较各种图形的数据的时候在在三角形处把triangle 写成了 rectangle导致比较上出现错误;
3、 在第八次题目集中使用for循环对输入的指令进行分割的时候,将条件判断语句list.size()写成了list.size()-1,导致当输入一个数据时程序的这段代码不会发挥作用;
4、 在ATM机模拟程序中需要初始的数据较多,有时输错了一两个之后,测试样例时程序出错,却总是找不到问题,当时找了挺久才发现问题;
5、 在ATM模拟程序中判断取款是否透支处,需要考虑许多种情况的发生。
四、 改进建议
可以适度的提高自己对代码的注释情况,这样子可以在过了一段时间之后再回头看能够快速弄懂自己在某些地方写这些代码的作用,也方便出问题的时候问别人,让别人理解自己是想要做什么。同时还要提高自己对类图的分析能力,以便能够快速的弄清楚每个类所需要发挥的作用大概要怎么写。
五、 总结
通过这几次的题目集,感觉自己对于类图的分析能力有所提高,但是有较大欠缺,需要去不断地锻炼自己;对于类于类之间的相互联系能够有一定的分析。
以上是关于题目集4-6次总结的主要内容,如果未能解决你的问题,请参考以下文章