OO_表达式求导专题_小结

概述:

在这三次OO表达式求导,我大体上采取了两种构造方法,先后实现了多项式求导、简单表达式求导、带有嵌套的表达式求导三个问题,虽然完成了任务,但仍然存在着不少缺点,

共性上有两大很致命的缺点:可拓展性差,这也导致我每次作业基本都是从零开始写程序;仍然是“面向方法”,对面向对象的理解还不够深入,接下来我将对三次作业逐一进行分析。

第一次作业:多项式求导

一、     分析自己的程序结构

如图所示,我创建了两个类:

          

 

Poly类将进行了判断表达式正误,存储、合并表达式的操作,将表达式按项存储在HashMap中

DerPoly类中,包含了main函数和求导操作,求导方法是直接按照x的幂的求导公式,之后再依次将项输出

以上便是我第一次作业的大体思路

二、     分析自己程序的bug

这次作业中,由于我在处理字符串是采用了trim(),导致开头结尾有非法字符时会无法识别,改正方法也很简单:去掉trim(),在正则匹配前后加上[ \t]*即可

三、     分析发现别人bug采取的策略

这次hack别人主要是两个点:

其一,和我类似的利用了trim(),但之前排除掉了\f,\v的可能。

尽管如此,由于trim()是去除所有小于空格的字符,故他没有考虑其他情况,我用\u0019 hack到了他

其二、正则爆栈问题

 

第二次作业:简单表达式求导

一、     分析程序结构

本次我的思路与上次大体一致,创建了三个类

         

 

Main类:就放置了main函数,

Dict类:每个Dict类存储结构类似{[powerX,powerSin,powerCos]:coef, [powerX,powerSin,powerCos]:coef,……}

          同时还具有打印方法,将字典中内容打印出来

Poly类:最重要属性为存储幂与参数对应关系的字典

其中在构造方法Poly()中判断表达式正误,并将表达式按项存入

      derPoly()方法可对当前表达式求导,并将结果存入一个新的dict中

求导方法:

其中的求导方法我直接计算了(a*x^n1*sin(x)^n2*cos(x)^n3)的导数,直接套用公式,虽然简单,但可扩展性差,让我在第三次作业吃了不少苦头通过以上三个类

二、     分析自己的bug

该次由于我的优化较为简单,没有被发现bug

三、     分析自己找到的bug

这次我找到的bug出在了“sin(x)*”这样的表达式,可能是在分割项的时候犯下错误,导致原本应该输出WF的输入得到了结果

 

第三次作业:带有嵌套结构的表达式求导

一、     分析程序结构

这次由于有了嵌套结构,识别表达式的问题别复杂了不少,这也导致我之前那种思路完全无法使用,因此,我采用了另一种应用嵌套的思路,但仍然没有摆脱面向方法的思路具体说来,我总共建立了三个类

 

           

 

Main类:只有main函数

Expression类:负责处理表达式,判断是否合法,处理方法:

先将表达式分割成项,判断是否合法,判断方法:

将每项分割成因子,依次判断是否是因子来进行正确性的判断

(若出现嵌套情况,嵌套为项或表达式都可递归调用上层方法,完成判断)

   Der类:负责对表达式进行求导,求导方法同上:

             将表达式分割成项,对项求导

                将项分割成因子,对因子求导

                   若不是简单因子,调用上层方法

二、     分析自己的bug

我在求导时忽略了处理“^+”这种情况,导致被hack了数刀,不过还好很容易改正

另外,我忘记了在平方大于10000时输出WF,好在这次无法hackWF,逃过一劫

三、     分析自己找到的bug

我找到了和我类似的bug,也是对“^+”处理出错+

 

 

Applying Creational Pattern

   在第三次作业中,可以更多的利用面向对象的思想:

   对于表达式、项、因子依次创建类,将判断正误与求导融合,处理时分别面对表达式对象,项对象,因子对象,从而进一步应用面向对象的思想

posted @ 2019-03-24 20:47  17231007  阅读(223)  评论(0编辑  收藏  举报