oo第一次博客-三次表达式求导的总结与反思
一.问题回顾与基本设计思路
三次作业依次是多项式表达式求导,多项式、三角函数混合求导,基于三角函数和多项式的嵌套表达式求导。
第一次作业想法很简单,根据指导书,我们可以发现表达式是由各个项与项之间的运算符(+,-)组成的,而每个项是由因子与因子间的运算符(*)组成的。对于首项和项的首个因子可能会出现特殊情况。
因此,我认为可以用面向对象的思想来解决这个问题。对象一共有两类,第一类是项,第二类是因子。具体实现如下:
1.读入,并构造一个合法ascii码数组,对于合法的字符char,legal['char']=1,之后扫描表达式,判断是否有非法字符。
2.判断表达式第一个非空格或制表符是否为+或-,若否,则将表达式接在"+"后。
3.构造正则表达式,读取项与项的前置运算符。
4.对于每个项,构造正则表达式读取各因子并存储其指数和系数,这时,对于每个项,可以运算得到唯一的系数与指数。
5.求导并输出。
而第二次作业是与第一次作业类似的,每个项可以表示为系数*sin(x)^指数*cos(x)^指数*x^指数,完全在第一次作业上增写。
第三次作业是增加了表达式因子,定义(表达式)为因子,并规定sin或cos括号内可以为因子,其余要求几乎一致。这是一个递归定义,很自然的我们想到了递归下降法。
在这里,我发现我掌握的正则表达式不能够直接处理这种情况了,联想到数据结构所学习的堆栈,我采取了在第二次作业基础上加入堆栈的写法。
首先构建有限状态机来提取项,这里实际上是使用的是下推自动机。首先先确定几个状态分别表示起始状态,中间状态和结束态,并加入堆栈,当空栈push或者结束栈不空时判为Wrong Format,否则,将该子串作为一个项传入因子处理的状态机。
之后,对于项,同样使用堆栈和状态机,根据括号匹配以及括号外'*'来找出每个因子。
在处理因子时,使用了正则表达式,匹配合法整数,x^n,sin,cos,当遇到sin或cos时,使用堆栈找出其作用的串,去掉首尾括号判断是否为表达式因子,如果均无法匹配,判断是否为表达式因子。
求导亦需要抓取项、因子的步骤,所以将上述部分写作几个类进行复用。
对于求导,链式法则可以简单地用递归处理。我们定义f为一个函数,其因变量为字符串str,则对于函数f(str)求导可以表示为str'*f'(str),进行递归处理,当str为一个合法整数或者是x^n形式时,就可以完成最后一步求导,结束递归。
在这里我对于判断表达式合法与求导进行了保守的处理,没有一边判断一边求导而是先完整判断表达式再求导,这样的好处是避免了边判断边求导是为防止wrong format而不得不存储所有待输出结果,但是会消耗更多的时间。
优化只写了最基本的化简,我觉得可以加上将多重嵌套括号进行化简。
二.类图绘制
第一次作业

第二次作业

第三次作业

三.bug
第一次最为惨烈,有一个重大的bug,是因为我优化时规定当系数为0则不输出,但是忽略了所有项系数均为0时要输出0。
第二次主要是爆栈问题。
第三次是在递归底,在因子类中利用正则表达式判断时有误,使得当首项首因子有前置空白符时会误判wrong format以及爆栈问题。
四.总结与感悟
这三次作业让我粗略认识了什么是面向对象,学会用对象的观点思考问题。第一次作业我依然不太具备面向对象的观点,代码更像是函数较多的面向过程代码,第二次在第一次的基础上将不同层次的对象隔离开分级处理。第三次我认为已经是一个面向对象风格比较显著的代码了,可是在代码复用,也就是继承上依然有所欠缺。
oo第一次博客-三次表达式求导的总结与反思的更多相关文章
- OO第一次博客作业
OO第一次博客作业 一.三次作业的bug反省 1.自己发现别人的问题 (1)输入处理的问题,比如第一次作业,主要就是处理输入的字符串,然后有同学的正则表达式有问题,则对于一些错误输入就不能正确判断. ...
- oo 第一次博客作业
oo 第一次博客作业 早在大一就听说了oo的各种传奇故事,大二下学期终于也开始了我的oo之旅. 基于度量来分析自己的程序结构 第一次作业 类图分析 耦合度分析 可以看出在第一次作业中,我的耦合度非常高 ...
- OO第一次博客
过去的三周里我们完成了表达式求导的程序设计与构造.表达式求导程序,大致思路是实现一个表达式类,支持表达式的输入.求导运算和输出功能.可能的话,还可以增加表达式的化简方法,从而得到更高质量的输出结果.总 ...
- OO第一次博客作业--第一单元总结
OO第一单元总结 面向对象设计与构造的第一单元,对“面向对象”的概念还根本不理解不熟悉,只觉得需要“分模块”,但不知道怎么分,分多少模块,怎么根据需要的模块的功能建立类.学习的进度又太慢,根本跟不上出 ...
- OO第一次博客总结
虽然早在开学之前就已耳闻过OO这门课的威力,也在寒假自学了一些java的语法,但在真正面对OO这样的工程训练时才发现寒假所学的那点语法简直不值一提,也深刻的感受到在这个过程中自己的提升确实很快,毕竟d ...
- 2019年北航OO第一次博客总结
一.基于度量对程序结构的分析 1. 第一次作业 1.1 基于类的分析的度量 首先,基于类的属性个数,方法个数,每个方法的规模,每个方法的控制分支数目,类总代码规模等特征对本次作业的结构进行分析. 1. ...
- OO第一次博客作业(第一单元总结)
Q:菜是绿的,鸡是黄的,那菜鸡是什么颜色的? A:红的,强测全WA了,能不红么. 菜不菜的问题先不说了,认真研究一下这次的题目,以及WA的原因吧. 程序结构简析 三次实验的核心结构都是差不多 第一次的 ...
- 始入OO课程的殿堂,初识面向对象的奥妙——OO第一次博客总结
当我满怀期待叩开OO的大门,却发现宝藏藏在层层阻难之后 第一次作业 1.度量分析 >关于第一次作业的metrics图分析没有出现标红的McCabe Cyclomatic Complexity或者 ...
- OO第一次博客作业总结反思
使用了masteruml插件来生成类图和metrics插件分析代码 第一次作业 1.UML类图 >在第一次作业中,使用了两个类,代码中有没有使用的变量与函数,为平衡两个类的内容,我将输出函数放在 ...
随机推荐
- Spring事务管理回滚问题
Spring事务管理不能回滚问题 在前段时间学习SpringMVC的练习中,碰到声明式事务管理时,事务不能回滚的情况,通过查看博客和资料,解决了问题. 原因 导致Spring事务管理不能回滚的原因有两 ...
- 分组密码(三)DES 算法— 密码学复习(六)
在介绍完Feistel结构之后,接下来进入到著名的DES算法. 6.1 DES算法的意义 在正式介绍DES之前,首先介绍几个重要的历史时间节点. ① 1973年,美国国家标准局(NBS)向社会公开征集 ...
- 【OI】蛇形填数题的深入探究
题目:在 n×n 方阵里填入 1,2,...n×n, 要求蛇形填数.例如,n=4 时方阵为: 10 11 12 1 9 16 13 2 8 15 14 3 7 6 ...
- Groovy系列(4)- Groovy集合操作
Groovy集合操作 Lists List 字面值 您可以按如下所示创建列表. 请注意,[]是空列表表达式 def list = [5, 6, 7, 8] assert list.get(2) == ...
- python的列表和java的数组有何异同
今天面试被问到,自己学习一下. python的列表是可变长的,定义时不需要指定长度:pyhton是弱对象类型,python的列表存储的数据类型可以不相同:python的列表更加灵活,如可以通过''命令 ...
- YbtOJ#723-欧拉之树【莫比乌斯反演,虚树】
正题 题目链接:http://www.ybtoj.com.cn/contest/121/problem/2 题目大意 给出\(n\)个点的一棵树,每个点有一个权值\(a_i\),求 \[\sum_{i ...
- redis无法连接
Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: DENIED Redi ...
- String(char[] value, boolean share) {
记录一下今天被蠢到 1. 在观察StringBuffer类的toString方法时,发现了个没见过的方法 return new String(toStringCache, true); @Overri ...
- 前端VUE基于gitlab的CI_CD
目录 CI 1.Gitlab的CI 1.1 GitLab-Runner 1.2 .gitlab-ci.yml 1.3 配置.gitlab-ci.yml 1.3.1 Pipeline概念 1.3.2 S ...
- 残差网络resnet理解与pytorch代码实现
写在前面 深度残差网络(Deep residual network, ResNet)自提出起,一次次刷新CNN模型在ImageNet中的成绩,解决了CNN模型难训练的问题.何凯明大神的工作令人佩服 ...