第一次作业
设计思路
第一次作业很简单,项仅有系数和x的幂。
我写得相当的面向过程,只用了一个类打天下,好写是好写,就是一点也不OO。所以就没有类图了
为了处理方便,我先对非法字符进行了判断,再对所有空格进行了判断。
对每个项我使用正则表达式来匹配,如果最后匹配出来的每一段的长度的和不等于我处理后的字符串的长度,说明这个表达式不合法。为了使整体结构统一,如果整个串的开头没有+
或者-
我会添加一个+
。
即我是选择用小正则去一个一个的匹配而不是使用一个正则莽。
测试与bug
公测
不出意外,我的程序在公测阶段没有出现任何错误。
互测
不出意外,我的程序在互测阶段没有出现任何错误。
我这次(也只有这次)手动构造了一些数据,构造方式就是从简单到复杂,在中途不断把一些合法的替换为非法,比如从一个x
到x^
再到x^a
。直接对程序进行测试,并不阅读代码。
第二次作业
设计思路
第二次的作业加入了三角函数,但是不支持嵌套。
第二次我尽力写得面向对象了一点(大概吧)。
用一个Reader类来处理输入的字符串,然后在Polynomial类里面解析。项被抽象为Term类,对项的一堆操作都在这里面进行,还有幂函数类,不过没有写三角函数类(记不住为啥了)。
大致思路和第一次作业一样,不过每个类自身合并一下x
, sin(x)
,cos(x)
,然后可以推出一个求导公式。
类图
测试与bug
公测
不出意外,我的程序在公测阶段没有出现任何错误。
互测
出了意外,我的程序在互测阶段被一个两行的数据hack了,我天真的以为评测机不会放过这样的数据于是公测前懒得改了。我在hack别人的时候使用的随机数据,对拍测出来的,没有看代码,通常是格式问题,不过也有算错了的。
第三次作业
设计思路
虽然出现了表达式嵌套,但嵌套的本质仍然是一个表达式,我设计了表达式类,项类和因子类。
表达式由很多项相加组成,每个项由很多因子相乘组成。这个因子可能是个表达式,所以我在因子类里增加了表达式的引用。
在实现因子类的时候,其实我感觉用接口会OO很多,但是我直接选择了比较面向过程的写法,即用一个变量tp
来区分因子的类型。
考虑到每个表达式因子外面必须有一对括号,我选择在括号匹配的时候对表达式进行分析,从内到外一层一层的解析,最后形成了一个树的结构。但是为了区分sin(x^2)
和sin((x^2))
我把sin(x)
的小括号替换为中括号作为区分。
类图
公测
不出意外,我的程序在公测阶段没有出现任何错误。
互测
不出意外,我的程序在互测阶段没有出现任何错误。我这次并没有hack人,除了随便交了一发,所以就不谈了。
总结
虽然这三次作业都能很不OO的写出来,不过我也有尽力再尝试OO的写法,也找到了一些些感觉。
前几次重心都在判WF和测试上面了,在OO的方面投入没有那么多,不过希望以后的作业能有更好的OO体验。
在写程序过程中,我也认为应该先构造测试样例,再写程序,这样能帮助你完善程序的思路,让程序的整体更具有鲁棒性, 否则可能会发现自己的程序无法处理某种数据而导致大范围重构。