面向对象程序设计-第二次题目集博客作业
1.前言
这三次题目集的难度适中题量也可以,有非常困难的题目,也有一眼就能看出思路以及解题步骤的题目,当然个人还是最喜欢的还是那种难度适中,有点复杂但是捋清楚就十分具有逻辑性的题目。在我看来,日期那几道题都是好题目。一句话总结一下这几次作业的知识点就是:继承与多态,封装以及各种类的调用熟练运用,正则表达式的初步运用。都比较好掌握,当然还有我没有完全熟练掌握的,比如抽象类和接口的运用,正则表达式的更高级用法。
2.具体题目分析
题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣比较
先说说7-2这题,这题是第一次开始接触日期类聚合,聚合方法是通过像是嵌套一样的方法。通过下面的类图来分析,我们可以看出DateUtil类含有Day类对象day,Day类中含有Month类对象month,Month又含有Year类对象。通过层层调用,来提取自己想要进行的操作或数据。每一个类的属性都进行了封装,只能在本类中进行修改,体现出安全性。本次题目的要求有:
- 求下n天
- 求前n天
- 求两个日期相差的天数

通过输入1-3来选择对应的功能。这道题目我没有拿到满分,主要原因是:我没有考虑到功能三输入的日期是小日期在前和在后的区别,比如说:输入“3 2001 6 12 1999 3 1”后我的代码会卡住不动了,因为我只考虑了小日期在前的情况,没有去做一个调换,导致代码出现了错误。当然了,这也是后来时间截止后才发现的问题,本人自行测试时根本就没有往这方面去考虑,苦恼了好久还是没有过这两个测试点。
以下是代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO 自动生成的方法存根 Operation s=new Operation(); s.inputData(); } } class Operation{ int mode; int intput_year; int input_month; int input_day; int intput_year2; int input_month2; int input_day2; int num; int number; DateUtil s1; DateUtil s2; Scanner sc= new Scanner(System.in); Operation(){ mode=0; intput_year=0; input_month=0; input_day=0; intput_year2=0; input_month2=0; input_day2=0; num=0; s1=new DateUtil(); s2=new DateUtil(); } void inputData(){ mode=sc.nextInt(); switch(mode) { case 1: modeOne(); break; case 2: modeTwo(); break; case 3: modeThree(); break; } } void modeOne() { intput_year=sc.nextInt(); input_month=sc.nextInt(); input_day=sc.nextInt(); num=sc.nextInt(); s1.day.month.year.value=intput_year; s1.day.month.value=input_month; s1.day.value=input_day; if(!s1.checkInputValidity()||num<0) { System.out.print("Wrong Format"); } else { s1.getNextNDay(num); } } void modeTwo() { intput_year=sc.nextInt(); input_month=sc.nextInt(); input_day=sc.nextInt(); num=sc.nextInt(); s1.day.month.year.value=intput_year; s1.day.month.value=input_month; s1.day.value=input_day; if(!s1.checkInputValidity()||num<0) { System.out.print("Wrong Format"); } else { s1.getPreviousNDay(num); } } void modeThree() { intput_year=sc.nextInt(); input_month=sc.nextInt(); input_day=sc.nextInt(); intput_year2=sc.nextInt(); input_month2=sc.nextInt(); input_day2=sc.nextInt(); s1.day.month.year.value=intput_year; s1.day.month.value=input_month; s1.day.value=input_day; s2.day.month.year.value=intput_year2; s2.day.month.value=input_month2; s2.day.value=input_day2; if(!s1.checkInputValidity()) { System.out.print("Wrong Format"); } else { if(!s2.checkInputValidity()) { System.out.print("Wrong Format"); } else { number=s1.getDaysofDates(intput_year2,input_month2,input_day2); System.out.println(number); } } } } class DateUtil{ Day day; DateUtil(){ day=new Day(); } DateUtil(int d,int m,int y){ } Day getDay() { return day; } void setDay(Day d) { } boolean checkInputValidity() { return day.validate(); } boolean compareDates(int year2,int month2,int day2) { boolean compareDate=(day.month.year.value!=year2||day.month.value!=month2||day.value!=day2); return compareDate; } boolean equalTwoDates(DateUtil data) { return false; } String showData() { String s="0"; return s; } void getNextNDay(int n){ int daynum=0; int yearnum=0; yearnum=n/365; for(int i=1;i<=yearnum;i++) { day.month.year.value++; if(day.month.year.isLeapYear()) { n=n-366; } else { n=n-365; } } daynum=n; while(daynum>0) { if(day.month.year.isLeapYear()) { day.a[2]=29; } else { day.a[2]=28; } while(day.month.value<=12&&daynum>0) { while(day.value<day.a[day.month.value]&&daynum>0) { day.dayIncreament(); daynum--; } if(daynum>0) { day.restMin(); day.dayReduction(); day.month.monthIncrement(); } } if(daynum>0) { day.month.reseMIN(); day.month.year.yearIncrement(); } } System.out.println(day.month.year.value+"-"+day.month.value+"-"+day.value); } void getPreviousNDay(int n){ while(n>0) { if(day.month.year.isLeapYear()) { day.a[2]=29; } else { day.a[2]=28; } while(day.month.value>=1&&n>0) { while(day.value>1&&n>0) { day.dayReduction(); n--; } if(n>0) { if(day.month.value!=1) { day.month.monthReduction(); day.restMax(); day.dayIncreament(); } else { day.month.monthReduction(); } } } if(n>0) { day.month.reseMax(); day.restMax(); day.dayIncreament(); day.month.year.yearReduction(); } } System.out.println(day.month.year.value+"-"+day.month.value+"-"+day.value); } int getDaysofDates(int year2,int month2,int day2){ int number=0; while(compareDates(year2,month2,day2)) { if(day.month.year.isLeapYear()) { day.a[2]=29; } else { day.a[2]=28; } while(day.month.value<=12&&compareDates(year2,month2,day2)) { while(day.value<day.a[day.month.value]&&compareDates(year2,month2,day2)) { day.dayIncreament(); number++; } if(compareDates(year2,month2,day2)) { day.restMin(); day.dayReduction(); day.month.monthIncrement(); } } if(compareDates(year2,month2,day2)) { day.month.reseMIN(); day.month.year.yearIncrement(); } } return number; } class Year{ int value; Year(){ } Year(int value){ } int getValue() { int i=0; return i; } void setValue(int value) { } boolean isLeapYear() { boolean isLeapYear; isLeapYear = (value%4==0&&value%100!=0)||value%400==0; return isLeapYear; } boolean validate() { boolean validate; validate=(value>=1900&&value<=2050); return validate; } void yearIncrement() { value++; } void yearReduction() { value--; } } class Month{ int value; Year year; Month(){ year=new Year(); } Month(int value){ } int getValue(){ int i=0; return i; } void setValue(int value) { } Year getYear() { return year; } void setYear(Year year) { } void reseMIN() { value=1; } void reseMax() { value=12; } boolean validate() { boolean validate; validate=(value>=1&&value<=12&&year.validate()); return validate; } void monthIncrement() { value++; } void monthReduction() { value--; } } class Day{ int value; Month month; int[]a= {0,31,28,31,30,31,30,31,31,30,31,30,31,0}; Day(){ month=new Month(); } Day(int yearValue,int monthValue,int dayValue){ } int getValue() { int i=0; return i; } void setValue(int value) { } Month getMonth() { return month; } void setMonth(Month value) { } void restMin() { value=1; } void restMax() { value=a[month.value]; } boolean validate(){ if(month.year.isLeapYear()) { a[2]=29; } boolean validate=(value>=1&&value<=a[month.value]&&month.validate()); return validate; } void dayIncreament() { value++; } void dayReduction() { value--; } } }
然后来说说题目集5的7-5,是同样类型的题目,要求也一模一样,同样是输入1-3来选择功能来求出前n天和后n天和两日期相差的天数。区别在哪里呢?首先来分析以下这道题目的类图,DateUtil类中包含了Day类对象day,Year类对象year,Month类对象month,和7-2的区别就在这了,前者是单独一个DateUtil类包含了各种需要的类的对象,后者是层层嵌套的形式,一类含有另一类。如果说哪一种好的话,我个人更倾向于7-5,观感上看起来更简洁,不会出现想调用Year类的一个方法,就必须要通过DateUtil,Day,Month来一步步调用的现象。而至于功能上的优劣就有点商酌了,这里留下一个问题。

这道题目虽然与7-2的要求差不多,但我还是选择了重写,因为7-2中我选择了一天天来进行加减的算法进行操作,但是这道题目的测试点会出现超时的现象,我就不得不着手考虑其他的方法,通过询问同学们的思路,最后选择了按年相加减的形式来进行计算,大大提高了效率。当然了,这次我重新考虑的功能三的日期前后问题,在本次作业中也进行了修正。最后这题成功拿到了满分。以下是代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO 自动生成的方法存根 Operation s=new Operation(); s.inputData(); } } class Operation{ int mode; long intput_year; int input_month; int input_day; long intput_year2; int input_month2; int input_day2; long num; int number; DateUtil s1; DateUtil s2; Scanner sc= new Scanner(System.in); Operation(){ mode=0; intput_year=0; input_month=0; input_day=0; intput_year2=0; input_month2=0; input_day2=0; num=0; s1=new DateUtil(); s2=new DateUtil(); } void inputData(){ mode=sc.nextInt(); switch(mode) { case 1: modeOne(); break; case 2: modeTwo(); break; case 3: modeThree(); break; default: System.out.print("Wrong Format"); break; } } void modeOne() { intput_year=sc.nextLong(); input_month=sc.nextInt(); input_day=sc.nextInt(); num=sc.nextLong(); s1.day.month.year.value=intput_year; s1.day.month.value=input_month; s1.day.value=input_day; if(!s1.checkInputValidity()||num<0) { System.out.print("Wrong Format"); } else { s1.getNextNDay(num); } } void modeTwo() { intput_year=sc.nextLong(); input_month=sc.nextInt(); input_day=sc.nextInt(); num=sc.nextLong(); s1.day.month.year.value=intput_year; s1.day.month.value=input_month; s1.day.value=input_day; if(!s1.checkInputValidity()||num<0) { System.out.print("Wrong Format"); } else { s1.getPreviousNDay(num); } } void modeThree() { intput_year=sc.nextLong(); input_month=sc.nextInt(); input_day=sc.nextInt(); intput_year2=sc.nextLong(); input_month2=sc.nextInt(); input_day2=sc.nextInt(); int flag=0; s1.day.month.year.value=intput_year; s1.day.month.value=input_month; s1.day.value=input_day; s2.day.month.year.value=intput_year2; s2.day.month.value=input_month2; s2.day.value=input_day2; if(!s1.checkInputValidity()) { System.out.print("Wrong Format"); } else { if(!s2.checkInputValidity()) { System.out.print("Wrong Format"); } else { if(s1.compareDates2(intput_year2, input_month2, input_day2)) { s2.day.month.year.value=intput_year; s2.day.month.value=input_month; s2.day.value=input_day; s1.day.month.year.value=intput_year2; s1.day.month.value=input_month2; s1.day.value=input_day2; flag=1; } s1.getDaysofDates(s2.day.month.year.value,s2.day.month.value,s2.day.value,flag); } } } } class DateUtil{ Day day; DateUtil(){ day=new Day(); } DateUtil(long d,int m,int y){ } Day getDay() { return day; } boolean checkInputValidity() { return day.validate(); } boolean compareDates(long year2,int month2,int day2) { boolean compareDate=(day.month.year.value!=year2||day.month.value!=month2||day.value!=day2); return compareDate; } boolean compareDates2(long year2,int month2,int day2) { if(day.month.year.value>year2){ return true; } else { if(day.month.value>month2&&day.month.year.value==year2) { return true; } else { if(day.value>day2&&day.month.value==month2&&day.month.year.value==year2) { return true; } else { return false; } } } } boolean equalTwoDates(DateUtil data) { return false; } void getNextNDay(long n){//得到后n天 long daynum=0; long everyear=day.month.year.value,evermonth=day.month.value,everday=day.value; long evern=n; int flag=0;//标志是否在二月前或后 while(n>366) { switch(day.month.value) { case 1: if(day.month.year.isLeapYear()) { n=n-366; } else { n=n-365; } day.month.year.value++; break; case 2: if(day.value==29) { n=n-365; day.month.year.value++; day.value=28; } else { if(day.month.year.isLeapYear()) { n=n-366; } else { n=n-365; } day.month.year.value++; } break; default: day.month.year.value++; if(day.month.year.isLeapYear()) { n=n-366; } else { n=n-365; } } } daynum=n; while(daynum>0) { if(day.month.year.isLeapYear()) { day.a[2]=29; } else { day.a[2]=28; } while(day.month.value<=12&&daynum>0) { while(day.value<day.a[day.month.value]&&daynum>0) { day.dayIncreament(); daynum--; } if(daynum>0) { day.restMin(); day.dayReduction(); day.month.monthIncrement(); } } if(daynum>0) { day.month.reseMIN(); day.month.year.yearIncrement(); } } System.out.println(everyear+"-"+evermonth+"-"+everday+" next "+evern+" days is:"+day.month.year.value+"-"+day.month.value+"-"+day.value); } void getPreviousNDay(long n){ long daynum=0; long everyear=day.month.year.value,evermonth=day.month.value,everday=day.value; long evern=n; int flag=0;//标志是否在二月前或后 while(n>366) { switch(day.month.value) { case 1: day.month.year.value--; if(day.month.year.isLeapYear()) { n=n-366; } else { n=n-365; } break; case 2: if(day.value==29) { n=n-365; day.month.year.value--; day.value=28; } else { day.month.year.value--; if(day.month.year.isLeapYear()) { n=n-366; } else { n=n-365; } } break; default: if(day.month.year.isLeapYear()) { n=n-366; } else { n=n-365; } day.month.year.value--; } } daynum=n; while(daynum>0) { if(day.month.year.isLeapYear()) { day.a[2]=29; } else { day.a[2]=28; } while(day.month.value>=1&&daynum>0) { while(day.value>1&&daynum>0) { day.dayReduction(); daynum--; } if(daynum>0) { if(day.month.value!=1) { day.month.monthReduction(); day.restMax(); day.dayIncreament(); } else { day.month.monthReduction(); } } } if(daynum>0) { day.month.reseMax(); day.restMax(); day.dayIncreament(); day.month.year.yearReduction(); } } System.out.println(everyear+"-"+evermonth+"-"+everday+" previous "+evern+" days is:"+day.month.year.value+"-"+day.month.value+"-"+day.value); } void getDaysofDates(long year2,int month2,int day2,int flag){ int number=0; int num=0; long everyear=day.month.year.value; int evermonth=day.month.value; int everday=day.value; if(everyear!=year2) { day.month.year.value++; while(day.month.year.value<year2) { if(day.month.year.isLeapYear()) { number=number+366; } else { number=number+365; } day.month.year.value++; } day.month.year.value=everyear; for(int i=1;i<day.month.value;i++) { switch(i) { case 1: num=num+31; break; case 2: if(day.month.year.isLeapYear()) { num=num+29; } else { num=num+28; } break; case 3: num=num+31; break; case 5: num=num+31; break; case 7: num=num+31; break; case 8: num=num+31; break; case 10: num=num+31; break; case 12: num=num+31; break; default: num=num+30; break; } } if(day.month.year.isLeapYear()) { number=number+366-num-everday; } else { number=number+365-num-everday; } day.month.year.value=year2; for(int i=1;i<month2;i++) { switch(i) { case 1: number=number+31; break; case 2: if(day.month.year.isLeapYear()) { number=number+29; } else { number=number+28; } break; case 3: number=number+31; break; case 5: number=number+31; break; case 7: number=number+31; break; case 8: number=number+31; break; case 10: number=number+31; break; case 12: number=number+31; break; default: number=number+30; break; } } day.month.year.value=everyear; number=number+day2; if(flag==0) System.out.println("The days between "+day.month.year.value+"-"+day.month.value+"-"+day.value+" and "+year2+"-"+month2+"-"+day2+" are:"+number); else System.out.println("The days between "+year2+"-"+month2+"-"+day2+" and "+day.month.year.value+"-"+day.month.value+"-"+day.value+" are:"+number); } else { for(int i=1;i<day.month.value;i++) { switch(i) { case 1: num=num+31; break; case 2: if(day.month.year.isLeapYear()) { //System.out.println(".1."+day.month.year.value); num=num+29; } else { num=num+28; //System.out.println(".1."+day.month.year.value); } break; case 3: num=num+31; break; case 5: num=num+31; break; case 7: num=num+31; break; case 8: num=num+31; break; case 10: num=num+31; break; case 12: num=num+31; break; default: num=num+30; break; } } num=num+day.value; day.month.year.value=year2; for(int i=1;i<month2;i++) { switch(i) { case 1: number=number+31; break; case 2: if(day.month.year.isLeapYear()) { number=number+29; //System.out.println(".4."+day.month.year.value); } else { number=number+28; //System.out.println(".4."+day.month.year.value); } break; case 3: number=number+31; break; case 5: number=number+31; break; case 7: number=number+31; break; case 8: number=number+31; break; case 10: number=number+31; break; case 12: number=number+31; break; default: number=number+30; break; } } day.month.year.value=everyear; number=number+day2; number=number-num; if(flag==0) System.out.println("The days between "+day.month.year.value+"-"+day.month.value+"-"+day.value+" and "+year2+"-"+month2+"-"+day2+" are:"+number); else System.out.println("The days between "+year2+"-"+month2+"-"+day2+" and "+day.month.year.value+"-"+day.month.value+"-"+day.value+" are:"+number); } } class Year{ long value; Year(){ } Year(int value){ } int getValue() { int i=0; return i; } void setValue(int value) { } boolean isLeapYear() { boolean isLeapYear; isLeapYear = (value%4==0&&value%100!=0)||value%400==0; return isLeapYear; } boolean validate() { boolean validate; validate=(value>=1820&&value<=2020); return validate; } void yearIncrement() { value++; } void yearReduction() { value--; } } class Month{ int value; Year year; Month(){ year=new Year(); } Month(int value){ } int getValue(){ int i=0; return i; } void setValue(int value) { } Year getYear() { return year; } void setYear(Year year) { } void reseMIN() { value=1; } void reseMax() { value=12; } boolean validate() { boolean validate; validate=(value>=1&&value<=12&&year.validate()); return validate; } void monthIncrement() { value++; } void monthReduction() { value--; } } class Day{ int value; Month month; int[]a= {0,31,28,31,30,31,30,31,31,30,31,30,31,0}; Day(){ month=new Month(); } Day(int yearValue,int monthValue,int dayValue){ } int getValue() { int i=0; return i; } void setValue(int value) { } Month getMonth() { return month; } void setMonth(Month value) { } void restMin() { value=1; } void restMax() { value=a[month.value]; } boolean validate(){ if(month.year.isLeapYear()) { a[2]=29; } boolean validate=(value>=1&&value<=a[month.value]&&month.validate()); return validate; } void dayIncreament() { value++; } void dayReduction() { value--; } } }
题目集4(7-3)图形继承
本题是第一次在作业集中接触到继承,在本题中有类Shape,类Circle,类Retangle,类Box,类Ball,Shape是Circle和Retangle的父类,而Circle和Retangle又分别是Ball和Box的父类。通过继承,子类能够得到父类的方法和属性,继承了半径,长和宽,通过子类方法重写,又实现了对不同图形的体积或表面积的求取功能。弄清楚子类和父类的关系后,这题就显得很简单了,单纯就是通过继承属性和方法以及重写方法来的到想要的结果。以下是代码:
import java.util.Scanner; import java.text.DecimalFormat; public class Main { public static void main(String[] args) { // TODO 自动生成的方法存根 Operation s1=new Operation(); s1.input(); } } class Operation{ int mode; double radius; double width; double length; double height; Shape shape; Circle circle; Rectangle rectangle; Ball ball; Box box; Operation(){ } void input() { Scanner sc=new Scanner(System.in); mode=sc.nextInt(); switch(mode) { case 1: radius=sc.nextDouble(); if(radius<0) System.out.print("Wrong Format"); else mode1(radius); break; case 2: width=sc.nextDouble(); length=sc.nextDouble(); if(width<0||length<0) System.out.print("Wrong Format"); else mode2(width,length); break; case 3: radius=sc.nextDouble(); if(radius<0) System.out.print("Wrong Format"); else mode3(radius); break; case 4: width=sc.nextDouble(); length=sc.nextDouble(); height=sc.nextDouble(); if(width<0||length<0||height<0) System.out.print("Wrong Format"); else mode4(width,length,height); break; default: System.out.print("Wrong Format"); break; } } void mode1(double nowradius) { double area; DecimalFormat df=new DecimalFormat("0.00"); circle=new Circle(); circle.setter(nowradius); area=circle.circleArea(); System.out.print("Circle's area:"+df.format(area)); } void mode2(double nowwidth,double nowlength) { double area; DecimalFormat df=new DecimalFormat("0.00"); rectangle=new Rectangle(); rectangle.setter(nowwidth, nowlength); area=rectangle.retangleArea(); System.out.print("Rectangle's area:"+df.format(area)); } void mode3(double nowradius) { double facearea; double Volume; DecimalFormat df=new DecimalFormat("0.00"); ball=new Ball(); ball.setter(nowradius); facearea=ball.superficialBall(); Volume=ball.getVolume(); System.out.println("Ball's surface area:"+df.format(facearea)); System.out.print("Ball's volume:"+df.format(Volume)); } void mode4(double nowwidth,double nowlength,double nowheight) { double facearea; double Volume; DecimalFormat df=new DecimalFormat("0.00"); box=new Box(); box.setter(nowwidth, nowlength); box.setter(nowheight); facearea=box.superficialBox(); Volume=box.getVolume(); System.out.println("Box's surface area:"+df.format(facearea)); System.out.println("Box's volume:"+df.format(Volume)); } } class Shape{ Shape(){ System.out.println("Constructing Shape"); } public double getArea(){//求图形面积 double circlearea=0; return circlearea; } } class Circle extends Shape{ private double radius; Circle(){ System.out.println("Constructing Circle"); } void setter(double newradius) { radius=newradius; } double getter() { return radius; } double circleArea() { double circlearea; circlearea=Math.PI*radius*radius; return circlearea; } } class Rectangle extends Shape{ private double width; private double length; Rectangle(){ System.out.println("Constructing Rectangle"); } void setter(double newwidth,double newlength) { width=newwidth; length=newlength; } double widthGetter() { return width; } double lengthGetter() { return length; } double retangleArea() { double retanglearea; retanglearea=width*length; return retanglearea; } } class Ball extends Circle{ Ball(){ System.out.println("Constructing Ball"); } double superficialBall() { double facearea; facearea=4.0*Math.PI*super.getter()*super.getter(); return facearea; } double getVolume() { double ballvolume; ballvolume=4.0*Math.PI*super.getter()*super.getter()*super.getter()/3.0; return ballvolume; } } class Box extends Rectangle{ private double height; Box(){ System.out.println("Constructing Box"); } void setter(double newheight) { height=newheight; } double getter() { return height; } double superficialBox() { double facearea; facearea=((super.lengthGetter()*super.widthGetter())+(super.lengthGetter()*height)+(super.widthGetter()*height))*2; return facearea; } double getVolume() { double volume; volume=super.lengthGetter()*super.widthGetter()*height; return volume; } }
7-5 图形继承与多态
本题和题目集四的7-3大致相同,不同之处在于输入的形式和存储的形式,都是Shape类作为父类然后延伸出Retangle,Circle,Triangle这几个子类,然后重写求面积等方法。对于我个人来说,唯一的新知识就是通过ArrayList来进行对象的存储。
ArrayList<Circle> a=new ArrayList(); ArrayList<Retangle> b=new ArrayList(); ArrayList<triangle> c=new ArrayList()
import java.util.Scanner; import java.util.ArrayList; import java.text.DecimalFormat; public class Main { public static void main(String[] args) { // TODO 自动生成的方法存根 Scanner sc=new Scanner(System.in); DecimalFormat df = new DecimalFormat("0.00"); int num_cri=sc.nextInt(); int num_re=sc.nextInt(); int num_tri=sc.nextInt(); int allflag=0; double radius; double width; double length; double size1,size2,size3; double allarea=0; int flag=0;//0为正常,1为出现错误 ArrayList<Circle> a=new ArrayList(); ArrayList<Retangle> b=new ArrayList(); ArrayList<triangle> c=new ArrayList(); if(num_cri<0||num_tri<0||num_re<0) { System.out.print("Wrong Format"); } else { double []cri=new double[num_cri]; double []tri=new double[num_tri]; double []re=new double[num_re]; double []all=new double[num_cri+num_tri+num_re]; for(int i=0;i<num_cri;i++) { radius=sc.nextDouble(); if(radius<=0) { flag=1; } a.add(new Circle(radius)); } for(int i=0;i<num_re;i++) { length=sc.nextDouble(); width=sc.nextDouble(); if(length<0||width<0) { flag=1; } b.add(new Retangle(length,width)); } for(int i=0;i<num_tri;i++) { size1=sc.nextDouble(); size2=sc.nextDouble(); size3=sc.nextDouble(); if(size1<0||size2<0||size3<0) { flag=1; } if(size1>=(size1+size2)||size2>=(size1+size3)||size3>=(size1+size2)) { flag=1; } c.add(new triangle(size1,size2,size3)); } if(flag==1) { System.out.print("Wrong Format"); } else { System.out.println("Original area:"); for(int i=0;i<a.size();i++) { cri[i]=a.get(i).getArea(); System.out.print(df.format(cri[i])+" "); allarea=allarea+cri[i]; all[allflag++]=cri[i]; } for(int i=0;i<b.size();i++) { re[i]=b.get(i).getArea(); System.out.print(df.format(re[i])+" "); allarea=allarea+re[i]; all[allflag++]=re[i]; } for(int i=0;i<c.size();i++) { tri[i]=c.get(i).getArea(); System.out.print(df.format(tri[i])+" "); allarea=allarea+tri[i]; all[allflag++]=tri[i]; } //allflag--; double temp; for(int i=0;i<allflag-1;i++) { for(int j=0;j<allflag-1;j++) { if(all[j]>all[j+1]) { temp=all[j]; all[j]=all[j+1]; all[j+1]=temp; } } } System.out.println(); System.out.println("Sum of area:"+df.format(allarea)); System.out.println("Sorted area:"); for(int i=0;i<allflag;i++) { System.out.print(df.format(all[i])+" "); } System.out.println(); System.out.println("Sum of area:"+df.format(allarea)); } } } } class Circle{ private double radius; Circle(double radius){ this.radius=radius; } void setRadius(double radius) { this.radius=radius; } double getRadius() { return this.radius; } double getArea() { double area; area=Math.PI*this.radius*this.radius; return area; } } class Retangle{ private double length; private double width; Retangle(double length,double width){ this.length=length; this.width=width; } void setLength(double length) { this.length=length; } double getLength() { return this.length; } void setwidth(double width) { this.width=width; } double getWidth() { return this.width; } double getArea() { double area; area=this.length*this.width; return area; } } class triangle{ double size1; double size2; double size3; triangle(double size1,double size2,double size3){ this.size1=size1; this.size2=size2; this.size3=size3; } double getArea() { double area; double p=(this.size1+this.size2+this.size3)/2; area=p*(p-this.size1)*(p-this.size2)*(p-this.size3); area=(double)Math.sqrt(area); return area; } }
7-6 实现图形接口及多态性 这题是我认为比较简单的一题,虽然出现了一个新知识:接口。但是只要了解到接口就是一个抽象方法的集合这个概念就没有什么难处了。接口GetArea,我们可以通过 类 + implements GetArea的形式来实现类对接口中所有的抽象方法的实现。
import java.util.Scanner; import java.util.ArrayList; import java.text.DecimalFormat; public class Main { public static void main(String[] args) { // TODO 自动生成的方法存根 Scanner sc=new Scanner(System.in); DecimalFormat df = new DecimalFormat("0.00"); int num_cri=sc.nextInt(); int num_re=sc.nextInt(); int num_tri=sc.nextInt(); int allflag=0; double radius; double width; double length; double size1,size2,size3; double allarea=0; int flag=0;//0为正常,1为出现错误 ArrayList<Circle> a=new ArrayList(); ArrayList<Retangle> b=new ArrayList(); ArrayList<triangle> c=new ArrayList(); if(num_cri<0||num_tri<0||num_re<0) { System.out.print("Wrong Format"); } else { double []cri=new double[num_cri]; double []tri=new double[num_tri]; double []re=new double[num_re]; double []all=new double[num_cri+num_tri+num_re]; for(int i=0;i<num_cri;i++) { radius=sc.nextDouble(); if(radius<=0) { flag=1; } a.add(new Circle(radius)); } for(int i=0;i<num_re;i++) { length=sc.nextDouble(); width=sc.nextDouble(); if(length<0||width<0) { flag=1; } b.add(new Retangle(length,width)); } for(int i=0;i<num_tri;i++) { size1=sc.nextDouble(); size2=sc.nextDouble(); size3=sc.nextDouble(); if(size1<0||size2<0||size3<0) { flag=1; } if(size1>=(size1+size2)||size2>=(size1+size3)||size3>=(size1+size2)) { flag=1; } c.add(new triangle(size1,size2,size3)); } if(flag==1) { System.out.print("Wrong Format"); } else { System.out.println("Original area:"); for(int i=0;i<a.size();i++) { cri[i]=a.get(i).getArea(); System.out.print(df.format(cri[i])+" "); allarea=allarea+cri[i]; all[allflag++]=cri[i]; } for(int i=0;i<b.size();i++) { re[i]=b.get(i).getArea(); System.out.print(df.format(re[i])+" "); allarea=allarea+re[i]; all[allflag++]=re[i]; } for(int i=0;i<c.size();i++) { tri[i]=c.get(i).getArea(); System.out.print(df.format(tri[i])+" "); allarea=allarea+tri[i]; all[allflag++]=tri[i]; } //allflag--; double temp; for(int i=0;i<allflag-1;i++) { for(int j=0;j<allflag-1;j++) { if(all[j]>all[j+1]) { temp=all[j]; all[j]=all[j+1]; all[j+1]=temp; } } } System.out.println(); System.out.println("Sum of area:"+df.format(allarea)); System.out.println("Sorted area:"); for(int i=0;i<allflag;i++) { System.out.print(df.format(all[i])+" "); } System.out.println(); System.out.println("Sum of area:"+df.format(allarea)); } } } } class Circle{ private double radius; Circle(double radius){ this.radius=radius; } void setRadius(double radius) { this.radius=radius; } double getRadius() { return this.radius; } double getArea() { double area; area=Math.PI*this.radius*this.radius; return area; } } class Retangle{ private double length; private double width; Retangle(double length,double width){ this.length=length; this.width=width; } void setLength(double length) { this.length=length; } double getLength() { return this.length; } void setwidth(double width) { this.width=width; } double getWidth() { return this.width; } double getArea() { double area; area=this.length*this.width; return area; } } class triangle{ double size1; double size2; double size3; triangle(double size1,double size2,double size3){ this.size1=size1; this.size2=size2; this.size3=size3; } double getArea() { double area; double p=(this.size1+this.size2+this.size3)/2; area=p*(p-this.size1)*(p-this.size2)*(p-this.size3); area=(double)Math.sqrt(area); return area; } }
正则表达式部分 说来惭愧,对于正则表达式的用法,本人还是显得不太熟练,在题目集4中7-1和题目集5中7-4统计Java程序中关键词的出现次数这两道难题中,我都没拿到满意的分数,这里就不发表自己的拙见了。主要谈谈另外的三道基础题:都是很标准很简单的正则表达式题目,唯一要注意的点就是\要通过\\来表示
7-1 正则表达式训练-QQ号校验
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO 自动生成的方法存根 Scanner sc =new Scanner(System.in); String a=sc.nextLine(); String b="[1-9][0-9]{4,14}"; boolean str; str=a.matches(b);//[1-9]\\d{4-14}也行 if(str) { System.out.print("你输入的QQ号验证成功"); } else { System.out.print("你输入的QQ号验证失败"); } } }
7-2 字符串训练-字符排序
本题多了一个排序问题,我是先通过char数组来录入String的信息,并且用冒泡排序来进行排序。
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO 自动生成的方法存根 int num; int j=0; char temp; Scanner sc =new Scanner(System.in); String a=sc.nextLine(); char []b=new char[a.length()]; for(int i=0;i<a.length();i++) { b[i]=a.charAt(i); } int min=0; for(int i=0;i<a.length();i++) { min=i; for(j=i;j<a.length();j++) { if(b[j]<b[min]) { min=j; } } temp=b[min]; b[min]=b[i]; b[i]=temp; } for(int i=0;i<a.length();i++) { System.out.print(b[i]); } } }
7-3 正则表达式训练-验证码校验
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO 自动生成的方法存根 Scanner sc =new Scanner(System.in); String a=sc.nextLine(); String b="\\w{1,4}";//[1-9]\\d{4-14}也行 boolean str; str=a.matches(b); if(str) { System.out.print(a+"属于验证码"); } else { System.out.print(a+"不属于验证码"); } } }
7-4 正则表达式训练-学号校验
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO 自动生成的方法存根 Scanner sc =new Scanner(System.in); String a=sc.nextLine(); boolean str; str=a.matches("20201[\\d]*[1234567][\\d]*[123][\\d]*[0123456789]")||a.matches("20201[\\d]*[1234567]40")||a.matches("20201[\\d]*[1234567]0[\\d]*[123456789]"); if(!str) str=a.matches("202061[\\d]*[123][\\d]*[0123456789]")||a.matches("20206140")||a.matches("2020610[\\d]*[123456789]"); if(!str) str=a.matches("20207[\\d]*[123][\\d]*[123][\\d]*[0123456789]")||a.matches("20207[\\d]*[123]40")||a.matches("20207[\\d]*[123]0[\\d]*[123456789]"); if(!str) str=a.matches("20208[\\d]*[123][\\d]*[123][\\d]*[0123456789]")||a.matches("20208[\\d]*[123]40")||a.matches("20208[\\d]*[123]0[\\d]*[123456789]"); if(str&&a.length()==8) { System.out.print("正确"); } else { System.out.print("错误"); } } }
踩坑心得:
1.在日期聚合问题中,要考虑到小日期在前或后的问题,其实题目中有给出提示
在这里他让我们去比较两者日期的大小,通过该方法来判断哪个一个是小日期,才能更好的进行加减操作。
2.接口中,如果一个类继承了一个接口,则这个类一定要重写所有该接口内的抽象方法。
改进建议
在写类的时候可以画一个存储结构图,具体什么类负责什么工作,这样写代码的时候目的性就会比较强。在进行加减的时候可以先考虑是否有更优解的方法来降低代码的运行时间,如将日期聚合类的加减算法从一天天的进行加减变成,先按年份加减,再按月份加减,最后才是天数加减,最大程度地减小运算复杂度。
总结
在这几次大作业中,我已经能够熟练运用类的继承和多态带来的便利方法,能够熟练归纳总结出父类以及延申出它的子类用于达到不同的目的。初步学习了正则表达式的运用,能够筛选出比较简单的字符串了。对于正则表达式,我觉得这是一个值得钻研的地方,很多有关格式,都可以用比较简洁的语言来进行编写,十分地方便。接口也是一个十分具有潜力的地方,这是实现多态的重要手段。实验上,农夫过河从非继承到继承,从4个角色增加到6个角色,每一次变换都在不断完善代码的多态性,安全性,稳定性。

浙公网安备 33010602011771号