OO第一单元总结

多项式求导作业总结

  面向对象设计与构造这门课程对我来说很有挑战性,第一单元的三个任务就告诉我了什么叫万事开头难。

第一次作业分析

  由于是补选进入课程,第一次作业的可用时间只有半天,虽然最后没有来得及提交有效作业。但我也及时掌握了课程的评价体系和提交作业的git方法。

第二次作业分析

  第二次作业是对包含正余弦三角函数的求导,这次作业让我第一次采用了面向对象的编程思想。将对一个多项式的求导的大问题分化为小问题由四个类的小问题来完成。分别是:只包含底数和指数的因子(Factor);将各个因子相乘得到的项(Term);各个项加减后产生的多项式(Polynomial);以及负责输入输出的Main函数。

 

 1.Factor类实现方法

  采取指导书内所提供的正则表达式方法,匹配输入的字符串并用group捕获指数。采用四个Biginteger分别存储常数系数,幂函数的指数,正弦函数的指数,余弦函数的指数。将捕获的指数存储到Biginteger中。对四种项分别求导,并将求导后的指数存储在新的Biginteger中。定义返回各个指数的方法,并注意存储各个项的符号。

2.Term的实现方法

  Term是factor相乘,求导时需要各个项求导前后的表达式。(连乘求导公式f=u1u2...un;f'=u1'u2...un+u1u2'...un+...+u1u2...un')。建立两个Factor的ArrayList分别存储求导前和求导后的项。Derivative方法完成项的求导,双层循环将每一个因子的导数与下标不同的因子相乘再放入列表中作为累加。

3.Polynomial的实现办法

  多项式类是这个代码中功能最多的一类,包括对输入表达式正确性的判断,将表达式化简以因子为单位进行划分,将求导后的各个项累加并且输出。定义了承接Term类的terms列表以及用来输出的项的nfactors列表。Simp方法去除表达式中的空白和多余正负号(可能有bug,因为有数据没通过)。CheckFormat方法检测有没有不和规则的符号。逐步匹配每一个因子遍历表达式,得到一个项后存入terms内删除此段继续匹配,直到表达式为空。Derivative方法调用Term类的derivative方法并对terms列表中的每个项求导添加到nfactors列表中。两个字符串类函数oneFactor与oneTerm分别将因子和项进行输出化处理,一个给因子添加乘号和乘方号,另一个将因子连接成项并添加加减号。最后connect方法将所有项连接并输出。

 

 UML图

第三次作业分析

  第三次作业引入了三角函数的嵌套,这对程序的设计复杂度有极大的要求,因为不合理的设计可能会导致程序陷入多层嵌套。采取了算法课中提到的“分而治之”思想。但由于个人代码能力不足,未能在有效的时间完成程序的需求功能。没有通过中测。

Bug分析

  主要分析第二次作业的中测bug,由于在符号的处理上不够清晰导致符号不规则的数据不能完成正确求导。如+ + + - - - + - sin(x)**2 - + 6*x**4 类的数据。在互测过程中因为没有合并同类项的问题被测出15个bug,不少同学用了树和Hash表进行化简,主要还是自己准备不足Java掌握不透彻,之后要多加改正。评测时我也没搭建自动机,但是利用一些边界值和特殊数据还是能找到同学代码的bug,比如常数,大指数函数等。

总结与反思

  互测过程发现同学们的代码确实比我更加简洁清晰,同时也运用了不少我还没掌握的代码方法。我在代码风格上的得分是零分,这一点反映出我综合代码能力很弱,处理难问题的思路混乱,选择的方法也比较笨拙。在完成作业的基础上,还是要多学习,掌握更好的设计方法并注重和同学们的交流。不要自己在一个问题上钻死角,学习和思考相结合才能更快的提升。

posted @ 2020-03-19 21:11  刘家琪  阅读(128)  评论(0编辑  收藏  举报