OOP前三次作业总结
目录
· 前言
· 设计与分析
· 踩坑心得
· 改进建议
· 总结
一、前言
前三次作业主要是让我们熟悉java中的语法,并未涉及太多的面向对象思想,起到一个过渡作用,让我们更好的熟练Java的编程规范等等。像顺序、判断、循环结构在作业中都有所体现,以及一些基本的数据类型、方法、类等等都有所运用。题量适中,个别题目具有一定难度,需要细心思考,仔细琢磨。
第一次作业因为没能够系统学习java这门语言的语法,以及开始作业的时间较晚,导致第一次作业的完成度较低,第二次作业则充分吸取了第一次作业的经验早早的开始作业并完成,但在完成的过程中因为缺乏正确的调试经验和方法,只能不停迭代优化,提交次数较多,效率较低。第三次作业学会了边界值测试、等价值测试以及断点测试,大大提高了调试效率。
二、设计与分析
1.求定积分(第一次作业7-11)
这个题目将编程和数学知识所结合,需要具备一定的数学基础,但题目总体难度不大。定积分是一个将图形不断微分在求和的过程,所以主要采用了for循环来进行求和运算。

2.判断三角形类型(第二次作业7-8)
这个题目需要我们去判断不同的三角形类型,判断条件较多,需要逻辑清晰,但难度不大,需要对if—else判断语句的熟练运用,值得注意在判断三角形类型之前需要先判断三边取值是否合法以及是否符合构成三角形的条件。

3.求下一天(第二次作业7-9)
此题涉及到多个判定,我的想法是通过多个if判断语句来解决问题,事实证明的确可行,但是显得代码过于冗长,同时此题具有许多非法日期的判定容易被遗忘,需要细心进行代码设计和运行测试,保证代码的正确,并且第三次作业中难度较大的两题也是以本题为基础进行功能拓展,所以本题意义重大。
本题只有一个类,类中有四个方法,分别用来判断是否为闰年,检查输入日期是否合法,以及用来判断下一天的日期,由于检查输入日期是否合法存在缺陷,无法检测无效日期,故在主方法中增加了判断是否为无效日期,该方法较为不妥,在后续作业中已经改进。

4.定义日期类(第三次作业7-3)
本题定义了一个日期类,在类中定义了相关的成员变量以及成员方法。该类用于求输入日期的下一天,功能与第二次作业的求下一天(7-9)相似,基于对于类的定义和使用,将代码稍加修改即可移植。
类中方法包括了设置年份,获取年份,设置月份,获取月份,设置天,获取天,判断是否为闰年,检查日期是否合法有效,获取下一天。其中检查日期是否合法有效既要判断输入日期是否合法,同时还要判断输入日期是否为有效日期,避免无效日期。
获取下一天需要注意月末下一天月份需要增加,以及年末下一天年份需要增加,同时还需要注意该年是否为闰年。

类图:

复杂度:

5.日期类定义(第三次作业7-4)
本题在上一题的基础上扩展了功能,分为三个功能,求下n天,求上n天,以及求两个日期间相隔多少天。类中方法包括检测输入的年、月、日是否合法,判断year是否为闰年,取得year-month-day的下n天日期,取得year-month-day的前n天日期,比较当前日期与date的大小(先后),判断两个日期是否相等,求当前日期与date之间相差的天数,以“year-month-day”格式返回日期值。
第一个功能是在前一题求下一天的功能下进行拓展,实现起来难度不大,其中上一题部分代码可以进行移植。第二个功能则与第一个功能相反,只需进行相反的操作即可。在操作中,认为对月份的判定过于冗长,于是选择改用数组,让代码更加清晰。第三个功能是求两个日期相差的天数,在此之前需要先判定比较日期的大小(先后),以及日期是否相等,才能求两个日期相差的天数,最后按照要求格式返回日期值。

复杂度:

三、踩坑心得
1.要及时开始作业,否则会时间不够,同时需要系统的去学习java才能够取得成效,否则效率很低。(附第一次作业没能及时完成图片)

2.一定要审清题意,仔细设计后再开始编程,否则会遗漏一些关键信息以及隐藏条件,犯低级错误。例如第一次作业求定积分(7-11),因为题目太长,一开始我选择直接用牛顿莱布尼茨公式求解,但始终不能通过测试点,不断修改代码也无济于事,最后认真审题,发现对积分方法是有要求的,题目让我们取中值计算,这才恍然大悟。


3.如果没能通过测试,不要急着把代码删了重写,既浪费时间也没有必要。一般编译错误则是出现了语法问题,只需按照提示去更正错误即可。若答案错误则可能是程序设计有问题,需要重新梳理思路,或者某一步骤出现了问题,可以进行断点测试。如果是部分正确,则是没有考虑全面,遗漏了一些隐藏条件,可以进行边界值测试和等价值测试检验。
4.如果遇到问题,要学会交流与讨论,有时候遇到了困难,自己冥思苦想也想不出来,上网查阅也没有答案,就需要去向别人请教,不耻下问从来都是一种好习惯。例如第二次作业中的判断三角形类型(7-8),其中有一个测试点是判断等腰直角三角形,最初我认为,等腰三角形不就是等腰三角形和直角三角形的结合体吗,只需要将这两个判断条件放在一起应该就可以了,结果测试点没能通过。然后我又去不停修改代码,都没能通过这个测试点。最终发现已经有人通过了这个测试点,于是决定去向他咨询。经过指点,我才明白java是不能进行精确运算的,实型数据之间的计算会丢失精度,所以要判断等腰直角三角形,只需判断直角两条边的平方和与斜边的平方和之间的精度就可以了。



5.编程最好要遵循规范,不光是因为老师要求,更多的是能够让自己的代码结构更加清晰明了,增强可读性,可维护性,以及可移植性。养成良好的编码习惯对以后的任务要求会更加得心应手,特别是要求团队合作时,良好的编程习惯能够大大提高团队的开发效率。
四、改进建议
1.三次作业中有几道题的功能需求其实是类似的,如果代码能够遵循单一职责原则,体现封装性,这样可以提高代码的可移植性,同时也能提高编程效率。
2.变量名的命名要遵守驼峰法则,做到见名知意,提高代码可读性。
3.编程避免无效代码,设计时要考虑周全,尽量不遗漏任何情况,同时最好能够进行注释,提高代码可维护性,否则时间长了,自己都看不懂自己的代码。
五、总结
第一次接触java,首先简单谈谈我对java的认识。java是一门面向对象编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的指针概念,换成了引用。因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
经过了三次作业的训练,基本掌握了java的基础语法,熟练掌握了类的使用;认识了面向对象的三个特性:封装,继承和多态,作为面向对象程序设计的三大支柱,封装,继承,多态,他们在程序设计的过程中都扮演着不同且十分重要的角色。封装对于程序的意义在于,它可以保护代码或者数据,防止它们被我们无意中破坏,并且可以保护其成员的属性,不会让类以外的程序直接访问和对其进行修改,最重要还可以隐藏方法细节。而继承,最主要的作用便是实现代码的重复使用,大大的节省了开发的时间。同时也学习了一些有用的测试方法:断点测试、边界值测试、以及等价值测试。但光掌握这些是远远不够的,还需要更加升入的学习,例如arraylist、stringbuilder、stringbuffer等等,这样才能更加熟练的运用java这个工具去解决问题。
在作业中,我所遇到的问题大多属于无法完成编译的错误,每次我都会在书上或者网上查明方法的使用,这让我认识到,我对于编译器自带的方法的使用并不熟悉。在练习中,出现了在编译器中正确却在pta中显示运行超时的问题,在查找资料的过程中,我明白了pta中对于时间复杂度过高的代码是无法通过的,之后我调整了代码,降低了时间复杂度之后成功通过了该题。我们的Java导师龙哥是一个性格鲜明的人,同时也是一个很有意思的人,个人还是很喜欢他的教学风格,教学质量也是杠杠滴。由于java课程比较重要,所以课程内容可能会偏多偏难,作业量和难度也会随之上升,但是没有付出就没有收获,希望在以后的训练中能够不断提高我的编程能力,训练我的编程思想。

浙公网安备 33010602011771号