BLOG-1

一、前言

大一下学期开始学Java这门课程,因为刚开始学Java,所以有很多不懂的地方,代码也写的比较混乱,逻辑性差。个人感觉Java比c语言要更难一些,Java和c语言也有很大的区别。c语言核心为数据结构+算法,c语言是面向过程的语言,执行效率高;而Java是面向对象的语言,执行效率没有c语言高。

但是面向对象有以下优点:
1.可复用性(保证低耦合)
2.可扩展性(功能可扩展)
3.可维护性

语言介绍:Java是一门面向对象的编程语言,被设计用于互联网的分布式环境。Java具有类似于C++语言的“形式和感觉”,但它要比C++语言更易于使用,而且在编程时彻底采用了一种“以对象为导向”的方式。Java具有三大特性,分别是封装性,继承和多态。

Java开发工具:可以使用Windows记事本或写字板创建Java程序,之后从命令窗口编译、运行程序,也可以使用Eclipse编译器进行编译。

二、总结题目集1-3

1)前言:

1.题目集01共有9道题目,主要考察的是Java语言的基础,包括输入,输出,浮点数的使用,数组求和,分情况讨论,字符串等知识点,难度不算特别难,还可以接受。

2.题目集02共有3道题目,但是难度相对于01有很大的提升,主要考察字母-数字转换,字符串的使用以及不同类型的输出。

3.题目集03共有四道题目,我个人感觉难度直接上升了一大截,主要考察用Java中的“类"来解决问题。

总体来说考察的知识点为Java的基本语法和Java对象间的基本关系。

(2)设计与分析:

1.题目集2:7-2 串口字符解析:RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。

设计思路:当程序判断到第一个0时,开始接受数据,从0开始,连续读入10位数字,倒数第二位为奇偶效验位,最后一位为结束位。其次,判断是否符合题目要求,若数据不足11位或者输入数据全1没有起始位,则输出"null data",若某个数据的结束符不为1,则输出“validate error”。若某个数据奇偶校验错误,则输出“parity check error”。若数据结束符和奇偶校验均不合格,输出“validate error”。

import java.util.Scanner;
public class Main{

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner in=new Scanner(System.in);
        String s=in.nextLine();
        int n=0;
        int count=1;
        int l=0;
        int m=0;
        for(int i=0;i<s.length();i++)
        {
            if(l==0) 
            {
                    if(s.charAt(i)=='0')
                    {    
                        m=1;
                        int j=i;
                        if(s.length()-i<11)
                        {
                          System.out.print("null data");
                          System.exit(0);
                        }
                        else
                        {
                            int k=i+8;
                            int sum=0;
                         for(;j<k;j++)
                         {
                            if(s.charAt(j+1)=='0')
                            {
                                sum=sum+1;
                            }
                         }
                        if(((sum%2==1&&s.charAt(i+9)=='1')||(sum%2==0&&s.charAt(i+9)=='0'))&&s.charAt(i+10)=='1')
                            {
                                System.out.println(count+":"+"parity check error");
                                i=i+10;
                            }
                        else 
                            if(s.charAt(i+10)!='1'&&((sum%2==1&&s.charAt(i+9)=='0')||(sum%2==0&&s.charAt(i+9)=='1')))
                            {
                                System.out.println(count+":"+"validate error");    
                                i=i+10;
                            }
                        else 
                            if(((sum%2==1&&s.charAt(i+9)=='1')||(sum%2==0&&s.charAt(i+9)=='0'))&&s.charAt(i+10)!='1')
                                {
                                    System.out.println(count+":"+"validate error");
                                    i=i+10;
                                }
                         else 
                              if(((sum%2==1&&s.charAt(i+9)=='0')||(sum%2==0&&s.charAt(i+9)=='1'))&&s.charAt(i+10)=='1')
                                            {
                                                System.out.println(count+":"+s.substring(i+1,i+9));
                                                i=i+10;
                                            }
                           count=count+1;
                           l=1;
                            }
                    }
                    
                    }
        else
                        if(l==1)
                        {
                            if(s.charAt(i)=='0')
                        {    
                                int j=i;
                                if(s.length()-i<11)
                                {
                                  System.exit(0);
                                }
                                else
                                {        
                                    int k=i+8;
                                    int sum=0;
                                 for(;j<k;j++)
                                     {
                                        if(s.charAt(j+1)=='0')
                                        {
                                            sum=sum+1;
                                        }
                                     }
                                 if(((sum%2==1&&s.charAt(i+9)=='1')||(sum%2==0&&s.charAt(i+9)=='0'))&&s.charAt(i+10)=='1')
                                    {
                                        System.out.println(count+":"+"parity check error");
                                        i=i+10;
                                    }
                                else 
                                    if(s.charAt(i+10)!='1'&&((sum%2==1&&s.charAt(i+9)=='0')||(sum%2==0&&s.charAt(i+9)=='1')))
                                    {
                                        System.out.println(count+":"+"validate error");    
                                        i=i+10;
                                    }
                                else 
                                    if(((sum%2==1&&s.charAt(i+9)=='1')||(sum%2==0&&s.charAt(i+9)=='0'))&&s.charAt(i+10)!='1')
                                        {
                                            System.out.println(count+":"+"validate error");
                                            i=i+10;
                                        }
                                 else 
                                      if(((sum%2==1&&s.charAt(i+9)=='0')||(sum%2==0&&s.charAt(i+9)=='1'))&&s.charAt(i+10)=='1')
                                                    {
                                                        System.out.println(count+":"+s.substring(i+1,i+9));
                                                        i=i+10;
                                                    }
                                                        count=count+1;
                                                        }
                                    }
                            
                                }
                        }
        if(m==0)
             System.out.print("null data");
        }
    }

2.题目集3:7-1 用类解一元二次方程式:定义一个代表一元二次方程ax2+bx+c=0的类QuadraticEquation,其属性为三个系数a、b、c(均为私有属性),类中定义的方法参考main方法中的代码。

设计思路:

1.题目已经给出主函数main,需要设计一个类QuadraticEquation,在类中补充Getter、Setter、return等方法的代码。

2.设置三个私有属性a、b、c

Scanner in = new Scanner(System.in);
    private double a;
    private double b;
    private double c;
    public QuadraticEquation(double a, double b, double c) {
        this.a=a;
        this.b=b;
        this.c=c;
public double getA() {
        // TODO 自动生成的方法存根
        return a;
    }
    public double getB() {
        // TODO 自动生成的方法存根
        return b;
    }
    public double getC() {
        // TODO 自动生成的方法存根
        return c;
    }

 

3.在求根的方法中写出求出跟root1和跟root2的代码,运用求根公式

public Object getRoot1() {
        double Root1=(-b+Math.sqrt((b*b-4*a*c)))/(2*a);
        return Root1;
    }
    public Object getRoot2() {
        double Root2=(-b-Math.sqrt((b*b-4*a*c)))/(2*a);
        return Root2;
    }

4.注意输出格式,完整代码如下

import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);

        double a = Double.parseDouble(input.next());
        double b = Double.parseDouble(input.next());
        double c = Double.parseDouble(input.next());
        
        if(a == 0){
            System.out.println("Wrong Format");
            System.exit(0);
        }
        
        //create a QuadraticEquation object
        QuadraticEquation equation = new QuadraticEquation(a, b, c);
        //get value of b * b - 4 * a * c
        double discriminant = equation.getDiscriminant();
        
        System.out.println("a=" + equation.getA() +
                ",b=" + equation.getB() + 
                ",c=" + equation.getC()+":");

        if (discriminant < 0) {
          System.out.println("The equation has no roots.");
        }
        else if (discriminant == 0)
        {
          System.out.println("The root is " + 
                  String.format("%.2f", equation.getRoot1()));
        }
        else // (discriminant >= 0)
        {
          System.out.println("The roots are " + 
                  String.format("%.2f", equation.getRoot1()) 
            + " and " +  String.format("%.2f", equation.getRoot2()));
        }
    }
}
class QuadraticEquation{
    Scanner in = new Scanner(System.in);
    private double a;
    private double b;
    private double c;
    public QuadraticEquation(double a, double b, double c) {
        this.a=a;
        this.b=b;
        this.c=c;
        // TODO 自动生成的构造函数存根
    }
    public double getDiscriminant() {
            double getDiscriminant;
            getDiscriminant=b*b-4*a*c;
            return getDiscriminant;
        }
    public double getA() {
        // TODO 自动生成的方法存根
        return a;
    }
    public double getB() {
        // TODO 自动生成的方法存根
        return b;
    }
    public double getC() {
        // TODO 自动生成的方法存根
        return c;
    }
    public Object getRoot1() {
        double Root1=(-b+Math.sqrt((b*b-4*a*c)))/(2*a);
        return Root1;
    }
    public Object getRoot2() {
        double Root2=(-b-Math.sqrt((b*b-4*a*c)))/(2*a);
        return Root2;
    }
    
    
}

类图:

 

3.题目集3:7-2 日期类设计 

参考题目集二中和日期相关的程序,设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 除了创建该类的构造方法、属性的getter及setter方法外,需要编写如下方法:

public boolean checkInputValidity();//检测输入的年、月、日是否合法
public boolean isLeapYear(int year);//判断year是否为闰年
public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期
public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期
public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后)
public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等
public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数
public String showDate();//以“year-month-day”格式返回日期值

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

设计思路:

1.题目已经给出主函数main,需要设计一个类DateUtil,在类中通过不同的方法来实现不同的功能。

2.首先设置三个私有属性year、month、day等

3.其次,在不同的方法中填写符合功能的代码

public boolean checkInputValidity();//检测输入的年、月、日是否合法
public boolean isLeapYear(int year);//判断year是否为闰年
public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期
public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期
public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后)
public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等
public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数
public String showDate();//以“year-month-day”格式返回日期值

4.最后注意题目要求输出的格式,控制好格式问题,完整代码如下

private int year;
    private int month;
    private int day;
    int []a=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int []b=new int[] {0,31,29,31,30,31,30,31,31,30,31,30,31};
    public int getYear() {
        return year;
    }
    public int getMonth() {
        return month;
    }
    public int getDay() {
        return day;
    }
    public DateUtil(int year, int month, int day) {
        this.year=year;
        this.month=month;
        this.day=day;
    }

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int year = 0;
        int month = 0;
        int day = 0;

        int choice = input.nextInt();

        if (choice == 1) { // test getNextNDays method
            int m = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            m = input.nextInt();

            if (m < 0) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
            System.out.println(date.getNextNDays(m).showDate());
        } else if (choice == 2) { // test getPreviousNDays method
            int n = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            n = input.nextInt();

            if (n < 0) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(
                    date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
            System.out.println(date.getPreviousNDays(n).showDate());
        } else if (choice == 3) {    //test getDaysofDates method
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            int anotherYear = Integer.parseInt(input.next());
            int anotherMonth = Integer.parseInt(input.next());
            int anotherDay = Integer.parseInt(input.next());

            DateUtil fromDate = new DateUtil(year, month, day);
            DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);

            if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
                System.out.println("The days between " + fromDate.showDate() + 
                        " and " + toDate.showDate() + " are:"
                        + fromDate.getDaysofDates(toDate));
            } else {
                System.out.println("Wrong Format");
                System.exit(0);
            }
        }
        else{
            System.out.println("Wrong Format");
            System.exit(0);
        }        
    }
}
class DateUtil{
    private int year;
    private int month;
    private int day;
    int []a=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int []b=new int[] {0,31,29,31,30,31,30,31,31,30,31,30,31};
    public int getYear() {
        return year;
    }
    public int getMonth() {
        return month;
    }
    public int getDay() {
        return day;
    }
    public DateUtil(int year, int month, int day) {
        this.year=year;
        this.month=month;
        this.day=day;
    }
    public boolean isLeapYear(int year){
        if((year%4==0&&year%100!=0)||(year%400==0)) {
            return true;
        }
        else {
            return false;
        }
    }
    public boolean checkInputValidity() {
        int year=this.year;
        int month=this.month;
        int day=this.day;
        if((year>=1820&&year<=2020)&&(month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&(day>=1&&day<=31))
        {
        return true;
        }
        else if((year>=1820&&year<=2020)&&(month==4||month==6||month==9||month==11)&&(day>=1&&day<=30))
        {
        return true;
        }
        else if((year>=1820&&year<=2020)&&month==2&&(day>=1&&day<=29)&&((year%4==0&&year%100!=0)||(year%400==0)))
        {
        return true;
        }
        else if((year>=1820&&year<=2020)&&month==2&&(day>=1&&day<=28)&&((year%4!=0||year%100==0)||(year%400!=0)))
        {
        return true;
        }
    else
    {
        return false;
    }
}
    public DateUtil getNextNDays(int m) {
        int year=this.year;
        int month=this.month;
        int day=this.day;
        int []a=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
        if((year%4==0&&year%100!=0)||(year%400==0))
      {
        a[2]=29;
      }
        for(int i=0;i<m;i++)
        {
            day=day+1;
            if(day>a[month])
            {
                day=1;
                month++;
                if(month>12)
                {
                    month=1;
                    year=year+1;
                
                if((year%4==0&&year%100!=0)||(year%400==0))
                {
                    a[2]=29;
                }
                else
                {
                    a[2]=28;
                }
            }
        }
    }
        return new DateUtil(year, month, day);
}
    public DateUtil getPreviousNDays(int n) {
        int year=this.year;
        int month=this.month;
        int day=this.day;
        int []a=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
        if((year%4==0&&year%100!=0)||(year%400==0))
           {
            a[2]=29;
           }
        int j=0;
        for(j=0;j<n;j++)
        {
            day=day-1;
            if(day<1)
            {
                month=month-1;
                day=a[month];
                if(month<1)
                {
                    year=year-1;
                    month=12;
                    day=31;
                if((year%4==0&&year%100!=0)||(year%400==0))
                {
                    a[2]=29;
                }
                else
                {
                    a[2]=28;
                }
            }
                
        }
    }
        return new DateUtil(year, month, day);
    }
    public boolean compareDates(DateUtil date) {
        if(year>date.year)
        {
            return true;
        }
        else if((year==date.year)&&(month>date.month))
        {
            return true;
        }
        else if(((year==date.year)&&(month==date.month))&&(day>date.day))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public boolean equalTwoDates(DateUtil date)//判断两个日期是否相等
    {
        if(((year==date.year)&&(month==date.month))&&(day==date.day))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public String showDate() {
        return year+"-"+month+"-"+day;
    }
    public int getDaysofDates(DateUtil toDate) {
        int days=0;
        for(int i=year;i<toDate.year;i++)
        {
            if((i%4==0&&i%100!=0)||(i%400==0))
            {
                days=days+366;
            }
            else
            {
                days=days+365;
            }
        }
        for(int j=1;j<toDate.month;j++)
        {
            if(j==1||j==3||j==5||j==7||j==8||j==10)
            {
                days=days+31;
            }
            else if(j==4||j==6||j==9||j==11)
            {
                days=days+30;
            }
            else if(j==2&&((toDate.year%4==0&&toDate.year%100!=0)||(toDate.year%400==0)))
            {
                days=days+29;
            }
            else
            {
                days=days+28;
            }
        }
        days=days+toDate.day;
        
        int dayss=0;
        for(int k=1;k<month;k++)
        {
            if(k==1||k==3||k==5||k==7||k==8||k==10)
            {
                dayss=dayss+31;
            }
            else if(k==4||k==6||k==9||k==11)
            {
                dayss=dayss+30;
            }
            else if(k==2&&((year%4==0&&year%100!=0)||(year%400==0)))
            {
                dayss=dayss+29;
            }
            else
            {
                dayss=dayss+28;
            }
          
        }
         dayss=dayss+day;
        
        return (days-dayss);
    }
}

类图: 

4.7-3 日期问题面向对象设计(聚合一)参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

设计思路:

1.首先,题目给出了设计类图,跟第二题的不同点在于第二题为设计一个类,而第三题设计如下几个类:DateUtil、Year、Month、Day

2.分别设置这四个类,再根据题目要求,在相应的类中完成算法

3.注意年月日的界限

4.注意输出格式,完整代码如下

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int year = 0;
        int month = 0;
        int day = 0;

        int choice = input.nextInt();

        if (choice == 1) { // test getNextNDays method
            int m = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            m = input.nextInt();

            if (m < 0) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.println(date.getNextNDays(m).showDate());
        } else if (choice == 2) { // test getPreviousNDays method
            int n = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            n = input.nextInt();

            if (n < 0) {
                System.out.println("Wrong Format");
                System.exit(0);
            }
            System.out.println(date.getPreviousNDays(n).showDate());
        } else if (choice == 3) {    //test getDaysofDates method
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            int anotherYear = Integer.parseInt(input.next());
            int anotherMonth = Integer.parseInt(input.next());
            int anotherDay = Integer.parseInt(input.next());

            DateUtil fromDate = new DateUtil(year, month, day);
            DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);

            if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
                System.out.println(fromDate.getDaysofDates(toDate));
            } else {
                System.out.println("Wrong Format");
                System.exit(0);
            }
        }
        else{
            System.out.println("Wrong Format");
            System.exit(0);
        }        
    }
}
class DateUtil{
   
    int []a=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
     private Day day;
     private Year year;
    private Month month;
    public DateUtil(int year, int month, int day) {
        this.year=new Year(year);
        this.month=new Month(month);
        this.day=new Day(day);
    }
    
    
    
    public Year getYear() {
        return year;
    }


    public void setYear(Year year) {
        this.year = year;
    }


    public Month getMonth() {
        return month;
    }


    public void setMonth(Month month) {
        this.month = month;
    }


    public Day getDay() {
        return day;
    }


    public void setDay(Day day) {
        this.day = day;
    }

    public void setDayMin()
    {
        day.value=1;
    }
    public void setDayMax()
    {
        day.value=a[month.value];
    }
    public boolean compareDates(DateUtil date) {
        if(year.value>date.year.value)
        {
            return true;
        }
        else if((year.value==date.year.value)&&(month.value>date.month.value))
        {
            return true;
        }
        else if(((year.value==date.year.value)&&(month.value==date.month.value))&&(day.value>date.day.value))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    
    public boolean equalTwoDates(DateUtil date)//判断两个日期是否相等
    {
        if(((year.value==date.year.value)&&(month.value==date.month.value))&&(day.value==date.day.value))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    
    public boolean checkInputValidity() {
        if((year.value>=1900&&year.value<=2050)&&(month.value==1||month.value==3||month.value==5||month.value==7||month.value==8||month.value==10||month.value==12)&&(day.value>=1&&day.value<=31))
        {
        return true;
        }
        else if((year.value>=1900&&year.value<=2050)&&(month.value==4||month.value==6||month.value==9||month.value==11)&&(day.value>=1&&day.value<=30))
        {
        return true;
        }
        else if((year.value>=1900&&year.value<=2050)&&month.value==2&&(day.value>=1&&day.value<=29)&&((year.value%4==0&&year.value%100!=0)||(year.value%400==0)))
        {
        return true;
        }
        else if((year.value>=1900&&year.value<=2050)&&month.value==2&&(day.value>=1&&day.value<=28)&&((year.value%4!=0||year.value%100==0)||(year.value%400!=0)))
        {
        return true;
        }
    else
    {
        return false;
    }
}
    
    
    public String showDate() {
        return year.value+"-"+month.value+"-"+day.value;
    }
    
    
    public int getDaysofDates(DateUtil toDate) {
         if (compareDates(toDate))
        {
            int y,m,d;
            y=toDate.year.value;
            m=toDate.month.value;
            d=toDate.day.value;
            toDate.year.setValue(year.value);
            toDate.month.setValue(month.value);
            toDate.day.setValue(day.value);
            year.setValue(y);
            month.setValue(m);
            day.setValue(d);
         }
        int days=0;
        for(int i=this.getYear().value;i<toDate.getYear().value;i++)
        {
            if((i%4==0&&i%100!=0)||(i%400==0))
            {
                days=days+366;
            }
            else
            {
                days=days+365;
            }
        }
        for(int j=1;j<toDate.getMonth().value;j++)
        {
            if(j==1||j==3||j==5||j==7||j==8||j==10)
            {
                days=days+31;
            }
            else if(j==4||j==6||j==9||j==11)
            {
                days=days+30;
            }
            else if(j==2&&((toDate.getYear().value%4==0&&toDate.getYear().value%100!=0)||(toDate.getYear().value%400==0)))
            {
                days=days+29;
            }
            else
            {
                days=days+28;
            }
        }
        days=days+toDate.getDay().value;
        
        int dayss=0;
        for(int k=1;k<this.getMonth().value;k++)
        {
            if(k==1||k==3||k==5||k==7||k==8||k==10)
            {
                dayss=dayss+31;
            }
            else if(k==4||k==6||k==9||k==11)
            {
                dayss=dayss+30;
            }
            else if(k==2&&((this.getYear().value%4==0&&this.getYear().value%100!=0)||(this.getYear().value%400==0)))
            {
                dayss=dayss+29;
            }
            else
            {
                dayss=dayss+28;
            }
          
        }
         dayss=dayss+this.getDay().value;
        
        return (days-dayss);
    }


    
    public DateUtil getNextNDays(int m) {
        int []a=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
        if((year.value%4==0&&year.value%100!=0)||(year.value%400==0))
        {
           a[2]=29;
        }
        for(int i=0;i<m;i++)
        {
            day.value=day.value+1;
            if(day.value>a[month.value])
            {
                day.value=1;
                month.value=month.value+1;
                if(month.value>12)
                {
                    month.value=1;
                    year.value=year.value+1;
                
                if((year.value%4==0&&year.value%100!=0)||(year.value%400==0))
                {
                    a[2]=29;
                }
                else
                {
                    a[2]=28;
                }
            }
        }
    }
        return new DateUtil(year.value,month.value,day.value);
}
    
    
    public DateUtil getPreviousNDays(int n) {
        int []a=new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};
        if((year.value%4==0&&year.value%100!=0)||(year.value%400==0))
           {
            a[2]=29;
           }
        int j=0;
        for(j=0;j<n;j++)
        {
            day.value=day.value-1;
            if(day.value<1)
            {
                month.value=month.value-1;
                day.value=a[month.value];
                if(month.value<1)
                {
                    year.value=year.value-1;
                    month.value=12;
                    day.value=31;
                if((year.value%4==0&&year.value%100!=0)||(year.value%400==0))
                {
                    a[2]=29;
                }
                else
                {
                    a[2]=28;
                }
            }
                
        }
    }
        return new DateUtil(year.value, month.value, day.value);
    }
    
    
    
}


class Year{
    int value;
    public Year() {}
    public Year(int value) {
        super();
        this.value = value;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public boolean isLeapYear(){
        if((value%4==0&&value%100!=0)||(value%400==0))
        {
            return true;
        }
        else 
        {
            return false;
        }
    }
    public boolean validate() {
        if(value>=1820&&value<=2020)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public void yearIncrement(){
        value=value+1;
    }
    public void yearReduction(){
        value=value-1;
    }
}


class Month{
    int value;
    public Month(int value) {
        super();
        this.value = value;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public void resetMin(){
        value=1;
    }
    public void resetMax(){
        value=12;
    }
    public boolean validate() {
        if(value>=1&&value<=12)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public void monthIncrement(){
        value=value+1;
    }
    public void monthReduction(){
        value=value-1;
    }
}


class Day{
    public Day(int value) {
        super();
        this.value = value;
    }
    int value;
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public void dayIncrement(){
        value=value+1;
    }
    public void dayReduction(){
        value=value-1;
    }
}

类图:

 

三、踩坑心得

(1)7-2 串口字符解析

1.长度不足11位或者输入数据全1没有起始位,通过控制字符串的长度来达到要求,需要注意,当长度不足11位时是不需要输出的,只有数据满了11位时才会判断数据格式是否错误
if(s.length()<11)
        {
          System.out.print("null data");
          System.exit(0);
        }
        for(i=1;i<s.length();i++)
        {
            if(s.charAt(i)!=0)
            {
                System.out.print("null data");
                  System.exit(0);
            }
        }

(2)7-1 用类解一元二次方程式

1.;两个实数根时,测试点未通过。

原因:没有+根号,公式运用错误,将跟root1和跟root2改正,添加Math.sqrt()

public Object getRoot1() {
        double Root1=(-b+Math.sqrt((b*b-4*a*c)))/(2*a);
        return Root1;
    }
    public Object getRoot2() {
        double Root2=(-b-Math.sqrt((b*b-4*a*c)))/(2*a);
        return Root2;
    }

(3).7-2 日期类设计

1.下n天的测试值错误

int i=0;
        for(i=0;i<m;i++)
        {
            day=day+1;
            if(day==a[month])
            {
                day=1;
                month=month+1;        
            }
        }

原因:在临界出思路出现了问题,应该在day大于当月最大日期后,day=1,month+1,以下为改正后的代码

for(int i=0;i<m;i++)
        {
            day=day+1;
            if(day>a[month])
            {
                day=1;
                month++;
            }
        }

2.前n天测试错误

.

        if((year%4==0&&year%100!=0)||(year%400==0))
           {
            a[2]=29;
           }
        int j=0;
        for(j=0;j<n;j++)
        {
            day=day-1;
            if(day<1)
            {
                month=month-1;
                day=a[month];
                if(month<1)
                {
                    year=year-1;
                    month=12;
                    day=31;
                if((year%4==0&&year%100!=0)||(year%400==0))
                {
                    a[2]=29;
                }
                else
                {
                    a[2]=28;
                }
            }
                
        }
            System.out.println(year+"-"+month+"-"+day);
    }
        return new DateUtil(year, month, day);

原因:多输出了一次System.out.println(year+"-"+month+"-"+day);导致结果不正确,所以这句话应该删除,将上面更改为下图的

if((year%4==0&&year%100!=0)||(year%400==0))
           {
            a[2]=29;
           }
        int j=0;
        for(j=0;j<n;j++)
        {
            day=day-1;
            if(day<1)
            {
                month=month-1;
                day=a[month];
                if(month<1)
                {
                    year=year-1;
                    month=12;
                    day=31;
                if((year%4==0&&year%100!=0)||(year%400==0))
                {
                    a[2]=29;
                }
                else
                {
                    a[2]=28;
                }
            }
                
        }
    }
        return new DateUtil(year, month, day);

 

3.天数差计算出错

for(int j=1;j<toDate.month;j++)
        {
            if(j==1&&j==3&&j==5&&j==7&&j==8&&j==10)
            {
                days=days+31;
            }
            else if(j==4&&j==6&&j==9&&j==11)
            {
                days=days+30;
            }
            else if(j==2&&((toDate.year%4==0&&toDate.year%100!=0)||(toDate.year%400==0)))
            {
                days=days+29;
            }
            else
            {
                days=days+28;
            }
        }
for(int k=1;k<month;k++)
        {
            if(k==1||k==3||k==5||k==7||k==8||k==10)
            {
                dayss=dayss+31;
            }
            else if(k==4||k==6||k==9||k==11)
            {
                dayss=dayss+30;
            }
            else if(k==2&&((year%4==0&&year%100!=0)||(year%400==0)))
            {
                dayss=dayss+29;
            }
            else
            {
                dayss=dayss+28;
            }
            dayss=dayss+day;
        }
        
        
        return (days-dayss);

 

错误原因1:&&与||符号整混了,if(j==1&&j==3&&j==5&&j==7&&j==8&&j==10)和else if(j==4&&j==6&&j==9&&j==11),在此处应该为||而不是&&,因为这些月份的天数都为31或者30

错误原因2;套错循环,dayss=dayss+day;应在外层循环

同时也需要注意数组超界的问题,可以先判断月份,再判断日期是否合法,减少出错的情况。

更正后的代码如下

if(j==1||j==3||j==5||j==7||j==8||j==10)
            {
                days=days+31;
            }
            else if(j==4||j==6||j==9||j==11)
            {
                days=days+30;
            }
            else if(j==2&&((toDate.year%4==0&&toDate.year%100!=0)||(toDate.year%400==0)))
            {
                days=days+29;
            }
            else
            {
                days=days+28;
            }
for(int k=1;k<month;k++)
        {
            if(k==1||k==3||k==5||k==7||k==8||k==10)
            {
                dayss=dayss+31;
            }
            else if(k==4||k==6||k==9||k==11)
            {
                dayss=dayss+30;
            }
            else if(k==2&&((year%4==0&&year%100!=0)||(year%400==0)))
            {
                dayss=dayss+29;
            }
            else
            {
                dayss=dayss+28;
            }
          
        }
         dayss=dayss+day;
        
        return (days-dayss);

 (4)7-3 日期问题面向对象设计(聚合一)

1.日期间隔测试错误

public int getDaysofDates(DateUtil toDate) {
         if (compareDates(toDate))
        {
            int y,m,d;
            y=toDate.year.value;
            m=toDate.month.value;
            d=toDate.day.value;
            toDate.year.setValue(year.value);
            toDate.month.setValue(month.value);
            toDate.day.setValue(day.value);
         }
        int days=0;
        for(int i=this.getYear().value;i<toDate.getYear().value;i++)
        {
            if((i%4==0&&i%100!=0)||(i%400==0))
            {
                days=days+366;
            }
            else
            {
                days=days+365;
            }
        }
        for(int j=1;j<toDate.getMonth().value;j++)
        {
            if(j==1||j==3||j==5||j==7||j==8||j==10)
            {
                days=days+31;
            }
            else if(j==4||j==6||j==9||j==11)
            {
                days=days+30;
            }
            else if(j==2&&((toDate.getYear().value%4==0&&toDate.getYear().value%100!=0)||(toDate.getYear().value%400==0)))
            {
                days=days+29;
            }
            else
            {
                days=days+28;
            }
        }
        days=days+toDate.getDay().value;
        
        int dayss=0;
        for(int k=1;k<this.getMonth().value;k++)
        {
            if(k==1||k==3||k==5||k==7||k==8||k==10)
            {
                dayss=dayss+31;
            }
            else if(k==4||k==6||k==9||k==11)
            {
                dayss=dayss+30;
            }
            else if(k==2&&((this.getYear().value%4==0&&this.getYear().value%100!=0)||(this.getYear().value%400==0)))
            {
                dayss=dayss+29;
            }
            else
            {
                dayss=dayss+28;
            }
          
        }
         dayss=dayss+this.getDay().value;
        
        return (days-dayss);
    }

错误原因:考虑情况不周全,当第一个日期大于第二个日期时,输出结果错误,所以应该加一个if (compareDates(toDate))函数,当第一个日期大于第二个日期时,交换两个日期,更正后的代码和结果如下

public int getDaysofDates(DateUtil toDate) {
         if (compareDates(toDate))
        {
            int y,m,d;
            y=toDate.year.value;
            m=toDate.month.value;
            d=toDate.day.value;
            toDate.year.setValue(year.value);
            toDate.month.setValue(month.value);
            toDate.day.setValue(day.value);
            year.setValue(y);
            month.setValue(m);
            day.setValue(d);
         }
        int days=0;
        for(int i=this.getYear().value;i<toDate.getYear().value;i++)
        {
            if((i%4==0&&i%100!=0)||(i%400==0))
            {
                days=days+366;
            }
            else
            {
                days=days+365;
            }
        }
        for(int j=1;j<toDate.getMonth().value;j++)
        {
            if(j==1||j==3||j==5||j==7||j==8||j==10)
            {
                days=days+31;
            }
            else if(j==4||j==6||j==9||j==11)
            {
                days=days+30;
            }
            else if(j==2&&((toDate.getYear().value%4==0&&toDate.getYear().value%100!=0)||(toDate.getYear().value%400==0)))
            {
                days=days+29;
            }
            else
            {
                days=days+28;
            }
        }
        days=days+toDate.getDay().value;
        
        int dayss=0;
        for(int k=1;k<this.getMonth().value;k++)
        {
            if(k==1||k==3||k==5||k==7||k==8||k==10)
            {
                dayss=dayss+31;
            }
            else if(k==4||k==6||k==9||k==11)
            {
                dayss=dayss+30;
            }
            else if(k==2&&((this.getYear().value%4==0&&this.getYear().value%100!=0)||(this.getYear().value%400==0)))
            {
                dayss=dayss+29;
            }
            else
            {
                dayss=dayss+28;
            }
          
        }
         dayss=dayss+this.getDay().value;
        
        return (days-dayss);
    }

2.日期测试错误

错误代码如下

public boolean checkInputValidity() {
        if((year.value>=1820&&year.value<=2020)&&(month.value==1||month.value==3||month.value==5||month.value==7||month.value==8||month.value==10||month.value==12)&&(day.value>=1&&day.value<=31))
        {
        return true;
        }
        else if((year.value>=1820&&year.value<=2020)&&(month.value==4||month.value==6||month.value==9||month.value==11)&&(day.value>=1&&day.value<=30))
        {
        return true;
        }
        else if((year.value>=1820&&year.value<=2020)&&month.value==2&&(day.value>=1&&day.value<=29)&&((year.value%4==0&&year.value%100!=0)||(year.value%400==0)))
        {
        return true;
        }
        else if((year.value>=1820&&year.value<=2020)&&month.value==2&&(day.value>=1&&day.value<=28)&&((year.value%4!=0||year.value%100==0)||(year.value%400!=0)))
        {
        return true;
        }
    else
    {
        return false;
    }
}

错误原因:没看清题目,以为时间界限和第二题一样,年份应该更改为1900-2050年

更正后的代码如下

public boolean checkInputValidity() {
        if((year.value>=1900&&year.value<=2050)&&(month.value==1||month.value==3||month.value==5||month.value==7||month.value==8||month.value==10||month.value==12)&&(day.value>=1&&day.value<=31))
        {
        return true;
        }
        else if((year.value>=1900&&year.value<=2050)&&(month.value==4||month.value==6||month.value==9||month.value==11)&&(day.value>=1&&day.value<=30))
        {
        return true;
        }
        else if((year.value>=1900&&year.value<=2050)&&month.value==2&&(day.value>=1&&day.value<=29)&&((year.value%4==0&&year.value%100!=0)||(year.value%400==0)))
        {
        return true;
        }
        else if((year.value>=1900&&year.value<=2050)&&month.value==2&&(day.value>=1&&day.value<=28)&&((year.value%4!=0||year.value%100==0)||(year.value%400!=0)))
        {
        return true;
        }
    else
    {
        return false;
    }
}

四、改进建议

1.自我感觉逻辑非常混乱,没有清晰的思路,有时总是想到一出写一出,总的来说就是代码质量不高。在之后的题目中,需要先理清思路,可以尝试画出流程图,根据思路一步一步的写出来。

2.所用的算法非常麻烦,有些题目是可以用到更简单的方法,有许多简单易懂的算法和思路,而我的代码长,乱,不容易读懂。

五、总结

1.

耦合:类与类之间关系的紧密程度---弱耦合性(有些时候理想情况为无耦合。)
例如:现在有方法A和方法B,我们在A元素去调用B元素,当B元素有问题或者不存在的时候,
A元素就不能正常的工作,那么就说元素A和元素B耦合。

2.

内聚:类内---强内聚性
高内聚是另外一个评判软件设计质量的标准。内聚更为专业的说法叫做功能内聚,是对系统中元素职责的相关性和集中度的量度。
如果元素有高度的相关职责,除了这些职责在没有其他的工作,那么该元素就有高内聚。

3.了解了Java的类间关系

类间关系:
①关联
②依赖
③聚集: 整体--->部分(发送消息)
1.聚合:整体和部分的生存期不一致
2.组合:整体和部分的生存期一致
④泛化
⑤实现

4.学会了类间关系的写法

posted @ 2022-04-09 23:19  Winter~  阅读(110)  评论(0)    收藏  举报