1. 第一次作业总结
1.1 需求分析
第一次作业是对简单多项式的导函数求解。本次作业是符号上的求导操作,而不是具体求值。在输入中,表达式包含且仅包含一行,表示一个多项式。输入数据可以不是最简的多项式,且数据的最大长度为1000。为了优化最短输出,我们需要对相同指数的项进行合并。
1.2 代码实现
大一学C语言的时候,我们就实现过多项式的加法、乘法和求导。当时是采用结构体保存多项式。本次作业,我很容易的就想到了使用类似的结构保存多项式。即构建一个Term
类,保存多项式中的每个项。然后装入ArrayList
中,作为Poly
类的属性。每个Term
有幂函数的求导规则,Poly
有多项式的求导规则。程序的UML图如下:
本次作业有三个难点
- 正则表达式匹配输入
- 无序数据的组织管理
- 超长整数的计算
解决过程
1.因为我是第二次写Java程序(第一次是输出"Hello java"),java的正则表达式对我来说是一个陌生的东西,在简单的学习了正则表达式后,我采用了枚举的方法解决这个问题,即枚举出各类输入项的形式,一共五种。接下来就是错误处理的问题,考虑到直接写一个匹配输入的正确形式的正则表达式较为复杂,我选取了先匹配带有空白字符输入错误的情况(从后两次作业来看,这个想法是正确的)第一次作业一共有三种错误的情况,我也是使用枚举的方法匹配输入,然后将\t
和<space>
替换为空,之后就可以按照无空白字符的方式正则匹配输入了。
2.本次作业中提示了我们可选的数据组织方式,我采用了ArrayList
来存储Term
。
3.因为输入限制是1000个字符,则极限情况下可以输入一个长达1000位的数字,long类型整数肯定是放不下的。我本来打算使用字符串存这超长整数,然后写两个字符串的加法减法和乘法。还好后来查询了一下,java内置了超长整数的库函数,就没有重复造轮子