前言:
这是我的第一次博客,本次博客主要针对第一阶段PTA的三次作业进行总结分析,对于出现的错误教训进行记录和理解。
作业过程总结:
①第一次作业:
本次作业主要是Java的基本用法,包括选择结构,循环结构,调用方法,是从C语言过渡到Java很好的练习。
第一题求一元二次方程,我开始觉得是个很简单的题目,按照题目的要求,我花费了1个半小时写完这道题目。但在通过测试点的时候,第一个测试点过不了,我反复测试自己的数据,最终发现自己是在条件的判断有问题。我只是考虑了判别式小于0就无根这一种情况,而实际上,二次项系数也需要判定是否存在,忘了这个最基础的定义。
第二题是判断闰年和星期几,之前在C语言做过类似的题目,这里最主要的是将方法和以前学的子函数概念类似,将功能方法实现起来并不难,这一题我花了1个小时写完。
第三题是求下一天,我用的是switch case语句,将各种情况进行详细条列,虽然方法很直接,但是代码比较多,写的过程中也容易遗漏情况。由于PTA对代码长度有限制,我改用if else语句将有联系的月份都放在一个if中。减少了代码量。这一题我花了一上午分析解决。
第四题是求前N天,和第三题有些许联系,不过要考虑的情况增加了,还好N的范围是-10到10,比较简单,先分析天数相加是否到达月,再对1月,12月,2月进行特殊的if分析,最终完成用时2小时。
②第二次作业:
本次作业对字符串,条件判断有要求,需要细心发现题目的题眼,很容易丢失小分。
第一题计算税率,题目不难,但条件众多。需要将每种符合条件的情况对号入座,比较繁琐,我用了2个小时。
第二题判断坐标点所在范围,关键是从坐标入手,将坐标和题目的要求联系在一起,很容易得出答案,我用了半个小时。
第三题字母数字转换是简单的if语句运用,将符合条件的对应输出,没有什么难度,我用了大概半个小时。
第四题判断三角形类型有一些细节问题我没有注意,同样是if语句的应用,我将符合三角形的各个情况从等腰三角形入手,如果等腰的同时直角三角形,或者等边那么再进一步输出等边三角或者等腰直角,剩下的情况就是等腰三角。但我显然遗漏了内容,我没有通过PTA的完整测试点,我觉得在三角形判定方面我有不足。这一题我虽然做出来花了1个半小时,但测试点我想了很久。
③第三次作业:
本次作业是前两次作业的升华,虽然基本的知识点都是前两次作业,但明显有深度也有难度,需要用到面向对象的思想,如果说前两次还算面向过程,难么这一次作业是实实在在的向面向对象过渡。
第一题是用类解一元二次方程,虽然解方程简单,但要用到类需要一番思考。我开始以为向类中传参数和方法一样可以直接用,后来发现需要用一个方法来接收传进来的参数,并且要定义的局部变量要在开头,这样就可以在后面的方法中直接使用我的参数,运算,返回。这一题我花了2个小时完成。
第二题日期类设计和第一次作业有些类似,但内容却是大相径庭。比如求前N天,第一次作业是有范围的,不会超过10天,这样就可以通过月份的判断来确定日期。但现在的N是没有范围的可能几天可能几月也可能几年,再用原来的方法需要考虑的情况复杂而繁琐,我写了将近1000行代价,很显然通过不了。在对日期的类进行计算时还需要返回一个类,这是我之前所不知道的。这一题确实难到了我,我后来的解决方法是用数组的方法,将闰年和平年的月份分别定义2个数组,然后将年分为闰年平年,将天数进行减少,回到我最初的想法。这一题所要写的方法比较多
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”格式返回日期值
由于前期陷入if语句分析各种情况的怪圈,没有用对方法,花费了大量时间仍然没有通过测试,静下心来才发现循环和数组可以使题目时间大幅下降。
第三题和第四题是第二题的延伸,不仅是面向对象的思想还要根据图中的各个方法聚合,是需要仔细思考的题目,我在看图方面仍然有不足,看到的东西实现起来却不容易,测试点过不了,需要多练这类题目。
OO设计心得:
①面向过程和面向对象比较:面向过程给我的最大感受就是先分析出解决问题的步骤,然后用函数把这些步骤一步一步地实现,解决的时候就是一个一个函数地调用。而面向对象就是把多个功能合理放到不同对象里,强调的是具备某些功能的对象,有的时候几个对象好像看起来没什么联系,但你却要把他放到一个类中。
②面向对象设计的基本原则理解:我现在还不是很理解,但有一点,面向对象注重的是对象,是每个个体的思维。将功能合理的放入对象中。
③ OO编程思维的理解:在类中归纳好使用的对象,注意每个对象的特点,该有返回值的不能少,不该有的也不能多出来,面向对象适应程序的多变性,可以根据题目的变动进行略微调整达到目的。
课程收获:
这段时间以来,面向对象的思想是老师讲课的重点,我也尝试去接收这种思想,但遇到问题的第一感觉还是面向过程,然后再转化为面向对象,还是不太熟悉这种思维。对于一些比较小的知识点没有记牢,每次还需要上网查一下,对一些简单点的题目掉以轻心,难点的题目容易放弃,钻研精神不够。但总的来说还是慢慢的学到了面向对象编程的思维,也很愿意进一步加深自己的理解。
课程建议:
我希望老师可以多捋一捋一些比较经典的题目,在给我们解析题目的过程中将知识点也更好的运用上,毕竟理论一点的东西是比较枯燥而无味的,谢谢老师!