前言

  在经过了三次艰辛的oo作业后,oo课程的第一单元告一段落,这一单元,我作为一个oo小白,开始了解oo的编程思想,也有了自己的一点心得体会。把笔粗成字,不当之处,还请各位大佬多多指教。

一.分析程序结构

第一次作业:

  在第一次作业中,由于刚刚开始接触oo的思想,我还不是很了解面向对象的编程方法,还是按照c语言的思路,将deriviation作为main函数,在deriviation中调用number类,完成运算。

  具体的操作思路,则是使用正则表达式构造出因子与项,通过正则式匹配来得到每一个项,使用求导公式运算,化简则是选择了运用哈希表将次数相同的表达式的次数相加,合并输出。

  类图如下:

  复杂度如下:

  可见,我的number复杂度较高,可以进一步优化。

第二次作业:

  第二次作业由于不涉及因子嵌套,只是添加了三角函数项,我选择了新建一个key类,用来存放三角函数与幂函数的相关次数,并在key类中重构hashcode与equal方法,就可以复用作业一中的hashmap,优化时,加入了,三角函数和为1的特判。

  下面是类图:

  复杂度如下:

  由于主要是复用了作业一,导致number的复杂度还是居高不下。

第三次作业:

  第三次作业加入了嵌套因子,导致正则方法提取失效。我选择了用多个小正则构造来判断输入是否合法。在判断输入合法性时,先进行括号匹配,若有多层括号嵌套,若括号不匹配的话直接判定为非法输出。括号匹配的情况下,逐层判断,每次将当前表达式视为只有一层括号嵌套,递归判断。

  而在进行求导运算时,这种方法无法准确提取项,便手动根据括号和符号,每次提取出表达式,再将表达式分割为因子,运用链式法则,逐个求导即可。

  类图如下:

  复杂度如下:

  

  由于判断输入合法和求导部分都有大量迭代,复杂度较高。

二.我的bug

  第一次作业中,我在书写正则表达式的时候,将空格表示为‘ ’,导致可以匹配‘号,此外,没有注意没有符号链接的项,正则匹配也失败。

  第二次作业中,没有被发现bug。

  第三次作业中,一个是使用了d{1,5}匹配小于10000的数,忽略了000008这种奇葩。此外,我的递归求导方法,由于嵌套过多,会导致超时。

总而言之,我的代码出现bug集中在正则表达式的构造错误,和求导方法的迭代次数过多。

三.互测的策略

 我的互测策略是尽量先仔细阅读房内同学的代码,争取找到代码逻辑的漏洞,好有的放矢。实在找不到逻辑错误的,会构造测试样例对代码进行黑盒测试。

我结合测试代码结构来构造测试样例,我会观察被测代码的方法结构,思考可能出现的错误点。

四. Applying Creational Pattern

   第一二次作业中,我都是将表达式作为对象,进行求导运算。

   第三次作业中,由于运算的复杂,在表达式对象的基础上,我又将每一个因子作为对象,进行求导运算。

北航oo作业第一单元小结的更多相关文章

  1. 北航oo作业第二单元小结

    类的设计: 首先,我对我的思路进行整体的说明,由于我的三次作业,思路是继承的,所以做总体的说明 第一,   Main类,Main类自身并没有功能,他的功能只是构造需要的电梯线程和输入线程. 其中,第三 ...

  2. OO作业第一单元总结

    一.第一单元作业回顾 ​ 系列一作业分为三周进行,都是表达式求导,难度渐进. ​ 第一次实现的是简单幂函数的求导,第二次加入了sin和cos两种三角函数,第三次实现了三角函数内的嵌套以及引入了表达式因 ...

  3. 2020北航OO第四单元总结

    2020北航OO第四单元总结 一.本单元架构设计 本单元作业是实现一个UML图解析器,其中实现接口及主要框架课程组已经提供,只需要我们完成特定功能. 在第一次作业时,感到十分迷茫,不知道如何下手,最后 ...

  4. 北航OO第四单元——UML图解析

    北航OO第四单元--UML图解析 作业要求简析 刚接触本次作业可能需要花上一会才能搞清楚到底是要我们写个啥,在这里简单说一下: UML图的保存格式.mdj文件是以json文件的形式存储的,将每一个Um ...

  5. OO面向对象第一单元总结

    OO面向对象第一单元总结(表达式求导) 写在前面: 魔鬼课程oo第一单元终于结束,当终究要落笔总结,竟不知从何写起…… 回首再去看第一次的作业,你会满足于那时的幸福,或许,这就是成长吧! 千言万语,一 ...

  6. 2019年北航OO第1单元(表达式求导)总结

    2019年北航OO第1单元(表达式求导)总结 1 基于度量的程序结构分析 量化指标及分析 以下是三次作业的量化指标统计: 关于图中指标在这里简要介绍一下: ev(G):基本复杂度,用来衡量程序非结构化 ...

  7. 2020北航OO第三单元总结

    2020北航OO第三单元总结 本单元要求是根据JML规格完善代码,初看是一个简单的代码照搬实现的东西,但最后才发现由于CPU时间的限制,还考察了大量优化策略及数据结构中关于图的知识,是一次非常注重细节 ...

  8. 北航oo作业第四单元小结

    1.总结本单元两次作业的架构设计 在我动手开始总结我的设计之前,我看了其他同学已经提交在班级群里的博客,不禁汗颜,我是真的偷懒.其他同学大多使用了新建一个类,用以储存每一个UMLelemet元素的具体 ...

  9. BUAA OO 2019 第一单元作业总结

    目录 总 架构 Controller​ Model​ 输入处理 代码静态分析 行数 方法复杂度 UML​ 类图 优点 缺点 坑 输入 非法的空白字符 输入的简并处理 运算 浅拷贝 可变类型与不可变类型 ...

随机推荐

  1. [hdu 1568] Fibonacci数列前4位

    2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2 ...

  2. Automake基本用法

    一. 确认你的系统安装有GNU的如下软件: 1. automake2. autoconf3. m44. perl5. 如果你需要产生共享库(shared library)则还需要GNU Libtool ...

  3. cuda by example

    int offset= x+y*dim   x 线程块内的线程索引 y 线程块索引 dim 线程块的维度   tid = threadIdx.x+blockIdx.x*blockDim.x 计算大于或 ...

  4. 缩点+spfa最长路【bzoj】 1179: [Apio2009]Atm

    [bzoj] 1179: [Apio2009]Atm Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri ...

  5. 使用css实现垂直居中

    vartical-align vartical-align可以设置行内元素和表格单元格(table-cell)垂直对方式,所以如果元素是行内元素或者表格的话,可以直接应用这个属性对内容进行对齐设置.如 ...

  6. Linux软件源apt 仓库 包 的概念

    概念介绍: 软件源是debian系的概念,把软件放在一个pool里面,用一条命令就可以自动从指定服务器下载并安装. 源列表是/etc/apt/sources.list,里面写了你所用的服务器地址 (其 ...

  7. 数据恢复(Data recovery)

    定义数据恢复: 当存储介质出现损伤或由于人员误操作.操作系统故障本身故障所造成的数据不可见,无法读取.丢失. 工程师通过特殊的手段读取却在正常状态下不可见,不可读,无法读的数据. 数据恢复(Data ...

  8. 关于Django中路由层(URL-conf)

    关于路由层 路由层其实就是项目中urls.py那个文件,那里面存放着url和视图函数的对应关系它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来 ...

  9. 6.SpringMVC2

    1.视图解析 当客户端发出请求后,交由SpringMVC的DispatcherServlet处理,接着Spring会分析看哪一个HandlerMapping定义的所有请求映射中对该请求的最合理的映射, ...

  10. put get & push pull

    总要有一个容器,一个生产方,一个消费方