PTA题目集1~3阶段性总结

前言:

题目集一:此题目集主要考察输入语句和循环语句以及对字符串的操作,如第一到四题考察输入输出,第五第十一第十二考察循环语句,第六题到第八题考察字符串操作,题量较大且个别题目难度较大。

题目集二:此题目集主要考察对输入信息的判断和数学计算,如前三题的长度质量计量单位换算和奇数求和和房地产税费计算还有游戏的职业选择,和求输入日期的下一天,题目数量较多但是难度不大。

题目集三:此题目集主要考察对类的设计与使用,在此题目集中要求我们创建各个类来面向对象解决问题,如前两题让我们创建圆类和账户类。题量较少但是难度较大。

设计与分析:

由于题目数量较多所以这次选择了题目集三的第三第四题来分析

7-3

定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31]

输入格式:

在一行内输入年月日的值,均为整型数,可以用一到多个空格或回车分隔。

输出格式:

  • 当输入数据非法及输入日期不存在时,输出“Date Format is Wrong”;
  • 当输入日期合法,输出下一天,格式如下:Next day is:年-月-日

我们对此分析,题目首先要求我们设计一个类,再在主方法中输入日期后输出下一天,题目已经给出类的属性以及类图如下

根据题目给出的信息我们可知除各个类的属性的get,set方法外我们还需要设置判断输入年份是否为闰年的boolean类型的isLeapYear方法和判断输入年份是否正确的boolean类型的checkinputvalidity和取得输入下一天的getNextdate方法

在isLeapYear方法中我们只需对输入年份进行简单的除于判断即可如下图

 

 

在checkinputvalidity方法中我们也是只需很简单的对输入数据进行数据的合理性判断即可如下图

 

 

 

 

在此方法中我们可以看到用了isleapyear方法,因为闰年的二月份的天数不同所以我们需要判断并更改每月天数数组的数据

getNextdate方法中我们则需要仔细注意,这是最复杂也是最重要的方法

代码如下:

 

 

 

首先我们先判断输入年份是否为闰年把二月份日期更改,在判断是否为十二月最后一天因为为十二月最后一天的话我们的年份要增加,在判断输入天是否为该月的最后一天,如果是则我们要增加月份,这个方法主要考察我们的逻辑思维,当我们的逻辑思考的全面则这个方法就可以很快又正确的写出来

7-4:

参考题目3和日期相关的程序,设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 要求实现求下n天和前n天和求两个日期之间的天数差

根据题目我们可以得出类图基本如下

 

 

 

从中我们可知我们有以下各类型的方法

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”格式返回日期值

前两个方法与第三题的方法一样在此不进行更多的赘述以及最后一个方法只是进行格式输出在此也不进行赘述

首先求下n天的getNextNDays方法,我们首先就要思考设置怎样的算法来求出下n天的日期,我在这里的思考为用for循环与第三题的求下一天的方法类似一天天的增加使日期更改代码如下

 

 

 

与前面第三题类似这里求下n天主要要注意日期到了今年的最后一天和月份最后一天的操作,以及当年份变换时我们要持续判断年份是否为闰年以及对二月天数数组数据的更改

在是求前n天的getPreviousNDays方法在这里我用的是与求下n天一样的算法既然我们可以再求下n天的时候一天天的加,那么我也可以在求前n天的时候一天天的减,所以我们依旧是一个for循环,不过我们此时需要注意的不再是每年的最后一天和月份的最后一天,我们需要注意的是每年的第一天和月份的第一天,应为此刻是到每年的第一天和每月的第一天月份和年份才会改变,代码如下:

 

 

 

后面的compareDates和equalTwoDates两个方法都是为了getDaysofDates方法而创立,我们直接先分析getDaysofDates方法在此过程中分析前两个方法,我们可知在getDaysofDates方法中我们是输入两个日期,我的算法是直接两个日期的年份相减得出相差年份,再直接将相差年份的天数相加和将日期小的年份的补全天数和日期大的已过天数相加,求出天数差,所以我们在此方法中先要比较两个日期的大小所以我们创建了compareDates方法,代码如下

 

 

 

如果输入日期比此日期大,则将两个日期的数据交换,然后我们要注意的是如果两个输入日期的年份相同与不同我们的算法是不一样的,代码如下

 

 

 

 

 

 

 

 

 

如果两个日期的年份相同我们只需计算月份之间的天数差,如果不同我们在算各个年份补全天数时日期小的是与十二月份的天数差,日期大的则是与一月份的天数差,所以我们要注意这个细节,以及不要忘了时刻判断闰年改变二月份的天数。

踩坑心得:

在题目集二中的7-8题目的提交问题如图:

 

 

 

这题的主要问题是判断直角三角形的情况时的理想化,直接用平方和判断,由于计算机不能判断无理数,所以我们这里应该使用平方和相差区间应该在0.000001内的方式判断直角三角形的情况而不是使用平方和相等去判断。

在题目集三中的7-2题目的提交问题如图:

 

 

 

在设置方法时没有仔细思考方法是否需要返回值以及需要返回值时是否注意到缺少返回语句,所以在写方法时要观察是否有返回值以及返回值的类型和是否有返回语句

 

在题目集三中的7-4题目的提交问题如图:

 

 

 

 

没有判断输入日期的年份是否相同而导致的逻辑错误,直接进行了天数的相加,忽略了年份相同时判断方法的错误,应该是先判断年份是否相等,如果相等应该直接计算两个日期间的月份天数差,与年份不同时的算法逻辑不同,年份不同时应该为日期小的与12月进行计算,日期大的与1月进行计算,因此导致错误的产生。

改进建议

    对于题目集一中的7-5,可以直接使用stringbuffer类的查找功能,而不是使用一个循环来直接一个个查,这样可以简化程序不必如此复杂。

对于题目集一中的7-6的string类可以更改成stringbuilder或stringbuffer类,

这样我们可以直接使用Java对我们提供的直接进行对字符串的查找删改方法,更加简单高效的完成要求。

    对于题目集二中的7-5,可以将输入数据设置为字符串,而不是直接设置为整型,使得必须使用多个除余来判断输入数据,可以直接使用stringbulider或stringbuffer两个类来直接判断,使得程序简化,不用如此多的变量和算法,使程序简单易读。

    对于题目集二中的7-8,在判断直角三角形时不必设置如此多的变量,可进行减少变量,对于各别需要计算的方式直接使用计算式,不必使用另一个变量。

对于题目集三7-4中的求下n天以及天数差的代码可以加以改进,我用的是循环来使天数一天天相加来计算下n天,这样虽然简单易懂但是代码不高效,所以为了使程序更高效我们可以使用求余的方式来计算下n天,这样我们的循环次数会大大减少使程序运行时间变少。

总结

这三次题目集的难度层层递进,正好使我对Java语言的学习也在逐渐加深,从开始对语法只是了解甚少到对基本语法的熟练运用,以及在三次题目集中学到了stringbuilder和stringbuffer两个用于字符串的高效类,可以进行直接增加减查在面对要求对字符串内容的判定更改可以比string类更加简单轻松.学会了面对对象创建对应的类和设置对应属性和构建所需要的方法,使得我们程序可读性加强。学会了私有与共有属性的设置操作,使程序的封装性增强。学习到了各种数学函数的运用,如random和round两个数学方法的使用。但是在对于构建类的方法的操作仍然不够熟练,在日后的学习中要多加练习,使创建的方法能够准确高效的实现它的功能。以及对于精简程序的方式不够了解如题目集一中的7-7题目,由于程序的冗杂导致运行超时,以至于解决不了此题,在日后的学习中应该注意各种程序的运算快慢,了解到高效程序怎样写。还有对于计算时应该注意到计算机计算的特点,不应该用现实世界的思维去计算问题应该用计算机的思维方式去计算,少导致算法错误的产生。

 

posted @ 2023-03-26 01:08  RCcxs  阅读(39)  评论(0编辑  收藏  举报