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

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

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

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

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以及爆栈问题。

四.总结与感悟

这三次作业让我粗略认识了什么是面向对象,学会用对象的观点思考问题。第一次作业我依然不太具备面向对象的观点,代码更像是函数较多的面向过程代码,第二次在第一次的基础上将不同层次的对象隔离开分级处理。第三次我认为已经是一个面向对象风格比较显著的代码了,可是在代码复用,也就是继承上依然有所欠缺。

转载于:https://www.cnblogs.com/lzyckd1/p/10604908.html

oo第一次博客-三次表达式求导的总结与反思相关推荐

  1. 【面向对象设计与构造】第一次博客作业

    [面向对象设计与构造]第一次博客作业 一.程序结构分析 1. 第一次作业 类图 由于第一次作业难度较低,实现起来也不需要很复杂的算法,因此在编写程序的时候只建立了两个类,Main类主要负责多项式的读入 ...

  2. 牛客题霸 [表达式求值] C++题解/答案

    牛客题霸 [表达式求值] C++题解/答案 题目描述 请写一个整数计算器,支持加减乘三种运算和括号. 题解: 没有除法emmm 我们从头开始依次判断每个字符 如果是左括号,我们就找右括号,并截取括号内 ...

  3. 2022北航敏捷软件工程 第一次博客作业

    2022北航敏捷软件工程 第一次博客作业 项目 内容 这个作业属于哪个课程 2022年北航敏捷软件工程 这个作业的要求在哪里 个人阅读作业-阅读和调研 我在这个课程的目标是 了解软件工程的方法论.在实 ...

  4. 古文字识别助手与众包平台——项目博客三

    古文字识别助手与众包平台--项目博客三 背景: 由于骨刻文项目存在许多骨刻文的静态图片,为了前端能够快速获取到相应的图片,后端打算再部署一个nginx静态服务器,用来存取在项目中客户上传的各种图片.同 ...

  5. 2022软工K班第一次博客作业

    2022软工K班第一次博客作业 一.自我介绍 二.思考 三.未来的期望 一.自我介绍 1.1 自我介绍 项目 内容 姓名 林毅 性别 男 昵称 云淡风轻/平安是福/上善若水 学号 012004114 ...

  6. OO_2019_第一单元总结——表达式求导

    一.基于度量的程序结构分析 首先给出Complexity metrics中参数的含义: ev(G):基本复杂度是用来衡量程序非结构化程度的,非结构成分降低了程序的质量,增加了代码的维护难度,使程序难于 ...

  7. 深度学习入门笔记(三):求导和计算图

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  8. java求导数_OO_JAVA_表达式求导

    OO_JAVA_表达式求导_第一弹 ---------------------------------------------------表达式提取部分 词法分析 ​ 首先,每一个表达式内部都存在不可 ...

  9. Mathematica对函数表达式求导并设置为新的自定义函数

    自定义函数 自定义函数需要注意亮点 1.最好使用 := 而非 = 2.定义时等式左端函数变量有下划线,被称为"空白" Wolfram 系统变换规则最强有力的方面或许是它们不仅能用于 ...

最新文章

  1. 【pytorch】nn.LSTM的使用
  2. 3.7.1 读取输入
  3. JQuery操作CheckBox和Radio
  4. Oracle 中对表空间使用情况进行查询
  5. 这是霄哥的天气预报,屌不屌?
  6. 小白的python进阶历程------01.初识python
  7. 多级队列调度算法可视化界面_冷月手撕408之操作系统(8)-处理机调度
  8. 什么是 “马太效应” ?
  9. HDU2476:String painter(区间dp)
  10. 最近一段时间经历的事情即做事方式的总结
  11. 【Python 2.7】xlrd读取Excel文件
  12. 矩阵分析相关证明(一) —— 正交与投影
  13. J2ME开发入门专题系列之一:J2ME概述
  14. css实现图片水平居中对齐
  15. 优质数据平台如何打造?从网易云音乐看内容生态的运营法则
  16. 数学三次危机(一)毕达哥拉斯学派的数学发现
  17. 深入理解Object.entries()
  18. spring boot mybatis 日志打印配置
  19. 死锁简述(死锁产生的四个条件,预防死锁)
  20. 7-36 大炮打蚊子(15 分)

热门文章

  1. 电商库存设计mysql redis_基于redis实现的扣减库存
  2. python generator object_python - 将生成器对象转换为列表以进行调试
  3. python日期格式转换成13位时间戳_python生成13位或16位时间戳以及反向解析时间戳的实例...
  4. java 上传文件到服务器_java上传文件到OSS云服务器(二)
  5. python绘制正方形、利用turlr_《像计算机科学家一样思考Python》学习笔记(四)...
  6. c语言程序申请管理员权限,vc 软件 要管理员运行 vc 管理员权限运行
  7. 小程序监听点击右上角按钮_朋友圈支持应用直达、公众号小程序支持行动按钮文案、原生页拉取...
  8. phoshop cs6软件提示试用版已过期,怎么办
  9. Android开发笔记(十三)视图绘制的几个方法
  10. python 字典默认会引用 除非深拷贝