1、前言:
总结三次题目集的知识点、题量、难度等情况
题目集4中的第一题主要要求输入数据的校验一律采用正则表达式,尤其是测量日期的校验,在查阅资料过后,并认真研究完指导书中给的类结构,同时思考CheckData、DealData两个类的作用,最终我使用正则表达式来对第一道题的解答,对需要验证的字符串进行验证;第二题是关于面向对象聚合的设计和实现,用于日期问题的解决,要求实现下一天、前n天、两个日期相差的天数,我利用聚合的解题思想,将各个类之间的功能都分开实现,让各个类之间的耦合性降到最低;第三题关于图形问题的类继承修改,主要功能有输出各个图形的表面积和体积;
题目集5中的前三题主要都是考查对String和数组的掌握情况,依次是查找字符串,合并数组,对整数型数据排序;这三道题都是关于数组的数据处理,其中对数据的处理思想最为重要,在对整数形数据排序时要求分别使用插入排序、选择排序及冒泡排序三种算法对整型数据进行排序,在这一要求下,我将3个功能变换为3个独立的函数,让类中的数据处理不那么复杂,让代码和类的结构变得更加清晰、合理,而对统计Java程序中关键次的出现次数程序,对关键字的存储变得尤为重要,在寻找关键字的过程中同样频繁使用了正则表达式来进行数据排除和删减,而对日期问题的再一次聚合,让程序更加具有条理性,也让代码变得更加简洁;
题目集6中的前4道题重点考察了对正则表达式的熟练应用,在学习了正则表达式之后,许多问题都变得简单了起来,利用正则解决问题我认为是这次作业的最大收获,也让我对Java代码的简洁性和强大的功能性有了很大的认识,对图形的继承和多态主要要求对Java封装、继承、多态的综合性考察,对于抽象方法的封装和调用,让代码的复杂性大大下降,对接口的应用也让类与类之间关系更加多样化,使功能的实现具有多种方式。
2、设计与分析:
重点对题目的提交源码进行分析,可参考SourceMonitor的生成报表内容以及PowerDesigner的相应类图,要有相应的解释和心得(做到有图有真相),本次Blog必须分析的内容如下:
①题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣比较
Main函数中对闰年的判断和对输入年月日范围的判断如下所示:
public static boolean isLeapYear(int year) { boolean mark=false; if((year % 4 == 0 && year % 100 != 0 || year % 400 == 0)){ mark=true; return mark; } else{ return mark; } } public static boolean checkInputValidity(int year, int month, int day){ boolean mark=false; if(year<1820||year>2020||month<1||month>12||day<1||day>31){ return mark; } else{ if(!isLeapYear(year)&&month==2&&day>28){ return mark; } else if(isLeapYear(year)&&month==2&&day>29){ return mark; } else if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31){ return mark; } else if((month==4||month==6||month==9||month==11)&&day>30){ return mark; } else mark=true; return mark; } }
②题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)
具体实现代码如下所示:
import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; public class Main { public static boolean checknum(double a,double b,double c) { if (a<0||b<0||c<0) { return false; } else return true; } public static void main(String[] args) { double []s = new double[100]; Scanner in = new Scanner(System.in); ArrayList nm = new ArrayList(); int a = in.nextInt(); int b = in.nextInt(); int c = in.nextInt(); double o = 0; double sum = 0; if (checknum(a, b, c) == false) { System.out.println("Wrong Format"); System.exit(0); } else { for (int i = 0; i < a; i++)//圆 { double r = in.nextDouble(); Circle circle = new Circle(r); if (circle.checkR(r) == false) { System.out.println("Wrong Format"); System.exit(0); } else { nm.add(circle.getArea()); o++; } } for (int i = 0; i < b; i++)//长方形 { double w = in.nextDouble(); double l = in.nextDouble(); Rectangle rectangle = new Rectangle(w, l); if (rectangle.checkWL(w, l) == false) { System.out.println("Wrong Format"); System.exit(0); } else { nm.add(rectangle.getArea()); o++; } } for (int i = 0; i < c; i++)//三角形 { double x = in.nextDouble(); double y = in.nextDouble(); double z = in.nextDouble(); Triangle triangle = new Triangle(x,y,z); if (triangle.checkXYZ(x,y,z) == false) { System.out.println("Wrong Format"); System.exit(0); } else { nm.add(triangle.getArea()); o++; } } System.out.printf("Original area:\n"); for (int i = 0; i < o; i++) { sum += (double) nm.get(i); System.out.printf("%.2f ", nm.get(i)); } System.out.printf("\n"); System.out.printf("Sum of area:%.2f\n", sum); Collections.sort(nm); System.out.println("Sorted area:"); for (int i = 0; i < o; i++) { System.out.printf("%.2f ", nm.get(i)); } System.out.printf("\n"); System.out.printf("Sum of area:%.2f\n", sum); } } } class Shape { public double getArea(){//定义求面积函数 return 0.0; } } class Rectangle extends Shape { private double w,l;//width,length; public Rectangle(){ } public Rectangle(double w,double l){ this.w = w; this.l = l; } public double getW() { return w; } public void setW(double w) { this.w = w; } public double getL() { return l; } public void setL(double l) { this.l = l; } public boolean checkWL(double w,double l){ if (w<=0||l<=0){ return false; }else return true; } @Override public double getArea() { return w*l; } } class Triangle extends Shape{ private double x; private double y; private double z; public Triangle(){ } public Triangle(double x,double y,double z){ this.x = x; this.y = y; this.z = z; } public double getX() { return x; } public void setX(double x) { this.x = x; } public double getY() { return y; } public void setY(double y) { this.y = y; } public double getZ() { return z; } public void setZ(double z) { this.z = z; } public Boolean checkXYZ(double x,double y,double z) { if(x+y<=z||x+z<=y||y+z<=x||x<0&&y<0&&z<0) { return false; } else return true; } @Override public double getArea() { double p=(x+y+z)/2; return Math.sqrt(p*(p-x)*(p-y)*(p-z)); } } class Circle extends Shape { private double r;//radius public Circle(double r){ this.r = r; } public double getR() { return r; } public void setR(double r){ this.r = r; } public boolean checkR(double r){ if (r<=0){ return false; }else return true; } @Override public double getArea() { return Math.PI*r*r; } }
③对三次题目集中用到的正则表达式技术的分析总结
使用正则表达式的程序代码:
对QQ号的验证:
import java.util.Scanner; public class Main {//正则表达式验证QQ号 public static void main(String[] args) { Scanner input = new Scanner(System.in); String in = input.nextLine(); String reg="[1-9][0-9]{4,14}"; boolean flag = in.matches(reg); if (flag) { System.out.println("你输入的QQ号验证成功"); }else{ System.out.println("你输入的QQ号验证失败"); } } }
对验证码的正则验证:
import java.util.Scanner; public class Main {//正则表达式验证验证码 public static void main(String[] args) { Scanner input = new Scanner(System.in); String in = input.nextLine(); String reg="[0-9|a-z|A-Z]{4}"; boolean flag = in.matches(reg); if (flag) { System.out.println(in +"123A属于验证码"); }else{ System.out.println(in +"不属于验证码"); } } }
对8位学号的校验:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); String in = input.nextLine(); String reg="^2020[11-17|15|61|71-73|81-82][1-40]"; boolean flag = in.matches(reg); if (flag) { System.out.println("正确"); }else{ System.out.println("错误"); } } }
④题目集5(7-4)中Java集合框架应用的分析总结
String 中存储的Java程序关键字,这同样属于该问题的一大难点,但同样还有其他问题需要处理;
Scanner input=new Scanner(System.in); String a; StringBuilder ss=new StringBuilder(); Map<String, Integer> map=new HashMap<String, Integer>(); String []key= { "abstract","assert","boolean","break","byte","case","catch", "char","class","const","continue","default","do","double","else", "enum","extends","false","final","finally","float", "for","goto","if","implements","import","instanceof", "int","interface","long","native","new","null","package", "private","protected","public","return","short","static", "strictfp","super","switch","synchronized","this","throw", "throws","transient","true","try","void","volatile","while" };
int count=0; String s=ss.toString(); // System.out.println(s); Pattern p=Pattern.compile("\"(.*?)\""); Matcher m=p.matcher(s); while(m.find()){ s=s.replace(m.group()," "); p=Pattern.compile("\"(.*?)\""); m=p.matcher(s); } p=Pattern.compile("/\\**(.*?)/"); m=p.matcher(s); while(m.find()){ s=s.replace(m.group()," "); m=p.matcher(s); } // System.out.println(s); if(s.isEmpty()) {System.out.println("Wrong Format"); System.exit(0); } s=s.replace("["," "); s=s.replace("]"," "); s=s.replace("-","a"); s=s.replace("*","a"); s=s.replace("/","a"); s=s.replace("+","a"); s=s.replace(">","a"); s=s.replace("=","a"); s=s.replace("!","a"); s=s.replace(":","a"); s=s.replace("\\","a"); s= s.replaceAll("[^a-zA-Z]", " ");
3、采坑心得:
对源码的提交过程中出现的问题及心得进行总结,务必做到详实,拿数据、源码及测试结果说话,切忌假大空
对于正则表达式的应用,我认为是永远最难的一部分,正则表达式让Java更加便捷,但编写正则表达式却并不简单;
String reg="[1-9][0-9]{4,14}"; String reg="[0-9|a-z|A-Z]{4}"; String reg="^2020[11-17|15|61|71-73|81-82][1-40]";
这些正则表达式的编写让我真正认识到Java的便捷和强大。
4、改进建议:
对相应题目的编码改进给出自己的见解,做到可持续改进
某些题目的难度过大,我认为Java代码或者思想的理解并不需要多么高深难懂的代码,更不需要其他某些方面的涉及,仅仅只是一个简单的例子就可以将Java的思想融入到实践当中,并不需要哪些复杂需求或者是复杂功能的编写,这些不仅仅浪费了时间,还让学生对Java的理解变成了对复杂题目的理解和解决,最后只会把时间放到如何解决题目,拿、得到正确答案,完全不能够将Java学号,我主张将题目的难度降低,容易、典型的例子也可以帮助理解Java,复杂问题的解决对于Java初学者来说无疑是最费时间的,这也是Java学习的一大阻力。
5、总结:
对本阶段三次题目集的综合性总结,学到了什么,哪些地方需要进一步学习及研究,对教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见
对于这次作业的完成,每个题目我都认真思考,同样也查阅了许多资料,学习他人的思维方式和对Java的个人理解,我个人十分推崇对问题的独立解决,这几次的作业使我收获很多;让我明白了Java其实没有看上去的那么复杂,那么晦涩难懂,在理解一个又一个例子后,我开始真正掌握了Java这门语言。