OOP第一次作业

前三次作业总结

 

 

(1)前言:因为本人表达能力偏弱,可能会写得有些冗长,但是我尽量把我要写的内容写全。

第一次实验:这次的题目最多,比较基础。依次考察了从控制台输入数字并相加,输入并识别字符、转化成对应数字输出,用选择语句对输入数据进行判断,计算税率,使用数组,进行排序,对实数进行计算、判断、然后输出。

第二次实验:难度飞跃,题量较大。第一题主要是对字符串的操作,第二题是更灵活的排序,第三题开始使用方法,三到五题都涉及到对日期的判断和操作。

第三次实验:只有三道,难度只能说懂得都懂。从第一题开始使用到类,需要创建构造方法、getter和setter等方法。

(2)设计与分析:

题目集1的7-8:用了非常多的if语句,圈复杂度很高,超出了绿色范围

 

 

题目集2的7-4、7-5:7-4的情况相对好一点,7-5的方法数目多,Avg depth等多项值超出范围。

 

 

 

 

题目集3的7-2、7-3:只有最大圈复杂度一项超出范围。

 

 

 

 

(3)采坑心得:

第一次实验只有一个问题,7-8的判断三角形有一种直角的情况,我直接用勾股定理把两边划了等号,但实际上实型数字计算需要留出一定的误差空间。我把‘’a*a+b*b==c*c‘’改成了“a*a+b*b-c*c<1”就能通过了。

(源码)import java.util.Scanner;

public class Main {

public static void main(String[] args) {

        Scanner input=new Scanner(System.in);

        double a=input.nextDouble();

         double b=input.nextDouble();

         double c=input.nextDouble();

        double t;

        

        

        if (a > b)  {

                 t = a;

                 a = b;

                 b = t;

             }

        if (a > c){

          t = a;

          a = c;

          c = t;

             }

        if (b > c){

            t = b;

            b = c;

            c = t;

             }

 

        

        

        if(a<1||c>200){

            System.out.println("Wrong Format");

        }

        else if(a+b<=c){

            System.out.println("Not a triangle");            

        }

        else if(a==c){

           System.out.println("Equilateral triangle");

        }

        else if(a==b&&a*a+b*b-c*c<1){

            System.out.println("Isosceles right-angled triangle");

        }

        else if(a==b||b==c){

            System.out.println("Isosceles triangle");

        }

        else if(a*a+b*b==c*c){

            System.out.println("Right-angled triangle");

        }

        else

            System.out.println("General triangle");

        

    }

}

实验二7-4:import java.util.Scanner;

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();

        if(checkInputValidity(a,b,c))

            System.out.println("Wrong Format");

            

         else

             nextDate(a,b,c);

       

         

        

    }

    

    

    public static boolean isLeapYear(int year) {    

     return (year%4==0&&year%100!=0||year%400==0);

    

    }

    

    public static boolean checkInputValidity(int year,int month,int day) {

      

         return (year<1820||year>2020||month<1||month>12||day<1||day>31||isLeapYear(year)==false&&month==2&&day==29);

    }

    

    

    public static void nextDate(int year,int month,int day) {

        int n;

        if(isLeapYear(year)){

            n=29;

        }

        else{

            n=28;

        }

        

        if(month==1&&day==31||month==3&&day==31||month==5&&day==31||month==7&&day==31||month==8&&day==31||month==10&&day==31){

            month++;

            System.out.println("Next date is:"+year+"-"+month+"-"+"1");

        }

        else if(month==4&&day==30||month==6&&day==30||month==9&&day==30||month==11&&day==30){

            month++;

            System.out.println("Next date is:"+year+"-"+month+"-"+"1");

        }

        else if(month==12&&day==31){

            year++;

            System.out.println("Next date is:"+year+"-"+1+"-"+"1");

        }

        else if(month==2&&day==n)

        {

            month++;

            System.out.println("Next date is:"+year+"-"+month+"-"+"1");

        }

        else{

           

            day++;

            System.out.println("Next date is:"+year+"-"+month+"-"+day);

       }

        

        

        

        

    }    

}

测试数据及结果:

    输入:2025 2 10

输出:Wrong Format

 

输入:2020 3 10

输出:Next date is:2020-3-11

 

 

实验二7-5:import java.util.Scanner;

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();

        int sum=input.nextInt();

        if(checkInputValidity(a,b,c))

            System.out.println("Wrong Format");

            

         else

             nextDate(a,b,c,sum);

       

         

        

    }

    

    

    public static boolean isLeapa(int a) {    

     return (a%4==0&&a%100!=0||a%400==0);

    

    }

    

    public static boolean checkInputValidity(int a,int b,int c) {

      

         return (a<1820||a>2020||b<1||b>12||c<1||c>31||isLeapa(a)==false&&b==2&&c==29);

    }

    

    

    public static void nextDate(int a,int b,int c,int sum) {

        int n;

        if(isLeapa(a)){

            n=29;

        }

        else{

            n=28;

        }

        switch(b) {

case 1:if(c<sum) {

            a--;

b=12;

c=31-sum+c;

}else c=c-sum;

;break;

case 2:if(c<sum) {

b--;

c=31-sum+c;}

                else if(c-sum<n){

                    c=c-sum;

                }

                else{

                    b++;

                    c=c-sum-n;

                }

      break;

case 3:

if(c<sum) {

b--;

c=n-sum+c;

}else c=c-sum; ;       break;

case 4:if(c<sum) {

b--;

c=31-sum+c;

}else c=c-sum;

break;

case 5:if(c<sum) {

b--;

c=30-sum+c;

}

else c=c-sum;

break;

case 6:if(c<sum) {

b--;

c=31-sum+c;

}

else c=c-sum;

;break;

case 7:if(c<sum) {

b--;

c=30-sum+c;

}

else c=c-sum;

break;

case 8:if(c<sum) {

b--;

c=31-sum+c;

}else c=c-sum;

 

;break;

case 9:if(c<sum) {

b--;

c=31-sum+c;

}

else c=c-sum;

;break;

case 10:if(c<sum) {

b--;

c=30-sum+c;

}

else c=c-sum;

break;

case 11:if(c<sum) {

b--;

c=31-sum+c;

}

else c=c-sum;

;break;

case 12:if(c<sum) {

b--;

c=30-sum+c;

}

else if(c-sum<n){

                    c=c-sum;

                }

                else{

                    a++;

                    b=1;

                    c=c-sum-31;

                }

break;

}    

        System.out.println(sum+" days ago is:"+a+"-"+b+"-"+c);

    }

    

    

}

   测试数据及结果:

         输入:2018  6 19 8

 

        输出:8 days ago is:2018-6-11

输入:2018  6 19 -8

输出:-8 days ago is:2018-6-27

 

实验三7-2import java.util.Scanner;

 

 

public class Main{

    public static void main(String[] args){

        Scanner input=new Scanner(System.in);

        

        

        int a=input.nextInt();//year

        int b=input.nextInt();//month

        int c=input.nextInt();//day

        Date date = new Date();

        if(date.checkInputValidity(a,b,c)) {

         System.out.println("Date Format is Wrong");

        }

        else {

         date.getNextDay(a,b,c);

        }

       

 

            

        }

}

 

class Date {

 

 Scanner input=new Scanner(System.in);

private int day=0;

    private int month=0;

    private int year=0;

    private int[] tian={0,31,28,31,30,31,30,31,31,30,31,30,31};

    

    

public Date() {

super();

// TODO Auto-generated constructor stub

}

public Date(int day, int month, int year) {

super();

this.day = day;

this.month = month;

this.year = year;

}

public int getDay() {

return day;

}

public void setDay(int day) {

this.day = day;

}

public int getMonth() {

return month;

}

public void setMonth(int month) {

this.month = month;

}

public int getYear() {

return year;

}

public void setYear(int year) {

this.year = year;

}

  

 

public boolean isLeapYear(int year) {    

     return (year%4==0&&year%100!=0||year%400==0);

    

    }                                                 //判断闰年

 

 public boolean checkInputValidity(int year,int month,int day) {

      

         return (year<1900||year>2000||month<1||month>12||day<1||day>31||isLeapYear(year)==false&&month==2&&day==29);

    }                                               //当输入无效时返回真值

    

 public void getNextDay(int year,int month,int day) {

 int n;

        if(isLeapYear(year)){

            n=29;

        }

        else{

            n=28;

        }

        

        if(month==1&&day==31||month==3&&day==31||month==5&&day==31||month==7&&day==31||month==8&&day==31||month==10&&day==31){

            month++;

            System.out.println("Next day is:"+year+"-"+month+"-"+"1");

        }

        else if(month==4&&day==30||month==6&&day==30||month==9&&day==30||month==11&&day==30){

            month++;

            System.out.println("Next day is:"+year+"-"+month+"-"+"1");

        }

        else if(month==12&&day==31){

            year++;

            System.out.println("Next day is:"+year+"-"+1+"-"+"1");

        }

        else if(month==2&&day==n)

        {

            month++;

            System.out.println("Next day is:"+year+"-"+month+"-"+"1");

        }

        else{

           

            day++;

            System.out.println("Next day is:"+year+"-"+month+"-"+day);

       }

        

 }

    

 

}

测试样例及结果:

       输入:1912 12 25

       输出:Next day is:1912-12-26

       输入:2001 2 30

输出:Date Format is Wrong

 

 

(4)改进建议:1.一个if语句就可以让圈复杂度飚出绿色范围了,今后我会少用if,尽量用switch语句代替需要判断的部分。

 

5)总结:对本阶段三次题目集的综合性总结,学到了什么,哪些地方需要进一步学习及研究,对教师、课程、作业、实验、课上及课下组织方式等方面的改进建议及意见。

第一次实验虽然简单,但是也花费了不少时间。那道计算税率的题的数据实在太多了,我有一个点一直过不去,检查了很久才发现是有一个数字输错了。

我想说,题量越多,时间越短反而让人越安心呢。一旦题目开始变少,难度简直直线上升,第三次的第三道题,就算时间再充裕,我也根本没有头绪,愁如何下手。在这道题之前,我遇到什么问题还可以看看书,逛逛博客,问问同学。做完之后哇好有成就感,觉得自己学到的真多呢,哪里哪里还可以改进哦。但是那最后一题,我拿命去写都写不出来啊,就完全没接触过、甚至见都没见过正则表达式,脑子里一点概念也没有。去百度上找了很多材料很多代码看,每次觉得学会了,一写一测试就是编译错误,或是运行结果错误。而且仅凭我那皮毛都算不上的学习,根本无法实现题目需要的判断。其实这个求导算法本身不复杂,多种要求混合增加了它的难度,我卡到天荒地老,根本写不出来。我的自学能力确实很欠缺,不得其法,要是老师有空可以预先讲解一下这样陌生的知识点,引导我们上手。

 

 

 

posted on 2021-04-04 20:37  hcjl  阅读(61)  评论(0)    收藏  举报

导航