第二次大作业
前言
这次blog离上次已经有很长时间了,在经过了后续的训练之后我发现自己的代码水平还有相当大的进步空间,对于很多方法等都不能很好的运用,特别是到了后面的菜单那个题目之后,真的就是无从下手。希望在这次总结之后能够增加自己在代码这方面的能力,更好的认识不足。
第四次作业
知识点
类的构造、类与类之间的设计、字符串、LocalDate类等等。
题目分析
这次作业一共有七题,但是第一题却难的一道题目,自己在那里看了几十分钟愣是不知道如何下笔,最后只得了一分QVQ。但对于之后的题目都算是比较容易,好比二四六七都很快便做完了并且都是满分吧,然后便是三五了都是部分正确,到最后也都不知道应该如何改正才能避免这一些错误。在这里要强调的一点便是二三四题,我看班上的同学大多数都用到了容器这一概念,而我却对此毫不知情也是涉及到了我的一个知识盲区了,在这之后也提醒我得去学习新知识(这或许也是导致我这机头没有满分的原因吧)。总之这一次作业已经表现出了我与班上同学有了很大的差距,知识也远远不够。
第五次作业
知识点
正则表达式、构造类、类与类之间的关系、读类图。
题目分析
这次作业题目总共是有六题,前四题都是叫我们使用正则表达式来做,题目都是很简单的题目,主要还是要我们学习正则表达式的使用方法。后面一题则是类与类之间的聚合关系,题目还是之前算日期的题目,只是要用不同的关系来做。最后一题则是上一题的迭代,题目算法还是一样,但只是方法要换一下。
第六次作业
知识点
构造类、类与类之间关系的设计。
题目分析
这次题目只有一题,但却是难度最大的一次作业,老师也说了这次代码估计有个一千七百多行,时间也是要花费很长时间。我也是在一番斗争与思考过后无从下手从而放弃了这道题目。但是在老师自己做了之后跟我们说这次作业难度不算大的时候,我也是深深的认识到了自己的不足,还有很多东西要学。
总结
在这三次难度相比于前三次作业难度上升了之后,我更加清楚的看到了自己与别人的差距,特别是在菜单这一个题目之后,更加的让我认识到了自己的不足,以及自己那非常非常广阔的学习空间。
分析
第五次作业
7-5
类图
这是老师已经给好了的类图

源码
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int i = input.nextInt(); int year = input.nextInt(); int month = input.nextInt(); int day = input.nextInt(); DateUtil d3 = new DateUtil(year,month,day); if(i != 1 && i != 2 && i != 3) { System.out.println("Wrong Format"); } else { if(d3.day.month.year.validate() == true&&d3.day.month.validate()==true&&d3.day.validate()==true) { if(d3.day.month.year.isLeapYear() == true) { d3.day.mon_maxnum[2] = 29; } else { d3.day.mon_maxnum[2] = 28; } if(i == 1) { int n = input.nextInt(); if(day > d3.day.mon_maxnum[month]) { System.out.println("Wrong Format"); }else System.out.println(d3.getNextDays(n).showDate()); } if(i == 2) { int n = input.nextInt(); if(day > d3.day.mon_maxnum[month]) { System.out.println("Wrong Format"); } else System.out.println(d3.getPreviousNDays(n).showDate()); } if(i == 3) { int year1 = input.nextInt(); int month1 = input.nextInt(); int day1 = input.nextInt(); DateUtil d4 = new DateUtil(year1,month1,day1); if(d4.day.month.year.validate() == true&&d4.day.month.validate()==true&&d4.day.validate()==true) { if(d4.day.month.year.isLeapYear() == true) { d4.day.mon_maxnum[2] = 29; } else { d4.day.mon_maxnum[2] = 28; } if(day>d3.day.mon_maxnum[month] || day1>d4.day.mon_maxnum[month1]) { System.out.println("Wrong Format"); } else{ System.out.println(d4.getDaysofDates(year,month,day,d4)); } } else { System.out.println("Wrong Format"); } } } else { System.out.println("Wrong Format"); } } } } class Year{ private int year; Year(){ } Year(int year){ this.year = year; } void setValue(int year) { this.year = year; } int getvalue() { return this.year; } boolean isLeapYear() { if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { return true; } else { return false; } } boolean validate() { if(year >= 1900 && year <= 2050) { return true; }else { return false; } } void yearIncrement() { year ++; } void yearReduction() { year --; } } class Month{ int month; Year year; Month(){ } Month(int year,int month){ Year year1 = new Year(year); this.month = month; this.setYear(year1); } void setmonth(int month) { this.month = month; } int getmonth() { return this.month; } void setYear(Year year) { this.year = year; } Year getYear() { return this.year; } void resetMin() { month = 1; } void resetMax() { month = 12; } boolean validate() { if(month >= 1 && month <= 12) { return true; }else { return false; } } void monthIncrement() { if(month == 12) { resetMin(); year.yearIncrement(); } else month ++; } void monthReduction() { if(month == 1) { resetMax(); year.yearReduction(); } else month --; } } class Day{ private int day; Month month; int[] mon_maxnum = {0,31,28,31,30,31,30,31,31,30,31,30,31}; Day(){ } Day(int year,int month,int day){ Month month1 = new Month(year,month); this.day = day; setdmonth(month1); } void setday(int day) { this.day = day; } int getday() { return this.day; } void setdmonth(Month month) { this.month = month; } Month getmonth() { return this.month; } void resetMin() { day = 1; } void resetMax() { if(month.year.isLeapYear() == true) { mon_maxnum[2] = 29; day = mon_maxnum[month.getmonth()]; } else day = mon_maxnum[month.getmonth()]; } boolean validate() { if(day >= 1 && day <= 31) { return true; }else { return false; } } void dayIncrement() {//增加 if(month.year.isLeapYear() == true) { mon_maxnum[2] = 29; } else { mon_maxnum[2] = 28; } if(day == mon_maxnum[month.getmonth()]) { resetMin(); month.monthIncrement(); } else day ++; } void dayReduction() {//减少 if(day == 1) { if(month.year.isLeapYear()) { mon_maxnum[2] = 29; } else { mon_maxnum[2] = 28; } month.monthReduction(); resetMax(); }else day--; } } class DateUtil{ Day day; DateUtil(){ } DateUtil(int year,int month,int day){ Day day1 = new Day(year,month,day); setDay(day1); } void setDay(Day d) { this.day = d; } Day getDay() { return this.day; } String showDate() { return day.getmonth().getYear().getvalue()+"-"+day.getmonth().getmonth()+"-"+day.getday(); } DateUtil getNextDays(int n) { DateUtil d = new DateUtil(); int i = 0; d.day = this.day; for(i = 0;i < n;i ++) { d.day.dayIncrement(); } return d; } DateUtil getPreviousNDays(int n) { DateUtil d = new DateUtil(); int i = 0; d.day = this.day; for(i = 0;i < n;i ++) { d.day.dayReduction(); } return d; } int getDaysofDates(int year,int month,int day,DateUtil date) { int sum = 0; int sum1 = 0; int sum2; for(int x = 1;x < year;x ++) { if((x % 4 == 0 && x % 100 != 0) ||(x % 400 == 0)) { sum += 366; }else { sum += 365; } } if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { date.day.mon_maxnum[2] = 29; for(int x = 1;x < month;x ++) { sum += date.day.mon_maxnum[x]; } } else { date.day.mon_maxnum[2] = 28; for(int x = 1;x < month;x ++) { sum += date.day.mon_maxnum[x]; } } sum += day; for(int x = 1;x < date.day.month.year.getvalue();x++) { if((x % 4 == 0 && x % 100 !=0 ) || (x % 400 == 0)) { sum1 += 366; }else { sum1 += 365; } } if((date.day.month.year.getvalue() % 4 == 0 && date.day.month.year.getvalue() % 100 != 0) || (date.day.month.year.getvalue() % 400 == 0)) { date.day.mon_maxnum[2] = 29; for(int x = 1;x < date.day.month.getmonth();x ++) { sum1 += date.day.mon_maxnum[x]; } } else { date.day.mon_maxnum[2] = 28; for(int x = 1;x < date.day.month.getmonth();x ++) { sum1 += date.day.mon_maxnum[x]; } } sum1 += date.day.getday(); sum2 = Math.abs(sum1 - sum); return sum2; } }
这两个题目里面的计算方法都是一样的只不过是换了类之间的关系,一个是一层叠一层,一个是三个类在一个大类里面。这次的几个类之间的捆绑关系减少了日期的错误,并且让我们对于代码的编写思路更加的清晰。
第四次作业和第六次作业的7-1
这两次都是菜单类的作业,我都是属于无从下手的那一类人,自然第四次作业没写,到了第六次还是那种看不懂的状态,也是空在了那里。总之,这种菜单类的对我来说是在是太难太难了QAQ。
踩坑心得
第四次作业
对于这一次作业,除了第一题那个菜单的无从下手之外,其余的题目都或多或少得了一点分,主要还是7-3和7-4的问题难以解决。7-3主要就是运行超时的问题,在请教完同学之后了解到可以用hashset来解决这一超时问题。而7-4则是自己忘记了删除相同项这一条件,也是在询问同学之后才发现的。这也反映出了自己对于知识掌握的不足以及对题目分析的不到位,也让我有了之后要改进的方向。
7-3

在反复修改之后都是运行超时也便放弃了。
7-4

7-4代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
String[] words = input.split("\\s+|\\,|\\.");
for (int i = 0; i < words.length - 1; i++) {
for (int j = 0; j < words.length - i - 1; j++) {
if (compare(words[j], words[j + 1]) > 0) {
String temp = words[j];
words[j] = words[j + 1];
words[j + 1] = temp;
}
}
}
for (int i = 0; i < words.length - 1; i++) {
System.out.println(words[i]);
}
}
private static int compare(String s1, String s2) {
if (s1.length() != s2.length()) {
return s2.length() - s1.length();
} else {
return s1.compareToIgnoreCase(s2);
}
}
}
第五次作业
7-1、7-3、7-4
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner input = new Scanner(System.in); String id = input.nextLine(); if (id.matches("^[1-9][0-9]{4,14}$")) System.out.print("你输入的QQ号验证成功"); else System.out.print("你输入的QQ号验证失败"); } }
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner input = new Scanner(System.in); String date = input.nextLine(); if (date.matches("^([0-9]|[A-Z]|[a-z]){4}$")) System.out.print(date + "属于验证码"); else System.out.print(date + "不属于验证码"); } }
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner input = new Scanner(System.in); String date = input.nextLine(); if (date.matches("^2020(1[1-7]|61|7[1-3]|8[1-2])(0[1-9]|[1-3][0-9]|40)$")) System.out.print("正确"); else System.out.print("错误"); } }
都是关于正则表达式的训练,了解到了matches方法的使用与作用。matches是用与对于一个字符串的判断,符合需求则返回true不符合则返回false。而在最前面的^和最后面的$应该就是开始和结束的作用,而中间的|是用与表示且,[]则表示内容的限定。这里主要是要注意对于每一位字符的限定都需要有一个判断,并且在和同学交流之后发现|的前后不能有空格,不然后显示匹配错误。
7-2
import java.util.Scanner; import java.util.Arrays; public class Main { public static void main(String[] args){ Scanner input = new Scanner(System.in); int i; String date = input.nextLine(); char[] chars = date.toCharArray(); Arrays.sort(chars); for (i = 0;i < chars.length;i ++){ System.out.print(chars[i]); } } }
这题主要就是考察我们对字符串的排序问题,我则是用的Arrays.sort这一个函数来对字符串进行排序,也是很快就做完了。
在这里我要说一句
对于第六次作业和第四次作业这种菜单的题目,我在下一次在遇到一定不能在放弃了,如果凭借我自己的能力还是无法解决,我一定要去请教一下那些做了的同学,起码要比之前有进步才行。
改进建议
1.在写代码的时候,还是不是很规范,没有注释,可读性太差,叫他人检查代码时都要去找到自己实现功能的那一个部分。除此之外,自己找错误是也同样要去寻找那个功能所在的位置,而且在一段时间过后,如果要修改代码还得对其进行重读。
2.还是没有画流程图的习惯,每次都是边写代码边实现功能,这也导致在写代码的时候思路是不清晰的,想一步写一步。
3.对于学过和用过的方法还是不能很好的记住,要上网或者翻书去查找,这也让我的写代码速度下降了。
4.还是不是很喜欢翻书,遇到问题老是喜欢上百度去查找,这也是一个很大的问题所在。
总结
先说说自己收获了哪些吧
1.在这三次作业之中,我学习了类与类之间的关系,虽然说不能很好的使用这一种关系,但我能在之后的题目之中就他进行运用,从而达到熟能生巧的地步。
2.对于set方法的使用,让我知道了一种更加迅速的排序方法,在之后的排序类的题目之中,再也不用去使用几个for循环来实现了,不仅节省了时间,也大大降低了出错的概率。
3.还有就是学习了正则表达式的使用,不在需要把字符串放入数组里面再去一个一个对比正误了。
不足
1.关于容器的知识我是一点没有概念,这也成为了我的一个缺口,也提醒我要加强对知识的储备。
2.自己的思维还是不够灵敏,想的解决方法不是很难实现就是容易漏掉或者重复对某个或者某些要求的判断。
3.对于正则表达式的运用还是不够熟练,总是要经过翻阅书籍和查找资料才能写出来。
4.最后就是对于难题的攻克问题,对于这两次的菜单作业,我可以说都是躺着过去的,这种遇难就退的心理是不能存在的,所以在下一次的作业中,我不管如何都要尽自己最大的努力来实现他。

浙公网安备 33010602011771号