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方法的使用规则。题量适中,难度适宜,老师上课认真负责,会在群里发一些有价值的资源,总之,目前为止,我对这门课程还是比较满意的。

posted @ 2021-04-04 20:18  De-de  阅读(126)  评论(0)    收藏  举报