第一次作业:
总览: 第一次作业只需要计算多项式的导数, 现在回想起来是很友善的了.但是当时我对正则表达式没什么了解,看了一整天还是写不出来.所以最后用的有限状态机判别的WRONG FORMAT. 而且第一周基本上不会面向对象的思想, 完全是面向过程写的, 我把格式判断放在了main里面, 然后用一个类用来求导,整体写的非常面向过程. 这也导致我第二次作业需要重构.
类图:
复杂度:
公测: 第一次作业公测部分没有发现问题。
互测:第一次作业互测是我被查出来的bug都是与WRONG FORMAT相关的。当时我状态机写得有问题,无法处理以符号结尾的输入。在bug修复阶段,我改为用正则表达式判断输入是否合法,把这些bug都当作同质bug处理了。第一次作业我在de别人bug的时候主要是通读代码然后面向正则表达式或者输出找到bug然后创建数据。
优化:第一次作业我礼拜日才开始时间不够了所以我的优化只做了合并同类项的优化,没有处理多出来的符号。所以性能分比较低。后来才发现可以用Hashmap简单的完成优化,并且需要调整输出使第一项是正的。
总结:其实第一次作业我觉得收获最大的部分是在互测得时候读别人的代码。看到了别人是怎么用正则表达式的,怎么面向对象设置不同的类还有怎么用Hashmap合并同类项对我第二次作业重构代码有很大的启发。
第二次作业
纵揽:第二次作业重构了代码,完全从零开始。尽量吸取第一次作业的教训,希望写出可以重复利用的代码。我设计了三个因子类(单项式:x^4,三角函数sin(x)^2,常数-3),后来觉得其实 可以把常数和单项式合并成一类;一个项类(所有项都可以写成常数*单项式*三角函数)的形式;一个式子类(所有式子都可以写成项+……+项的形式)。但是由于当时还不会继承多态,所以并没意识到因子类们都可以从一个共同的父类继承。而且由于自己面向对象的还没有建立好,所以非常面向过程的设计了一个求导类完成所有的求导运算,后来发现可以在每一个类中写对应的求导方法。
类图:
复杂度
Complexity metrics |
星期日 |
24 三月 2019 21:29:30 CST |
||
Method |
ev(G) |
iv(G) |
v(G) |
|
homeworktwo.Cal.Diffcos(BigInteger) |
3 |
2 |
3 |
|
homeworktwo.Cal.Diffpoly(BigInteger) |
3 |
2 |
3 |
|
homeworktwo.Cal.Diffsin(BigInteger) |
3 |
2 |
3 |
|
homeworktwo.Cal.QuiDao(Xiang) |
4 |
3 |
4 |
|
homeworktwo.Input.fromkey() |
2 |
2 |
2 |
|
homeworktwo.Main.main(String[]) |
1 |
1 |
1 |
|
homeworktwo.Number.Calnum(String) |
1 |
2 |
2 |
|
homeworktwo.Number.Getnum() |
1 |
1 |
1 |
|
homeworktwo.Number.isnum(String) |
1 |
2 |
2 |
|
homeworktwo.Output.print(ArrayList<Xiang>) |
2 |
6 |
6 |
|
homeworktwo.Output.put(Xiang) |
1 |
1 |
1 |
|
homeworktwo.Poly.Calci(String) |
1 |
2 |
2 |
|
homeworktwo.Poly.Getci() |
1 |
1 |
1 |
|
homeworktwo.Poly.isPoly(String) |
1 |
2 |
2 |
|
homeworktwo.Sentence.Cal(String) |
1 |
3 |
3 |
|
homeworktwo.Sentence.QuiDao() |
1 |
2 |
2 |
|
homeworktwo.Sentence.getxiang() |
1 |
1 |
1 |
|
homeworktwo.Sentence.islegal(String) |
1 |
5 |
6 |
|
homeworktwo.Sentence.merge() |
1 |
19 |
19 |
|
homeworktwo.Sentence.mergefirst() |
1 |
8 |
8 |
|
homeworktwo.Sentence.standrize(String) |
1 |
1 |
1 |
|
homeworktwo.Sin.Calci(String) |
1 |
2 |
2 |
|
homeworktwo.Sin.Caltype(String) |
1 |
1 |
2 |
|
homeworktwo.Sin.Getci() |
1 |
1 |
1 |
|
homeworktwo.Sin.Gettype() |
1 |
1 |
1 |
|
homeworktwo.Sin.issin(String) |
1 |
2 |
2 |
|
homeworktwo.Xiang.Getcosci() |
1 |
1 |
1 |
|
homeworktwo.Xiang.Getnumber() |
1 |
1 |
1 |
|
homeworktwo.Xiang.Getpolyci() |
1 |
1 |
1 |
|
homeworktwo.Xiang.Getsinci() |
1 |
1 |
1 |
|
homeworktwo.Xiang.cal(String) |
1 |
11 |
11 |
|
homeworktwo.Xiang.changcosci(BigInteger) |
1 |
1 |
1 |
|
homeworktwo.Xiang.changnumber(BigInteger) |
1 |
1 |
1 |
|
homeworktwo.Xiang.changpolyci(BigInteger) |
1 |
1 |
1 |
|
homeworktwo.Xiang.changsinci(BigInteger) |
1 |
1 |
1 |
|
homeworktwo.Xiang.isXiang(String) |
1 |
3 |
3 |
|
homeworktwo.Xiang.mergenum() |
1 |
2 |
2 |
|
homeworktwo.Xiang.mergepoly() |
1 |
2 |
2 |
|
homeworktwo.Xiang.mergesin() |
1 |
3 |
3 |
|
Class |
OCavg |
WMC |
||
homeworktwo.Cal |
3.25 |
13 |
||
homeworktwo.Input |
2 |
2 |
||
homeworktwo.Main |
1 |
1 |
||
homeworktwo.Number |
1.67 |
5 |
||
homeworktwo.Output |
3 |
6 |
||
homeworktwo.Poly |
1.67 |
5 |
||
homeworktwo.Sentence |
4.29 |
30 |
||
homeworktwo.Sin |
1.6 |
8 |
||
homeworktwo.Xiang |
1.92 |
25 |
||
Package |
v(G)avg |
v(G)tot |
||
homeworktwo |
2.82 |
110 |
||
Module |
v(G)avg |
v(G)tot |
||
homework2 |
2.82 |
110 |
||
Project |
v(G)avg |
v(G)tot |
||
project |
2.82 |
110 |
公测:优化翻车了所以公测错了四个点,都是同质bug。我输出时候事先写一个每一项都形如a*x^b*sin(x)^c*cos(x)^d(a,b,c,d均为常数)的字符串,然后用replaceAll替换掉其中可以缩短的部分。但是在这一部分我考虑的不全,使得输出中有很多bug,比如*11的时候我会把*1去掉……
互测:被砍了13刀,都是输出的问题,估计大部分是误伤。在bug修复环节选择放弃输出上的优化,直接输出就把它们都改掉了。第二次给别人debug就没太看代码了,因为会花费很多时间。我一般会手动创建一个数据然后把它复制给好几个人,然后比对他们的求道结果。由于第二次作业大家都做了优化,所以这还比较简单。然后如果结果都一样我就会把求导的答案复制下来再次求导,直到有人出错。这样一般求4~5次导就能挑出来bug,但是后来我发现这样找出来来的bug会有大量同质bug,需要人工判断。
优化:因为第一次没有优化扣了很多性能分,所以第二次作了一些能想到的优化。首先在求导这些先把每一项都整理成a*x^b*sin(x)^c*cos(x)^d(a,b,c,d均为常数)的形式,然后求导。求导以后合并同类项,并依据sin(x)^2+cos(x)^2=1或1-cos(x)^2=sin(x)^2或 1-sin(x)^2=cos(x)^2整理。然后输出的时候按上面提到的方式优化输出(翻车了)。
总结:第二次作业真的花了很多时间重构代码,并且尝试用面向对象的方式完成它。感觉自己稍微有点理解面向对象的意义了。
第三次作业
纵览:第三次作业我基本是在第二次作业的基础上完成的。主要就是设计了因子类作为之前数字,单项式,三角函数类的父类,并且为因子类增加了,表达式类,一维表达式类(只有前三类组成的表达式),和复杂三角函数类。并且为上述类都增加了求导方法。在求导的时候选择用表达式类和复杂三角函数类递归求导,将遇到一维表达式作为递归终止的条件。其实感觉结构上有点乱,而且只用到继承但是并没有用到接口(主要是当时客商没太弄懂接口的语法)。而且没有做优化。而且第三次作业直接在第二次作业的文件里面写的名字都没有改,许多第二次作业中写的不用了的类也没有删除。
类图:
复杂度:
Complexity metrics |
星期日 |
24 三月 2019 21:08:29 CST |
|
Method |
ev(G) |
iv(G) |
v(G) |
homeworktwo.Biaodashi.QiuDao(String) |
2 |
5 |
5 |
homeworktwo.Biaodashi.standrize(String) |
1 |
1 |
1 |
homeworktwo.Biaodashiyz.QiuDao(String) |
1 |
7 |
9 |
homeworktwo.Biaodashiyz.standrize(String) |
1 |
1 |
1 |
homeworktwo.Cal.Diffcos(BigInteger) |
3 |
2 |
3 |
homeworktwo.Cal.Diffpoly(BigInteger) |
3 |
2 |
3 |
homeworktwo.Cal.Diffsin(BigInteger) |
3 |
2 |
3 |
homeworktwo.Cal.QuiDao(Xiang) |
4 |
3 |
4 |
homeworktwo.Input.fromkey() |
2 |
2 |
2 |
homeworktwo.Main.main(String[]) |
1 |
1 |
1 |
homeworktwo.Number.Calnum(String) |
1 |
2 |
2 |
homeworktwo.Number.Getnum() |
1 |
1 |
1 |
homeworktwo.Number.QiuDao(String) |
1 |
1 |
1 |
homeworktwo.Number.isnum(String) |
1 |
2 |
2 |
homeworktwo.Output.print(String) |
1 |
4 |
4 |
homeworktwo.Poly.QiuDao(String) |
1 |
1 |
1 |
homeworktwo.Poly.isPoly(String) |
1 |
2 |
2 |
homeworktwo.Sentence.Cal(String) |
4 |
6 |
7 |
homeworktwo.Sentence.getxiang() |
1 |
1 |
1 |
homeworktwo.Sentence.islegal(String) |
2 |
9 |
11 |
homeworktwo.Sentence.standrize(String) |
6 |
10 |
10 |
homeworktwo.Sin.Caltype(String) |
1 |
1 |
2 |
homeworktwo.Sin.Gettype() |
1 |
1 |
1 |
homeworktwo.Sin.QiuDao(String) |
2 |
2 |
2 |
homeworktwo.Sin.issin(String) |
1 |
2 |
2 |
homeworktwo.Sincomp.QiuDao(String) |
5 |
5 |
6 |
homeworktwo.Xiang.Getcosci() |
1 |
1 |
1 |
homeworktwo.Xiang.Getnumber() |
1 |
1 |
1 |
homeworktwo.Xiang.Getpolyci() |
1 |
1 |
1 |
homeworktwo.Xiang.Getsinci() |
1 |
1 |
1 |
homeworktwo.Xiang.QiuDao(String) |
4 |
19 |
21 |
homeworktwo.Xiang.cal(String) |
1 |
11 |
11 |
homeworktwo.Xiang.changcosci(BigInteger) |
1 |
1 |
1 |
homeworktwo.Xiang.changnumber(BigInteger) |
1 |
1 |
1 |
homeworktwo.Xiang.changpolyci(BigInteger) |
1 |
1 |
1 |
homeworktwo.Xiang.changsinci(BigInteger) |
1 |
1 |
1 |
homeworktwo.Xiang.isXiang(String) |
1 |
3 |
3 |
homeworktwo.Yinzi.Calci(String) |
1 |
3 |
3 |
homeworktwo.Yinzi.Getci() |
1 |
1 |
1 |
homeworktwo.Yinzi.Getyz() |
1 |
1 |
1 |
homeworktwo.Yinzi.setyz(String) |
1 |
1 |
1 |
Class |
OCavg |
WMC |
|
homeworktwo.Biaodashi |
2 |
4 |
|
homeworktwo.Biaodashiyz |
4.5 |
9 |
|
homeworktwo.Cal |
3.25 |
13 |
|
homeworktwo.Input |
2 |
2 |
|
homeworktwo.Main |
1 |
1 |
|
homeworktwo.Number |
1.5 |
6 |
|
homeworktwo.Output |
3 |
3 |
|
homeworktwo.Poly |
1.5 |
3 |
|
homeworktwo.Sentence |
6.5 |
26 |
|
homeworktwo.Sin |
1.75 |
7 |
|
homeworktwo.Sincomp |
5 |
5 |
|
homeworktwo.Xiang |
3.27 |
36 |
|
homeworktwo.Yinzi |
1.5 |
6 |
|
Package |
v(G)avg |
v(G)tot |
|
homeworktwo |
3.32 |
136 |
|
Module |
v(G)avg |
v(G)tot |
|
homeworktwo |
3.32 |
136 |
|
Project |
v(G)avg |
v(G)tot |
|
project |
3.32 |
136 |
公测:中测部分第四点和最后一点一直过不了,极其崩溃,改了好几个bug都过不了,用完了所有免费提交的次数。但是因为实在没有时间等别人告诉我是什么bug,所以就自己一直尝试,终于在交了11次以后AC了。强测部分,除了一个括号匹配的问题,在某种特定的输入的时候会数组越界。
互测:这次的格式处理的不好,在算式以数字开头的时候会输出WRONG FORMAT,被刀了12刀。但是这次互测后期好像就不让刀WRONG FORMAT了,所以被刀的不多,反正都是同质bug也没什么伤害。第三次互测的输出结果太难判断正误了,我就一开始找了两个WRONG FORMAT的错误,后来不让交了以后就没有de了。
优化:第三次作业那个礼拜在忙别的事情,顺便吸取第二次作业优化翻车的教训所以就没有优化。礼拜一中午AC以后就没再弄了。
总结:其实第三次作业收获不是很大,因为那一周实在有别的事情,没有来得及做优化,代码的结构设计的不大好(当时想着反正是这个系列的最后一次了),AC后就没再改过。其实这个礼拜博客作业完成以后如果有时间我还是想尝试改一下结构,练习一下接口的使用。