OO第一单元作业的主题是求导,下面将分三次作业分别总结一下。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第一次作业:只有带系数的幂函数求导

1、程序结构

第一次作业表达式结构比较简单,因此我只分了两类:主函数类和Term类。主函数对输入输出进行处理,Term类负责存每个项的系数和指数。

代码复杂度分析如下:

2、程序bug

公测测试点全部通过,没有进行将正项提到首项的优化。互测被发现的bug主要在:

(1)非法字符\v, \f;

(2)对于首项的特殊化处理出现错误;

(3)在最终求导结果为0的时候有时会没有输出。

这些问题主要出现在主类中对字符串输入进行处理和字符串输出的部分。出现这些问题主要是因为自己对多项式的结构分的不够好,对于首项,其虽然有特殊性但仍然可以当作一个普通的前面带运算符的项来处理,这样就不需要对首项进行特殊处理了。

3、如何发现别人的bug

第一次作业由于输入输出都比较简单,而且是第一次做互测,因此采用了比较原始的在程序中一个个输入并检查输出的方式。构造测试样例时,主要考虑到以下几方面:

(1)表达式各处的空格;

(2)指数或系数为0的情况;

(3)多个符号叠加运算的情况

(4)长表达式可能引起爆栈的情况。

在构造测试用例时,偶尔会看看该同学代码中是否出现正则表达式或逻辑上的错误,但大多数时候还是构造出一个样例就将它直接输入到所有人的程序中观察结果。这么做是因为大家都通过了中测,大的代码逻辑框架应该问题不大,要仔细阅读并找出bug费时费力,就算找出bug,效率也太低了,不如直接用样例测试快速。

4、面向对象的重构

第一次作业我的主类中main函数仍然很长,很多对于字符串的处理都直接放在了main函数里,这很不面向对象,应该对这些操作建立一个类。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第二次作业:加入了三角函数的多项式求导

1、程序结构

第二次作业的表达式结构相比第一次又复杂了一些,且加入了三角函数,需要重新考虑多项式的结构。我的整个代码分了5类:主类、项类、幂函数因子类、sin(x)因子类、cos(x)因子类。类图如下:

代码复杂度分析如下:

2、程序bug

强测错了一个测试点,是由于有些部分的三角函数正则表达式忘记加空格了,导致在sin和(x)之间的空格会被认定为Wrong Format。互测被找到的bug也是这个。

3、如何发现别人的bug

这次我自己编写了一个bash脚本,来运行所有人的程序,并统一输出结果然后手动检查。构造样例的思路基本和第一次作业相同,这次我刻意缩短了一些表达式的长度,这样便于自己检查,也便于被hack的同学快速定位自己的bug。

4、面向对象的重构

这次的main函数比第一次缩短了一些。应该设置一个input handler类来处理读入的字符串。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第三次作业:加入了多层嵌套、表达式因子的表达式求导

1、程序结构

第三次作业的结构更加复杂,且很难一次性识别出所有项和因子,因此考虑通过构造不同的类来模拟表达式的运算。我的代码分为4类:主类、项类、表达式类、嵌套因子类。类图如下:

代码复杂度分析如下:

2、程序bug

这次的bug较多,强测错了4个测试点,错误有:

(1)在识别表达式因子的时候,括号的匹配算法出现问题(考虑到多重嵌套因子的存在,表达式因子的识别不能直接使用正则表达式识别括号对的形式);

(2)表达式因子后面如果有指数会被认定为Wrong Format;

(3)对表达式项的首尾空格处理出现问题。

3、如何发现别人的bug

这次的表达式检查更加困难,而且测试用例需要比较复杂,因此采用了对拍器检查的方式,这样不仅简单快捷,还减弱了能使用样例的长度限制。构造样例的方法除了第一、二次作业提到的那些,还包括了多重嵌套和多重表达式的乘法求导,这些都是递归调用中可能出现bug的地方。

4、面向对象的重构

这次我没有完全按照课上的提示中建立加减、乘法、嵌套类那样的方法,导致出现了很多问题,求导的逻辑也比较难梳理和检查,这是本次作业可以改进的地方。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

总体来说,这三次作业都出现了和空格有关的bug,或许采用在读入字符串时就检查因空格引起的格式错误,之后去除所有空格的方式会减少很多这样的错误,也会降低之后正则表达式的复杂度。

2019OO第一单元作业总结的更多相关文章

  1. 【BUAA-OO】第一单元作业总结

    #OO第一单元作业总结 #确认存活,爱学习,爱北航,爱OO 一.三次作业分析 1.第一次作业 1.1 程序结构 对方法的度量: 类的内聚和相互间的耦合情况: 类图: 优缺点: 优点大概没什么优点,毕竟 ...

  2. BUAA_OO第一单元作业总结

    BUAA_OO第一单元作业总结 单元任务 第一单元的任务为实现表达式的求导,其中第一次作业是对简单多项式的求导,第二次作业是对包含简单幂函数和简单正余弦函数的多项式的求导,第三次作业是对包含简单幂函数 ...

  3. 【OO学习】OO第一单元作业总结

    OO第一单元作业总结 在第一单元作业中,我们只做了一件事情:求导,对多项式求导,对带三角函数的表达式求导,对有括号嵌套的表达式求导.作业难度依次递增,让我们熟悉面向对象编程方法,开始从面向过程向面向对 ...

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

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

  5. 【作业1.0】OO第一单元作业总结

    OO第一单元作业已全部完成,为了使这一单元的作业能够收获更多一点,我回忆起我曾经在计算机组成课设中,经常我们会写一些实验报告,经常以此对实验内容反思总结.在我们开始下一单元的作业之前,我在此对OO第一 ...

  6. OO第一单元作业总结——表达式求导

    OO第一单元作业总结 第一次作业 基于度量分析代码结构 基本算法 第一次作业是简单多项式导函数求解,不需要对输入数据的合法性进行判定, 基本思想是用 (coeff, expo)表示二元组 coeff* ...

  7. OO第一单元作业小结

    前言 第一单元的主题是表达式求导,第一次作业是只带有常数和幂函数的求导,第二次作业加入了正余弦函数,第三次作业又加入了表达式嵌套,难度逐渐提升.总体来说前两次作业还易于应对,而第三次作业做得相对有些艰 ...

  8. OO第一单元作业总结

    oo第一单元的作业是对多项式的求导.下面就是对三次作业分别进行分析. 第一次作业 分析 第一次作业相对来讲比较简单,甚至不用面向对象的思想都能十分轻松的完成(实际上自己就没有使用),包含的内容只有常数 ...

  9. 2019OO第二单元作业总结

    OO第二单元的作业主题是模拟电梯. ---------------------------------------------------------------------------------- ...

随机推荐

  1. 浅谈redis的HyperLogLog与布隆过滤器

    首先,HyperLogLog与布隆过滤器都是针对大数据统计存储应用场景下的知名算法. HyperLogLog是在大数据的情况下关于数据基数的空间复杂度优化实现,布隆过滤器是在大数据情况下关于检索一个元 ...

  2. Spring声明式事务配置详解

    Spring支持编程式事务管理和声明式的事务管理. 编程式事务管理 将事务管理代码嵌到业务方法中来控制事务的提交和回滚 缺点:必须在每个事务操作业务逻辑中包含额外的事务管理代码 声明式事务管理 一般情 ...

  3. Forth 内部解释程序工作流程

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  4. csla框架__使用Factory方式实现Csla.BusinessBase对象数据处理

    环境:.net4.6+csla4.6 实现:对象的数据库访问及数据库执行使用Factory方式进行封闭. 正文: 以前在使用csla框架完成业务对象的定义时所有的数据处理都在对象内部实现,也不能说不好 ...

  5. springboot-mybatis多数据源以及踩坑之旅

    首先,springboot项目结构如下 springboot配置文件内容如下 动态数据源的配置类如下(必须保证能被ComponentScan扫描到): 1 package com.letzgo.con ...

  6. Java oop(一些自己的理解,并没有展开很细)

    一下内容是自己总结用的,只是按照自己的理解去写.参考的是菜鸟教程.Java 是一个面向对象的语言.OOP就是面向对象编程.封装:在某些类里面,某些属性不想向外暴露,但是我们又想提供一个方法去访问或修改 ...

  7. oracle入门之对表数据查询(三)

    oracle表复杂查询--子查询 什么是子查询? 子查询是指嵌入在其它sql语句中的select语句,也叫嵌套查询. 单行子查询 单行子查询是指只返回一行数据的子查询语句. 请思考:如果显示与smit ...

  8. Hacker一月间

    我给自己的新赛季制定了一个计划,就是研究Kali,一个大集成开源软件系统,不过是用来做Hacker的. 以前其实想玩玩这个,但负责信息安全,总是担心安全漏洞这里安全漏洞哪儿,其实自己很害怕有安全漏洞, ...

  9. ionic3样例应用

    https://github.com/jujunjun/ionic3-study 该应用包括的样例内容有: 文件上传,上拉更新,下拉加载,弹出层,列表,加载中,栅格,按钮等. php提供的文件上传接口 ...

  10. day 22 面向对象 类与对象 名称空间操作

    一.面向对象 1.面向过程编程 核心是"过程"二字,过程指的是解决问题的步骤,即先干什么再干什么 基于该思想编写程序就好比在编写一条流水线,是一种机械式的思维方式. 优点:复杂的问 ...