2019OO第一单元作业总结

时间:2023-03-08 22:04:44

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

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

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

1、程序结构

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

2019OO第一单元作业总结

代码复杂度分析如下:

2019OO第一单元作业总结

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)因子类。类图如下:

2019OO第一单元作业总结

代码复杂度分析如下:

2019OO第一单元作业总结

2、程序bug

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

3、如何发现别人的bug

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

4、面向对象的重构

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

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

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

1、程序结构

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

2019OO第一单元作业总结

代码复杂度分析如下:

2019OO第一单元作业总结

2、程序bug

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

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

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

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

3、如何发现别人的bug

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

4、面向对象的重构

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

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

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