最新要闻
- 金融类都有什么-金融类都有什么专业 天天即时看
- 蔚来五一换电量创历史新高 车主高速薅免费电池4万块_世界今日报
- 《王者荣耀》妲己九尾“收割”女玩家:实体手办1199元
- 苹果树桃树缓控修剪新技术_关于苹果树桃树缓控修剪新技术的简介 环球微动态
- 宁波地铁全天免费坐 五一延长1小时 有站点人流暴涨200%|世界快看
- 今年的五一“疯”了吗?网友:走不动 根本走不动
- 太科幻!比亚迪深圳云巴开通:全自动运行、刷脸进站、无感支付
- AMD Yes!一文了解锐龙Z1处理器:为掌机而生 天天热头条
- 天天热头条丨让AI画“边打游戏边吃意面” AI毅然让玩家啃了手柄
- 《饥荒联机版》在线人数破纪录 Steam史低只要4.8元
- 评论区被疯狂玩梗 抖音网红女骑手:何必恶语相对
- 通讯!经典超烂游戏《Ancient Roman》引热议 日本4成女性居然都知道
- 环球关注:亚美尼亚飞一航空:未预先通知,土耳其对其关闭了领空
- 苏宁易购一季度亏损1亿元:大幅减亏90% 核心家电3C业务盈利 全球微速讯
- 快讯:景区回应“上厕所要花55元买门票”:园外无公厕
- 直线过抛物线焦点公式(抛物线焦点公式)-环球关注
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
看点:OO题目集4-6总结
一、前言
题目集四
从本次题目集开始,正式开始了菜单类设计,并熟悉了字符串各常用语法的运用,及运用封装性进行面向对象编程。七道题目,菜单3难度稍高,其他中等。
(资料图片仅供参考)
题目集五
本次题目集集中训练了正则表达式,以及日期问题的面向对象聚合设计。总体难度不大,题量也只有六道,不多,主要是熟悉正则的用法以及如何实现聚合。
题目集六
在这次题目集中仅一道菜单类题目,是题目集四菜单类的再次迭代,虽然题目量少,但相较于其他题目集花费时间却更多,题目代码量更多,类与类之间的设计也更加复杂难以下手。
二、设计与分析
---题目集4-1,题目集6-1
1、题目
(1) 题目集4-1
(2) 题目集6-1
2、分析:
题目集4-1是菜单类题目的第三次迭代,刚开始的时候,由于没有写过菜单1和菜单2,看到这么长的题目还是挺手足无措的,不知道从哪里开始下手,总是会有一点逃避心理的,再加上在题目集3中并不是只有这一道题目,一开始就先打算完成其他题目再来慢慢写,没想到在其他题目上也被卡了很久,导致最后在设计分析这道题的时候,时间也不多了,类间关系混乱,很多地方都没有考虑到,最后也没有写完。
在编写本次blog时,是已经经历过题目集6-1的菜单4了,现在一对比菜单4,菜单3的条件等等都相对非常简化版本的了,现在反思当时的小小逃避心理真的是非常后悔的(欠下的债总是要还的),而由于当时的我对于菜单3并没有好好的分析,使我在菜单4的更复杂的题目中花费了大量时间来抽离主干、分析设计。
由上面的图片可以看到,菜单类设计主要是分为两个板块,一个是输入菜谱,一个是输入订单,而菜单4则比菜单3增加了十几条异常情况判断和一种功能增加。在菜单类的设计中,我也在和同学讨论如何改进菜单各个情况的处理的过程中收获了许多。
(1) 比如说菜单4的输入格式等方面判断,一开始我使用的是字符串输入,split分割成字符串数组再来一一判断,但是这样就会漏掉比如多个空格等错误情况,后来在交流中,发现可以用正则表达来判断会更加全面;
原来的:
改进后:
(2) 还有格式错误这些小细节,在写代码中,输出基本是自己按照题目去写格式,由于各个地方的判断输出都比较多,输入时不可能所有的内容直接复制格式在一起输入,那么一些小细节的地方就会完全发现不了,比如:
在这里的冒号后面其实是有一个空格的,但是如果是自己对照着一个个写格式,这里是绝对不会发现不了还有一个空格,这个点也是我在同学的提醒下才发现的。
(3)在菜单类4中,由于异常判断较多,时常会出现各种问题。比如在这里判断后,是直接输出吗,还是要延迟输出;是先判断这个,还是先判断哪个等等,由于我的各个方法是在对应的类中实现,并不能说是非常直观的在代码中看到功能以及效果,导致了许多混乱,后来在与同学的复盘中也提到了,说我的代码看起来就像在不停的打补丁一样,这里缺了一点就补一下,那里缺了一点再补一下,程序结构非常混乱,PTA的提交分数也是飘忽不定,这是需要改正的。
关于菜单的类与类的设计,现在最后的版本相比较于最初的想法基本上可以说是毫不相干了,在逐渐完成代码的时候,一步步加上各种功能,发现现在的类不能满足需求,又重新设计,添加上新的类,不断修改修改,在这次题目集中,确实是感觉到自己成长了许多。
对于本次题目集中的菜单类问题,后期发现确实是在算法上没有什么难点,在我看来它更多地是在考验逻辑思维,细心程度,分析解决问题能力以及和同学伙伴间的交流能力,而不是要自己闭门造车。
最后的类图如下:
设计了Dish菜品类,Menu菜谱类,TableNumberIdentification桌号类,Record单条点菜记录类,Order单条订单类,BlanketOrder总订单类。Menu -> Dish,BlanketOrder ->Order ->Record和TableNumberIdentification。
数据分析如下:
---题目集5-5,题目集5-6
这两道题是在上次总结中也有写过的日期问题的两种不同的聚合关系的写法,虽然大体上算法大差不差,但是在类的结构,内容上随着类间关系的变化也是导致代码产生了许多变化。
类图如下:
(1) 题目集5-5
(2) 题目集5-6
在5-5中,是按照中介 -> 年 -> 月 -> 日的聚合方式,是一级比一级要大的,而在5-6中,则是中介 -> 年,月,日的聚合方式,在中介的下面,年月日是同样的地位,这是两种聚合的主要不同。那么随着变化,类内的方法和属性肯定也是不同的。
这两道题难度都不大,我认为主要是想让我们熟悉并运用聚合关系。
最后代码如下:
(1) 题目集5-5
import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int choice = in.nextInt(); if(choice == 1){//求下n天 int y = in.nextInt(); int m = in.nextInt(); int d = in.nextInt(); DateUtil dateUtil = new DateUtil(y,m,d); int n = in.nextInt(); if (!dateUtil.checkInputValidity() || n < 0) { System.out.println("Wrong Format"); System.exit(0); } dateUtil.getNextDays(n); System.out.println(dateUtil.showDate()); } else if(choice == 2){//求前n天 int y = in.nextInt(); int m = in.nextInt(); int d = in.nextInt(); DateUtil dateUtil = new DateUtil(y,m,d); int n = in.nextInt(); if (!dateUtil.checkInputValidity() || n < 0) { System.out.println("Wrong Format"); System.exit(0); } dateUtil.getPreviousDays(n); System.out.println(dateUtil.showDate()); } else if(choice == 3){//求相差天数 int y = in.nextInt(); int m = in.nextInt(); int d = in.nextInt(); DateUtil dateUtil1 = new DateUtil(y,m,d); int yy = in.nextInt(); int mm = in.nextInt(); int dd = in.nextInt(); DateUtil dateUtil2 = new DateUtil(yy,mm,dd); if (!dateUtil1.checkInputValidity() || !dateUtil2.checkInputValidity()) { System.out.println("Wrong Format"); System.exit(0); } System.out.println(dateUtil1.getDaysofDates(dateUtil2)); } else { System.out.println("Wrong Format"); System.exit(0); } }}class Year{//年 private int value; public Year(){ } public Year(int value){ this.value = value; } public void setValue(int value) { this.value = value; } public int getValue() { return value; } public boolean isLeapYear(){//判断闰年 if(value % 400 == 0 || (value % 100 != 0 && value % 4 == 0)) return true; return false; } public boolean validate(){//判断输入是否合法 if(value >= 1900 && value <= 2050) return true; return false; } public void yearIncrement(){ value ++; } public void yearReduction(){ value --; }}class Month{ private int value; private Year year; public Month(){ } public Month(int yearValue,int monthValue){ this.value = monthValue; year = new Year(yearValue); } public void setValue(int value) { this.value = value; } public int getValue() { return value; } public void setYear(Year year) { this.year = year; } public Year getYear() { return year; } public void resetMin() { value = 1; } public void resetMax() { value = 12; } public boolean validate(){//判断输入是否合法 if(value >= 1 && value <= 12) return true; return false; } public void monthIncrement(){ value ++; } public void monthReduction(){ value --; }}class Day{ private int value; private Month month; private 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.value = dayValue; month = new Month(yearValue,monthValue); } public void setValue(int value) { this.value = value; } public int getValue() { return value; } public void setMonth(Month month) { this.month = month; } public Month getMonth() { return month; } public void resetMin() { value = 1; } public void resetMax() { value = mon_maxnum[month.getValue()]; } public boolean validate(){//判断输入是否合法 if(month.getYear().isLeapYear() && month.getValue() == 2){ if(value >= 1 && value <= 29) return true; } if(value >= 1 && value <= mon_maxnum[month.getValue() - 1]) return true; return false; } public void dayIncrement(){ value ++; } public void dayReduction(){ value --; }}class DateUtil{ private Day day; public DateUtil(){ } public DateUtil(int y,int m,int d) { day = new Day(y,m,d); } public Day getDay() { return day; } public void setDay(Day d) { this.day = day; } public boolean checkInputValidity(){ if(day.getMonth().getYear().validate()) if(day.getMonth().validate()) if(day.validate()) return true; return false; } public boolean compareDates(DateUtil date){//比较大小 if(day.getMonth().getYear().getValue() < date.getDay().getMonth().getYear().getValue()) return true;//年小 if(day.getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue()) if(day.getMonth().getValue() < date.getDay().getMonth().getValue()) return true;//年等,月小 if(day.getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue()) if(day.getMonth().getValue() == date.getDay().getMonth().getValue()) if(day.getValue() <= date.getDay().getValue()) return true;//年等月等,日小 return false; } public boolean equalTwoDates(DateUtil date){//比较是否相等 if(day.getMonth().getYear().getValue() == date.getDay().getMonth().getYear().getValue()) if(day.getMonth().getValue() == date.getDay().getMonth().getValue()) if(day.getValue() == date.getDay().getValue()) return true;//年等月等日等 return false; } public String showDate(){//格式化日期 return day.getMonth().getYear().getValue() + "-" + day.getMonth().getValue() + "-" + day.getValue(); } public DateUtil getNextDays(int n){//求下n天 Day temp; long num = 0; int YearNum = 365; if(day.getMonth().getYear().isLeapYear()) YearNum = 366; for(int i = 0;i < day.getMonth().getValue() - 1;i ++){ temp = new Day(0,0,0);//设立一个新的Day类,用来累加 temp.getMonth().setValue(i);//把当前要加上的月份赋给他 temp.resetMax();//把本月的最大天数赋值 if(day.getMonth().getYear().isLeapYear() && i == 1) num = num + temp.getValue() + 1; else num += temp.getValue(); } num += day.getValue(); num += n; //跨年了,有可能跨了不止一年 while(num > YearNum){ day.getMonth().getYear().yearIncrement();//年份加一 num -= YearNum; if(day.getMonth().getYear().isLeapYear()) YearNum = 366; else YearNum = 365; } day.setValue(0); day.getMonth().setValue(1); int i = 0; temp = new Day(0,0,31); while(num > temp.getValue()){ if(day.getMonth().getYear().isLeapYear() && i == 1)//闰年的二月 num = num - temp.getValue() - 1; else num-= temp.getValue(); temp.getMonth().monthIncrement(); day.getMonth().monthIncrement(); i ++; temp.getMonth().setValue(i); temp.resetMax(); } day.setValue((int)num); return this; } public DateUtil getPreviousDays(int n){//求前n天 Day temp; long num = 0; int YearNum = 365; if(day.getMonth().getYear().isLeapYear()) YearNum = 366; for(int i = 0;i < day.getMonth().getValue() - 1;i ++){ temp = new Day(0,0,0);//设立一个新的Day类,用来累加 temp.getMonth().setValue(i);//把当前要加上的月份赋给他 temp.resetMax();//把本月的最大天数赋值 if(day.getMonth().getYear().isLeapYear() && i == 1) num = num + temp.getValue() + 1; else num += temp.getValue(); } num += day.getValue(); num -= n; //跨年了,有可能跨了不止一年 while(num <= 0){ day.getMonth().getYear().yearReduction();//年份减一 if(day.getMonth().getYear().isLeapYear()) YearNum = 366; else YearNum = 365; num += YearNum; } day.setValue(0); day.getMonth().setValue(1); int i = 0; temp = new Day(0,0,31); while(num > temp.getValue()){ num -= temp.getValue(); temp.getMonth().monthIncrement(); day.getMonth().monthIncrement(); i ++; temp.getMonth().setValue(i); temp.resetMax(); if(day.getMonth().getYear().isLeapYear() && i == 1)//闰年的二月 temp.setValue(29); } day.setValue((int)num); return this; } public int getDaysofDates(DateUtil date){//求相差天数 int yearMin,yearMax; int numMin = 0,numMax = 0; Day temp,dayMax,dayMin; int YearNum = 365; if(day.getMonth().getYear().isLeapYear()) YearNum = 366; if(this.compareDates(date)) {//this <= date yearMax = date.getDay().getMonth().getYear().getValue(); yearMin = this.getDay().getMonth().getYear().getValue(); dayMax = new Day(date.getDay().getMonth().getYear().getValue(),date.getDay().getMonth().getValue(),date.getDay().getValue()); dayMin = new Day(day.getMonth().getYear().getValue(),day.getMonth().getValue(),day.getValue()); } else{ yearMax = this.getDay().getMonth().getYear().getValue(); yearMin = date.getDay().getMonth().getYear().getValue(); dayMax = new Day(day.getMonth().getYear().getValue(),day.getMonth().getValue(),day.getValue()); dayMin = new Day(date.getDay().getMonth().getYear().getValue(),date.getDay().getMonth().getValue(),date.getDay().getValue()); } //以小的年份为基准,用大的来-- //计算小的年份在本年的天数 for(int i = 0;i < dayMin.getMonth().getValue() - 1;i ++){ temp = new Day(0,0,0);//设立一个新的Day类,用来累加 temp.getMonth().setValue(i);//把当前要加上的月份赋给他 temp.resetMax();//把本月的最大天数赋值 if(dayMin.getMonth().getYear().isLeapYear() && i == 1) numMin = numMin + temp.getValue() + 1; else numMin += temp.getValue(); } numMin += dayMin.getValue(); //计算大的年份在本年的天数 for(int i = 0;i < dayMax.getMonth().getValue() - 1;i ++){ temp = new Day(0,0,0);//设立一个新的Day类,用来累加 temp.getMonth().setValue(i);//把当前要加上的月份赋给他 temp.resetMax();//把本月的最大天数赋值 if(dayMax.getMonth().getYear().isLeapYear() && i == 1) numMax = numMax + temp.getValue() + 1; else numMax += temp.getValue(); } numMax += dayMax.getValue(); //再加上差的每一年的天数 while(yearMin != yearMax){ yearMax --; if((yearMax % 400 == 0)||(yearMax % 100 != 0 && yearMax % 4 == 0)) numMax += 366; else numMax += 365; } numMax -= numMin; return numMax; }}
(2) 5-6
import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int choice = in.nextInt(); if(choice == 1){//求下n天 int y = in.nextInt(); int m = in.nextInt(); int d = in.nextInt(); DateUtil dateUtil = new DateUtil(y,m,d); int n = in.nextInt(); if (!dateUtil.checkInputValidity() || n < 0) { System.out.println("Wrong Format"); System.exit(0); } System.out.print(dateUtil.showDate() + " next " + n + " days is:"); dateUtil.getNextDays(n); System.out.println(dateUtil.showDate()); } else if(choice == 2){//求前n天 int y = in.nextInt(); int m = in.nextInt(); int d = in.nextInt(); DateUtil dateUtil = new DateUtil(y,m,d); int n = in.nextInt(); if (!dateUtil.checkInputValidity() || n < 0) { System.out.println("Wrong Format"); System.exit(0); } System.out.print(dateUtil.showDate() + " previous " + n + " days is:"); dateUtil.getPreviousDays(n); System.out.println(dateUtil.showDate()); } else if(choice == 3){//求相差天数 int y = in.nextInt(); int m = in.nextInt(); int d = in.nextInt(); DateUtil dateUtil1 = new DateUtil(y,m,d); int yy = in.nextInt(); int mm = in.nextInt(); int dd = in.nextInt(); DateUtil dateUtil2 = new DateUtil(yy,mm,dd); if (!dateUtil1.checkInputValidity() || !dateUtil2.checkInputValidity()) { System.out.println("Wrong Format"); System.exit(0); } System.out.print("The days between " + dateUtil1.showDate() + " and " + dateUtil2.showDate() + " are:"); System.out.println(dateUtil1.getDaysofDates(dateUtil2)); } else { System.out.println("Wrong Format"); System.exit(0); } }}class Year{//年 private int value; public Year(){ } public Year(int value){ this.value = value; } public void setValue(int value) { this.value = value; } public int getValue() { return value; } public boolean isLeapYear(){//判断闰年 if(value % 400 == 0 || (value % 100 != 0 && value % 4 == 0)) return true; return false; } public boolean validate(){//判断输入是否合法 if(value >= 1820 && value <= 2020) return true; return false; } public void yearIncrement(){ value ++; } public void yearReduction(){ value --; }}class Month{ private int value; public Month(){ } public Month(int value){ this.value = value; } public void setValue(int value) { this.value = value; } public int getValue() { return value; } public void resetMin() { value = 1; } public void resetMax() { value = 12; } public boolean validate(){//判断输入是否合法 if(value >= 1 && value <= 12) return true; return false; } public void monthIncrement(){ value ++; } public void monthReduction(){ value --; }}class Day{ private int value; public Day(){ } public Day(int value){ this.value = value; } public void setValue(int value) { this.value = value; } public int getValue() { return value; } public void dayIncrement(){ value ++; } public void dayReduction(){ value --; }}class DateUtil{ private Day day; private Month month; private Year year; private int[] mon_maxnum = {31,28,31,30,31,30,31,31,30,31,30,31}; public DateUtil(){ } public DateUtil(int y,int m,int d) { day = new Day(d); month = new Month(m); year = new Year(y); } public Day getDay() { return day; } public void setDay(Day d) { this.day = d; } public Month getMonth() { return month; } public void setMonth(Month month) { this.month = month; } public Year getYear() { return year; } public void setYear(Year year) { this.year = year; } public void setDayMax(){ //if(month.getValue() >= 1) day.setValue(mon_maxnum[month.getValue()]); } public void setDayMin(){ day.setValue(1); } public boolean checkInputValidity(){ int d; if(year.validate()) if(month.validate()){ d = mon_maxnum[month.getValue() - 1]; if(day.getValue() >= 1 && day.getValue() <= d) return true; } return false; } public boolean compareDates(DateUtil date){//比较大小 if(year.getValue() < date.getYear().getValue()) return true;//年小 if(year.getValue() == date.getYear().getValue()) if(month.getValue() < date.getMonth().getValue()) return true;//年等,月小 if(year.getValue() == date.getYear().getValue()) if(month.getValue() == date.getMonth().getValue()) if(day.getValue() <= date.getDay().getValue()) return true;//年等月等,日小 return false; } public boolean equalTwoDates(DateUtil date){//比较是否相等 if(year.getValue() == date.getYear().getValue()) if(month.getValue() == date.getMonth().getValue()) if(day.getValue() == date.getDay().getValue()) return true;//年等月等日等 return false; } public String showDate(){//格式化日期 return year.getValue() + "-" + month.getValue() + "-" + day.getValue(); } public DateUtil getNextDays(int n){//求下n天 DateUtil temp = new DateUtil(0,0,0);//设立一个新的Day类,用来累加; long num = 0; int YearNum = 365; if(year.isLeapYear()) YearNum = 366; for(int i = 0;i < month.getValue() - 1;i ++){ temp.getMonth().setValue(i);//把当前要加上的月份赋给他 temp.setDayMax();//把本月的最大天数赋值 if(year.isLeapYear() && i == 1) num = num + temp.getDay().getValue() + 1; else num += temp.getDay().getValue(); } num += day.getValue(); num += n; //跨年了,有可能跨了不止一年 while(num > YearNum){ year.yearIncrement();//年份加一 num -= YearNum; if(year.isLeapYear()) YearNum = 366; else YearNum = 365; } day.setValue(0); month.setValue(1); int i = 0; temp = new DateUtil(0,0,31); while(num > temp.getDay().getValue()){ if(year.isLeapYear() && i == 1)//闰年的二月 num = num - temp.getDay().getValue() - 1; else num -= temp.getDay().getValue(); temp.getMonth().monthIncrement(); month.monthIncrement(); i ++; temp.getMonth().setValue(i); temp.setDayMax(); } day.setValue((int)num); return this; } public DateUtil getPreviousDays(int n){//求前n天 DateUtil temp = new DateUtil(0,0,0);//设立一个新的Day类,用来累加; long num = 0; int YearNum = 365; if(year.isLeapYear()) YearNum = 366; for(int i = 0;i < month.getValue() - 1;i ++){ temp.getMonth().setValue(i);//把当前要加上的月份赋给他 temp.setDayMax();//把本月的最大天数赋值 if(year.isLeapYear() && i == 1) num = num + temp.getDay().getValue() + 1; else num += temp.getDay().getValue(); } num += day.getValue(); num -= n; //跨年了,有可能跨了不止一年 while(num <= 0){ year.yearReduction();//年份减一 if(year.isLeapYear()) YearNum = 366; else YearNum = 365; num += YearNum; } day.setValue(0); month.setValue(1); int i = 0; temp = new DateUtil(0,0,31); while(num > temp.getDay().getValue()){ num -= temp.getDay().getValue(); temp.getMonth().monthIncrement(); month.monthIncrement(); i ++; temp.getMonth().setValue(i); temp.setDayMax(); if(year.isLeapYear() && i == 1)//闰年的二月 temp.getDay().setValue(29); } day.setValue((int)num); return this; } public int getDaysofDates(DateUtil date){//求相差天数 int yearMin,yearMax; long numMin = 0,numMax = 0; DateUtil temp,dayMax,dayMin; int YearNum = 365; if(year.isLeapYear()) YearNum = 366; if(this.compareDates(date)) {//this <= date yearMax = date.getYear().getValue(); yearMin = this.getYear().getValue(); dayMax = new DateUtil(date.getYear().getValue(),date.getMonth().getValue(),date.getDay().getValue()); dayMin = new DateUtil(year.getValue(),month.getValue(),day.getValue()); } else { yearMax = this.getYear().getValue(); yearMin = date.getYear().getValue(); dayMax = new DateUtil(year.getValue(),month.getValue(),day.getValue()); dayMin = new DateUtil(date.getYear().getValue(), date.getMonth().getValue(), date.getDay().getValue()); } //以小的年份为基准,用大的来-- //计算小的年份在本年的天数 for(int i = 0;i < dayMin.getMonth().getValue() - 1;i ++){ temp = new DateUtil(0,0,0);//设立一个新的Day类,用来累加 temp.getMonth().setValue(i);//把当前要加上的月份赋给他 temp.setDayMax();//把本月的最大天数赋值 if(year.isLeapYear() && i == 1) numMin = numMin + temp.getDay().getValue() + 1; else numMin += temp.getDay().getValue(); } numMin += dayMin.getDay().getValue(); //计算大的年份在本年的天数 for(int i = 0;i < dayMax.getMonth().getValue() - 1;i ++){ temp = new DateUtil(0,0,0);//设立一个新的Day类,用来累加 temp.getMonth().setValue(i);//把当前要加上的月份赋给他 temp.setDayMax();//把本月的最大天数赋值 if(year.isLeapYear() && i == 1) numMax = numMax + temp.getDay().getValue() + 1; else numMax += temp.getDay().getValue(); } numMax += dayMax.getDay().getValue(); //再加上差的每一年的天数 while(yearMin != yearMax){ yearMax --; if((yearMax % 400 == 0)||(yearMax % 100 != 0 && yearMax % 4 == 0)) numMax += 366; else numMax += 365; } numMax -= numMin; return (int)numMax; }}
三、踩坑心得
---题目集4-2
这道题几个错误都是运行超时导致的,在修改中发现将x的定义挪出循环外后有一个点的运行超时就通过了,仔细分析发现应该是一直定义不断增加占据空间的同时拖慢了运行速度,还是一些基础不牢固导致的,这种错误是不应该出现的,要多多注意。
---题目集4-3
本题在题目集三中出现过类似题目,在一开始写的时候我原本也是按照之前的思路进行设计,但在提交后发现总是会运行超时。
尝试改变算法(增加改变判断条件),改变元素的储存方式(ArrayList)之类的,都一直还是超时,后来在和同学的的讨论中不断尝试,最后用到了LinkedHashSet才终于通过。
---题目集4-4
在本题中主要踩的坑是由于对于 split() 这个语法点的学习不够全面,知识没有掌握到位,split的()内当多个条件出现时,是有顺序的判断,从前往后,判断符合了第一个,就会跳过已经判读的字符,开始下一轮判断。
由于知识学习的不全面,导致只能在不断地测试试错中发现正确的用法,我认为这是非常需要改进的。而在试错的同时,也没有仔细分析错误的可能和与同学讨论可能原因,只是盲目的测试,也浪费了许多不必要的时间。
最后代码如下:
import java.util.Arrays;import java.util.ArrayList;import java.util.Scanner;public class Main { public static void main(String[] args) { String ch; Scanner in = new Scanner(System.in); String s = in.nextLine(); String[] str = s.split("\\. |\\, |\\.|\\ "); int strLon = str.length; int i,j; Arrays.sort(str,String.CASE_INSENSITIVE_ORDER);//所有的元素按字母序排序 for(i = strLon - 1;i >= 1;i --){//按字数排序 for(j = i - 1;j >= 0;j --){ if(str[i].length() <= str[j].length()){ ch = str[i]; str[i] = str[j]; str[j] = ch; } } } ArrayListnewStr = new ArrayList<>(); for(i = strLon - 2;i >= 0;i --){ if(!str[i + 1].equals(str[i])) newStr.add(str[i]); } int newStrLon = newStr.size(); System.out.println(str[strLon - 1]); for(i = 0;i < newStrLon;i ++){ System.out.println(newStr.get(i)); } }}
四、改进建议
(1)菜单类题目:在上面分析中我也曾提到过,写代码和打补丁一样,哪里缺了补哪里,当时是由于连题目都完成不了,就也没想那么多,把要修正的直接写上去了,发现时也来不及又修改又继续往下写了。这给了我很大的教训,这种代码编写想法是需要在以后改正的。
(2) 代码的各种小问题在这几次的题目集中我也是经常犯。比如在循环里每次重定义一个数,使题目大大增加运行时间;循环判断true/false写反了;题目阅读不仔细,出错了才反应过来等等。
五、总结
1、综合性总结
(1) 对于知识学习的不全面:如上面所说的 split 的用法由于了解不全面,导致一直出错。还有循环里的重定义,这也是对知识的掌握不全面导致的。
(2) 细节问题总是出错:像格式错误,读题不仔细这种,确实是不应该犯的错误。
(3) 对于题目条件间的逻辑:这个在菜单类题目中体现得非常明显,没有总体的意识,看一步走一步的,非常容易使自己逻辑混乱,一步错步步错的。以后要从类图开始着手,整理好类间逻辑再开始。
2、对于教师、课程、作业、实验及课上课下组织方式的改进建议以及意见
如果可以的话,希望以后可以开放题目集的补集。就是和原题目集一样的题目,但是成绩不参与平时成绩的计算。我觉得开放补集,可以在学习到了更多知识,有了更好的对于题目的想法和想要改进之前的算法的时候对于各种想法正确与否进行验证,只是与以往程序对照可能会出现疏漏。
关键词:
PTA题目集4~6总结
全球热点评!详细的BoltDB学习记录文档
看点:OO题目集4-6总结
金融类都有什么-金融类都有什么专业 天天即时看
“五一”迎来客流高峰 各部门全力保障旅客出行
蔚来五一换电量创历史新高 车主高速薅免费电池4万块_世界今日报
《王者荣耀》妲己九尾“收割”女玩家:实体手办1199元
苹果树桃树缓控修剪新技术_关于苹果树桃树缓控修剪新技术的简介 环球微动态
宁波地铁全天免费坐 五一延长1小时 有站点人流暴涨200%|世界快看
今年的五一“疯”了吗?网友:走不动 根本走不动
太科幻!比亚迪深圳云巴开通:全自动运行、刷脸进站、无感支付
AMD Yes!一文了解锐龙Z1处理器:为掌机而生 天天热头条
天天热头条丨让AI画“边打游戏边吃意面” AI毅然让玩家啃了手柄
要闻速递:性能_1 Jmeter脚本编写
《饥荒联机版》在线人数破纪录 Steam史低只要4.8元
评论区被疯狂玩梗 抖音网红女骑手:何必恶语相对
通讯!经典超烂游戏《Ancient Roman》引热议 日本4成女性居然都知道
环球关注:亚美尼亚飞一航空:未预先通知,土耳其对其关闭了领空
stable-diffusion-webui 环境设置过程记录 每日速读
苏宁易购一季度亏损1亿元:大幅减亏90% 核心家电3C业务盈利 全球微速讯
快讯:景区回应“上厕所要花55元买门票”:园外无公厕
直线过抛物线焦点公式(抛物线焦点公式)-环球关注
九年不屈!贾跃亭的FF 91量产下线 FF:工艺品质媲美豪华车制造商
探索“研学+”模式助力乡村振兴 张家港乐余镇启动乡村研学旅游季 当前最新
世界焦点!关于Linux操作系统使用lastlog命令对OS账号最后一次登录时间的审计
【世界独家】如何彻底关闭 Windows 10 自动更新
AITO问界卖的多亏得多?赛力斯:2022年净亏损超38亿元
微软690亿美元收购案被阻 动视暴雪CEO:必须合并才能跟腾讯、字节竞争|焦点滚动
西湖边最美人墙2.0版来了:为大家出行保驾护航_报资讯
视讯!中欧班列(武汉)连续4个月单月开行百列以上 同比增长近200%
赵长江:清华经管EMBA校友 一次下单超过20台腾势D9 动态
玩家建议微软推出自己的掌机:性能和XSS一样就行
你知道吗?火星上有22个中国地名:西柏坡、古田、窑店等
电影《长空之王》票房破2亿 王一博肩膀出血也不吭声:被赞爷们气 天天热闻
【全球热闻】襄阳公安这场推进会透出妥妥“安全感”
商务部:“五一”假期首日消费市场大幅升温
天天要闻:鲁绣、丝绸织染等山东非遗“炫技”海南
焦点快报!这价格疯了!24寸显示器仅279元:还是三微边设计
让《灌篮高手》电影被喷的“三渲二”技术 可以做到多牛X?_报道
CPU处理器价格越来越贵 笔记本除外:大跌9% 全球观热点
环球今热点:五一旅游闹心 115元买4.6斤水果少一斤后续:情况属实 顶格处罚
1999元起卖爆!Redmi Note 12 Turbo首销月三个销量第一:打破行业记录|全球快资讯
.Net Core Console&Cache 当前动态
共赴数字之约 描绘数字未来
当前观察:RTX 4070为何会破发?背后原因揭开
热门看点:ChatGPT一炮而红 OpenAI再度融资:估值已达2000亿
冲击30℃!五一假期北方多地开启升温模式 南方降雨在路上 世界今亮点
聊聊拍照那些事:五一外出你更喜欢用相机还是手机?_每日速读
越级影像旗舰真我11即将发布 realme徐起:五一大家休息 节后爆猛料|全球即时看
全球微资讯!“五一”档10余部新片集中上映
住客称入住网红酒店发现死尸打1星“差评” 涉事酒店回应_微头条
每日热讯!外观大变 首增插混!全新广汽本田雅阁开启11元盲订
曝Redmi K60 Ultra下半年登场:天玑9200+加持 安卓CPU性能之王
比NAS更好用!华为家庭存储便宜了:2699元起 最大16TB 环球热讯
两款《古墓丽影》游戏将登陆Switch!跟着劳拉去破坏“文物”
学系统集成项目管理工程师(中项)系列15_质量管理 世界视讯
热门5G手机市占率排名:华为P40 Pro国产机第一 5G平分天下 天天观速讯
承认车辆侧面碰撞试验“造假” 丰田章男道歉:我们错了
世界实时:五一2.4亿人次出游 酒店民宿价格5-7倍上涨 经济日报:违约应赔偿
离离原上谱!求职者:6000工资太高 只要2000可以吗?|世界时快讯
五一假期首日服务区充电站排队时长榜来了:充电要等2.7小时你接受吗?
驻村故事(逐梦)
【全球聚看点】好评率近100%!Redmi Note 12 Turbo把竞品甩在后面:1TB版太受欢迎
Markdown表格-换行、合并单元格
消息!关于方正证券的一些信息
《死或生:女神假期》新女神艾米登场:身材出众的18岁研究生 焦点要闻
超大额优惠券手慢无:植贝名朵防晒小光圈到手19.9元/瓶
聚焦产业建圈强链 成都市温江区举行校地合作交流会
【焦点热闻】退市三板行情_退市三板股票代码
启动“三年共富行动计划”,以“三拼”之势打造“六个乾潭”|微动态
蓝牙为啥叫“蓝”牙?就不能叫白牙吗?-全球微速讯
高速上44辆车被扎胎!初查结果:系货车铁屑散落
PC玩家很受伤!今年翻车的大作太多了
世界快看点丨【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
全球观热点:工程建设的范围是什么_工程建设的范围
海底捞一门店睡满人导致无法用餐:全是“特种兵”式大学生
[0基础学R语言] 软件下载与环境配置_天天热点
焦点!15 设备类型与设备驱动
万物皆有灵下一句是什么_万物皆有灵 全球百事通
每日快看:对标《原神》!《王者荣耀世界》新实机画面:蓝BUFF化身寒冰之王
Uzi老对手官宣转型!LOL“欧成”Rekkles改打辅助
快资讯丨苏教版二年级上册数学期中试卷含答案_苏教版二年级上册数学期中试卷
当前动态:4999元 荣耀MagicBook 14 GT版上架:RTX 2050独显
世界短讯!USB:终于一统江湖
视频会议的免费时代:宣告结束了 环球观热点
环球新动态:世界第八大奇迹!放假第一天兵马俑游客突破五万人:秦俑打上了保湿抗皱针
世界资讯:ssti注入
简讯:椰子怎么喝 椰子怎么喝最好
《角斗士》旧情人欣然返场
主机用质量模式玩《星球大战绝地》更好?起码可稳30帧 全球热门
MySQL常用数据库语句 天天观天下
穿小椰子怎么搭配衣服 穿小椰子鞋如何搭配_全球今日讯
最新:男子服务区买15元汉堡只有2片面包 老板:你不要我退钱
九号平衡车L8奥特曼定制版发布:首发1799元 可触发彩蛋
赛力斯2022年营收翻倍:问界M5/M7立大功
当前滚动:xss-labs靶场
男人对你说子非鱼是什么意思_子非鱼是什么意思
飞利浦推出新款24.5寸游戏显示器:280Hz高刷、0.5ms极速响应|全球观速讯
速读:14 进程的等待与唤醒机制
【环球新视野】基于python实现将AWS-ElastiCache-的Reserved_Cache_Nodes-预留节点及费用的信息统计