前言:
本次学习主要分成了三次题目集(题目集4-6),其中,题目集4有三道题、题目集5有五道题、题目集6有六道题。难度最大的为题目集4,题目集4的第一道题目就占了总分的一半(50分),难度较大,在此不做分析,后两题分别为日期问题聚合一和图形继承题,难度中上;题目集5的前三题为几种排序等知识的基础题,在此不做具体分析,后两题分别为统计JAVA中关键字出现的次数和日期问题聚合二,难度中上;题目集6前四题为基础题,在此不做具体分析,后两题分别为图形继承与多态和实现图形接口及多态性,难度中等。本次学习总结所要总结的题目分别为题目集4的7-2、7-3;题目集5的7-4;题目集6的7-5、7-6。
设计与分析:
1、题目集4(7-2)与题目集5(7-5)两种日期类聚合设计的优劣比较:
题目集4(7-2)类图(以下我们称为聚合1):

题目集5(7-5)类图(以下我们称为聚合2):

从类图来看,聚合1相对于聚合2来说相对较分散,聚合2相对集中些。聚合1中的Day、Month、Year类中内容相对较多些,而聚合2大部分的内容都集中在Dateutil中。
聚合1中Day类中包含:默认构造方法、带参构造方法、value的get和set方法、month的get和set方法、日期复位、日期设为改日最大值、校验数据合法性、日期增1、日期减1;Month类中包括:默认构造方法、带参构造方法、value的get和set方法、year的get和set方法、月份复位、月份设置为12、校验数据合法性、月份增1、月份减1;Year类中包括:默认构造方法、带参构造方法、value的get和set方法、判断是否为闰年、校验数据合法性、年份增1、年份减1;Dateutil类中包括:默认构造方法、带参构造方法、day的get和set方法、校验数据合法性、比较两个日期是否相等、日期值格式化、求下n天、求前n天、求两个日期之间的天数。
聚合2中month的get和set方法、year的get和set方法都放在了Dateutil类中,并且在Dateutil中添加了日期按“年-月-日”格式化的方法。
两种方法相比较,聚合1相对来说每个类中的方法数较平均,检查代码过测试点更便于查看但内容相对较散,而聚合2主要的方法集中在一个类中,更统一但一个类中的方法太多不方便查看。
聚合1代码如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n= input.nextInt(); if(n==1) { int year = input.nextInt(); int month = input.nextInt(); int day = input.nextInt(); DateUtil w=new DateUtil(year,month,day); int d= input.nextInt(); if(w.validate1()) { w.after(d); } else System.out.println("Wrong Format"); } else if(n==2) { int year = input.nextInt(); int month = input.nextInt(); int day = input.nextInt(); DateUtil w=new DateUtil(year,month,day); int d= input.nextInt(); if(w.validate1()) { w.format(d); } else System.out.println("Wrong Format"); } else if(n==3) { int year1 = input.nextInt(); int month1 = input.nextInt(); int day1 = input.nextInt(); DateUtil date1=new DateUtil(year1,month1,day1); int year2 = input.nextInt(); int month2 = input.nextInt(); int day2 = input.nextInt(); DateUtil date2=new DateUtil(year2,month2,day2); if(date1.validate1()&&date2.validate1()) { date1.sub(date1,date2); } else System.out.println("Wrong Format"); } else System.out.println("Wrong Format"); } } class DateUtil{ Year year; Month month; Day day; int cnt=0; public DateUtil(){ } public DateUtil(int d,int m,int y){ this.day=new Day(d,m,y); } public boolean validate1(){ if(day.validate()) { return true; } else { return false; } } public void format(int n)//前n天 { int y = day.getMonth().getYear().getValue(); int m = day.getMonth().getValue(); int d = day.getValue(); int nd=n; for(;n!=0;n--) { cnt++; if(m==5||m==7||m==10||m==12) { if(d==1) { m--; d=30; } else { d--; } } else if(m==8) { if(d==1) { m--; d=31; } else { d--; } } else if(m==1) { if(d==1) { y--; m=12; d=31; } else { d--; } } else if(m==3) { if(d==1) { if((y%4==0&&y%100!=0)||y%400==0) { m--; d=29; } else if(!((y%4==0&&y%100!=0)||y%400==0)) { m--; d=28; } } else { d--; } } else { if(d==1) { m--; d=31; } else { d--; } } } System.out.print( y + "-" + m + "-" + d); } public void after(int n)//后n天 { int y = day.getMonth().getYear().getValue(); int m = day.getMonth().getValue(); int d = day.getValue(); int nd=n; if(n>0) { for(;n!=0;n--) { cnt++; if(m==1||m==3||m==5||m==8||m==10) { if(d==31) { m++; d=1; } else { d++; } } else if(m==12) { if(d==31) { y++; m=1; d=1; } else { d++; } } else if(m==2) { if((y%4==0&&y%100!=0)||y%400==0) { if(d==29) { m++; d=1; } else { d++; } } else if(!((y%4==0&&y%100!=0)||y%400==0)) { if(d==28) { m++; d=1; } else { d++; } } } else if(m==7) { if(d==31) { m++; d=1; } else { d++; } } else { if(d==30) { m++; d=1; } else { d++; } } } } System.out.print( y + "-" + m + "-" + d); } public void sub(DateUtil date1,DateUtil date2)//相差n天 { int date1y=date1.day.getMonth().getYear().getValue(); int date1m=date1.day.getMonth().getValue(); int date1d=date1.day.getValue(); int date2y=date2.day.getMonth().getYear().getValue(); int date2m=date2.day.getMonth().getValue(); int date2d=date2.day.getValue(); int y=0,m=0,d=0,y2=0,m2=0,d2=0; if(date1y>date2y||date1y==date2y&&date1m>date2m||date1y==date2y&&date1m==date2m&&date1d>date2d) { y=date2y; m=date2m; d=date2d; y2=date1y; m2=date1m; d2=date1d; } else { y=date1y; m=date1m; d=date1d; y2=date2y; m2=date2m; d2=date2d; } int n=0; for(n=0;!(y==y2&&m==m2&&d==d2);n++) { if(m==1||m==3||m==5||m==8||m==10) { if(d==31) { m++; d=1; } else { d++; } } else if(m==12) { if(d==31) { y++; m=1; d=1; } else { d++; } } else if(m==2) { if((y%4==0&&y%100!=0)||y%400==0) { if(d==29) { m++; d=1; } else { d++; } } else if(!((y%4==0&&y%100!=0)||y%400==0)) { if(d==28) { m++; d=1; } else { d++; } } } else if(m==7) { if(d==31) { m++; d=1; } else { d++; } } else { if(d==30) { m++; d=1; } else { d++; } } } System.out.println(n); } } 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%4==0&&value%100!=0)||value%400==0) return true; else return false; } public boolean validate() { if(value>=1900&&value<=2050) return true; else return false; } } class Day{ int value; Month month; public Day() { } public Day(int yearValue,int monthValue,int dayValue) { month = new Month(yearValue,monthValue); value = dayValue; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public Month getMonth() { return month; } public void setMonth(Month value) { this.month = value; } public boolean validate() { int y=getMonth().getYear().getValue(); int m=getMonth().getValue(); int d=getValue(); if(y>=1900&&y<=2050&&m>=1&&m<=12&&d>=1&&d<=31) { if(!((y%4==0&&y%100!=0)||y%400==0)) { if(m==2&&d>=29) { return false; } } if((y%4==0&&y%100!=0)||y%400==0) { if(m==2&&d>=30) { return false; } } if(m==2||m==4||m==6||m==9||m==11) if(d>=31) { return false; } else if(m==1||m==3||m==5||m==7||m==8||m==10||m==12) if(d>=32) { return false; } return true; } else return false; } } class Month{ int value; Year year; public Month() { } public Month(int yearValue,int monthValue) { year = new Year(yearValue); 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; } }
聚合2代码如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n= input.nextInt(); if(n==1) { int year = input.nextInt(); int month = input.nextInt(); int day = input.nextInt(); DateUtil w=new DateUtil(year,month,day); int d= input.nextInt(); if(w.validate()) { w.after(d); } else System.out.println("Wrong Format"); } else if(n==2) { int year = input.nextInt(); int month = input.nextInt(); int day = input.nextInt(); DateUtil w=new DateUtil(year,month,day); int d= input.nextInt(); if(w.validate()) { w.format(d); } else System.out.println("Wrong Format"); } else if(n==3) { int year1 = input.nextInt(); int month1 = input.nextInt(); int day1 = input.nextInt(); DateUtil date1=new DateUtil(year1,month1,day1); int year2 = input.nextInt(); int month2 = input.nextInt(); int day2 = input.nextInt(); DateUtil date2=new DateUtil(year2,month2,day2); if(date1.validate()&&date2.validate()) { date1.sub(date1,date2); } else System.out.println("Wrong Format"); } else System.out.println("Wrong Format"); } } class Month{ int value; public Month() { } public Month(int monthValue) { value = monthValue; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public boolean validate() { if(value>=1&&value<=12) return true; else return false; } } 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 validate() { if(value>=1820&&value<=2020) return true; else return false; } public boolean isLeapYear() { if((value%4==0&&value%100!=0)||value%400==0) return true; else return false; } } class Day{ int value; public Day() { } public Day(int dayValue) { value = dayValue; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } } class DateUtil{ Year year; Month month; Day day; int cnt=0; int y,m,d,y2,m2,d2; public DateUtil(){ } public void setYear(Year year) { this.year = year; } public Year getYear() { return year; } public void setMonth(Month month) { this.month = month; } public Month getMonth() { return month; } public void setDay(Day day) { this.day = day; } public Day getDay() { return day; } public DateUtil(int y,int m,int d){ this.year=new Year(y); this.month=new Month(m); this.day=new Day(d); } public boolean validate(){ int y=getYear().value; int m= getMonth().value; int d= getDay().value; if(!(y>=1820&&y<=2020)&&!(m>=1&&m<=12)&&!(d>=1&&d<=31)) { return false; } if(y>=1820&&y<=2020&&m>=1&&m<=12&&d>=1&&d<=31) { if(!((y%4==0&&y%100!=0)||y%400==0)) { if(m==2&&d>=29) { return false; } } if((y%4==0&&y%100!=0)||y%400==0) { if(m==2&&d>=30) { return false; } } if(m==2||m==4||m==6||m==9||m==11) if(d>=31) { return false; } else if(m==1||m==3||m==5||m==7||m==8||m==10||m==12) if(d>=32) { return false; } return true; } else return false; } public void after(int n)//后n天 { long y=getYear().value; long m= getMonth().value; long d= getDay().value; int nd=n; if(n>0) { for(;n!=0;n--) { if(m==1||m==3||m==5||m==8||m==10) { if(d==31) { m++; d=1; } else { d++; } } else if(m==12) { if(d==31) { y++; m=1; d=1; } else { d++; } } else if(m==2) { if((y%4==0&&y%100!=0)||y%400==0) { if(d==29) { m++; d=1; } else { d++; } } else if(!((y%4==0&&y%100!=0)||y%400==0)) { if(d==28) { m++; d=1; } else { d++; } } } else if(m==7) { if(d==31) { m++; d=1; } else { d++; } } else { if(d==30) { m++; d=1; } else { d++; } } } } System.out.print(getYear().value+"-"+getMonth().value+"-"+getDay().value+" next "+nd+" days is:"+ y + "-" + m + "-" + d); } public void format(int n)//前n天 { long y=getYear().value; long m= getMonth().value; long d= getDay().value; int nd=n; for(;n!=0;n--) { cnt++; if(m==5||m==7||m==10||m==12) { if(d==1) { m--; d=30; } else { d--; } } else if(m==8) { if(d==1) { m--; d=31; } else { d--; } } else if(m==1) { if(d==1) { y--; m=12; d=31; } else { d--; } } else if(m==3) { if(d==1) { if((y%4==0&&y%100!=0)||y%400==0) { m--; d=29; } else if(!((y%4==0&&y%100!=0)||y%400==0)) { m--; d=28; } } else { d--; } } else { if(d==1) { m--; d=31; } else { d--; } } } System.out.print(getYear().value+"-"+getMonth().value+"-"+getDay().value+" previous "+nd+" days is:"+ y + "-" + m + "-" + d); } public void define(DateUtil date1,DateUtil date2) { int date1y=date1.getYear().value; int date1m=date1.getMonth().getValue(); int date1d=date1.getDay().getValue(); int date2y=date2.getYear().value; int date2m=date2.getMonth().getValue(); int date2d=date2.getDay().value; if(date1y>date2y||date1y==date2y&&date1m>date2m||date1y==date2y&&date1m==date2m&&date1d>date2d) { y=date2y; m=date2m; d=date2d; y2=date1y; m2=date1m; d2=date1d; } else { y=date1y; m=date1m; d=date1d; y2=date2y; m2=date2m; d2=date2d; } } public void sub(DateUtil date1,DateUtil date2)//相差n天 { define(date1,date2); long date1y=date1.getYear().value; long date1m=date1.getMonth().getValue(); long date1d=date1.getDay().getValue(); long date2y=date2.getYear().value; long date2m=date2.getMonth().getValue(); long date2d=date2.getDay().value; int n=0; for(n=0;!(y==y2&&m==m2&&d==d2);n++) { if(m==1||m==3||m==5||m==8||m==10) { if(d==31) { m++; d=1; } else { d++; } } else if(m==12) { if(d==31) { y++; m=1; d=1; } else { d++; } } else if(m==2) { if((y%4==0&&y%100!=0)||y%400==0) { if(d==29) { m++; d=1; } else { d++; } } else if(!((y%4==0&&y%100!=0)||y%400==0)) { if(d==28) { m++; d=1; } else { d++; } } } else if(m==7) { if(d==31) { m++; d=1; } else { d++; } } else { if(d==30) { m++; d=1; } else { d++; } } } System.out.println("The days between "+date1y+"-"+date1m+"-"+date1d+" and "+date2y+"-"+date2m+"-"+date2d+" are:"+n); } }
2、题目集4(7-3)与题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等):
题目集4(7-3)类图(以下称为题目7-3):

题目集6(7-5)类图(以下我们称为题目7-5):

题目集6(7-6)类图(以下我们称为题目7-6):

- 题目7-3单纯为继承题,题目7-5为图形继承与多态,题目7-6为实现图形多态与接口。(1)在题目7-3中,Shape为总的父类,Circle、Rectangle为其子类;接下来的Ball和Box分别为Circle和Rectangle的子类。其中Shape为图形的形状、Circle和Rectangle分别为圆形和矩形。类Shape,无属性,有一个返回0.0的求图形面积的公有方法类Circle,继承自Shape,有一个私有实型的属性radius(半径),重写父类继承来的求面积方法,求圆的面积类Rectangle,继承自Shape,有两个私有实型属性width和length,重写父类继承来的求面积方法,求矩形的面积类Ball,继承自Circle,其属性从父类继承,重写父类求面积方法,求球表面积,此外,定义一求球体积的方法类Box,继承自Rectangle,除从父类继承的属性外,再定义一个属性height,重写父类继承来的求面积方法,求立方体表面积,此外,还有一个求立方体体积的方法。 (2)在题目7-5中,题目目的主要要我们掌握类的继承、多态性及其使用方法。本次作业重点研究平面图形相关的处理方法。类图中的getArea()方法为抽象方法,功能为求得图形的面积;validate()方法也为抽象方法,对图形的属 性进行合法性校验;toString()继承自 Object,功能为输出图形的面积信息。所谓的“多态”,简单的理解就是对象在不同情况下的不同表现,具体体现在定义和功能两个方 面,简单的总结一下,多态可以用“三个定义和两个方法”来总结。三个定义分别是父类定义子类构 建、接口定义实现类构建和抽象类定义实体类构建,而两个方法分别是方法重载和方法重写。本次作 业我们采用的是抽象类定义、实体类构建的方式。即 Shape为抽象类,Circle、Rectangle 及 Triangle 为实体类。此外,题目要求我们根据图形的面积大小进行升序排序,要求必须对list中的图形对象list中进行排序,而不是对求得的面积进行排序,排序后再次求出各图形的面积并输出,ArrayList的应用:要求创建的各个图形对象均存储在 ArrayList类型的列表中(具体使用方法在下面的代码中可见)。 (3)在题目7-6中GetArea为一个接口,无属性,只有一个GetArea(求面积)的抽象方法;Circle及Rectangle分别为圆类及矩形类,分别实现GetArea接口要求:在Main类的主方法中分别定义一个圆类对象及矩形类对象(其属性值由键盘输入),使用接口的引用分别调用圆类对象及矩形类对象的求面积的方法,直接输出两个图形的面积值。
- 题目7-3代码如下:
-
public class Main { public static void main(String[] args) { java.util.Scanner input = new java.util.Scanner(System.in); int size = input.nextInt(); int[] list = new int[size]; for (int i = 0; i < list.length; i++) { list[i] = input.nextInt(); } int choice = input.nextInt(); switch(choice){ case 1:insertionSort(list);break; case 2:selectionSort(list);break; case 3:bubbleSort(list);break; default: break; } } private static void selectionSort(int[] list) { // TODO Auto-generated method stub int min ;//记录目前能找到的最小值元素的下标 for (int i = 0; i < list.length - 1; i++){ //总共要经过list.length-1轮比较 min = i; for (int j = i+1 ; j < list.length; j++) { //每一趟在后面的n-i+1个待排序的元素中选择关键字最小的元素 if (list[min]>list[j]) { min=j; } if(i != min) {//将找到的最小值和i位置所在的值进行交换 int temp = list[i]; list[i] = list[min]; list[min] = temp; } } } for( int i=0;i<list.length;i++) System.out.print(list[i]+" "); } //Insert your code private static void insertionSort(int[] list) { // TODO Auto-generated method stub int j; for(int i= 1;i<list.length;i++) {//从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的 int tmp = list[i];//记录要插入的数据 j=i; while(j > 0 && tmp < list[j-1]){//从已经排序的序列最右边的开始比较,找到比其小的数 list[j] = list[j-1];//向后挪动 j--; } list[j] = tmp;//存在比其小的数,插入 } for(int i = 0 ; i < list.length ; i++){ System.out.print(list[i]+" "); } } public static void bubbleSort(int[] list) { // TODO Auto-generated method stub int j = 0; int tmp = 0; for(int i=0;i<list.length-1;i++) {//确定排序趟数 for(j=0;j<list.length-i-1;j++) {//确定比较次数 if(list[j]>list[j+1]) { //交换 tmp = list[j+1]; list[j+1] = list[j]; list[j] = tmp; } } } for(int i=0;i<list.length;i++) System.out.print(list[i]+" "); } }
- 题目7-5代码如下:
-
import java.util.Scanner; import java.util.ArrayList; import java.util.*; public class Main{ public static void main(String[] args) { Scanner input = new Scanner(System.in); int a=input.nextInt(); int b=input.nextInt(); int c=input.nextInt(); ArrayList<Shape> w=new ArrayList<>(); int i=0,j=0,judge=1; double sum=0; for (i = 0; i < a; i++) { double radius = input.nextDouble(); w.add(new C(radius)); if(w.get(i).validate()) { } else judge=0; } for (i = 0; i < b; i++) { double width = input.nextDouble(); double length = input.nextDouble(); w.add(new R(width, length)); } for (i = 0; i < c; i++) { double side1 = input.nextDouble(); double side2 = input.nextDouble(); double side3 = input.nextDouble(); w.add(new Triangle(side1, side2, side3)); } for (i = 0; i < a + b + c; i++) { if (w.get(i).validate()) { } else { judge = 0; } } if(a==0&&b==0&&c==0) { judge=1; } if (judge == 1 && (a >= 0 && b >= 0 && c >= 0)) { System.out.println("Original area:"); for (i = 0; i < a; i++) { System.out.print(String.format("%.2f", w.get(i).getArea()) + " "); } for (i = a; i < a + b; i++) { System.out.print(String.format("%.2f", w.get(i).getArea()) + " "); } for (i = a + b; i < a + b + c; i++) { System.out.print(String.format("%.2f", w.get(i).getArea()) + " "); } System.out.println(); for (i = 0; i < a + b + c; i++) { sum += w.get(i).getArea(); } System.out.println("Sum of area:" + String.format("%.2f", sum)); sort(w); System.out.println("Sorted area:"); for (i = 0; i < a + b + c; i++) { System.out.print(String.format("%.2f", w.get(i).getArea()) + " "); } System.out.println(); sum=0; for (i = 0; i < a + b + c; i++) { sum += w.get(i).getArea(); } System.out.println("Sum of area:" + String.format("%.2f", sum)); } else { System.out.println("Wrong Format"); } } public static ArrayList<Shape> sort(ArrayList<Shape> w){ Shape k; int i=0,j=0; double a=0,b=0,t=0; for (i = 0; i < w.size(); i++) { for (j = 0; j < w.size() - i - 1; j++) { if (w.get(j).getArea() >= w.get(j + 1).getArea()) { k = w.get(j); w.set(j, w.get(j + 1)); w.set(j + 1, k); } } } return w; } } class C extends Shape{ @Override public double getArea(){ return Math.PI*radius*radius; } Shape shape; C(){ } double radius; C(double radius) { this.radius=radius; } @Override public boolean validate(){ if(radius>0) return true; else return false; } } class R extends Shape{ R(){ } double width; double length; Shape shape; R(double width,double length) { this.width=width; this.length=length; } @Override public boolean validate(){ if(width>0&&length>0) return true; else return false; } @Override public double getArea(){ return width*length; } } class Triangle extends Shape{ double side1; double side2; double side3; Shape shape; Triangle(){ } @Override public boolean validate() { if(side1+side2<=side3||side1+side3<=side2||side2+side3<=side1) { return false; } if(side1-side2>=side3||side1-side3>=side2||side2-side3>=side1) { return false; } return true; } Triangle(double side1,double side2,double side3) { this.side1=side1; this.side2=side2; this.side3=side3; } @Override public double getArea(){ double p=(side1+side2+side3)/2; double s=Math.sqrt(p*(p-side1)*(p-side2)*(p-side3)); return s; } } abstract class Shape{ abstract public double getArea(); abstract public boolean validate(); Shape(){ } }
- 题目7-6代码如下:
-
import java.util.Scanner; import java.util.*; public class Main { public static void main(String[] args){ Scanner input=new Scanner(System.in); double r = input.nextDouble(); double width = input.nextDouble(); double length = input.nextDouble(); if (r <= 0 || width <= 0 || length <= 0) { System.out.println("Wrong Format"); } else { Circle a = new Circle(r); Rectangle b = new Rectangle(width, length); double s1 = a.getArea();//圆面积 double s2 = b.getArea();//矩形面积 System.out.println(String.format("%.2f", s1)); System.out.println(String.format("%.2f", s2)); } } } interface GetArea{ double getArea(); } class Circle implements GetArea{ Circle(){ } double radius; Circle(double radius){ this.radius=radius; } public void setRadius(double radius) { this.radius = radius; } public double getRadius() { return radius; } @Override public double getArea() { double s; s=Math.PI*radius*radius; return s; } } class Rectangle implements GetArea{ Rectangle(){ } double width; double length; Rectangle(double width,double length){ this.width=width; this.length=length; } public void setWidth(double width) { this.width = width; } public double getWidth() { return width; } public void setLength(double length) { this.length = length; } public double getLength() { return length; } @Override public double getArea() { double s; s=width*length; return s; } }
3、三次题目集中的正则表达式总结:
题目集4中正则表达式的运用在分值为五十分的题目7-1中,题目为水文校验及数据处理,其中题目要求:对输入数据合法性校验必须使用正则表达式;因为该题难度较大,所以在此不做具体分析。指导书给出的类图如下:

类间发送消息如图:

题目集6中的正则表达式运用于题目7-4(学号校验)。题目要求为:
对软件学院2020级同学学号进行校验,学号共八位,规则如下:
- 1、2位:入学年份后两位,例如20年
- 3、4位:学院代码,软件学院代码为20
- 5位:方向代码,例如1为软件工程,7为物联网
- 6位:班级序号
- 7、8位:学号(序号)
要求如下:
- 只针对2020级
- 其中软件工程专业班级分别为:202011~17、61,物联网工程专业班级为202071~202073,数据科学与大数据专业班级为202081~82
- 每个班级学号后两位为01~40
代码中的具体运用为:String regex = "^2020(1[1-7]|61|7[1-3]|8[1-2])(0[1-9]|[1-3]\\d|40)";
7-4代码如下:
import java.util.Scanner; public class Main{ public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); String str = input.nextLine(); String regex = "^2020(1[1-7]|61|7[1-3]|8[1-2])(0[1-9]|[1-3]\\d|40)"; int length = str.length(); boolean n = str.matches(regex); if(length == 8) { if(n) System.out.print("正确"); else System.out.print("错误"); } else System.out.print("错误"); } }
4、题目集5(7-5)中Java集合框架应用的分析总结:因为个人pta的完成情况,在此此题目不做具体分析。
踩坑心得:经过同学们的反馈之后,从题目集5开始基础题型开始变多,这对我们学习Java语言是有极大帮助的,但是在我们的学习过程中肯定都会存在问题,在此就个人的学习针对每个题目集都在此做一个总结。 题目集4:首先是题目7-2(日期聚合一),这一题完整的做完,当然包括过pta上的测试点,花了的时间算很长了,题目中给的类图确实有些复杂,当初理解也理解了半天,还有计算日期相差的天数也是最后才挣扎出来,时间久了,挣扎的细节我也不多说了,总之这题还是挺让人头疼的;然后是题目7-3(图形继承),刚开始接触继承,是真的很难理解,上课老师讲也迷迷糊糊的听不懂,这着实让人着急,但其实在学习过程中我们会发现,其实在一个题目中,我们就可以学到所有东西,在写一个题目的过程中,不懂继承我们会想尽办法去找到解决问题的方法,充分利用互联网资源才是最明智的选择。 题目集5:在这个题目集里面其实印象最深的还是题目7-3(对整型数据进行排序),刚开始看题目的时候有些不明白为什么非要用三种方法,用一种最简单的冒泡排序的方法不一样能简简单单得出答案吗?做了这个题目才发现三种排序方法(插入排序、选择排序、冒泡排序)各有各的好处,其中的插入排序是我之前没有用过的方法,在此题目中也学会了如何使用。 题目集6:此题目集中印象最深的要数“多态”和“接口”的使用了。说实话,多态和接口刚开始理解和使用着实有些困难,直至现在也不算懂的很透彻,不过我会努力去理解它们。
改进建议:虽然在Java的学习上花的时间不少,但是我觉得自己应该再花些时间去不断地完善自己的代码,争取每次pta上的作业拿下一百分。即使拿了一百分,也要不断地检查和思考自己的代码,写出做好的解决问题的方案,从而达到不断优化自己代码的目的。
总结:我们学习Java语言已经有大半个学期了,这么久的学习下来,我个人的体验还是觉得Java还是比较难学的语言的。这样相比之下,会觉得上学期学的C语言简单很多吧。但是可能后期学了别语言之后,我们也可能会觉得Java没有自己想象中的那么难了吧。本次学习还是学到了挺多东西的,正则表达式的运用、聚合、继承、多态、接口.......这些都是Java语言的特点,其中继承、多态和接口还要继续学习,从而加深进一步的理解。
浙公网安备 33010602011771号