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. 活代码LINQ——08

    一.模块代码 ' Fig. 9.6: ListCollection.vb ' Generic List collection demonstration. Module ListCollection ...

  2. pseudo-class与pseudo-element的不同点与相同点

    关于两者的区别,其实是很古老的问题.但是时至今日,由于各种网络误传以及一些不负责任的书籍误笔,仍然有相当多的人将伪类与伪元素混为一谈,甚至不乏很多CSS老手.早些年刚入行的时候,我自己也被深深误导,因 ...

  3. Charles篡改请求,在手机上抓包,以及弱网设置

    篡改请求 可以测试各种异常 原理:clint->server正常是客户端发送请求到服务端,charles相当于一个拦截器,拦住客户端的请求,并进行修改,修改后再发送到server端 Server ...

  4. Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (简单dp)

    题目:https://codeforces.com/problemset/problem/977/F 题意:一个序列,求最长单调递增子序列,但是有一个要求是中间差值都是1 思路:dp,O(n)复杂度, ...

  5. Linux:Fedora系统的安装

    新的一周,新的一天又来了!话不多说我们直接进入今天的系统安装吧!这次是Linux系统的第八期了,这款系统是可以当做家庭用途使用,非常强大的一款开发源操作系统. 安装Fedora系统 系统映像文件下载 ...

  6. zookeeper 启动 zookeeper_server.pid: Permission denied

    在启动zookeeper的时候 报错 没有权限 以为是 zookeeper 没有权限 然后 chmod -R 777 zookeeper/ 之后还是不行. 后来 才发现 原来是我 /tmp/zooke ...

  7. 原型图 ER 8.0的注册码

    axuer8.0注册码Licensee:米 业成 (STUDENT)Key:nFmqBBvEqdvbiUjy8NZiyWiRSg3yO+PtZ8c9wdwxWse4WprphvSu9sohAdpNnJ ...

  8. 2017-10-5模拟赛T2 小Z爱排序(sorting.*)

    Description Solution 比赛时找到了规律,但是没有证出来……(当然最后还是AC了……) 显然没有被操作的数在排好序的序列中一定是连续的一段. 所以,没有被操作的数一定从左到右连续地递 ...

  9. 使用VB6读取数据库资源并发送邮件(原创)

    Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection ...

  10. 关于Java方法重载

    今天在做项目的时候发现一个问题,如果有两个方法是重载的,而且他们的参数一个是父类,一个是子类,那么调用的时候会调用哪个函数呢? 做了个测试,发现调用的是子类. 例子: public class Ani ...