Liuyu的第一次博客作业(题目集1-3的总结)

一,前言

(1)在我看来,本课程发布在pta上的题目集的难度是随着题目量的减少而逐渐加深的。从题目集1的多个小题目可以看出是在测试我们如何解决不同种类的问题,其中包含了后面题目集要用的一些方法,例如三角形种类的判断等。所以这次的题目集可以说是测试我们对java编程的方法掌握怎样的测验(但我没有满分)。

(2)从题目集2开始题目变得暗示我们学会用类解决问题,而且其中包含了数字和字符串如何用Java中自带的类进行分割检查,总之这次题目的难度适中但要想看懂且看清楚题目还是需要一点时间的(但我还是没有满分)。

(3)题目集3无论是题目量还是难度都远超之前的题集。在此次题目集我们首先学会如何根据给出主类和题目来写出所需要的类还有其中的方法。无论是类还是方法都必须符合题目的要求,其中所有的属性还是类之间的继承关系都必须按照题目所要求的进行。后三题将这种要求运行到极致,首先第一题写如何求日期的前n天,后n天,还有如何判断闰年,检查输入是否符合要求等。然后第二题中要求了一个类图,其实这个类图是有问题的,但我们还是必须按照要求写类还有其中的方法,在最后一题提出了最为有效的基础方法然后根据这个类图对之前的代码进行修改。只要第一题没有写好的话,后面两题基本上是无法得到几分的(所以我还是没有满分)。

二,设计与分析

(1)分析题目集2的7-2:

import java.util.Scanner;
public class Main {
	    public static void main(String[] args) {
	        Scanner input=new Scanner(System.in);
	        String num = input.nextLine();
            int l=num.length();
            int t=num.indexOf('0');
            int z=0,j,k=1;
            if(l<11||t==(-1)) 
            {
            	System.out.println("null data");
            }
            else
            {
            	for(j=1;num.indexOf('0')!=-1;j++)
            	{	
            		int t1=num.indexOf('0');
            		String num1 = num.substring(t1+1,t1+10);
            		char []a=num1.toCharArray();
            		char []a1=num.toCharArray();
            		z=0;
            		for(int i=0;i<9;i++)
            		{
            			z=z+a[i]-48;
            		}
            		if(z%2==0&&a1[t1+10]==49)
            		{
            			System.out.println(k+":parity check error");
            		}
            		else if(a1[t1+10]==48)
                	{
                		System.out.println(k+":validate error");
                	}
            		else if(a1[t1+10]==48&&z%2==0)
                	{
                		System.out.println(k+":validate error");
                	}
            		else
            		{
            			System.out.print(k+":");
            			for(int i=0;i<7;i++)
                		{
            				System.out.print(a[i]);
            				if(i==6)
            				{
            					System.out.print(a[i]+"\n");
            				}
                		}
            		}
            		k++;
            		num = num.substring(t1+11);
            	}
            }
	    }
}

  这次的代码其实是有点错误的,之前交pta时交了这个没想到把之前写的覆盖掉了所以之前的代码是比这个更完善的但是没有关系,写代码的人在这,依然可以正确的介绍,这个代码Σ(っ °Д °;)っ只当参考。

  代码解释:其实这个问题很简单首先判断一下字符串的个数是否为11,然后用字符串查找方法查找到"0"的位置,再接着写一个循环每次截取0后10位如果没有的话就直接输出那个0后的8位。至于奇偶校验位,只需要判断0后9位加起来是否为奇数如果为奇数则通过测验输出该输出的。还有一些细节都可以直接对字符串裁剪后判断(注意0和1的ascll码分别为48,49)。

(2)分析题目集3的7-2,7-3,7-4。

代码如下

class DateUtil{
	private int year;
	private int month;
	private int day;
	public DateUtil() {
		
	}
	public DateUtil(int year,int month,int day) {
		this.year = year;
		this.month = month;
		this.day = day;
	}
    public int getYear() {
        return year;
    }
    public void setYear(int year) {
        this.year = year;
    }
    public int getMonth() {
        return month;
    }
    public void setMonth(int month) {
        this.month = month;
    }
    public int getDay() {
        return day;
    }
    public void setDay(int day) {
        this.day = day;
    }
	public boolean checkInputValidity() {
		boolean checkInputValidity;
	    checkInputValidity = (year>=1820&&year<=2020&&month>=1&&month<=12&&day<=31&&day>=1);
	    return checkInputValidity;
	}
	public boolean isLeapYear(int year) {
		boolean isLeapYear;
	    isLeapYear = (year% 4 == 0 && year % 100 !=0 )||year % 400 == 0;
	    return isLeapYear;
	}
	public DateUtil getNextNDays(int n) {
		DateUtil date = new DateUtil(year,month,day);
		int num1=0,t2=1,t1=1;
		int[] b=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
		if(isLeapYear(year))
			b[2]=29;
		for(int i=1;i<month;i++) 
		{
			num1 = num1+b[i];
		}
		num1=num1+day;
		if(isLeapYear(year)) {
			num1=366-num1;
		}
		else {
			num1=365-num1;
		}

		while(n>365)
		{
			if(isLeapYear(year)) 
			{
				n=n-366;
			}
			else 
			{
				n=n-365;
			}
			year=year+1;
		}
		if(n>num1)
		{
			if(isLeapYear(year)) {
				n=n-1;
			}
			date.year=year+1;
			n=n-num1;
			int[] a=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
			if(isLeapYear(date.year))
				a[2]=29;
			for(int i=1;i<12;i++)
			{
				//if((n-a[i])<a[i+1]&&(n-a[i])>0)
				if(n>a[i+1])
				{
					n=n-a[i];
					t2=t2+1;
				}
			}
			date.month=t2;
			date.day=n;
		}
		else
		{
			date.year=year;
			num1=0;
			for(int i=1;i<month;i++) 
			{
				num1 = num1+b[i];
			}
			num1=num1+day;
			n=n+num1;
			int[] c=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
			if(isLeapYear(date.year)) {
				c[2]=29;
			}
			for(int i=1;i<12;i++)
			{
				if(n>=c[i+1])
				{
					n=n-c[i];
					t1=t1+1;
				}
			}
			date.month=t1;
			date.day=n;
		}
		
		return date;
	}
	public DateUtil getPreviousNDays(int n) {
		DateUtil date = new DateUtil(year,month,day);
		int num1=0,num2=0,t1=12,t2=1;
		int[] b=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
		if(isLeapYear(year))
			b[2]=29;
		for(int i=1;i<month;i++) 
		{
			num1 = num1+b[i];
		}
		num1=num1+day;
		while(n>365)
		{
			if(isLeapYear(year)) 
			{
				n=n-366;
			}
			else 
			{
				n=n-365;
			}
			year=year-1;
		}
		if(n>=num1) 
		{
			date.year = year-1;
			n=n-num1;
			int[] a=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
			if(isLeapYear(date.year))
				a[2]=29;
			for(int i=12;i>=1;i--) 
			{
				if(n>=a[i]) 
				{
					n = n-a[i];
					t1=t1-1;
				}
			}
			date.month=t1;
			date.day=a[t1]-n;
		}
		else
		{
			
			date.year=year;
			n=num1-n;
			int[] c=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
			if(isLeapYear(date.year)) {
				c[2]=29;
			}
			for(int i=1;i<12;i++)
			{
				if(n>=c[i+1])
				{
					n=n-c[i];
					t2=t2+1;
				}
			}
			date.month=t2;
			date.day=n;
		}
		return date;
	}
	public boolean compareDates(DateUtil date) {
		boolean compareDates= false;
		compareDates = (year>date.year||year==date.year&&month>date.month||year==date.year&&month==date.month&&day>date.day);
		return compareDates;
	}
	public boolean equalTwoDates(DateUtil date) {
		boolean equalTwoDates = false;
		equalTwoDates = (year==date.year&&month==date.month&&day==date.day);
		return equalTwoDates;
	}
	public int getDaysofDates(DateUtil date) {
		int t=0;
	    int num = 0;
	    int num1 = 0;
	    int num2 = 0;
	    if(!equalTwoDates(date)) 
	    {
	    	if(!compareDates(date))
	    	{//day<date.day
	    		for(int i=year;i<=date.year;i++) 
	    		{
	    			if(isLeapYear(i)) 
	    			{
	    				t = t+1;
	    			}
	    		}
	    		int[] b=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
	    		for(int i=1;i<month;i++) 
	    		{
	    			num1 = num1+b[i];
	    		}
	    		num1 = num1+day;
	    		for(int i=1;i<date.month;i++) 
	    		{
	    			num2 = num2+b[i];
	    		}
	    		num2 = num2+date.day;
	    		num = 365*(date.year-year)+t+(num2-num1);
	    	}
	    	else  //day>date.day
	    	{
	    		for(int i=date.year;i<=year;i++) 
	    		{
	    			if(isLeapYear(i)) 
	    			{
	    				t = t+1;
	    			}
	    		}
	    		int[] b=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
	    		for(int i=1;i<month;i++) 
	    		{
	    			num1 = num1+b[i];
	    		}
	    		num1 = num1+day;
	    		for(int i=1;i<date.month;i++) 
	    		{
	    			num2 = num2+b[i];
	    		}
	    		num2 = num2+date.day;
	    		num = 365*(year-date.year)+t+(num1-num2);
	    	}
	    }
	    else 
	    {
	    	num=0;
	    }
	    return num;
	}
	public String showDate() {
		return year+"-"+month+"-"+day;
	}
}

    代码设计与分析(还有心得):在这个题目中首先给我们了主类还有其所要的方法,这些方法都是主类所要用的所以可以根据主类的的写法把框架先构造好。我写的DateUtil类中只有year,month,day三个属性。但在我的类的方法中还需要一个关于每个月份有多少天的数组,所以在我的方法里每次要用时我都要重新复制一次(这个是代码复用,低级错误),所以可以这样改进,在DateUtil类中加上一个有关月份天数的数组,这样需要调用时可以简化程序。然后就是根据要求检测输入的年、月、日是否合法,判断year是否为闰年,取得year-month-day的(上)下n天日期,求当前日期与date之间相差的天数这些方法。其中以“year-month-day”格式返回日期值这个方法是贯穿choice1,2的方法,在这两个输出时都要按格式返回日期值return date.

(3)题目集3的7-3:

代码如下:

class DateUtil {
	Day day;
	Month month;
	Year year;
	public DateUtil(){
        
    }
    public DateUtil(int d, int m, int y){
        this.day = new Day(d,m,y);
    }
    public Day getDay() {
		return day;
	}
	public void setDay(Day day) {
		this.day = day;
	}
	public Month getMonth() {
		return month;
	}
	public void setMonth(Month month) {
		this.month = month;
	}
	public Year getYear() {
		return year;
	}
	public void setYear(Year year) {
		this.year = year;
	}
    
	
	public boolean checkInputValidity() {
		boolean checkInputValidity;
	    checkInputValidity = (this.getDay().getMonth().getYear().getValue()>=1820&&this.getDay().getMonth().getYear().getValue()<=2020&&this.getDay().getMonth().getValue()>=1&&this.getDay().getMonth().getValue()<=12&&this.getDay().getValue()<=31&&this.getDay().getValue()>=1);
	    return checkInputValidity;
	}
	public boolean compareDates(DateUtil date) {
		boolean compareDates= false;
		compareDates = (this.getDay().getMonth().getYear().getValue()>date.getDay().getMonth().getYear().getValue()||this.getDay().getMonth().getYear().getValue()==date.getDay().getMonth().getYear().getValue()&&this.getDay().getMonth().getValue()>date.getDay().getMonth().getValue()||this.getDay().getMonth().getYear().getValue()==date.getDay().getMonth().getYear().getValue()&&this.getDay().getMonth().getValue()==date.getDay().getMonth().getValue()&&this.getDay().getValue()>date.getDay().getValue());
		return compareDates;
	}
	public boolean equalTwoDates(DateUtil date) {
		boolean equalTwoDates = false;
		equalTwoDates = (this.getDay().getMonth().getYear().getValue()==date.getDay().getMonth().getYear().getValue()&&this.getDay().getMonth().getValue()==date.getDay().getMonth().getValue()&&this.getDay().getValue()==date.getDay().getValue());
		return equalTwoDates;
	}
	
	public String showDate() {
		return this.getDay().getMonth().getYear().getValue()+"-"+this.getDay().getMonth().getValue()+"-"+this.getDay().getValue();
	}
	public boolean isLeapYear(int year) {
		boolean isLeapYear;
	    isLeapYear = (year% 4 == 0 && year % 100 !=0 )||year % 400 == 0;
	    return isLeapYear;
	}
	public DateUtil getNextNDays(int n) {
		//DateUtil date = new DateUtil(year,month,day);
		int year = this.getDay().getMonth().getYear().getValue();
		int month = this.getDay().getMonth().getValue();
		int day = this.getDay().getValue();
		int year1=0,month1=0,day1=0;
		
		
		int num1=0,t2=1,t1=1;
		int[] b=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
		if(isLeapYear(year))
			b[2]=29;
		for(int i=1;i<month;i++) 
		{
			num1 = num1+b[i];
		}
		num1=num1+day;
		if(isLeapYear(year)) {
			num1=366-num1;
		}
		else {
			num1=365-num1;
		}

		while(n>365)
		{
			if(isLeapYear(year)) 
			{
				n=n-366;
			}
			else 
			{
				n=n-365;
			}
			year=year+1;
		}
		if(n>num1)
		{
			if(isLeapYear(year)) {
				n=n-1;
			}
			year1=year+1;
			n=n-num1;
			int[] a=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
			if(isLeapYear(year1))
				a[2]=29;
			for(int i=1;i<12;i++)
			{
				//if((n-a[i])<a[i+1]&&(n-a[i])>0)
				if(n>a[i+1])
				{
					n=n-a[i];
					t2=t2+1;
				}
			}
			month1=t2;
			day1=n;
		}
		else
		{
			year1=year;
			num1=0;
			for(int i=1;i<month;i++) 
			{
				num1 = num1+b[i];
			}
			num1=num1+day;
			n=n+num1;
			int[] c=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
			if(isLeapYear(year1)) {
				c[2]=29;
			}
			for(int i=1;i<12;i++)
			{
				if(n>=c[i+1])
				{
					n=n-c[i];
					t1=t1+1;
				}
			}
			month1=t1;
			day1=n;
		}
		return new DateUtil(year1, month1, day1);
	}
	public DateUtil getPreviousNDays(int n) {
		//DateUtil date = new DateUtil(year,month,day);
		int year = this.getDay().getMonth().getYear().getValue();
		int month = this.getDay().getMonth().getValue();
		int day = this.getDay().getValue();
		int year1=0,month1=0,day1=0;
		
		int num1=0,num2=0,t1=12,t2=1;
		int[] b=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
		if(isLeapYear(year))
			b[2]=29;
		for(int i=1;i<month;i++) 
		{
			num1 = num1+b[i];
		}
		num1=num1+day;
		while(n>365)
		{
			if(isLeapYear(year)) 
			{
				n=n-366;
			}
			else 
			{
				n=n-365;
			}
			year=year-1;
		}
		if(n>=num1) 
		{
			year1 = year-1;
			n=n-num1;
			int[] a=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
			if(isLeapYear(year1))
				a[2]=29;
			for(int i=12;i>=1;i--) 
			{
				if(n>=a[i]) 
				{
					n = n-a[i];
					t1=t1-1;
				}
			}
			month1=t1;
			day1=a[t1]-n;
		}
		else
		{
			
			year1=year;
			n=num1-n;
			int[] c=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
			if(isLeapYear(year1)) {
				c[2]=29;
			}
			for(int i=1;i<12;i++)
			{
				if(n>=c[i+1])
				{
					n=n-c[i];
					t2=t2+1;
				}
			}
			month1=t2;
			day1=n;
		}
		return new DateUtil(year1, month1, day1);
	}
	
	public int getDaysofDates(DateUtil date) {
		int year = this.getDay().getMonth().getYear().getValue();
		int month = this.getDay().getMonth().getValue();
		int day = this.getDay().getValue();
		int year1 = date.getDay().getMonth().getYear().getValue();
		int month1 = date.getDay().getMonth().getValue();
		int day1 = date.getDay().getValue();
		
		
		int t=0;
	    int num = 0;
	    int num1 = 0;
	    int num2 = 0;
	    if(!equalTwoDates(date)) 
	    {
	    	if(!compareDates(date))
	    	{//day<date.day
	    		for(int i=year;i<=year1;i++) 
	    		{
	    			if(isLeapYear(i)) 
	    			{
	    				t = t+1;
	    			}
	    		}
	    		int[] b=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
	    		for(int i=1;i<month;i++) 
	    		{
	    			num1 = num1+b[i];
	    		}
	    		num1 = num1+day;
	    		for(int i=1;i<month1;i++) 
	    		{
	    			num2 = num2+b[i];
	    		}
	    		num2 = num2+day1;
	    		num = 365*(year1-year)+t+(num2-num1);
	    	}
	    	else  //day>date.day
	    	{
	    		for(int i=year1;i<=year;i++) 
	    		{
	    			if(isLeapYear(i)) 
	    			{
	    				t = t+1;
	    			}
	    		}
	    		int[] b=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
	    		for(int i=1;i<month;i++) 
	    		{
	    			num1 = num1+b[i];
	    		}
	    		num1 = num1+day;
	    		for(int i=1;i<month1;i++) 
	    		{
	    			num2 = num2+b[i];
	    		}
	    		num2 = num2+day1;
	    		num = 365*(year-year1)+t+(num1-num2);
	    	}
	    }
	    else 
	    {
	    	num=0;
	    }
	    return num;
	}
	
}
class Day {
	private int value;
	Month month;
	int[] b={31,28,31,30,31,30,31,31,30,31,30,31};
	
	public Day() {
		
	}
	public Day(int yearValue,int monthValue,int dayValue) {
		this.month = new Month(yearValue,monthValue);
        this.value = dayValue;
	}
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
	public Month getMonth() {
		return month;
	}
	public void setMonth(Month month) {
		this.month = month;
	}
	public void resetMin() {
		value = 1;
	}
	public void restMax() {
		value = 31;
	}
	public boolean validate() {//校验数据合法性
		if(this.getMonth().getYear().isLeapYear())
            b[1]++;
		boolean validate;
		validate = (value>=1&&value<=31);
		return validate;
	}
	public void dayIncrement() {//日期加一
		value++;
	}
	public void dayReduction() {//日期减一
		value--;
	}
}
class Month {
	int value;
	Year year;
	public Month() {
		
	}
	public Month(int yearValue,int monthValue) {
		this.year = new Year(yearValue);
        this.value = monthValue;
	}
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
	public Year getYear() {
		return year;
	}
	public void setYear(Year year) {
		this.year = year;
	}
	public void restMin() {
		value=1;
	}
	public void restMax() {
		value=12;
	}
	public boolean validate() {//校验数据合法性
		boolean validate;
		validate = (value>=1&&value<=12);
		return validate;
	}
	public void monthIncrement() {//月份加一
		value++;
	}
	public void monthReduction() {//月份减一
		value--;
	}
}
class Year {
	int value;
	
	public Year() {
	}
	public Year(int value) {
		this.value=value;
	}
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
	public boolean isLeapYear() {
		boolean isLeapYear;
	    isLeapYear = (value% 4 == 0 && value % 100 !=0 )||value % 400 == 0;
	    return isLeapYear;
	}
	public boolean validate() {
		boolean validate;
		validate = (value>=1900&&value<=2050);
		return validate;
	}
	public void yearIncrement() {
		value++;
	}
	public void yearReduction() {
		value--;
	}
}

    代码设计与分析(还有心得):这个题目中给出了类之间的关系还有每个类中所用的方法,属性。但要注意的是这个类之间的方法不是正确的所以会在运用时会非常麻烦。例如这个:

public String showDate() {
		return this.getDay().getMonth().getYear().getValue()+"-"+this.getDay().getMonth().getValue()+"-"+this.getDay().getValue();
	}

  在上一题中我们只需要这样:

public String showDate() {
		return year+"-"+month+"-"+day;
	}

  其原因是类中的继承递增的由year类继承month类,再由month类继承day类所以在程序中想要调用year的值需要先getDay再在day类中调用getMonth,然后在month类中调用getYear,最后在year类中调用getValue,同理month和day。然后在上一题的基础上我是这样节省的:

int year = this.getDay().getMonth().getYear().getValue();
int month = this.getDay().getMonth().getValue();
int day = this.getDay().getValue();

  在我的程序中都是直接用year和month所以可以直接这样赋值给它们。接下来就在第二题的基础上用这种方法就行了。

(4)题目集3的7-4

代码如下(没有main类):

class DateUtil {
	Day day;
	Month month;
	Year year;
	public DateUtil(){ 
    }
    public DateUtil(int d, int m, int y){
        this.day = new Day(d);
        this.month = new Month(m);
        this.year = new Year(y);
    }
    public Day getDay() {
		return day;
	}
	public void setDay(Day day) {
		this.day = day;
	}
	public Month getMonth() {
		return month;
	}
	public void setMonth(Month month) {
		this.month = month;
	}
	public Year getYear() {
		return year;
	}
	public void setYear(Year year) {
		this.year = year;
	}
	
	public boolean checkInputValidity() {
		boolean checkInputValidity;
	    checkInputValidity = (this.getYear().getValue()>=1820&&this.getYear().getValue()<=2020&&this.getMonth().getValue()>=1&&this.getMonth().getValue()<=12&&this.getDay().getValue()<=31&&this.getDay().getValue()>=1);
	    return checkInputValidity;
	}
	public boolean compareDates(DateUtil date) {
		boolean compareDates= false;
		compareDates = (this.getYear().getValue()>date.getYear().getValue()||this.getYear().getValue()==date.getYear().getValue()&&this.getMonth().getValue()>date.getMonth().getValue()||this.getYear().getValue()==date.getYear().getValue()&&this.getMonth().getValue()==date.getMonth().getValue()&&this.getDay().getValue()>date.getDay().getValue());
		return compareDates;
	}
	public boolean equalTwoDates(DateUtil date) {
		boolean equalTwoDates = false;
		equalTwoDates = (this.getYear().getValue()==date.getYear().getValue()&&this.getMonth().getValue()==date.getMonth().getValue()&&this.getDay().getValue()==date.getDay().getValue());
		return equalTwoDates;
	}
	
	public String showDate() {
		return this.getYear().getValue()+"-"+this.getMonth().getValue()+"-"+this.getDay().getValue();
	}
	public boolean isLeapYear(int year) {
		boolean isLeapYear;
	    isLeapYear = (year% 4 == 0 && year % 100 !=0 )||year % 400 == 0;
	    return isLeapYear;
	}
	public DateUtil getNextNDays(int n) {
		int year = this.getYear().getValue();
		int month = this.getMonth().getValue();
		int day = this.getDay().getValue();
		int year1=0,month1=0,day1=0;
		
		
		int num1=0,t2=1,t1=1;
		int[] b=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
		if(isLeapYear(year))
			b[2]=29;
		for(int i=1;i<month;i++) 
		{
			num1 = num1+b[i];
		}
		num1=num1+day;
		if(isLeapYear(year)) {
			num1=366-num1;
		}
		else {
			num1=365-num1;
		}

		while(n>365)
		{
			if(isLeapYear(year)) 
			{
				n=n-366;
			}
			else 
			{
				n=n-365;
			}
			year=year+1;
		}
		if(n>num1)
		{
			if(isLeapYear(year)) {
				n=n-1;
			}
			year1=year+1;
			n=n-num1;
			int[] a=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
			if(isLeapYear(year1))
				a[2]=29;
			for(int i=1;i<12;i++)
			{
				//if((n-a[i])<a[i+1]&&(n-a[i])>0)
				if(n>a[i+1])
				{
					n=n-a[i];
					t2=t2+1;
				}
			}
			month1=t2;
			day1=n;
		}
		else
		{
			year1=year;
			num1=0;
			for(int i=1;i<month;i++) 
			{
				num1 = num1+b[i];
			}
			num1=num1+day;
			n=n+num1;
			int[] c=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
			if(isLeapYear(year1)) {
				c[2]=29;
			}
			for(int i=1;i<12;i++)
			{
				if(n>=c[i+1])
				{
					n=n-c[i];
					t1=t1+1;
				}
			}
			month1=t1;
			day1=n;
		}
		return new DateUtil(year1, month1, day1);
	}
	public DateUtil getPreviousNDays(int n) {
		//DateUtil date = new DateUtil(year,month,day);
		int year = this.getYear().getValue();
		int month = this.getMonth().getValue();
		int day = this.getDay().getValue();
		int year1=0,month1=0,day1=0;
		
		int num1=0,num2=0,t1=12,t2=1;
		int[] b=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
		if(isLeapYear(year))
			b[2]=29;
		for(int i=1;i<month;i++) 
		{
			num1 = num1+b[i];
		}
		num1=num1+day;
		while(n>365)
		{
			if(isLeapYear(year)) 
			{
				n=n-366;
			}
			else 
			{
				n=n-365;
			}
			year=year-1;
		}
		if(n>=num1) 
		{
			year1 = year-1;
			n=n-num1;
			int[] a=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
			if(isLeapYear(year1))
				a[2]=29;
			for(int i=12;i>=1;i--) 
			{
				if(n>=a[i]) 
				{
					n = n-a[i];
					t1=t1-1;
				}
			}
			month1=t1;
			day1=a[t1]-n;
		}
		else
		{
			
			year1=year;
			n=num1-n;
			int[] c=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
			if(isLeapYear(year1)) {
				c[2]=29;
			}
			for(int i=1;i<12;i++)
			{
				if(n>=c[i+1])
				{
					n=n-c[i];
					t2=t2+1;
				}
			}
			month1=t2;
			day1=n;
		}
		return new DateUtil(year1, month1, day1);
	}
	
	public int getDaysofDates(DateUtil date) {
		int year = this.getYear().getValue();
		int month = this.getMonth().getValue();
		int day = this.getDay().getValue();
		int year1 = date.getYear().getValue();
		int month1 = date.getMonth().getValue();
		int day1 = date.getDay().getValue();
		
		
		int t=0;
	    int num = 0;
	    int num1 = 0;
	    int num2 = 0;
	    if(!equalTwoDates(date)) 
	    {
	    	if(!compareDates(date))
	    	{//day<date.day
	    		for(int i=year;i<=year1;i++) 
	    		{
	    			if(isLeapYear(i)) 
	    			{
	    				t = t+1;
	    			}
	    		}
	    		int[] b=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
	    		for(int i=1;i<month;i++) 
	    		{
	    			num1 = num1+b[i];
	    		}
	    		num1 = num1+day;
	    		for(int i=1;i<month1;i++) 
	    		{
	    			num2 = num2+b[i];
	    		}
	    		num2 = num2+day1;
	    		num = 365*(year1-year)+t+(num2-num1);
	    	}
	    	else  //day>date.day
	    	{
	    		for(int i=year1;i<=year;i++) 
	    		{
	    			if(isLeapYear(i)) 
	    			{
	    				t = t+1;
	    			}
	    		}
	    		int[] b=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
	    		for(int i=1;i<month;i++) 
	    		{
	    			num1 = num1+b[i];
	    		}
	    		num1 = num1+day;
	    		for(int i=1;i<month1;i++) 
	    		{
	    			num2 = num2+b[i];
	    		}
	    		num2 = num2+day1;
	    		num = 365*(year-year1)+t+(num1-num2);
	    	}
	    }
	    else 
	    {
	    	num=0;
	    }
	    return num;
	}	
}


class Day {
	private int value;
	
	public Day() {
		
	}
	public Day(int value) {
        this.value = value;
	}
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
	public void dayIncrement() {//日期加一
		value++;
	}
	public void dayReduction() {//日期减一
		value--;
	}
}
class Month {
	int value;
	public Month() {
		
	}
	public Month(int value) {
        this.value = value;
	}
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
	public void restMin() {
		value=1;
	}
	public void restMax() {
		value=12;
	}
	public boolean validate() {//校验数据合法性
		boolean validate;
		validate = (value>=1&&value<=12);
		return validate;
	}
	public void monthIncrement() {//月份加一
		value++;
	}
	public void monthReduction() {//月份减一
		value--;
	}
}
class Year {
	int value;
	
	public Year() {
	}
	public Year(int value) {
		this.value=value;
	}
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
	public boolean isLeapYear() {
		boolean isLeapYear;
	    isLeapYear = (value% 4 == 0 && value % 100 !=0 )||value % 400 == 0;
	    return isLeapYear;
	}
	public boolean validate() {
		boolean validate;
		validate = (value>=1900&&value<=2050);
		return validate;
	}
	public void yearIncrement() {
		value++;
	}
	public void yearReduction() {
		value--;
	}
}

    代码心得还有啥:这题中的类才是合理的关系,所以根据类图我们可以得知showDate这样写:

public String showDate() {
		return this.getYear().getValue()+"-"+this.getMonth().getValue()+"-"+this.getDay().getValue();
	}

    这次我们可以直接在每个类中掉用getValue。例day类:

class Day {
	private int value;
	
	public Day() {
		
	}
	public Day(int value) {
        this.value = value;
	}
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
	public void dayIncrement() {//日期加一
		value++;
	}
	public void dayReduction() {//日期减一
		value--;
	}
}

    上一次的day类:

public Day() {
		
	}
	public Day(int yearValue,int monthValue,int dayValue) {
		this.month = new Month(yearValue,monthValue);
        this.value = dayValue;
	}
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
	public Month getMonth() {
		return month;
	}
	public void setMonth(Month month) {
		this.month = month;
	}
	public void resetMin() {
		value = 1;
	}
	public void restMax() {
		value = 31;
	}
	public boolean validate() {//校验数据合法性
		if(this.getMonth().getYear().isLeapYear())
            b[1]++;
		boolean validate;
		validate = (value>=1&&value<=31);
		return validate;
	}
	public void dayIncrement() {//日期加一
		value++;
	}
	public void dayReduction() {//日期减一
		value--;
	}
}

    很明显用第三题的类型简便了不少,然后就是改编。(怎么写我就不细写了)

三,踩坑心得

(1)首先的就是题目没看懂,就比如题目集2的7-2:

  在这个奇偶校验上我花了不少时间,一开始我是根本没有听说过这个东西,然后去百度上查完,发现还是不懂,于是我就把例题里的输入都一个一个拆分发现好像怎么输都是对的,到最后还是其他人告诉我只要前9位加起来是奇数就可以,所以好好理解题目很重要。(我还是觉得是题目的问题,首先在这个题目中没有任何和奇偶校验相关的任何解释,那我不知道百度上找的和题目要求的奇偶校验是否是同一类型,还有题目中的”在有效数据之后加上1位可选的奇偶校验位和1位结束位‘1’”这个极具迷糊性的要求,总之是题目表述不清,“请”下次改正。)

 (2)然后其实就没有什么,有些题目设置的得分点不全,可能会导致我们写了一大堆导致一分都没得到。就比如这个题目:

  在题目中明明要求了只有17,18,19,20,4个年级,所以在程序中检测到不符合时应该输出"Wrong format"可是在得分上根本没有设置这一得分点,只要提取到202017和202061然后输出后4位就行,就可以得到全部的分数,所以我的建议是找准得分点不要死磕不然会花很多不必要的时间。(这好像也不是学生的问题啊w(゚Д゚)w)

四,改进建议:

  (1)我上面的代码大多都没有得到满分,但我把做题的思路都很清楚的写出来了,如果要有该进的地方就是题目集3的7-4:

 

  这个题目集的最后我的程序输出的日期没有问题,但是会在输出1834-2-17的地方直接输出它们的地址,然后就是因为实在写不动了写一题写了两天,就放弃了。

如果能够改进的我话我应该会在输出那个日期的地方转换一下就这样。

五,总结

  (1)  经过这三个题目集的鞭策我觉得我学会了很多,比如如何创建自己想要运用的类,这样就不用只在main类把一切都写完,还有就是根据类图降低类之间的耦合性。

  (2)我在写类中的方法上还有欠缺,对一些基本类的用法还不是很清楚,很多时候都还是自己写方法,花了很多时间在草稿上。(我真的不知道有些人为什么都不写草稿就直接写程序就可以得满分,反正我是不行,所以我还有很长的路要走(* ̄rǒ ̄))

  (3)  对教师和课程有什么意见:我觉得现在有点“充实”过头了,一天到晚都在电脑前。除了java课程我们还有三门数学课而且我觉得我现在可能有点跟不上了,虽然数学老师布置的作业确实很少,但想要完全理解课里的内容这点肯定是不过的,所以在课外我需要时间去看书,在这一点上所花的时间我认为不应该比Java少,所以现在的情况是上午写数学作业,下午和晚上都在写pta。我觉得这有点过头了,没有什么时间去锻炼还是说是我的效率不行,总之我希望后面的节奏能慢一点,就这样。

posted @ 2022-04-09 19:59  liuyuX518  阅读(52)  评论(0)    收藏  举报