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. http中的socket是怎么一回事

    首先我们先看一下socket的定义:是在传输层和应用层中间的一个抽象层,是实现网络通信的接口. 那么什么是传输层,什么是应用层呢?网络又是怎样通信的呢?为了弄清这两个问题,我们需要弄清一个概念TCP/ ...

  2. Ubuntu下安装chrome浏览器

    1.在终端中,输入以下命令: sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/sources.l ...

  3. Spring _day02_IoC注解开发入门

    1.Spring IoC注解开发入门 1.1 注解开发案例: 创建项目所需要的jar,四个基本的包(beans core context expression ),以及两个日志记录的包,还要AOP的包 ...

  4. express3/4引入socket.io

    app.js var express = require('express'); var path = require('path'); var session = require('express- ...

  5. pypyodbc 的坑

    1, 你要先确认你自己的office的版本, 你要安装access dabase engine. 但是 sb 微软的驱动 32位的不让装, 64位的也不让装, 吐槽微软100次---MS个大SX. 最 ...

  6. oraclesql语句笔记

    1. ORA-00947:Not enough values 原因:values没有写足够的值与select()中的字段对应 2.查看一张表中共有多少个字段 select count(*) from ...

  7. LINUX磁盘分区

    在学习 Linux 的过程中,安装 Linux 是每一个初学者的第一个门槛.在这个过程中间,最大的困惑莫过于给硬盘进行分区.虽然,现在各种发行版本的 Linux 已经提供了友好的图形交互界面,但是很多 ...

  8. windows与sql身份登录

    windows身份验证:1.“.”代表本地2.127.0.0.1代表本地3.本地ip地址,在dos中可查4.localhost代表本地 sql身份验证:首先用windows登上去,之后再安全性中找到登 ...

  9. 怎么在Mac上安装Tomcat 7[转载]

    本文来自http://wolfpaulus.com/journal/mac/tomcat7,谢谢Wolf Paulus 的分享 Tomcat 7 是Apache发布的第一款可以支持Servlet 3. ...

  10. JODA-TIME获取本月的第一天及最后一天

    1.获取当前时间: LocalDate now = LocalDate.now(); 2.本月第一天: LocalDate firstDayOfCurrentMouth = now.dayOfMont ...