第一次作业

基于x的简单多项式相加求导

  • 带符号整数 支持前导0的带符号整数,符号可省略,如: +02-16>、19260817等。
  • 幂函数
    • 一般形式 由自变量x和指数组成,指数为一个带符号整数,如:x ^ +2
    • 省略形式 当指数为1的时候,可以采用省略形式,如:x
  • 表达式 由加法和减法运算符连接若干项组成,如: -1 + x ^ 233 - x ^ >06。此外,在第一项之前,可以带一个正号或者负号,如:- -1 + x ^ 233>、+ -2 + x ^ 19260817。注意,空串不属于合法的表达式
    • 变量项

      • 带有系数的幂函数,如:2 * x ^ 2-1 * x
      • 系数为1的时候,可以省略系数或表示为正号开头的形式,如:x ^ 2+ >x ^ 2
      • 系数为-1的时候,可以表示为负号开头的形式,如:-x ^ 2
    • 常数项 包含一个带符号整数,如:233
  • 空白字符 在本次作业中,空白字符包含且仅包含<space>\t

此外,值得注意的几点是:

  • 带符号整数内不允许包含空白字符。
  • 幂函数、项、表达式,在不与上一条矛盾的前提下,可以在任意位置包含任意数量的>空白字符。
  • 如果某表达式存在不同的解释方式,则只要有任意一条解释中是合法的,该表达式即>为合法。

题目分析与程序设计

基础底的PolyTerm类系数coefficient和指数index以及extend判断项是否表达式合法

传入一段字符串进行构造,比如+4*x^-5

上层类的Poly包含结果String类myPoly,以及用来多项式每一项存储结果的HashMap

将多项式用加号分割然后分割的每一项先求导构造Poly类,将构造出来的Poly类的coefficient和index存入HashMap

再从HashMap遍历构造myPoly字符串

ComputePoly是main主类将stdin的string用来构造Poly

总结整理和反思

第一次写面向对象程序,代码复用性较差,用加号分割会出现一些bug,比如^+,^-,要预先将它替换

PolyTerm没有写求导方式而是直接用表达式写出代码可移植性差

第二次作业

第二次作业,增加了三角函数的处理,额外的格式规定。

  • 三角函数 sin(x)cos(x)(在本次作业中,括号内仅为x)

    • 一般形式 类似于幂函数,由sin(x)和指数组成,指数为一个带符号整数,如:sin(x) ^ +2
    • 省略形式 当指数为1的时候,可以采用省略形式,省略指数部分,如:sin(x)
  • 常数因子 包含一个带符号整数,如:233
    • 一般形式 由乘法运算符连接若干因子组成,如:2 * x ^ 2 * 3 * x ^ -2sin(x) * cos(x) * x

此外,值得注意的几点是:

  • 三角函数的保留字内不允许包含空白字符,即sincos内不可以含有空白字符。
  • 未知数包含且仅包含小写的x

题目分析与程序设计

第二次作业我想继承第一次作业的思路,我用加号分割项,用乘号分割因子

发现一个奇特的地方,每一项都是由x,sin(x),cos(x)组成的

(xa*sin(x)b*cos(x)c)'=a*xa-1*sin(x)b*cos(x)c+b*xa*sin(x)b-1*cos(x)c+c*xa*sin(x)b*cos(x)c-1

Term:继承上一次作业加入了termnature,参数是x,sin(x),cos(x)用来存储基础因子

PolyTerm:是构造形如d*xa*sin(x)b*cos(x)c  的表达式一共四个值 coefficient,xindex,sinindex和cosindex,以及重构toString,输出xa*sin(x)b*cos(x)c

因为我们要用toString作为存储HashMap的键值,对于传进来的String我们要用*分割然后遍历每个因子改变四个值coefficient,xindex,sinindex和cosindex

Poly:将输入多项式每一项用加号分割,对于分割的每一项构造PolyTerm化简,然后传出参数,用上面公式求导构造三个PolyTerm项

以toString为key值,coefficient为value存在HashMap

总结整理和反思

相比于第一次作业 *出现+也要预先处理,对于字符串的处理没有进行三角函数的化简

第三次作业

第三次作业加入了可以嵌套的递归规则

  • 变量因子

    • 幂函数

      • 一般形式 由自变量x和指数组成,指数为一个带符号整数,如:x ^ +2且,指数绝对值一律不得超过​

      • 省略形式 当指数为1的时候,可以采用省略形式,如:x

    • 三角函数 sin(x)cos(x),另外,本指导书范围内所有的词语“三角函数”,除非特殊说明,否则一律包含且仅包含上述两个函数

      • 一般形式 类似于幂函数,由sin(x)cos(x) 和指数组成,指数为一个带符号整数,如:sin(x) ^ +2同样的,指数绝对值一律不得超过​

      • 省略形式 当指数为1的时候,可以采用省略形式,省略指数部分,如:sin(x)

  • 常数因子 包含一个带符号整数,如:233

  • 表达式因子 将在表达式的相关设定中进行详细介绍。不过,表达式因子不支持幂运算

  • 嵌套因子 本次作业将支持因子嵌套在三角函数因子里面,即一个因子作为另一个三角函数因子的自变量,例如sin(x^2)cos(sin(x)) 以及 sin(sin(cos(cos(x^2))))^2 等。但是不允许出现指数为变量的情况,指数依然只能是带符号整数,例如sin(x) ^ sin(x)是不合法的,因为指数不是自变量。也不允许幂函数的自变量为除了x之外的因子,例1926^0817是不合法的,因为幂函数的自变量只能为x

题目分析与程序设计

第三次作业我依旧想继承第二次作业的思想,我用加号分割项用乘号分割因子,但是因子遇到了嵌套的情况,所以用括号再递归分割因子

Pol类用来把顶层类我们的表达式用加号分割成每一项

对于每个项求导我们要用到链式法则和复合函数求导规则,我用用乘号分割因子,每个因子构造顶层Po用一个循环实现链式法则求导

如果遇到符合第二次作业的PolyTerm没有出现嵌套规则的可以直接求导

如果遇到嵌套我们利用复合函数求导规则f(g(x)) ' = derva(f(x))derva(g(x))

我用一个简化算法节省复杂度把g(x)替换成x既可f(x)可以直接构造PolyTerm求导,然后再替换回来可以节省复杂度

首先为了防止因为括号内的加号和乘号或者sin(x)*cos(x),影响我的分割我采用一个堆栈维护括号匹配

BUAA_OO_homworkone包含三角函数的多项式求导的更多相关文章

  1. 多项式求导系列——OO Unit1分析和总结

    一.摘要 本文是BUAA OO课程Unit1在课程讲授.三次作业完成.自测和互测时发现的问题,以及倾听别人的思路分享所引起个人的一些思考的总结性博客.本文第二部分介绍三次作业的设计思路,主要以类图的形 ...

  2. BUAA_OO Summary——多项式求导问题

    从C.DS.计组一路折磨过来, 几乎都在采用过程化.函数式的编程思想.初接触面向对象的项目开发,经过了三周的对多项式求导问题的迭代开发,经历了设计.coding.测评环节,算是对面向对象有了一定的认识 ...

  3. OO_多项式求导_单元总结

    概述: 面向对象第一单元的作业是三次难度依次递增的多项式求导.第一次作业是仅包含带符号整数和幂函数的多项式求导,例如:-1+xˆ233-xˆ06:第二次是在前面的基础上增加了三角函数的求导,例如:-1 ...

  4. OO第一单元总结-多项式求导

    OO第一单元总结-多项式求导 一.第一.第二次作业总结 因为前两次作业设计复杂度差别不大,因而放在这里统一总结. 基于度量分析程序结构: 前两次作业确实存在缺乏可拓展设计的构想,基本还是面向过程的思维 ...

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

    第一次作业分析 1.程序结构分析 类图: 好吧,这一次基本上完全是在面向过程编程,没有看出来任何的面向对象的特性. 复杂度: 可以看到模块间的相互耦合度很高,PolyDerive方法的非结构化程度也不 ...

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

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

  7. OO随笔之魔鬼的第一单元——多项式求导

    OO是个借助Java交我们面向对象的课,可是萌新们总是喜欢带着面向过程的脑子去写求导,然后就是各种一面(main)到底.各种方法杂糅,然后就是被hack的很惨. 第一次作业:萌新入门面向对象 题目分析 ...

  8. BUAA-OO-第一单元表达式求导作业总结

    figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...

  9. OO第一单元(求导)单元总结

    OO第一单元(求导)单元总结 这是我们oo课程的第一个单元,也是意在让我们接触了解掌握oo思想的一个单元,这个单元的作业以求导为主题,从一开始的加减多项式求导再到最后的嵌套多项式求导,难度逐渐提高,编 ...

随机推荐

  1. Web内容回顾

    -----------------siwuxie095 Java EE 三层结构 1.Web 层:Struts2 框架 2.Service 层:Spring 框架 3.DAO 层:Hibernate ...

  2. 学习h5(开始)

    webstorm 下载地址:http://www.sdifenzhou.com/6176.html webstorm注册码: 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QT ...

  3. 花了好几个小时的奇葩Mat为0问题

    问题 1. Mat mserMat = adaptive_image_from_points(contour, rect); CCharacter character; character.setCh ...

  4. IIS7日志中时间与系统时间不一致的原因

    最近在分析web日志,发现IIS7日志中时间与系统时间不一致,即本该上班时间才产生的产并发访问日志,全部发生在凌晨至上班前. 本以为是系统时间设置错误,检查后一切正常.后查询资料,原来是这个原因: 日 ...

  5. [原创]COCOS2DX 3.8 增加protobuf为external库

    此处为记录防止忘记,最近使用COCOS练习一些新的库,所以需要把PROTOBUF编译进去,看上去很麻烦,这里记录一下,以防忘记. 首先下载protobuf 2.5.0版本,下载地址请自行百度. 准备工 ...

  6. CodeForces 690D1 The Wall (easy) (判断连通块的数量)

    题意:给定一个图,问你有几个连通块. 析:不用说了,最简单的DFS. 代码如下: #include <bits/stdc++.h> using namespace std; const i ...

  7. Android canvas bug

    安卓4.1.1-4.1.2的webkit在渲染canvas元素时有bug. 具体表现是出现重影,即canvas的clearRect()方法不能彻底清空画布,仍然保留之前某个状态当“背景”. 目前的修复 ...

  8. 编写高质量代码改善C#程序的157个建议——建议129:泛型类型参数要以T作为前缀

    建议129:泛型类型参数要以T作为前缀 作为一种约定,泛型类型的参数要以T作为前缀.如委托声明: Action<T1,T2> 其中,泛型类型参数名不应该处理成: Action<Arg ...

  9. java爬虫入门

    本文内容 涞源于  罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的?  2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做 ...

  10. delphi sqlsever 实现存在则更新,不存在

    (' if exists(select * from NBcommission where Type='''+sType+'''and ItemNo='''+s+''' ) '+ ' begin'+ ...