首页 > 技术文章 > 北航面向对象Round One

1623-1017 2019-03-27 14:35 原文

Unit1指导书传送门(提取码nfw6)

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内置了超长整数的库函数,就没有重复造轮子

推荐阅读