0.前言java
第一阶段java做业分为3次。程序员
第一次做业是简单得一些语法和一些简单得逻辑思惟,主要内容有求三角形是什么三角形的,还有就是求坐标点所在范围的,也涉及到了数字和字母的转换,总之相至关因而给java初学者得一次入门练习,可是这个是基于在有C语言的基础之上;算法
第二次做业是关于日期求下n天还有上n天以及两个日期之间相差多少天,里面涉及得比第一次多了一点,涉及到了日期的基本逻辑判断以及简单算法的设计,同时还用到了方法,以及方法之间的调用;编程
第三次做业主要是对类的理解和运用,做业题目仍是跟第二次做业是同样的,也是有一个一元二次方程解的,还有3个日期的题目,题目是同样的,可是3个题目之间类之间的关系和类图是不同的,根据不一样的类图来写出不一样的代码。数组
1.做业过程总结eclipse
(1)三次做业之间的知识迭代关系学习
①.三次做业之间有明显的迭代关系,每次做业中的每小题做业里面也有明显的迭代,因此作做业的时候老师也是建议咱们要一个题目一个题目按顺序来。测试
②.第一次做业是最简单的,彻底就是基于咱们大一学过的C语言,好比使用简单的for循环,while循环,还有if判断语句,还有一些用了swtich..case..语句就能解决,就迭代关系来讲,第一次做业里面的各个题目,是没太大的联系的,第一次做业就是让咱们经过练习来适应java里面的一些语法,让咱们的编程习惯从C语言转变过来,适应适应这么新的语言。优化
③.第二次做业相对于第一次做业来讲 ,又增长了难度,不过仍是没有涉及到面向对象思想,仍然是面向过程的思想,此次做业用到了的结构有选择、循环、方法、数组,依然仍是方法的调用。主要是求日期类的,不过这里面的三个日期题目之间也是有着联系,第一个日期题目是求某一日期是星期几的,第二个题目是求下一天的,第三个题目是求前n天的,求下1天或者上1天其实跟求前n天或者后n天相联系的,搞懂了下1天,下n天也就能够解决了,因此说做业内的题目也存在迭代关系。this
④.第三次做业仍是求关于日期的,可是此次是面向对象而不是面向过程了,涉及到了类,单一职责原则,理论上是一个类处理一个功能, 尽可能类之间关系不要太复杂。此次的日期题目一个题目里面要实现求下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)老师能够上课少讲一下理论的,就是好比一个类的使用,能够给咱们展现一下,这样咱们比较容易记住这个类的具体用法。