一、第一次作业
1.需求分析
简单多项式导函数
- 带符号整数 支持前导0的带符号整数,符号可省略,如:
+02
、-16
、19260817
等。 - 幂函数
- 一般形式 由自变量x和指数组成,指数为一个带符号整数,如:
x ^ +2
。 - 省略形式 当指数为1的时候,可以采用省略形式,如:
x
。
- 一般形式 由自变量x和指数组成,指数为一个带符号整数,如:
- 项
- 变量项
- 带有系数的幂函数,如:
2 * x ^ 2
、-1 * x
。 - 系数为1的时候,可以省略系数或表示为正号开头的形式,如:
x ^ 2
、+ x ^ 2
。 - 系数为-1的时候,可以表示为负号开头的形式,如:
-x ^ 2
。
- 带有系数的幂函数,如:
- 常数项 包含一个带符号整数,如:
233
。
- 变量项
- 表达式 由加法和减法运算符连接若干项组成,如:
-1 + x ^ 233 - x ^ 06
。此外,在第一项之前,可以带一个正号或者负号,如:- -1 + x ^ 233
、+ -2 + x ^ 19260817
。注意,空串不属于合法的表达式。 - 空白字符 在本次作业中,空白字符包含且仅包含
<space>
和\t
。
2.实现方案
-
输入合法判断 使用java中自带的正则表达式匹配
java.util.regex.Matcher
和java.until.regx.Pattern
进行输入的匹配。由于第一次作业字符串长度不限制长度,不能一次匹配完整个表达式(否则会出现正则爆栈),故使用了itemF
item
分别匹配第一项和后面的项:String num = "([+-]?0*[0-9]+)"; String pow = "(\\s*x\\s*" + "(\\^\\s*" + num + ")?)"; String variableWith = "(\\s*" + num + "\\s*\\*" + pow + ")"; String variableWithout = "(\\s*[+-]?\\s*" + pow + ")"; String variable = "(" + variableWith + "|" + variableWithout + ")"; String constant = "(\\s*" + num + ")"; String itemF = "(\\s*[+-]?" + "(" + variable + "|" + constant + "))"; String item = "(\\s*[+-]" + "(" + variable + "|" + constant + "))"; String polyStyle = "^" + itemF + item + "*\\s*$";//结尾也可能有空格
此处最好将
\\s
改成[\\t ]
以避免\\v
\\f
等不合法输入出现 -
输入预处理 只需要将空格删除即可
s = s.replaceAll("\\s", "");
-
建立类图 第一次作业较为简单,没有多考虑,只建立了一个Item类,是(coef,exp)的二元组,在主控类Derivative中使用了一个静态数组
Item[] poly
:用来存入Item(类图省略) -
实现思路 每匹配到一项,便将其作为Item构造器的输入,全部构造完成后,对poly进行选择排序,并且从尾到头遍历一遍,合并指数相同的项(前面的coef设为0,后面的coef等于两者之和)
3.测试及修复
- 测试思路 此次作业相对简单,测试的思路也并不复杂,只需要按照指导书对每一种不同的省略输入进行测试即可
- bug修复