前言
第一单元的三次作业围绕表达式求导展开,表达式由一开始的加减项到增加三角函数再到多项式和三角函数的嵌套,由易到难,难度的递进也实现了函数求导功能的完善。坦白说这三次作业对之前没有接触过面向对象思想的我来说是一次挑战。老师在理论课上强调层次划分的思想,但自认为依然在面向过程编程,在实现功能的过程中存在着很多欠考虑的地方,前一次作业设计的漏洞和不完善对后一次作业的影响也比较大,过程比较艰辛。但总的来说,在这一单元的作业中收获不少,借此次博客从以下几个方面对第一单元的作业进行总结与反思。
一、作业回顾
第一次作业
第一次作业是简单表达式(仅包含幂函数)求导,这次作业的难度在现在看来不算高,主要难点在于判断表达式非法,第一次作业让我对正则表达式有了粗浅的了解,使用方法依然很幼稚。由于这次的实现逻辑不算很复杂,出现了一个类硬刚的情况,感觉自己的思想没有从C语言跳出,还是函数的堆砌,一步一步实现功能。
度量分析
第一次的作业的想法比较自然,首先判断空白符有无WF情况,然后去掉空白符,进行正则匹配判断表达式,由于每个因子只有五种合法形式,若匹配则截断,再进行下一次匹配。整个字符串匹配完成后进行“+-”符号分割计算,最后进行简单优化并输出。
公测及互测bug分析
由于对输入的处理是用正则表达式匹配然后截断字符串的操作,对于常数与x直接相连以及多个x相连的WF情况未考虑完善,同时在处理因子的时候额外考虑了零次幂或系数为零的情况并对结果进行了化简,反而导致了在强测中出现bug。互测中被hack有延续强测中出现的bug,还因为未考虑“\f\v”而被hack。
第一次作业输入输出比较简单,而且是第一次互测,因此采用了一个个输入测试数据并检查输出的方式。输入数据正确并且有正常输出的代码基本没有出现问题,大多是在判断WF上出现了bug。在构造测试数据时,主要考虑了自己在写代码的时候碰到的特殊处理点,比如x叠加,表达式各处的空白符等。
第二次作业
第二次作业在第一次作业的基础上增加了三角函数因子,由于第一次对正则表达式有了初步的认识,这一次作业在判断WF的时候没那么磨人,重心也就放在了表达式计算和处理输出上,但是因为是在第一次作业的基础上进行修正和增加功能,所以依然是一个类(也导致了在第三次作业中遇到很多问题),没有什么延展性可言,现在想来,应该反思自己的态度问题,不能偷一时的懒,是要还债的。
度量分析
第二次作业延续了第一次的判断WF方法,相较于第一次判断了hasNextLine()。
然后用“+-”分割项,“*”分割因子,分别进行计算,最后进行简单优化并输出。总的来说,完成情况并不理想。
公测及互测bug分析
这一次作业的bug主要是表达式简化,犯了一个很愚蠢的错误,删去了结果中的“^1”,结果导致了强测未完全通过并且被多次hack,这给我最大的教训就是不要瞎化简,思维漏洞很可怕,所以思考一定要全面,这也是在之后的作业中自己要重点注意的地方,有意识的培养思维。程序的安全性优先。
这次的互测借用了同学的对拍程序,构造数据然后然后进行输出检测,经过第一次作业,感觉大家的WF判断更加完善了,出现的bug也集中在了计算和输出上。
第三次作业
第三次作业出现了嵌套,难度陡增,同时自己也因为前两次作业没有好好进行构思所以在第三次作业中遇到了很多问题。但是自己也是在这一次作业中有了一点点面向对象的感觉。整体架构相较于前两次有了很大的不同。
度量分析
第三次作业是最具有挑战性的,对因子,项,表达式建立类,采用了递归下降的思想,分割字符处理。
公测及互测bug分析
这次在公测中未被检测出bug。在互测中由于对输入的处理考虑不全面以及WF的判断而被hack。
这一次在互测中我尝试着去读其他同学的代码,但由于大家的实现方法不同以及代码量太大,感觉还是挺吃力的,并且在互测中也看到了大家优化的不同,有同学进行了优化但是导致输出偏差,有的同学输出比较冗长,但是安全性很高,当然也有同学安全性和性能都很棒,对方完美。
二、反思
第一单元的作业整体来说结果不那么令人满意,大概是面向对象的初体验,我更愿意把这三次作业当做试错的过程,不断犯错不断尝试。从面向过程到面向对象的思想转换需要练习需要总结,我也在渐渐感受到java功能的强大,但是常常会有一种为了完成作业而完成作业的感觉,这是自己的态度问题,需要在以后的作业中提醒自己,希望能真正有所收获(虐在其中)。
在互测环节中,我会很功利性的着重去找其他同学的bug,忽略了从其他同学的代码中汲取精华,一个bug屋七八个人其实给了我们很多机会可以去学习其他同学的算法思想和实现方法(也能真切的感受到自己和其他同学的差距),从讨论区和与同学交流的过程中也能让我收获很多,但是总是感觉自己找bug的方式比较幼稚,关于能够实现自动测试的测试文件,我目前了解的还不多,应该找时间系统的学习一下这方面的知识和技能。
然后就是关于代码的优化,安全性大于性能是要时时提醒自己的一点,并且在每次作业的实现过程中,应当考虑到后面增加新的需求怎么办,这个单元的作业很大的不足就是延展性不够,在以后的作业中要重点关注。
最重要的一点:
想好了再动手!!!!
尽管设计思路的过程比较痛苦,但是想好了大体思路以及某些细节,代码才会写得顺手,也便于debug。
总的来说这一单元对面向对象有了粗浅的认识,期待在以后的学习中能探索更多,收获更多。