2019北航OO第一单元作业总结

一、前三次作业内容分析总结

前言

前三次作业,我提交了三次,但是有效作业只有两次,最后一次作业没能实现多项式求导的基本功能因此无疾而终,反思留给后文再续,首先我介绍一下这三次作业,三次作业围绕着多项式求导展开,输出目的都是一致的,即对输入的多项式进行求导,将求导结果打印到显示屏,作业难度递增,每一次对多项式的要求都更加宽松,相应而言,求导的难度也就加大,从简单而固定的多项式到复杂而灵活的多项式,处理的难度随之加大,从正则表达式解决一切到继承接口多态的引入,java代码也越来越复杂,那么就让我们来分别剖析一下这三次作业。

1、第一次作业

作业要求简述:多项式求导,多项式由多个项之间用加减运算符连接而成,项由有符号整数和幂函数的乘积构成,支持1*x和x^1的省略形式,支持+1*x的省略形式,需要注意的是多项式前面可以有一个符号,而有符号整数之间不可以出现空格,其余地方都可以出现空格,以上就是这次作业要求的提炼;

作业解题思路:本次我的作业架构:

 

实现简述:

主类为DerivationPolynomial,提供函数入口,然后调用Polynomial进行合法性检查,在本次作业中我使用了大正则匹配法,(这也注定了本次作业要被刀爆),在多项式类中,首先遍历字符串,检查是否存在不合法的字符,然后对空格不合法的情况进行了罗列,最后进行大正则匹配,在检查合法后,将字符串所有的空格去除,并且将多符号合并

Polynomial类检查合法性后实例化Derivation进行求导,利用正则表达式的捕获组将字符串的每一项单独提取出来,存入数组中,然后创建Term类,Term类中提取了每一项的系数指数和符号,并且创建了求导方法,将求导结果返回,然后实例化MergeLikeTerm类进行多项式合并,合并的算法非常简单,就是判断是否有指数相同的项,有则合并,并将其中一项标记为不合法,重写toString类,将标记为合法的项输出

测试时存在的问题:

1、自己的bug:主要有两处,一是在空格的合法性检查的时候没有罗列完全,少考虑了在指数上有符号整数间存在空格的情况;二是算法本身的问题,大正则表达式爆栈,虽然在本地测试中并没有出现爆栈的情况,但是评测机还是认定了我的爆栈,只能说大正则的做法本身就是一个巨大的bug;

2、第一次刀别人的bug:刀人首秀的战绩并不理想,在刀人实验中发现了自己的bug,同组的小伙伴也有中招的,用自己的bug拿到了第一滴血可谓是有点心痛,还发现的bug就是空格输入出现RE的状况,至于刀人的方法,采用先盲刀(疯狂构造样例)+逐个侦破(看被人的代码),但是可能是由于第一次作业比较简单,并没有发现过多的bug

3、暴露的问题:大正则回溯导致爆栈、整体架构不清晰,类之间的依赖关系明显

本次作业的UML图和类的复杂度分析

 

 

2、第二次作业

作业要求简述:在第一次作业的基础上增加了三角函数sin(x)和cos(x),要求是三角函数保留字内不可以有空格,而且三角函数的参数里只能是x,不能是其他函数,除此之外,因子之间组合形式更加复杂,项可以是多个因子的乘积,而且第一个因子如果是1*的形式可以简写为+,-1*可以简写为-,其他要求和第一次相同

作业解题思路:

 

实现思路简述:三个类分别表示多项式、项、因子,项和因子创建Arraylist来储存,每一项都可以固定为常数*幂函数*sin(x)*cos(x)的形式,这样进行求导

测试时发现的问题:

自身的bug:在互测和强测阶段发现了两个bug,一是在指数上存在多符号的情况时没有WF,这是在预检查阶段没有罗列所有的情况,考虑欠妥,这和第一次作业的bug非常类似,也显示了我思维上的短板;二是在化简的时候出现了错误,这也是很多人的共性错误,在化简的时候直接检测输出的字符串中是否有1*和^1,有则直接替换为空串“”,这样^10和11*的情况就会出错,也是情况考虑不周全,没能兼顾所有情形

刀别人的bug时主要使用构造样例,由于本次作业我在设计阶段就考虑了很多比较刁钻的样例,因此在互测的时候直接使用这些样例就能够发现很多bug了,因此我也希望以后的作业设计阶段就能够尽量多地考虑到一些比较极端的样例,一方面可以在改善自身的代码防止踩坑,另一方面在互测阶段也可以直接使用,非常方便

暴露的问题:考虑不周到,很多并不是非常极端的样例没有考虑到,化简的算法没有好好想,bug较多

本次作业的UML图和参数分析:

3、第三次作业

 作业要求简述: 与前两次作业相比,第三次作业在多项式求导上进一步加大难度,增加了三角函数里的嵌套,并且增加了表达式因子,因子不再是简单的常数,三角函数或者幂函数,而括号括起来的表达式同样可以作为因子出现在某一项中,三角函数内的参数不再是x,而可以是任何表达式

本次作业我没有能够完成,没能在规定时间内实现基本功能,但是大体的框架是没有问题的,下面介绍一下我的框架:

 

遇到的困难:在其他部分没有问题,卡在了嵌套的问题上,使用递归下降法,但是由于类与类之间层次不清晰,分工不够明确,对象的功能不单一,总会出现各种各样的bug,最终没能在ddl前被捞起来,十分遗憾

 

二、反思与总结

第一单元的作业对于Java初学者来说确实是很好的练习,对于程序的鲁棒性和面向对象的结构都完成了从无到有的转变,经过三次作业也发现了自身知识储备上的不足,在程序的鲁棒性方面,如何正确高效地使用try catch来捕获异常;对于继承和接口的应用还不够熟练,每一个对象功能的单一性不能实现,很多类的有相互依赖关系的,这也直接导致了我第三次作业的失败,可以说虽然积累了一些经验,但是还是有很多知识等着我去学习和理解,加以实践。我的程序架构基本上都是比较主流的,与很多同学的比较类似,也可以说是实现起来相对容易的架构,在表达式的化简上,我没有下太多功夫,这也是强测阶段没能进入A房的主要原因,对于第三次作业的失利,我认为主要原因是懒惰,没有提早写,花费的时间不够,还有就是架构的不清晰,希望在以后的作业中能够做好时间分配,完成所有的作业。

2019北航OO第一单元作业总结

全文结束