Blog作业02
题目集4~6总结
1.前言
①题目集04:共有三题,三题相较于前面三个题目集难度都加大了不少。其中第一题为水文数据校验及处理,这题为三题中最难的一题,该题主要运用了正则表达式中的知识点,使用了Matcher和Pattern中的较多方法,属于较难的正则表达式;第二题为日期问题面向对象设计(聚合一),这题定义了很多个类,每个类中都定义了较多value,构造方法,一些特定的方法,本题思路不难,但是处理起来较繁琐,代码较长。第三题为图形继承,此题为三题中最简单的一题,每个类中的方法不难写,思路也很清晰,初步使用了继承这一模块,super,this两个关键字的使用在这一题也起到了很大的作用。
②题目集05:共有五题,五题难度区间较大。其中第一题为找出最长的单词-hebust,这题和后面两题都是属于简单的题目,该题主要使用了split方法和if语句的判断,代码也较简单。第二题为合并两个有序数组为新的有序数组,该题将两个数组合并后随便使用一种排序方法输出即可。第三题为对整型数据排序,该题主要考查对插入排序、选择排序、冒泡排序三种方法的使用,没有太大难度。第四题为统计Java程序中关键词的出现次数,该题最需要注意的就是使用了接口的新知识,题目要求要使用List、Set或Map中一种或多种,这是前面的题目集从来没有使用过的,对字符串的使用也有较大的考验,该题可以说是本题目集最难的一题。第六题为日期问题面向对象设计(聚合二),该题和题目集04中的第二题有些不同,本题对每个类中的方法构造有较高的要求,代码较多,完成起来非常的繁琐。
③题目集06:共有六题,这六题相较于前面两个题目集来说没有较难的题目。其中一、三、四、题主要考查的是正则表达式的使用,分别为正则表达式训练-QQ号校验、正则表达式训练-验证码校验、正则表达式训练-学号校验,这三题难度上都没有太大差别。第二题为字符串训练-字符排序,此题较简单,只需要将字符串中的各个字符进行排序输出即可,但要注意的是需要按照ASCII码进行排序。第五题为图形继承与多态,该题主要考查了对继承及多态的掌握程度,还特别考查了ArrayList 的应用,该题的写题思路不难,但是类较多,处理起来也有些头大,还是很适合初学者训练的。第六题为实现图形接口及多态性该题算是第五题的简单版,但是特别考查了对抽象方法的使用,对于刚了解抽象的同学很有帮助。
2.设计与分析
(1)此次题目中有三个图形继承设计的题目,分别为题目集04的7-3、题目集06的7-5、7-6。这里对这三个题目作比较分析。
题目集04的7-3为最简单的一题,初步使用了继承,方法的构造只需要按照题目上说的做即可,这里我对类中的value使用的使private修饰,访问起来会相对简单一些,以下为代码。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner m=new Scanner(System.in);
int mm=m.nextInt();
if(mm==1||mm==2||mm==3||mm==4) {
switch(mm) {
case 1:
double q=m.nextDouble();
if(q>0) {
Circle a=new Circle();
a.setRadius(q);
System.out.print("Circle's area:"+String.format("%.2f",a.getArea()));
}
else {
System.out.println("Wrong Format");
}
case 2:
double w=m.nextDouble();
double e=m.nextDouble();
if(w>0&&e>0) {
Rectangle b=new Rectangle();
b.setWidth(w);;
b.setLength(e);
System.out.println("Rectangle's area:"+String.format("%.2f",b.getArea()));
}
else {
System.out.println("Wrong Format");
}
case 3:
double r=m.nextDouble();
if(r>0) {
Ball c=new Ball();
c.setRadius(r);
System.out.println("Ball's surface area:"+String.format("%.2f",c.getArea()));
System.out.print("Ball's volume:"+String.format("%.2f",c.getVolume()));
}
else {
System.out.println("Wrong Format");
}
case 4:
double t=m.nextDouble();
double y=m.nextDouble();
double u=m.nextDouble();
if(t>0&&y>0&&u>0) {
Box d=new Box();
d.setWidth(t);
d.setLength(y);
d.setHeight(u);
System.out.println("Box's surface area:"+String.format("%.2f",d.getArea()));
System.out.print("Box's volume:"+String.format("%.2f",d.getVolume()));
}
else {
System.out.println("Wrong Format");
}
}
}
else {
System.out.println("Wrong Format");
}
}
}
class Shape{
public Shape() {
System.out.println("Constructing Shape");
}
public double getArea() {
return 0.0;
}
}
class Circle extends Shape{
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
private double radius;
public Circle() {
System.out.println("Constructing Circle");
}
public double getArea(){
double x=0;
x=Math.PI*radius*radius;
return x;
}
}
class Rectangle extends Shape{
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
double width;
private double length;
public Rectangle() {
System.out.println("Constructing Rectangle");
}
public double getArea() {
double x=0;
x=width*length;
return x;
}
}
class Ball extends Circle{
public Ball() {
System.out.println("Constructing Ball");
}
public Ball(double radius) {
setRadius(radius);
}
private double radius;
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getArea() {
double x=0;
x=4*Math.PI*getRadius()*getRadius();
return x;
}
public double getVolume() {
double tiji=0;
tiji=(4.0/3.0)*Math.PI*getRadius()*getRadius()*getRadius();
return tiji;
}
}
class Box extends Rectangle{
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
private double height;
public Box() {
System.out.println("Constructing Box");
}
public Box(double width,double length) {
setWidth(width);
setLength(length);
}
public double getArea() {
double x=0;
x=(getWidth()*getLength()+getWidth()*getHeight()+getHeight()*getLength())*2;
return x;
}
public double getVolume() {
double tiji=0;
tiji=getWidth()*getLength()*getHeight();
return tiji;
}
}
这是运行结果



题目集06的7-6和7-5在题目集04的7-3难度上提高了一些,特别是7-5要求实现能创建多个图形对象,并且存放在ArrayList中,这里我使用循环创建图形对象,以下为7-5的代码。
import java.util.Scanner;
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
Scanner m=new Scanner(System.in);
int o=m.nextInt();
int p=m.nextInt();
int q=m.nextInt();
ArrayList<Circle> m1 =new ArrayList<>();
ArrayList<Rectangle> m2 =new ArrayList<>();
ArrayList<Triangle> m3 =new ArrayList<>();
if(o<0||p<0||q<0) {
System.out.println("Wrong Format");
}
else {
if(o!=0) {
for(int i=0;i<o;i++) {
double e1=m.nextDouble();
Circle u=new Circle();
u.setRadius(e1);
m1.add(u);
}
}
if(p!=0) {
for(int i=0;i<p;i++) {
double e1=m.nextDouble();
double e2=m.nextDouble();
Rectangle u=new Rectangle();
u.setWidth(e1);
u.setLength(e2);
m2.add(u);
}
}
if(q!=0) {
for(int i=0;i<q;i++) {
double e1=m.nextDouble();
double e2=m.nextDouble();
double e3=m.nextDouble();
Triangle u=new Triangle();
u.setSide1(e1);
u.setSide2(e2);
u.setSide3(e3);
m3.add(u);
}
}
double[] m7=new double[o+p+q];
for(int i=0;i<o+p+q;i++) {
if(i<o) {
m7[i]=m1.get(i).getArea();
}
else if(o<=i&&i<o+p) {
m7[i]=m2.get(i-o).getArea();
}
else if(o+p<=i&&i<o+p+q) {
m7[i]=m3.get(i-o-p).getArea();
}
}
ArrayList<Double> list =new ArrayList<>();
for(int i=0;i<o+p+q;i++) {
list.add(m7[i]);
}
if(list.contains(0.0)) {
System.out.println("Wrong Format");
}
else {
System.out.println("Original area:");
if(o!=0) {
double[] m4=new double[o];
for(int i=0;i<o;i++) {
m4[i]=m1.get(i).getArea();
}
for(int i=0;i<o;i++) {
System.out.print(String.format("%.2f",m4[i])+" ");
}
}
if(p!=0) {
double[] m5=new double[p];
for(int i=0;i<p;i++) {
m5[i]=m2.get(i).getArea();
}
for(int i=0;i<p;i++) {
System.out.print(String.format("%.2f",m5[i])+" ");
}
}
if(q!=0) {
double[] m6=new double[q];
for(int i=0;i<q;i++) {
m6[i]=m3.get(i).getArea();
}
for(int i=0;i<q;i++) {
System.out.print(String.format("%.2f",m6[i])+" ");
}
}
System.out.println();
double sum=0;
for(int i=0;i<m7.length;i++) {
sum=sum+m7[i];
}
System.out.println("Sum of area:"+String.format("%.2f",sum));
double temp=0;
for(int i=0;i<m7.length;i++) {
for(int j=i-1;j>=0;j--) {
if(m7[j]>m7[j+1]) {
temp=m7[j+1];
m7[j+1]=m7[j];
m7[j]=temp;
}
}
}
System.out.println("Sorted area:");
for(int i=0;i<m7.length;i++) {
System.out.print(String.format("%.2f",m7[i])+" ");
}
System.out.println();
System.out.println("Sum of area:"+String.format("%.2f",sum));
}
}
}
}
class Shape{
public double getArea() {
return 0.0;
}
public boolean validate() {
return true;
}
}
class Circle extends Shape {
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
private double radius;
public boolean validate() {
if(radius<0) {
return false;
}
else
return true;
}
public double getArea(){
double x=0;
x=Math.PI*radius*radius;
return x;
}
}
class Rectangle extends Shape {
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
private double width;
private double length;
public boolean validate() {
if(width<0||length<0) {
return false;
}
else
return true;
}
public double getArea() {
double x=0;
x=width*length;
return x;
}
}
class Triangle extends Shape {
public double getSide1() {
return side1;
}
public void setSide1(double side1) {
this.side1 = side1;
}
public double getSide2() {
return side2;
}
public void setSide2(double side2) {
this.side2 = side2;
}
public double getSide3() {
return side3;
}
public void setSide3(double side3) {
this.side3 = side3;
}
private double side1;
private double side2;
private double side3;
public boolean validate() {
if((side1+side2)<=side3||(side1+side3)<=side2||(side2+side3)<=side1||side1<0||side2<0||side3<0) {
return false;
}
else
return true;
}
public double getArea() {
double x=0;
double p=(side1+side2+side3)/2;
x=Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
return x;
}
}
这是运行结果



这几次题目集都有题目用到了正则表达式,这些最难的部分是对Matcher和Pattern的掌握,这几题对于判断字符串还是较简单的,还是要注意字母与数字的区别,这里给出一题的代码。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner m=new Scanner(System.in);
String mm=m.next();
Pattern mmm=null;
Matcher mmmm=null;
String zia="[1-9][0-9]{4,14}";
mmm=Pattern.compile(zia);
mmmm=mmm.matcher(mm);
if(mmmm.matches()) {
System.out.println("你输入的QQ号验证成功");
}
else{
System.out.println("你输入的QQ号验证失败");
}
}
}
这是运行结果


题目集04的7-2和题目集05的7-5都是对日期问题进行处理,这两题的输入格式对于前面几个题目集的日期问题有所不同,需要做更多考虑,方法都是大同小异的,但是题目集05的7-5的Dateutil类中的方法会更繁琐一些,写的时候代码更多一些,有序这两题我都没有完全正确,这里就不给出代码。
3.采坑心得
这几个题目集中有非常多需要用到继承的题目,继承类的变量访问一开始我也非常头疼,但是后来发现如果对类中的变量进行封装处理之后,访问起来就很简单了,只需要简单的get,set就好了。还有正则表达式的使用规范,{}[]这两个符号的使用一定要注意次数,不然很容易判断错误。
4.改进建议
这里我的题目集06的7-5代码有些繁琐,没有用最好的方法解决这题。
import java.util.Scanner;
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
Scanner m=new Scanner(System.in);
int o=m.nextInt();
int p=m.nextInt();
int q=m.nextInt();
ArrayList<Circle> m1 =new ArrayList<>();
ArrayList<Rectangle> m2 =new ArrayList<>();
ArrayList<Triangle> m3 =new ArrayList<>();
if(o<0||p<0||q<0) {
System.out.println("Wrong Format");
}
else {
if(o!=0) {
for(int i=0;i<o;i++) {
double e1=m.nextDouble();
Circle u=new Circle();
u.setRadius(e1);
m1.add(u);
}
}
if(p!=0) {
for(int i=0;i<p;i++) {
double e1=m.nextDouble();
double e2=m.nextDouble();
Rectangle u=new Rectangle();
u.setWidth(e1);
u.setLength(e2);
m2.add(u);
}
}
if(q!=0) {
for(int i=0;i<q;i++) {
double e1=m.nextDouble();
double e2=m.nextDouble();
double e3=m.nextDouble();
Triangle u=new Triangle();
u.setSide1(e1);
u.setSide2(e2);
u.setSide3(e3);
m3.add(u);
}
}
double[] m7=new double[o+p+q];
for(int i=0;i<o+p+q;i++) {
if(i<o) {
m7[i]=m1.get(i).getArea();
}
else if(o<=i&&i<o+p) {
m7[i]=m2.get(i-o).getArea();
}
else if(o+p<=i&&i<o+p+q) {
m7[i]=m3.get(i-o-p).getArea();
}
}
ArrayList<Double> list =new ArrayList<>();
for(int i=0;i<o+p+q;i++) {
list.add(m7[i]);
}
if(list.contains(0.0)) {
System.out.println("Wrong Format");
}
else {
System.out.println("Original area:");
if(o!=0) {
double[] m4=new double[o];
for(int i=0;i<o;i++) {
m4[i]=m1.get(i).getArea();
}
for(int i=0;i<o;i++) {
System.out.print(String.format("%.2f",m4[i])+" ");
}
}
if(p!=0) {
double[] m5=new double[p];
for(int i=0;i<p;i++) {
m5[i]=m2.get(i).getArea();
}
for(int i=0;i<p;i++) {
System.out.print(String.format("%.2f",m5[i])+" ");
}
}
if(q!=0) {
double[] m6=new double[q];
for(int i=0;i<q;i++) {
m6[i]=m3.get(i).getArea();
}
for(int i=0;i<q;i++) {
System.out.print(String.format("%.2f",m6[i])+" ");
}
}
System.out.println();
double sum=0;
for(int i=0;i<m7.length;i++) {
sum=sum+m7[i];
}
System.out.println("Sum of area:"+String.format("%.2f",sum));
double temp=0;
for(int i=0;i<m7.length;i++) {
for(int j=i-1;j>=0;j--) {
if(m7[j]>m7[j+1]) {
temp=m7[j+1];
m7[j+1]=m7[j];
m7[j]=temp;
}
}
}
System.out.println("Sorted area:");
for(int i=0;i<m7.length;i++) {
System.out.print(String.format("%.2f",m7[i])+" ");
}
System.out.println();
System.out.println("Sum of area:"+String.format("%.2f",sum));
}
}
}
}
class Shape{
public double getArea() {
return 0.0;
}
public boolean validate() {
return true;
}
}
class Circle extends Shape {
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
private double radius;
public boolean validate() {
if(radius<0) {
return false;
}
else
return true;
}
public double getArea(){
double x=0;
x=Math.PI*radius*radius;
return x;
}
}
class Rectangle extends Shape {
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
private double width;
private double length;
public boolean validate() {
if(width<0||length<0) {
return false;
}
else
return true;
}
public double getArea() {
double x=0;
x=width*length;
return x;
}
}
class Triangle extends Shape {
public double getSide1() {
return side1;
}
public void setSide1(double side1) {
this.side1 = side1;
}
public double getSide2() {
return side2;
}
public void setSide2(double side2) {
this.side2 = side2;
}
public double getSide3() {
return side3;
}
public void setSide3(double side3) {
this.side3 = side3;
}
private double side1;
private double side2;
private double side3;
public boolean validate() {
if((side1+side2)<=side3||(side1+side3)<=side2||(side2+side3)<=side1||side1<0||side2<0||side3<0) {
return false;
}
else
return true;
}
public double getArea() {
double x=0;
double p=(side1+side2+side3)/2;
x=Math.sqrt(p*(p-side1)*(p-side2)*(p-side3));
return x;
}
}
这里对Arraylist的使用不是很熟练,希望能够改进使用这个点的方法,使代码看起来没那么冗长。
5.总结
这三次题目集对继承和正则表达式的体会尤其深,初步掌握了这两个技能,还学习了一些接口的使用。希望老师在课堂上能够对这些内容复习复习,课堂够更加活跃一些,实验题目的代码量能减少一些,多讲一些例子。

浙公网安备 33010602011771号