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. lua 基础 之 坑一样的地方

    -- local 局部-- local表=全局表,是同一个表,这主要是由于lua的表机制是匿名的,相当于函数的指针,local foo = foo,-- 即使本地foo没有在全局_G注册,还是引用的是 ...

  2. Django REST framework--序列化

    Django REST framework--序列化 基础准备工作 创建项目添加应用 (venv) lee@lee:~/PycharmProjects/Djdemo/djdemo$ python ma ...

  3. Double H

    ##Double H Team 1.队员 王熙航211606379(队长) 李冠锐211606364 曾磊鑫211606350 戴俊涵211606359 聂寒冰211606324 杨艺勇2116063 ...

  4. nopcommerce 4.1 core 插件 相关1

    nop中 插件机制是比较值得学习的: Nop 插件学习: 1. 项目里面的生成必须是采用 直接编辑项目文件,参考nop原本的项目文件 动态加载插件的方法-mvc3 参考: using System.L ...

  5. 从0到1用eclipse用maven搭建web项目

    1,默认已经搭建了JDK1.5以上,以及eclipseEE版本,和maven. 2,修改maven的本地仓库和镜像,修改本地仓库是为了方便我们管理,maven的默认仓库是在C盘的USER文件夹下,我一 ...

  6. L342 Air Pollution Is Doing More Than Just Slowly Killing Us

    Air Pollution Is Doing More Than Just Slowly Killing Us In the future, the authorities might need to ...

  7. 四:客服端防护HTTP发送请求类

    一.源代码: public class swtDefendOperate{private BackgroundWorker backgroundWorker;//DefendType的值 Verify ...

  8. Holer实现外网访问本地MySQL数据库

    外网访问内网MySQL数据库 内网主机上安装了MySQL数据库,只能在局域网内访问,怎样从公网也能访问本地MySQL数据库? 本文将介绍使用holer实现的具体步骤. 1. 准备工作 1.1 安装并启 ...

  9. python—DAY1

    # user = "123"# possword = "111"# count = 0## while count < 3:# user_name = i ...

  10. amaze ui 滚动监听

    引入   此框架的css  js    前提还要有jquery http://amazeui.org/javascript/scrollspy 然后看这个链接里的各种动画 运用方法就是  在你想要有动 ...