一.问题回顾与基本设计思路

三次作业依次是多项式表达式求导,多项式、三角函数混合求导,基于三角函数和多项式的嵌套表达式求导。

第一次作业想法很简单,根据指导书,我们可以发现表达式是由各个项与项之间的运算符(+,-)组成的,而每个项是由因子与因子间的运算符(*)组成的。对于首项和项的首个因子可能会出现特殊情况。

因此,我认为可以用面向对象的思想来解决这个问题。对象一共有两类,第一类是项,第二类是因子。具体实现如下:

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第一次博客-三次表达式求导的总结与反思的更多相关文章

  1. OO第一次博客作业

    OO第一次博客作业 一.三次作业的bug反省 1.自己发现别人的问题 (1)输入处理的问题,比如第一次作业,主要就是处理输入的字符串,然后有同学的正则表达式有问题,则对于一些错误输入就不能正确判断. ...

  2. oo 第一次博客作业

    oo 第一次博客作业 早在大一就听说了oo的各种传奇故事,大二下学期终于也开始了我的oo之旅. 基于度量来分析自己的程序结构 第一次作业 类图分析 耦合度分析 可以看出在第一次作业中,我的耦合度非常高 ...

  3. OO第一次博客

    过去的三周里我们完成了表达式求导的程序设计与构造.表达式求导程序,大致思路是实现一个表达式类,支持表达式的输入.求导运算和输出功能.可能的话,还可以增加表达式的化简方法,从而得到更高质量的输出结果.总 ...

  4. OO第一次博客作业--第一单元总结

    OO第一单元总结 面向对象设计与构造的第一单元,对“面向对象”的概念还根本不理解不熟悉,只觉得需要“分模块”,但不知道怎么分,分多少模块,怎么根据需要的模块的功能建立类.学习的进度又太慢,根本跟不上出 ...

  5. OO第一次博客总结

    虽然早在开学之前就已耳闻过OO这门课的威力,也在寒假自学了一些java的语法,但在真正面对OO这样的工程训练时才发现寒假所学的那点语法简直不值一提,也深刻的感受到在这个过程中自己的提升确实很快,毕竟d ...

  6. 2019年北航OO第一次博客总结

    一.基于度量对程序结构的分析 1. 第一次作业 1.1 基于类的分析的度量 首先,基于类的属性个数,方法个数,每个方法的规模,每个方法的控制分支数目,类总代码规模等特征对本次作业的结构进行分析. 1. ...

  7. OO第一次博客作业(第一单元总结)

    Q:菜是绿的,鸡是黄的,那菜鸡是什么颜色的? A:红的,强测全WA了,能不红么. 菜不菜的问题先不说了,认真研究一下这次的题目,以及WA的原因吧. 程序结构简析 三次实验的核心结构都是差不多 第一次的 ...

  8. 始入OO课程的殿堂,初识面向对象的奥妙——OO第一次博客总结

    当我满怀期待叩开OO的大门,却发现宝藏藏在层层阻难之后 第一次作业 1.度量分析 >关于第一次作业的metrics图分析没有出现标红的McCabe Cyclomatic Complexity或者 ...

  9. OO第一次博客作业总结反思

    使用了masteruml插件来生成类图和metrics插件分析代码 第一次作业 1.UML类图 >在第一次作业中,使用了两个类,代码中有没有使用的变量与函数,为平衡两个类的内容,我将输出函数放在 ...

随机推荐

  1. Identity用户管理入门二(显示用户列表)

    在Controllers中新建AccountController,并在构造方法(函数)中注入SignInManager,UserManager UserManager   用户管理(注册,查找,修改, ...

  2. ASP.NET Core Web API 教程 - Project Configuration

    ASP.NET Core Web API 教程 本系列文章主要参考了<Ultimate ASP.NET Core 3 Web API>一书,我对原文进行了翻译,同时适当删减.修改了一部分内 ...

  3. 使用私有gitlab发布自动生成版本号和标签(version和tag)(骚)

    设置 semantic ,自动生成版本号和标签 FROM node:14-buster-slim LABEL maintainer="wangyunpeng" COPY sourc ...

  4. CentOS8部署tftp

    tftp:简单文本传输协议,而ftp:文本传输协议.可以把tftp看成是ftp的精简版.tftp用于免登录传输小文件,tftp服务端监听在udp协议的69端口tftp简单的工作原理: tftp服务端与 ...

  5. 一生挚友redo log、binlog《死磕MySQL系列 二》

    系列文章 原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 一生挚友redo log.binlog<死磕MySQL系列 二> 前言 咔咔闲谈 上期根据 ...

  6. python学习笔记(三)-列表&字典

    列表: 一.列表操作"""Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素.比如,列出班里所有同学的名字,就可以用一 ...

  7. django forms的常用命令及方法(一)

    根据别人网上发布,个人爱好收集 Form表单的功能 自动生成HTML表单元素 检查表单数据的合法性 如果验证错误,重新显示表单(数据不会重置) 数据类型转换(字符类型的数据转换成相应的Python类型 ...

  8. 解决samba和SELINUX 冲突

    在使用Samba进行建立Window与Linux共享时,要是不能访问,出现"您可能没有权限使用网络资源", 那就是SELinux在作怪了 要是想让共享目录能访问,可以使用命令 #s ...

  9. 「含源码」关于NXP IMX8 Mini的图形开发指南(GPU)案例分享!

    前言 Graphical Demo框架提供了对平台相关依赖的抽象.Graphical应用的通用封装,如模型加载.纹理加载.着色器编译等,以及其它一些通用的应用逻辑处理的封装,使得使用框架的开发人员(以 ...

  10. Python3入门系列之-----列表

     列表 列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. ...