在过去的四个星期中,面向对象的作业以多项式求导为主题。通过这三次作业,我对面向对象程序设计有了一些入门的感觉,这三次作业的设计也越来越有面向对象的感觉,但是看完别人的设计后觉得自己还是有太多东西要学习,有很多设计不到位的地方。

第一次作业

第一次作业我的设计十分简单,还没有脱离面向过程的写法。Term的设计更像是一个结构体。

读入

在这次作业中,我直接使用了正则表达式读入,并使用ArrayList储存每个项。

储存,求导与合并同类项

项是以系数,次数二元组的形式储存,求导直接对系数和次数进行操作即可。

合并同类项时,再次遍历整个ArrayList,如果遇到次数相同的项,则合并输出。

第二次作业

第二次作业我已经试图引入类,但此时对类的理解不够深刻,此时设计的类更像是面向过程里的函数,是按照功能进行分类的,类之间没有关系和消息的交互,可以说设计的比较失败了。

在第二次作业中出现了两个严重的bug,第一个是因为手误将合并同类相的判断条件打错,第二个是忘了处理表达式前的空格。这两个错误都非常不应该,主要原因还是在于自己测试的不全面。当时没有自动化测试,每个测试都是依靠自己灵光一现,想起来什么就测什么,由于需要自己求导,所以测试样例大多数很短,测试很不充分。

读入

首先使用正则表达式读入一个项,再根据乘号将项分割成更基本的因子,使用ArrayList储存。

储存与合并同类项

构造系数,x系数,sin(x)系数,cos(x)系数的四元组,根据求导的公式求出导数,再遍历ArrayList,如果系数相同,则合并同类相。

第三次作业

第三次作业有较大的改动,类的设计,读入方式,表达式的储存都和以前不同。这次作业也有两个bug,在于读入时没能正确处理。在这次作业中主要构建了表达式树,项的类的设计也更加面向对象,但是在读入数据时,整个类又长又复杂,最终也在这里出现了bug。

由于几乎重写了整个程序,所以这次作业完成的非常紧张,几乎没有留出优化的时间,在输出时会输出很多无谓的常数和多余的括号。

在这次的设计中,我设计了一个父类Term,其他的类都是其子类。在子类中其实也分为两种,一种是组合类,一种是不可分解的基本类。在这里应该可以继续提取他们共同的特征,再构造出组合类和基本类来。

读入

这次读入时我参考了递归下降分析法,将表达式分解,当具体到某个因子的时候使用正则表达式判断正确性。具体做法是解析整个表达式前先读入一个项,而解析项之前先读入因子,读入因子之后进行判断,如果是一个简单因子,则直接创建相应的对象,如果是一个表达式因子,则再次调用解析表达式的函数,直到所有因子都是简单因子为止。

储存与求导

储存结构采用了表达式树,我构建的表达式树没有优化,是一个二叉树。以x+2*sin(x)例,根节点是一个加法组合对象,其左节点是x,右结点是一个乘法组合对象,该乘法组合对象左节点是常数2,右节点是sin(x)。如果能优化成多叉树,则能够少输出很多括号。比如当加法组合对象的某个子结点还是加法组合对象时,可以将其子结点的子结点直接连接到该加法组合对象下,这样子表达式树更为简洁,也避免了无谓的括号。

求导时从二叉树的根节点开始向下遍历,每一层直接返回结果字符串。在这一方面优化的空间还有很多,首先就是针对常数的优化,当有一个子结点是常数1或者0时,可以直接替换掉该节点。其次还有合并同类项,我觉得在得到输出之后可以再增添一个优化类,用来去除多余的括号并合并同类项。

互测

互测环节我还是以经验为主,开始时是阅读别人的源代码并针对性的构造测试数据,这样正确率非常高,但是很慢。之后我使用了平时积累的一些数据进行测试,在第二次作业中起到了比较好的效果。最后在课上我学习到了自动化测试并自己进行了尝试,虽然没来得及应用到互测之中,但是也让我学到了完整的测评应该包含哪些步骤和方法。

设计模式改进

在完成本次作业时,我还不知道何为设计模式。在写这篇文章时,我注意到了工厂模式,其中简单工厂模式是工厂模式家族中最简单实用的模型。

在本次作业中,可以看作所有的项都是同一种抽象,而它们自己的类型就是条件。当发出求导的指令时,只要有项的特征,对象就知道应该对项采用什么样的求导方式。这就是简单工厂模式的典型案例。

简单工厂的优点/缺点:

  • 优点:简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。明确区分了各自的职责和权力,有利于整个程序结构的优化。
  • 缺点:很明显工厂类集中了所有实例的创建逻辑。

总结

通过这三周自己写程序和阅读别人的代码,我初步了解了面向对象的思想。当然,在实践的时候自己的设计还非常初步。通过这三周的学习,我还学会了正则表达式的使用和自动化测试,自己的测试能力也有所提高。对于接口,继承等概念,还需要多多实践,在实践中领会它的作用。

希望在接下来的课程中,自己能够学到更多的设计模式,自己的设计也能够更加符合面向对象的思想。

转载于:https://www.cnblogs.com/quarkstar/p/10610019.html

面向对象多项式求导总结相关推荐

  1. matlab对多项式求导,matlab中多项式求导

    1 0.5 0 -0.5 -1 -1.5 -2 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 4.对比用多项式函数的 polyder 函数及符号函数中的 diff 函数,求导 x2+2x ...

  2. 多项式乘积求导 c语言,c语言实现多项式求导.docx

    c语言实现多项式求导 #include #include//动态申请空间的函数的头文件typedef struct node //定义节点类型{ float coef; //多项式的系数 int ex ...

  3. 神奇的多项式求导矩阵与积分矩阵

    线性代数是一门有趣又有用的学科.基于机器学习.深度学习等技术的人工智能的核心数学知识就包含数理统计.微积分与线性代数. 通过 求导矩阵 对多项式求导: 例: f(x)=4x2+3x+2f(x) = 4 ...

  4. 【面向对象】多项式求导——第一单元课程总结

    目录 一.基于度量来分析自己的程序结构 第一次作业 整体思路介绍 第二次作业 整体思路介绍 第三次作业 整体思路介绍 二.分析自己程序的bug 第一次作业 第二次作业 第三次作业 三.发现别人程序bu ...

  5. OO第一单元总结__多项式求导问题

    作业一.含幂函数的简单多项式的求导 (1)基于度量的程序结构分析 1. 统计信息图: 2. 结构信息图: 3. 复杂度分析 基本复杂度(Essential Complexity (ev(G)).模块设 ...

  6. python多项式求导_Python求离散序列导数的示例

    有一组4096长度的数据,需要找到一阶导数从正到负的点,和三阶导数从负到正的点,截取了一小段. 394.0 388.0 389.0 388.0 388.0 392.0 393.0 395.0 395. ...

  7. [MATLAB]多项式求导/加减/乘除

    函数公式: 多项式的加减运算 多项式的加减运算非常简单,即相应向量相加减 多项式乘法 conv(p1,p2):多项式相乘函数.在这里,P1.P2是两个多项式系数向量 多项式除法 [Q,r]=decon ...

  8. 基于MATLAB的数值微分与拟合多项式求导

    目录 前言 一. 数值微分算法 中心公式一: 中心公式二: 二. 中心差分算法及其MATLAB的实现方法 例题一 三. 用插值.拟合多项式求导数 例题二 四. 二元函数的梯度计算 前言 由导数的定义得 ...

  9. OO第一单元总结——多项式求导

    一.基于度量来分析自己的程序结构 1.第一次作业 UML类图 OO度量 这次作业我写了3个类,其中class Struct是Polynomial的内部类,这个类有2个属性:coe.index,分别代表 ...

最新文章

  1. halt库卡_KUKA库卡机器人编程之字符串处理函数
  2. SSM高级整合_非Maven控制版本下SSM高级整合
  3. python打包的exe如何免杀_如何使用Python进行Payload免杀
  4. 机器学习笔记(十二)——马尔科夫模型
  5. 伺服电控领域的产业情况与各主流制造商简介
  6. 微信小程序的数据库用mysql可以_微信小程序之在前端使用数据库
  7. Excel中的相对引用和绝对引用详解
  8. 经济学论文素材之汇率波动的外汇风险
  9. C++Primer第五版 第六章 课后习题答案
  10. 我的IT之路2012(一)
  11. MySQL 中STD、STDDEV、STDDEV_SAMP 标准差函数的区别
  12. 自制可运行pe的iso
  13. JDK1.8下载与安装完整教程
  14. 07【需求评审】 UED
  15. Focusing Attention Network(FAN)自然图像文本识别 学习笔记
  16. 《超时空要塞》与《太空堡垒》之缘——同样伟大的硬币两面
  17. WampServer3.2.0下载安装教程详解版
  18. SpringBoot+Vue实现前后端分离的网吧管理系统
  19. SecureCRT乱码解决
  20. 苹果屏蔽更新_如何屏蔽苹果系统自动更新

热门文章

  1. input输入的时候统计字数的代码
  2. 你想象不到这些明星竟然是程序员出身
  3. 基于stm32的智能语音提醒器
  4. 快学Python:函数的使用
  5. 网易我的世界中国版服务器存档文件在哪里,网易我的世界怎么导入存档 网易中国版手游存档位置...
  6. 【工具】GIT简单使用
  7. C++日期计算器的实现
  8. Scrapy中的item和pipline
  9. java http请求发送unicode_c++ 使用httpclient获取网页及utf8与unicode之间转码
  10. 如何制作全图版PPT “某些字体无法随着演示文稿一起保存”