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

前言

首先我介绍一下这三次作业,三次作业围绕着多项式求导展开,输出目的都是一致的,即对输入的多项式进行求导,将求导结果打印到显示屏,作业难度递增,每一次对多项式的要求都更加宽松,相应而言,求导的难度也就加大,从简单而固定的多项式到复杂而灵活的多项式,处理的难度随之加大,从正则表达式解决一切到继承接口多态的引入,java代码也越来越复杂,那么就让我们来分别剖析一下这三次作业。

1、第一次作业

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

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

实现简述:

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

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

测试时存在的问题:

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

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

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

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

 实现思路简述:三个类分别表示多项式、项、因子,项和因子创建Arraylist来储存,每一项都可以固定为常数*幂函数*sin(x)*cos(x)的形式,这样进行求导测试时发现的问题:自身的bug:这和第一次作业的bug非常类似,也显示了我思维上的短板;二是在化简的时候出现了错误,这也是很多人的共性错误,在化简的时候直接检测输出的字符串中是否有1*和^1,有则直接替换为空串“”,这样^10和11*的情况就会出错,也是情况考虑不周全,没能兼顾所有情形刀别人的bug时主要使用构造样例,由于本次作业我在设计阶段就考虑了很多比较刁钻的样例,因此在互测的时候直接使用这些样例就能够发现很多bug了,因此我也希望以后的作业设计阶段就能够尽量多地考虑到一些比较极端的样例,一方面可以在改善自身的代码防止踩坑,另一方面在互测阶段也可以直接使用,非常方便暴露的问题:考虑不周到,很多并不是非常极端的样例没有考虑到,化简的算法没有好好想,bug较多本次作业的UML图和参数分析:

3、第三次作业 作业要求简述: 与前两次作业相比,第三次作业在多项式求导上进一步加大难度,增加了三角函数里的嵌套,并且增加了表达式因子,因子不再是简单的常数,三角函数或者幂函数,而括号括起来的表达式同样可以作为因子出现在某一项中,三角函数内的参数不再是x,而可以是任何表达式 本次作业我没有能够完成,没能在规定时间内实现基本功能,但是大体的框架是没有问题的,下面介绍一下我的框架:

 二、心得

第一单元的作业告一段落了,但是它带给我的影响却还没有停止。在这篇的反思过程中我理顺了自己构建代码的思路,同时发现了自己的思维漏洞,即对对象的封装总是不完备,容易将许多对象耦合在一起,使得它们之间的逻辑复杂、难以理解且难以处理,这是我需要在之后改善的。其次就是评测机的构建给我一个新的理解问题的思路,从评测的角度去理解,有时候更容易理清思路。这次总结没有倾向于关注代码中的技术思路和细节,而更多地是我自己在构建代码时的想法,这主要是因为我尚没有特别掌握面向对象的思想,如果过多地关注技术细节,可能会使我更偏居一隅,无法从整体的角度去看待这几次作业的影响,因此在这里展示自己思考的心路历程,可能对我改善自己的思维方式更有裨益。

实现简述:

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

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

测试时存在的问题:

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

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

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

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

猜你喜欢

转载自www.cnblogs.com/ManGoStin/p/12539238.html
今日推荐