总结:基于继承和接口的简单OOP

前情提要

到目前为止,OO课程已经完成了前三次的作业,分别为:

  1. 第一次作业:简单多项式的构造和求导。【正则表达式】【数据结构】【排序】
  2. 第二次作业:含三角函数因子的复杂多项式的构造、求导和化简。【递归下降】【DFS】
  3. 第三次作业:含嵌套因子的复杂式的构造、求导和化简。【递归下降】【抽象类】【接口】【递归】

第一次作业

功能介绍

对某种格式的多项式进行parsing,之后计算其导数,按相同格式输出。

多项式由项组成,项有且仅有系数和x的幂。不存在多于两个因子的项。

类图

程序的大致结构如下图:

第一次作业程序结构比较简单,Main中构造一个Poly对象,Poly对象中由Item聚合而成。

代码分析

 可以看出,除了Polynomial类的构造函数,其他的方法的复杂度均不高。

而造成其构造函数复杂度稍高的原因是在不断parsing的时候需要一定的分支、循环等逻辑。

虽然该构造函数仅有不到23行,但是当逻辑进一步复杂的时候,不如将循环体内部的一些操作移出到一个类似工厂的小静态方法中

测试与Bug

公测

不出意外,笔者的程序在公测阶段没有出现任何错误。

互测

不出意外,笔者的程序在互测阶段没有出现任何错误。

在互测中,笔者challenge中了同屋的5个数据点。其中有一个是当自己在刚开始写程序时,同时手造的数据,为了验证自己程序的正确性;其他的数据点均为数据生成器和对拍器发现的bug点。

在手造数据时,应该仔细针对输入格式说明,从基础的元件(如幂函数部分:x还是x^;x^后面的数是有符号还是无符号,是正是负)开始,逐步向上构造用例,使用“乘法原理”将不同的情况组合起来

Bug分析与总结

  • 正则中的"\s"是匹配所有空白字符,并不只有tab和space。
  • Java的trim()是去掉所有ASCII码比space小的字符,因此可能会将其他不期望的空白字符一并去掉,在使用时应该注意。
  • 使用正则表达式尝试完全匹配一个超长的字符串是慢且有爆栈可能性的,应该将重复的特征提取出来,并手动while()一段一段地匹配。

猜你喜欢

转载自www.cnblogs.com/FuturexGO/p/10585564.html