PTA总结报告1

发布时间 2023-03-26 16:57:58作者: 水温寒

 1、前言

  三次PTA中,第一次的难度相对来说比较低,只需要学会JAVA中最基础的输入输出格式,再加上一些C语言学会的算法,对数据进行初级的处理,就可以得到答案,部分对字符数组的处理只需要掌握一些字符串的相应函数就可以解决。

第二次的作业相对第一次的难度有所提升,但难度依旧不大,掌握一些初级的函数就可以搞定。

第三次的难度相对较大,尤其是第3、4题,花费了更多时间,但是收获也较大,让我更加熟悉了一些常用函数和对类的理解和使用。

 

 2、

 

 3、

 

 

2、设计与分析

7--3 定义日期类

 

 题目分析

本题主要是对日期的处理,输入日期后,对日期进行判断,如果合法,则进行日期的操作,这题主要是根据不同年份和月份进行判断,需要判断年份是否为闰年,该月份有多少天,然后输出下一天

  void getNextDate() {
         if(month==12&&day==31) {
             year++;
             month=1;
             day = 1;
         }
         else if(isLeapYear(year)&&month==2&&day==29) {//是闰年且2月29号
                 month++;
                 day=1;
         }
          else if(isLeapYear(year)&&month==2&&day==28) {//是闰年且2月29号
                 day++;
         }
         else {
             if(day==monday[month]) {
                 month++;
                 day=1;
             }
             else {
                 day++;
             }
         }
         System.out.println("Next day is:"+year+"-"+month+"-"+day);
     }
     }

 

 

 以上是这一题的核心代码,对日期进行判断,先对一些特殊的日期进行操作,如果是该年的最后一天,则对year进行+1的操作,让month和day归1,再对年份进行判断,如果为闰年且是二月底的特殊日期,则让下一天为3月的第一天。为方便操作,我定义了一个monday数组,判断该天是否为该月的最后一天,再进行下一步操作。总的来说,月份的日期数组的定义省去了不少麻烦。

 

7-4 日期类设计

 

 试题分析:

本题可以说是7--3的Plus版本,可以借用上一题的算法,略加修改便可,但复杂程度较高,需要完成三个功能。

功能一:求下n天。

 public DateUtil getNextNDays(int n) {//求下n天
        for(int i=0;i<n;i++) {
         if(month==12&&day==31) {
             year++;
             month=1;
             day = 1;
         }
         else if(isLeapYear(year)&&month==2&&day==29) {//是闰年且2月29号
                 month++;
                 day=1;
         }
          else if(isLeapYear(year)&&month==2&&day==28) {//是闰年且2月29号
                 day++;
         }
         else {
             if(day==monday[month]) {
                 month++;
                 day=1;
             }
             else {
                 day++;
             }
         }
    }
        DateUtil results=new DateUtil(year, month, day);
        return results;
   }

 

该功能为输入一个日期,输入一个整型的数字,求该日期的n天之后的日期。这题和上一题有异曲同工之妙,只是将下一天改为了下n天,那么可以利用一个循环的结构,将求下一天的算法重复n次,便可以轻松得到下n天的答案。但该算法有一个缺陷,就是当n取极大值时,需要较多运算时间。

功能二:求上n天

public DateUtil getPreviousNDays(int n){
     for(int i=n;i>0;i--) {
            if(month==1&&day==1) {
                year--;
                month=12;
                day = 31;
            }
            else if(isLeapYear(year)&&month==3&&day==1) {//是闰年且3月1号
                    month--;
                    day=29;
            }
             else if(isLeapYear(year)&&month==2&&day==29) {//是闰年且2月29号
                    day--;
            }
            else {
                if(day==1) {
                    month--;
                    day=monday[month];
                }
                else {
                    day--;
                }
            }
       }
           DateUtil results=new DateUtil(year, month, day);
           return results;
}

 

该功能为输入一个日期,输入一个整型的数字,求该日期的n天之前的日期。这题很明显是上一个功能的改版,只需要一些逆向思维,对功能一的算法进行一些修改。对输入的日期进行判断,如果为一年中的第一天,则上一天为上一年的最后一天,然后对年份进行判断,区分闰年和平年,对不同年份的二月份日期进行处理,再根据上一个月为大月或小月,对新日期进行赋值,然后对上述的算法进行n次循环,便可以得到相应的计算结果。

功能三:求两个日期相差的天数

public boolean compareDates(DateUtil date) {//比较当前两个日期
    if(date.year>this.year) {
        return true;//前面一个输入更xiao,返回对,后面小,返回错//后面
    }
    else if(date.year ==this.year&&date.month>this.month) {
        return  true;
    }
    else if(date.year==this.year&&date.month==this.month&&date.day>this.day) {
        return  true;
    }
    return false;
}

public boolean equalTwoDates(DateUtil date) {//判断两个日期是否相等
   if(date.year==this.year&&date.month==this.month&&date.day==this.day) {
       return false;//相等
   }
    return true;
}


public int getDaysofDates(DateUtil date) {//取得相差的天数 
     DateUtil date1 = new DateUtil(year, month, day);
     DateUtil date2 = new DateUtil(year, month, day);

    int i = 0;
    if(!equalTwoDates(date)) {//
        return i;
    }

    else {
        if(compareDates(date))
        {
           date1.day=this.day;
        date1.month=this.month;
        date1.year=this.year;
        
        date2.day=date.day;
        date2.month=date.month;
        date2.year=date.year;
        }
        else {
            date2.day=this.day;
            date2.month=this.month;
            date2.year=this.year;
            
            date1.day=date.day;
            date1.month=date.month;
            date1.year=date.year;
        }
            while(date2.year!=date1.year||date2.month!=date1.month||date2.day!=date1.day) {
                 if(date1.month==12&&date1.day==31) {
                     date1.year++;
                     date1.month=1;
                     date1.day = 1;
                 }
                 else if(isLeapYear(date1.year)&&date1.month==2&&date1.day==29) {//是闰年且2月29号
                     date1.month++;
                     date1.day=1;
                 }
                  else if(isLeapYear(date1.year)&&date1.month==2&&date1.day==28) {//是闰年且2月29号
                      date1.day++;
                 }
                 else {
                     if(date1.day==monday[date1.month]){
                         date1.month++;
                         date1.day=1;
                     }
                     else {
                         date1.day++;
                     }
                 }
         i++;        
        }
        
    }
    return i;
}

 

在我看来,功能三是功能一的Plus版本,在进行求两个日期的相差天数之前,需要进行一些判断,判读输入的两个日期是否相等,如果不相等,则判断两个日期哪个更早,为便于操作,进行一个交换,确保第一个日期是更早的日期。两个判断结束后,便可以根据功能一的相应算法,添加一个判断的语句,对更早的日期进行求下n天操作,定义一个计数的变量,当求的下n天和更晚的日期相等时,输出的计数变量就是两个日期的相差天数。

 4、踩坑心得

在7--3中,我只对闰年中的2月29号进行了特殊的判断,忽略了2月28号,导致闰年的2月28号求下一天的运行结果为3月1日,虽然PTA的测试点没有这个日期,但经过同学的提醒,我及时发现了这一错误,并进行了修改,添加了一个判断的语句,并成功运行得到了这一结果。

5、改进意见

算法可以有很大的改进,在7--4的求下n天中,如果可以先以年为单位对日期进行相加,当n过于大时,可以根据当前的年份对下一年进行判断是否为闰年,再进行year+1,n-365或n-366的操作,当n小于一年的日期时,就可以再执行之前的算法,可以精简算法。

6、总结

学习结果:学会了很多JAVA的基础语法,以及一些基础算法。

经过三次pta作业,我对Java的面向对象这一说法的认知有了很大的提升,也领会到了java面向对象的好处以及重要性,在了解完题目的要求后,应该先根据需求,要实现的功能细划分为不同类,分清楚各个类的功能任务。


建议:希望老师上课时能讲一讲pta上一些难题的思路。