OOP第一次实验报告
一、前言
关于前三次作业的知识点,我学到了很多,包括java中的编译器的安装与使用,使用eclipse进行调试来纠正错误,java中数据的输入与输出,类和对象的关系,构造函数有参无参的区别,不同种类方法的调用方式不同,this关键字的用处,参数传递,if语句,switch语句,for循环,foreach语句等语句的正确使用,还有第三次作业用到的正则表达式,pattern,matcher方法的使用规则。题量适中,本人可以勉强写完 ,至于难度方面,除了第三次有关正则表达式的题目,其他的题目都可以按时写完。
二、设计与分析
第一次作业7-8:
源码如下:
import java.util.Scanner;
public class Main {
public static void main (String [] args) {
Scanner sr= new Scanner(System.in);
double border1=sr.nextDouble();
double border2=sr.nextDouble();
double border3=sr.nextDouble();
//判断是否输入正确
if(border1<1||border1>200||border2<1||border2>200||border3<1||border3>200) {
System.out.println("Wrong Format");
}else {
//判断三边是否构成三角形
if((border3+ border2<= border1)&&(border3+ border1<= border2)&&(border1+ border2<= border3)) {
System.out.println("Not a triangle");
}else {
//判断是否构成等边三角形
if((border3==border2)&&(border3==border1)&&(border1==border2)) {
System.out.println("Equilateral triangle");
}else if(((((border3*border3+border2*border2-border1*border1)<0.000001)&&((border3*border3+border2*border2-border1*border1)>-0.000001))||(((border1*border1+border2*border2-border3*border3)<0.000001)&&((border1*border1+border2*border2-border3*border3)>-0.000001))||(((border3*border3+border1*border1-border2*border2)<0.000001)&&((border3*border3+border1*border1-border2*border2)>-0.000001)))&&((border3==border2)||(border3==border1)||(border1==border2))) {
//判断是否构成直角等腰三角形
System.out.println("Isosceles right-angled triangle");
}else if(((border3==border2)||(border3==border1)||(border1==border2))) {
//判断是否构成等腰三角形
System.out.println("Isosceles triangle");
}else if((((border3*border3+border2*border2-border1*border1)<0.000001)&&((border3*border3+border2*border2-border1*border1)>-0.000001))||(((border1*border1+border2*border2-border3*border3)<0.000001)&&((border1*border1+border2*border2-border3*border3)>-0.000001))||(((border3*border3+border1*border1-border2*border2)<0.000001)&&((border3*border3+border1*border1-border2*border2)>-0.000001))) {
//判断是否构成直角三角形
System.out.println("Right-angled triangle");
}else{
System.out.println("General triangle");
}
}
}
}
}
本题主要考察逻辑判断能力,以及利用Java函数对数据的处理,我在做这题只是利用if else语句分类讨论。

第二次作业7-4:
源码如下:import java.util.Scanner;public class Ma{ public static void main(String args[]) { int year,month,day; Scanner sr = new Scanner(System.in); year=sr.nextInt();
month=sr.nextInt();
day=sr.nextInt();
//判断输入是否正确
if(year<1820||year>2020) {
System.out.println("Wrong Format");
}else if(month<1||month>12) {
System.out.println("Wrong Format");
}else if(day<1||day>31) {
System.out.println("Wrong Format");
}else if(month==1) {
//对一月份分情况求下一天
if(day==31) {
month=2;
day=1;
}else {
day++;
}
System.out.println("Next date is:"+year+"-"+month+"-"+day);
} else if (month==2&&((year%4==0&&year%100!=0)||year%400==0)) {
//对二月份分情况求下一天
if(day==29) {
month=3;
day=1;
}else {
day++;
}
System.out.println("Next date is:"+year+"-"+month+"-"+day);
} else if (month==2) {
if(day==29) {
System.out.println("Wrong Format");
}else if(day==28) {
month=3;
day=1;
System.out.println("Next date is:"+year+"-"+month+"-"+day);
}else {
day++;
System.out.println("Next date is:"+year+"-"+month+"-"+day);
}
} else if (month==3) {
//对三月份分情况求下一天
if(day==31) {
month=4;
day=1;
}else {
day++;
}
System.out.println("Next date is:"+year+"-"+month+"-"+day);
} else if (month==4) {
//对四月份分情况求下一天
if(day==30) {
month=5;
day=1;
}else {
day++;
}
System.out.println("Next date is:"+year+"-"+month+"-"+day);
} else if (month==5) {
//对五月份分情况求下一天
if(day==31) {
month=6;
day=1;
}else {
day++;
}
System.out.println("Next date is:"+year+"-"+month+"-"+day);
} else if (month==6) {
//对六月份分情况求下一天
if(day==30) {
month=7;
day=1;
}else {
day++;
}
System.out.println("Next date is:"+year+"-"+month+"-"+day);
} else if (month==7) {
//对七月份分情况求下一天
if(day==31) {
month=8;
day=1;
}else {
day++;
}
System.out.println("Next date is:"+year+"-"+month+"-"+day);
} else if (month==8) {
//对八月份分情况求下一天
if(day==31) {
month=9;
day=1;
}else {
day++;
}
System.out.println("Next date is:"+year+"-"+month+"-"+day);
} else if (month==9) {
//对九月份分情况求下一天
if(day==30) {
month=10;
day=1;
}else {
day++;
}
System.out.println("Next date is:"+year+"-"+month+"-"+day);
} else if (month==10) {
//对十月份分情况求下一天
if(day==31) {
month=11;
day=1;
}else {
day++;
}
System.out.println("Next date is:"+year+"-"+month+"-"+day);
} else if (month==11) {
//对十一月份分情况求下一天
if(day==30) {
month=12;
day=1;
}else {
day++;
}
System.out.println("Next date is:"+year+"-"+month+"-"+day);
} else if (month==12) {
//对十二月份分情况求下一天
if(day==31) {
month=1;
day=1;
year++;
}else {
day++;
}
System.out.println("Next date is:"+year+"-"+month+"-"+day);
}
}
}
没什么好解释的,就是暴力分情况,但是要特别注意一下二月份要分平年和闰年进行操作。

第二次作业7-5:
源码如下:import java.util.Scanner;public class Main
{
public static void main(String args[])
{
int year,month,day,changed;
Scanner sr = new Scanner(System.in);
year=sr.nextInt();
month=sr.nextInt();
day=sr.nextInt();
changed=sr.nextInt();
//判断是否输入正确
if(year<1820||year>2020) {
System.out.println("Wrong Format");
}else if(month<1||month>12) {
System.out.println("Wrong Format");
}else if(day<1||day>31) {
System.out.println("Wrong Format");
}else if(month==1) {
//对一月份分情况求前N天
day=day-changed;
if(day>31) {
month=2;
day=day-31;
}else if(day<=0){
day=31+day;
month=12;
year--;
}
System.out.println(changed+" days ago is:"+year+"-"+month+"-"+day);
} else if (month==2&&((year%4==0&&year%100!=0)||year%400==0)) {
//对二月份分情况求前N天
day=day-changed;
if(day>29) {
month=3;
day=day-29;
}else if(day<=0){
day=31+day;
month=1;
}
System.out.println(changed+" days ago is:"+year+"-"+month+"-"+day);
} else if (month==2) {
if(day==29) {
System.out.println("Wrong Format");
}else {
day=day-changed;
if(day>28) {
month=3;
day=day-28;
System.out.println(changed+" days ago is:"+year+"-"+month+"-"+day);
}else if(day<=0){
day=day+31;
month=1;
System.out.println(changed+" days ago is:"+year+"-"+month+"-"+day);
}
}
}else if (month==3) {
//对三月份分情况求前N天
day=day-changed;
if(day>31) {
month=4;
day=day-31;
}else if(day<=0&&((year%4==0&&year%100!=0)||year%400==0)){
day=29+day;
month=2;
}else if(day<=0) {
day=28+day;
month=2;
}
System.out.println(changed+" days ago is:"+year+"-"+month+"-"+day);
} else if (month==4) {
//对四月份分情况求前N天
day=day-changed;
if(day>30) {
month=5;
day=day-30;
}else if(day<=0){
day=31+day;
month=3;
}
System.out.println(changed+" days ago is:"+year+"-"+month+"-"+day);
} else if (month==5) {
//对五月份分情况求前N天
day=day-changed;
if(day>31) {
month=6;
day=day-31;
}else if(day<=0){
day=30+day;
month=4;
}
System.out.println(changed+" days ago is:"+year+"-"+month+"-"+day);
} else if (month==6) {
//对六月份分情况求前N天
day=day-changed;
if(day>31) {
month=7;
day=day-30;
}else if(day<=0){
day=31+day;
month=5;
}
System.out.println(changed+" days ago is:"+year+"-"+month+"-"+day);
} else if (month==7) {
//对七月份分情况求前N天
day=day-changed;
if(day>31) {
month=8;
day=day-31;
}else if(day<=0){
day=30+day;
month=6;
}
System.out.println(changed+" days ago is:"+year+"-"+month+"-"+day);
} else if (month==8) {
//对八月份分情况求前N天
day=day-changed;
if(day>31) {
month=9;
day=day-31;
}else if(day<=0){
day=31+day;
month=7;
}
System.out.println(changed+" days ago is:"+year+"-"+month+"-"+day);
} else if (month==9) {
//对九月份分情况求前N天
day=day-changed;
if(day>30) {
month=10;
day=day-30;
}else if(day<=0){
day=31+day;
month=8;
}
System.out.println(changed+" days ago is:"+year+"-"+month+"-"+day);
} else if (month==10) {
//对十月份分情况求前N天
day=day-changed;
if(day>31) {
month=11;
day=day-31;
}else if(day<=0){
day=30+day;
month=9;
}
System.out.println(changed+" days ago is:"+year+"-"+month+"-"+day);
} else if (month==11) {
//对十一月份分情况求前N天
day=day-changed;
if(day>30) {
month=12;
day=day-30;
}else if(day<=0){
day=31+day;
month=10;
}
System.out.println(changed+" days ago is:"+year+"-"+month+"-"+day);
} else if (month==12) {
//对十二月份分情况求前N天
day=day-changed;
if(day>31) {
month=1;
day=day-31;
year++;
}else if(day<=0){
day=30+day;
month=11;
}
System.out.println(changed+" days ago is:"+year+"-"+month+"-"+day);
}
}
}
还是暴力分情况,但要比前一题更加复杂一些。

第三次作业7-2:
源码如下:
import java.util.Scanner; import java.time.*; public class Main { public static void main(String args[]) { int year=0;//年 int month=0;//月 int day=0;//天 Scanner sr= new Scanner(System.in); //自定义数据 year = sr.nextInt(); month = sr.nextInt(); day = sr.nextInt(); //创建一个Date对象 Date a = new Date(year,month,day); a.checkinputValidity(); } } class Date//定义Date类 { private int year=0;//年 private int month=0;//月 private int day=0;//天 Date(){ }//定义无参构造方法 Date(int year,int month,int day){ this.year=year; this.month=month; this.day=day; }//定义有参构造方法 int getyear(){ return year; } void setyear(int year){ this.year=year; } int getmonth(){ return month; } void setmonth(int month){ this.month=month; } int getday(){ return day; } void setday(int day){ this.day=day; } static boolean isLeapYear(int year) { if((year%4==0&&year%400!=0)||year%400==0) { return true; }else { return false; } }//判断闰年 boolean checkinputValidity() { 判断是否为闰年
if(isLeapYear(year)) {
//判断输入是否正确
if(year<1900||year>2000) { System.out.println("Date Format is Wrong"); return false; }else if(month<1||month>12) { System.out.println("Date Format is Wrong"); return false; }else if(day<1||day>31) { System.out.println("Date Format is Wrong"); return false; }else if(day>31&&month==1) { System.out.println("Date Format is Wrong"); return false; }else if(day>29&&month==2) { System.out.println("Date Format is Wrong"); return false; }else if(day>31&&month==3) { System.out.println("Date Format is Wrong"); return false; }else if(day>30&&month==4) { System.out.println("Date Format is Wrong"); return false; }else if(day>31&&month==5) { System.out.println("Date Format is Wrong"); return false; }else if(day>30&&month==6) { System.out.println("Date Format is Wrong"); return false; }else if(day>31&&month==7) { System.out.println("Date Format is Wrong"); return false; }else if(day>31&&month==8) { System.out.println("Date Format is Wrong"); return false; }else if(day>30&&month==9) { System.out.println("Date Format is Wrong"); return false; }else if(day>31&&month==10) { System.out.println("Date Format is Wrong"); return false; }else if(day>30&&month==11) { System.out.println("Date Format is Wrong"); return false; }else if(day>31&&month==12) { System.out.println("Date Format is Wrong"); return false; }else{
//求下一天 getNextDate(); System.out.println("Next day is:"+year+"-"+month+"-"+day); return true; } }else { //判断输入是否正确
if(year<1900||year>2000) { System.out.println("Date Format is Wrong"); return false; }else if(month<1||month>12) { System.out.println("Date Format is Wrong"); return false; }else if(day<1||day>31) { System.out.println("Date Format is Wrong"); return false; }else if(day>31&&month==1) { System.out.println("Date Format is Wrong"); return false; }else if(day>28&&month==2) { System.out.println("Date Format is Wrong"); return false; }else if(day>31&&month==3) { System.out.println("Date Format is Wrong"); return false; }else if(day>30&&month==4) { System.out.println("Date Format is Wrong"); return false; }else if(day>31&&month==5) { System.out.println("Date Format is Wrong"); return false; }else if(day>30&&month==6) { System.out.println("Date Format is Wrong"); return false; }else if(day>31&&month==7) { System.out.println("Date Format is Wrong"); return false; }else if(day>31&&month==8) { System.out.println("Date Format is Wrong"); return false; }else if(day>30&&month==9) { System.out.println("Date Format is Wrong"); return false; }else if(day>31&&month==10) { System.out.println("Date Format is Wrong"); return false; }else if(day>30&&month==11) { System.out.println("Date Format is Wrong"); return false; }else if(day>31&&month==12) { System.out.println("Date Format is Wrong"); return false; }else{
//求下一天 getNextDate(); System.out.println("Next day is:"+year+"-"+month+"-"+day); return true; } } } void getNextDate() {
//判断是否为润年 if(isLeapYear(year)) { day++;
//对各月份分情况操作 if(month==1&&day==32) { month++; day=1; }else if(month==2&&day==30) { month++; day=1; }else if(month==3&&day==32) { month++; day=1; }else if(month==4&&day==31) { month++; day=1; }else if(month==5&&day==32) { month++; day=1; }else if(month==6&&day==31) { month++; day=1; }else if(month==7&&day==32) { month++; day=1; }else if(month==8&&day==32) { month++; day=1; }else if(month==9&&day==31) { month++; day=1; }else if(month==10&&day==32) { month++; day=1; }else if(month==11&&day==31) { month++; day=1; }else if(month==12&&day==32) { month=1; year++; day=1; } }else { day++; //对各月份分情况操作
if(month==1&&day==32) { month++; day=1; }else if(month==2&&day==29) { month++; day=1; }else if(month==3&&day==32) { month++; day=1; }else if(month==4&&day==31) { month++; day=1; }else if(month==5&&day==32) { month++; day=1; }else if(month==6&&day==31) { month++; day=1; }else if(month==7&&day==32) { month++; day=1; }else if(month==8&&day==32) { month++; day=1; }else if(month==9&&day==31) { month++; day=1; }else if(month==10&&day==32) { month++; day=1; }else if(month==11&&day==31) { month++; day=1; }else if(month==12&&day==32) { month=1; day=1; year++; } } } }
本题运用到类和对象的知识,其他的与前几题类似。

第三次作业7-3:
源码如下:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.Scanner;
public class Main {
public static void main(String []args)
{
Scanner sr = new Scanner(System.in);
String totalRegex = "([-+]?(\\s+)?((([2-9]+[0-9]*)|([1-9]+[0-9]+))(\\s+)?(\\*)?)?(\\s+)?x?(\\^)?(([+-]?[2-9]+[0-9]*)|([+-]?[1-9]+[0-9]+)|([-][1-9]+[0-9]*))?)+";
//用于检测输入的式子总的正则表达式
String sbuRegex = "[-+]?(\\s+)?((([2-9]+[0-9]*)|([1-9]+[0-9]+))(\\s+)?(\\*)?)?(\\s+)?x?(\\^)?(([+-]?[2-9]+[0-9]*)|([+-]?[1-9]+[0-9]+)|([-][1-9]+[0-9]*))?";
//用于提取每一项
String cofRegex = "[-+]?(\\s+)?((([2-9]+[0-9]*)|([1-9]+[0-9]+))(\\s+)?(\\*)?)?(\\s+)?";
//用于提取系数部分
String expRegex="x(\\^)?(([+-]?[2-9]+[0-9]*)|([+-]?[1-9]+[0-9]+)|([-][1-9]+[0-9]*))?";
//用于提取指数部分
String input= sr.nextLine();
Pattern cofpattern = Pattern.compile(cofRegex);
Pattern exppattern = Pattern.compile(expRegex);
int intcof=0,intexp=0;
int c=0,c1=0;
boolean flag1=false,flag2=false;
boolean bl=Pattern.matches(totalRegex, input);
if(bl==true)
{
Pattern pattern = Pattern.compile(sbuRegex);
Matcher matcher=pattern.matcher(input);
while(matcher.find())
{
c++;
String tmp=matcher.group();
Matcher cofmatcher=cofpattern.matcher(tmp);
Matcher expmatcher=exppattern.matcher(tmp);
if(c==1) {
if(cofmatcher.find()) {
String cof=cofmatcher.group();
flag1=cof.contains("*");
cof=cof.replace(" ", "");
cof=cof.replace("*", "");
if(cof.equals("-")) {
intcof=-1;
}else if(cof.equals("+")) {
intcof=1;
}else if(cof.length()!=0){
intcof=Integer.parseInt(cof);
}else {
intcof=1;
}
}
if(expmatcher.find()) {
String sexp=expmatcher.group();
flag2=sexp.contains("^");
if(flag2) {
sexp=sexp.replace("x", "");
sexp=sexp.replace("^", "");
intexp=Integer.parseInt(sexp);
intexp--;
if(intexp==0) {
intexp++;
System.out.print(intexp*intcof);
c1++;
}else if(intexp==1) {
intexp++;
System.out.print(intexp*intcof+"*x");
c1++;
}else {
intexp++;
System.out.print(intexp*intcof+"*x^"+(--intexp));
c1++;
}
}else {
System.out.print(intcof);
c1++;
}
}
}else {//c>1
if(cofmatcher.find()) {
String cof=cofmatcher.group();
flag1=cof.contains("*");
cof=cof.replace(" ", "");
cof=cof.replace("*", "");
if(cof.equals("-")) {
intcof=-1;
}else if(cof.equals("+")) {
intcof=1;
}else if(cof.length()!=0){
intcof=Integer.parseInt(cof);
} else {
intcof=1;
}
}
if(expmatcher.find()) {
String sexp=expmatcher.group();
flag2=sexp.contains("^");
if(flag2) {
sexp=sexp.replace("x", "");
sexp=sexp.replace("^", "");
intexp=Integer.parseInt(sexp);
intexp--;
if(intexp==0) {
intexp++;
if(intexp*intcof>0&&c1!=0) {
System.out.print("+");
}
System.out.print(intexp*intcof);
c1++;
}else if(intexp==1) {
intexp++;
if(intexp*intcof>0&&c1!=0) {
System.out.print("+");
}
System.out.print(intexp*intcof+"*x");
c1++;
}else {
intexp++;
if(intexp*intcof>0&&c1!=0) {
System.out.print("+");
}
System.out.print(intexp*intcof+"*x^"+(--intexp));
c1++;
}
}else {
if(intcof>0&&c1!=0) {
System.out.print("+");
}
System.out.print(intcof);
c1++;
}
}
}
long end=matcher.end();
if(end==input.length()) {
break;
}
}
if(c1==0) {
System.out.print("0");
}
}else {
System.out.print("Wrong Format");
}
}
}
本题难度确实有点大,有几个确实过不去,其他基本功能可以实现,例如对一些简单正常的式子可以进行求导。

三、踩坑心得
1.在方法外面不能进行输入输出操作,赋值操作,但可以进行一些定义变量的操作。
2.定义public类名必须与文件名相同。
3.Scanner类中next()和nextline()的区别,前者类似于C语言中的scanf,遇到空白符就终止,并将其留在输入缓存区,后者则是类似gets,遇到空白符就终止,并将其吸收转化为\0。
四、改进建议
主要是针对正则表达式,后续将继续学习,改进判断条件,从而更好处理一些特殊情况。以及对一些判断条件的改进,例如对日期的判断可以用数组来判断,而不是单纯的用if语句来搞。
五、总结
通过这三次作业,让我对Java有了更深刻的认识,进一步提高了我对Java的兴趣,java中的编译器的安装与使用,使用eclipse进行调试来纠正错误,java中数据的输入与输出,类和对象的关系,构造函数有参无参的区别,不同种类方法的调用方式不同,this关键字的用处,参数传递,if语句,switch语句,for循环,foreach语句等语句的正确使用,还有第三次作业用到的正则表达式,pattern,matcher方法的使用规则。题量适中,难度适宜,老师上课认真负责,会在群里发一些有价值的资源,总之,目前为止,我对这门课程还是比较满意的。

浙公网安备 33010602011771号