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
在第三次作业中,可以更多的利用面向对象的思想:
对于表达式、项、因子依次创建类,将判断正误与求导融合,处理时分别面对表达式对象,项对象,因子对象,从而进一步应用面向对象的思想