0.前言
第一阶段java作业分为3次。
第一次作业是简单得一些语法和一些简单得逻辑思维,主要内容有求三角形是什么三角形的,还有就是求坐标点所在范围的,也涉及到了数字和字母的转换,总之相相当于是给java初学者得一次入门练习,但是这个是基于在有C语言的基础之上;
第二次作业是关于日期求下n天还有上n天以及两个日期之间相差多少天,里面涉及得比第一次多了一点,涉及到了日期的基本逻辑判断以及简单算法的设计,同时还用到了方法,以及方法之间的调用;
第三次作业主要是对类的理解和运用,作业题目还是跟第二次作业是一样的,也是有一个一元二次方程解的,还有3个日期的题目,题目是一样的,但是3个题目之间类之间的关系和类图是不一样的,根据不同的类图来写出不同的代码。
1.作业过程总结
(1)三次作业之间的知识迭代关系
①.三次作业之间有明显的迭代关系,每次作业中的每小题作业里面也有明显的迭代,所以做作业的时候老师也是建议我们要一个题目一个题目按顺序来。
②.第一次作业是最简单的,完全就是基于我们大一学过的C语言,比如使用简单的for循环,while循环,还有if判断语句,还有一些用了swtich..case..语句就能解决,就迭代关系来说,第一次作业里面的各个题目,是没太大的联系的,第一次作业就是让我们通过练习来适应java里面的一些语法,让我们的编程习惯从C语言转变过来,适应适应这么新的语言。
③.第二次作业相对于第一次作业来说 ,又增加了难度,不过还是没有涉及到面向对象思想,仍然是面向过程的思想,这次作业用到了的结构有选择、循环、方法、数组,依然还是方法的调用。主要是求日期类的,不过这里面的三个日期题目之间也是有着联系,第一个日期题目是求某一日期是星期几的,第二个题目是求下一天的,第三个题目是求前n天的,求下1天或者上1天其实跟求前n天或者后n天相联系的,搞懂了下1天,下n天也就可以解决了,所以说作业内的题目也存在迭代关系。
④.第三次作业还是求关于日期的,但是这次是面向对象而不是面向过程了,涉及到了类,单一职责原则,理论上是一个类处理一个功能, 尽量类之间关系不要太复杂。这次的日期题目一个题目里面要实现求下n天,上n天,以及两个日期之间相差多少天的功能。3个题目测试的功能都是同一个,但是之间的区别是类的区分不同。
第一个日期题是只有一个类DateUtil,全部写在这个类DateUtil里面;
第二题日期题是设计了4个类DateUtil、Year、Month、Day,类之间有着聚合的关系,并且关系比较复杂,是DateUtil包含Day类,Day类包含Month类,Month包含Year类,关系复杂,并不是一个好的设计,耦合性比较高。
第三题日期题也是同样的是类之间聚合的关系,也是有4个类DateUtil、Year、Month、Day这个但是相当于是Year,Day,Month这个3个类围着DateUtil这个类,也是一种聚合,这种聚合比第二题的那种聚合好多了,数据参数的调用没有那么复杂,不用通过一层一层的类调用再去拿来数据用,代码会更简单,编程人员的思路也更简单;
这3题之间就是属于迭代的关系,是3种不同的设计,3种设计里面可以说各有优点,但总的来说最后一个设计是更好的。
(2)如何通过作业逐步从面向过程过渡到面向对象
刚开始接触java,写java作业完全还是按照C语言的路子来,就是写一大段代码,然后把代码弄到相应的方法里面去,结果正确就ok了,但是后来因为老师的要求,以及这门语言本来就是面向对象的语言,我开始看bilibili里面的视频,知道了对象这个东西,知道了new 的用法,写代码的时候慢慢发现了面向过程虽然写起来思路不复杂(这是相对于写代码本人来说),但是如果你把这个代码给另一个人,可能别人就理解不了你代码是用来干嘛的,而面向对象里面的类,刚好可以满足这个需求,比如一个类就只有一个功能,这样使用这个代码的人员(对象)就能比较容易的得出你这个代码的具体功能是用来干嘛的。开始慢慢的开始写类,去new 对象,以及慢慢的去学会用对象去调用类里面的属性和方法,作业里面的要求也是要用到类,然后就通过写作业 ,来完成作业的要求来慢慢的理解了一点面向对象的皮毛。
(3)作业过程中自己的思路和遇到的问题及解决方法
第一次作业
思路:题目刚出来把5道题目都看了一遍,于是大概判断了难度和代码量,果断把税率计算的放到了最后,因为代码量比较大,其次就是把判断三角形类型放到倒数第二,因为虽然这个逻辑比较多,要考虑到很多种情况,其他的就可以按照顺序来了。
遇到的问题:
①最基础的问题,pta里面的主方法要写成Main而不能是main。
②没有注意代码的严谨性,一些空格输出没有控制好,导致一系列格式错误。
③电话键盘复制模数字转换题目里面没有把字母强制类型转换,导致运行结果错误。
解决方法:在char类型变量前面加(int),强制转换为数字,然后通过if ..else..语句来控制输出。
④做三角形判断类型题目中出现double类型的a*a+b*b==c*c来判断直角三角形会出现误差,然后导致测试点会通过不了。
解决方法:百度了没找到,咨询了同学,发现我们可以用把误差范围减少到很小其实也可以约等于==,也可以达到判断直角三角形的效果,比如a*a+b*b-c*c<=1e-10,然后发现就解决了问题。
第一次作业比较简单,一般错的都是比较基础的错误,加上eclipse 有自动纠错功能,一般语法错误不会出现,算法这次作业也没有,所以算得上是入门的java“面向过程”。
第二次作业
思路:刚出题目就看了一下全部题目,把第一题一元二次方程做了,这个属于级别为1的题目,然后发现后面3个题目都是跟日期有关的,并且题目说了不准用日期有关的类,所以肯定是要先把这些算法想出来,再进行敲代码。
遇到的问题:
①一元二次方程b,c均为0的情况没有考虑到,因为我以为这个包含在1个实数根这个测试点里面了。
解决方法:在代码 里面多加了一个if(b==0&&c==0)语句,在运行就解决了问题。
②计算求当前日期距离1年1月1日的天数出了问题,当时没有取解决这个问题,只得到了该题的27分。
③求下一天的时候出现跨年的情况没有考虑清楚导致出现13月的情况,闰年29非闰年28的这种错误并没有出现
解决方法:加上了if(month==12&&day==31),就有year++;使得年份可以加1,然后月和日复位到1。
④刚看到第四题求下n天的时候思路是跟第三题求下一天的思路是一样的,但是又不太一样,当时遇到的问题是n天,我要解决的同样还是跨月,跨年问题,不同于一天,而是n天(n是有范围的,属于(-10,10),显然,负数跟正数的算法是不太一样的,当时就卡在那里了。
解决方法:考虑到这种算法的抽象想象是比较难想得,于是我打算用几个具体的例子来设计算法,于是我就想到了用2月29(闰年),12月31日,这个来设计求n为正数的情况,还有1月1日用来求n为负数的情况,然后我假定n为一个具体的数,然后找出day跟n的关系,然后有些是day=day+n,有些是需要day=31-(day-n)的,大概就是这些类型的,然后就还是把代码给补全就ok了。
第三次作业
遇到的问题:
①首先类的传参数问题,我不知道怎么传参数,不会构造有参方法。
解决方法:我百度,然后解决了,就是将this.属性 = 特定的参数。
②第一次提交第二题的作业,发现只有10分,只有边界测试和非法数据的测试过了测试点,求下n天,求上n天,求两个日期之间间隔多少天都没有通过测试点。
解决方法:发现这里的n不像第二次作业的那样有范围,这里的n可以是很大,所以我就发现我之前的那个算法出现了问题,之前的那个算法并没有考虑n过大的情况,于是我重新设计了算法,就是从i = 0一直加到n,这样一天一天的算,遇到跨月跨年,就按照之间的算法来,发现最后前n天,后n天的答案是正确的。
③运行超时问题。
解决方法:运行超时是因为我循环的次数太多了,所以我就想到了如果n大于366天,我是不是可以按照一年一年的减少或者增加来算,然后我就设计了如果n大于366的时候,就每一次减少365或者366,year-1或者year+1,当n小于了366的时候,就按照之前那个一天一天啊的算的算法,发现运行没有超时了,成功通过了 。
④不知道怎么从其他类里面调用方法,也不知道怎么把属性传到其他类里面去。
解决方法:咨询了同学,举个例子,可以year = new Year(y);这样,然后调用方法后来我发现了如果你打了一个点(.),他后面会出现提示,然后我就是这样摸索摸索完成了第四题和第三题。
(4)每次作业花费的时间比例
第一次作业:花费时长大概一共是2个小时,第一题:0.8h;第二题:0.3h;第三题:0.3h;第四题:0.3h;第五题:0.3h;
第二次作业:花费时长大概一共是12个小时,第一题:0.5h;第二题:4h;第三题:3.5h;第四题:4h;
第三次作业:花费时长大概一共是30小时,第一题:1h;第二题:23h;第三题:2h;第四题:4h;(我先做第四题,做第三题发现简单了许多,错误也少了许多)
(5)对编程过程的逻辑严谨性的认识及教训
①首先字母的拼写要注意,尤其是方法的命名,不然你发现方法不一致,代码很长的情况下,你会比较麻烦。
②java输出格式要特别注意规范,多一个空格少一个空格都要注意,还有标点符号也是要注意,血一般的教训。
③算法的优越性和实用性,设计一个算法,要尽可能完美一点,不然可能代码换一个地方,换一个题目就不能用了,就是算法的适用范围可以广一点。
④类之间的关系要注意,尽量不要出现空指针异常的情况。
2.OO设计心得
(1)面向过程与面向对象的比较
我觉得面向过程就是简单得把一大串代码放在一起,虽然小分工有方法来承担但是大分工不是很明确。
面向对象则是用到了类,一个类有一个大分工,使得代码更加清楚明了,不同得程序员看这段代码更容易看得懂,这就是面向对象得一个优点之一,单一职责原则。
(2)面向对象设计的基本原则理解
暂时了解的就只有单一职责原则:就是每一个类一般来说就执行相对应的功能,不要加其他别的功能,比如我计算Day的 就是计算day有关的,不要计算year或者month的,尽量不要在一个类里面把功能搞得这么复杂。
(3)OO编程思维的理解
我觉得oo编程思维主要体现在类的设计,类之间的关系上,是聚合还是其他的什么,同时类之间的耦合度高低都是跟类的设计有关,我们就是要想办法把类设计得好,让单一职责原则体现出来,同时程序能很容易被读懂。
3.测试的理解与实践
(1)测试对于编码质量的重要性
测试对于编码质量是非常重要的,就相当于测试游戏的bug一样,如果一个代码,你不去测试的话,那可能别人用你的代码都不放心,你的代码功能这样也是不完全的,很容易出现得到错误的结论的情况,所以测试是非常有必要的。
(2)假如让你设计测试用例,你会如何做
比如这个的作业日期类的,首先我会设计一个闰年的2月29日,非闰年的2月28日;超出了时间范围的例子;非闰年的2月28日,2月29日;输入n是5000的情况还有n是int类型最大值的情况
总之,不管是什么题目的测试,我们在设置测试用例的时候,一定要考虑到普通和特殊的情况,只要把普通和特殊这些情况都考虑到了,其实测试用例也就差不多了。
4.课程收获
这一个阶段下来,还是学到了一些东西,一开始学的C语言学的并不是特别好,现在经过这一阶段的补习相当于,算法设计能力提高了,编程的速度也提高了,同时还知道了面向过程和面向对象的一点点区别,知道了类和对象这个东西,知道了类之间的调用,明白了算法优化的重要性,不然会出现超时的情况,也懂了我们编写的代码要尽可能好一点,确保能在多处地方用得上,同时,知道了怎么去通过单步调试去改进自己的代码,通过测试用例来知道自己那里的代码出现了问题,算是培养了一个小小的整体大局观吧。
5.对课程的建议
(1)希望老师能更多的讲一些例子,我觉得通过讲例子能更好得帮助我们来学习java,这样学起来没有这么抽象。
(2)老师可以多讲一下下次作业有关得内容,这样下次作业做起来不会这么吃力。
(3)老师可以上课少讲一下理论的,就是比如一个类的使用,可以给我们展示一下,这样我们比较容易记住这个类的具体用法。