作业一、含幂函数的简单多项式的求导

(1)基于度量的程序结构分析

1. 统计信息图:

2. 结构信息图:

3. 复杂度分析

  基本复杂度(Essential Complexity (ev(G))、模块设计复杂度(Module Design Complexity (iv(G)))、Cyclomatic Complexity (v(G))圈复杂度

  OCavg为平均循环复杂度;WMC为总循环复杂度

4. 分析:

本次作业一共使用3个类,没有使用继承、接口。

Main类:

  1)程序入口

  2)主要业务逻辑层

  3)处理输入String

Polynomial类:处理多项式

  1)正则表达式判WF(大正则)

  2)简化输入String

  3)分解成单项式:

    用ArrayList<String>储存

  3)组合单项式的输出String:

    最终将ArrayList<String>转为String

  4)简化输出String

Deviation类:单项式求导

  1)求导

  2)生成输出String

(2)程序BUG分析

1. 强测中未被查出BUG,但由于-1*cos(x)未被简化成-cos(x),被扣了性能分。

输入 我的输出 原因
 -sin(x)   -1*cos(x)  在优化时只优化了+1*x-->+x,忘记了-1的情况,并且测试也不全面

2. 互测中未被查出BUG

(3)程序测试分析

1. 本次作业同学们的BUG集中在WF方面,/f,/v,+,**,末尾加空格等情况可能没有判出WF(BUG类似,不一一列举)。

2. 个人觉得一个有效解决非法字符的办法是先将正确字符从输入表达式中删除,再判断输入是否为空,不为空则WF。

3. 本次测试方法是构造各种WF的数据。


作业二、含三角函数的普通多项式的求导

(1)基于度量的程序分析

1. 统计信息图:

2. 结构信息图:

3. 复杂度分析

  基本复杂度(Essential Complexity (ev(G))、模块设计复杂度(Module Design Complexity (iv(G)))、Cyclomatic Complexity (v(G))圈复杂度

  OCavg为平均循环复杂度;WMC为总循环复杂度

4. 分析:

本次作业一共使用4个类,没有使用继承、接口。

Main类:

  1)程序入口

  2)主要业务逻辑层

InputHandler类:

  1)处理输入String

  2)少部分判WF

  3)简化输入String

Polynomial类:处理多项式

  1)大部分判WF(大正则)

  2)分解成单项式:

    用ArrayList<String>储存

  3)组合单项式的输出String:

    最终将ArrayList<String>转为String

  4)简化输出String:

    合并同类项,去0项,去1*,去-1*,找到正项做首项并去掉+, cos(x)^2+sin(x)^2 合并(任意系数的可合并项)

Monomial类:处理单项式

  1)合并同类项

    合并后形如 a*x^b*sin(x)*c*cos(x)^d

  2)求导:

    对于一个单项式,设其为a*x^b*sin(x)*c*cos(x)^d,再设其导数为A1*x^B1*sin(x)*C1*cos(x)^D1 + A2*x^B2*sin(x)*C2*cos(x)^D2 + A3*x^B3*sin(x)*C3*cos(x)^D3,通过数学运算可求出各参数值。

  3)生成输出String

(2)程序BUG分析

1.  强测中未被查出BUG,但由于只做了一部分优化,被扣了性能分。

  e.g.   sin(x)^3*cos(x)+sin(x)*cos(x)^3 可化简为--> sin(x)*cos(x) ,但是这种化简比较复杂,我为了保证正确没有实现。

2. 互测中未被查出BUG

(3)程序测试分析

   测试方法:我用之前构造的测试样例先大致测试一遍,在观察一些易考察的部分(如:正则表达式),进行针对性测试。

  本次debug情况如下:

输入 输出 原因
  sin(x) * sin(x) * cos(x) ^-2 *x  
 WRONG FORMAT!  无法识别多个三角函数连乘

作业三、支持嵌套的复杂多项式的求导

(1)基于度量的程序分析

1. 统计信息图:

2. 结构信息图:

3. 复杂度分析

  基本复杂度(Essential Complexity (ev(G))、模块设计复杂度(Module Design Complexity (iv(G)))、Cyclomatic Complexity (v(G))圈复杂度

  OCavg为平均循环复杂度;WMC为总循环复杂度

4. 分析

本次作业一共使用10个类,没有使用接口,使用了一层继承。

Main类:

  1)程序入口

  2)主要业务逻辑层

InputHandler类:

  1)处理输入String

  2)部分WF

factors包:

Factor类(父类):

  1)抽象函数derivation public abstract String derivation();

  2)FactorTri类(三角函数因子类):

    2.1)将嵌套的因子用 content 保存:

       content = string.replaceAll("^sin\\(", "").replaceAll("\\)(\\^[+\\-]?\\d+)?$", "");

    2.2)区分sin、cos private Pattern patternSin = Pattern.compile("^sin\\(");

              private Pattern patternCos = Pattern.compile("^cos\\(");

    2.3)判断WF(指数>10000)

    2.4)求导

  3)FactorX类(幂函数因子类):

    3.1)求导

items包:

CombinationItem类(父类):

  1)定义最大递归深度(将非法数据判为WF)(每调用一次depth++):

 if (depth > 95) {
System.out.println("WRONG FORMAT!");
System.exit(0);
}

  2)定义抽象函数derivation public abstract StringBuilder derivation();

  3)定义函数beakdown,将str以sign分割为List ArrayList<String> breakDown(String str, String sign) ,并判断WF

  4)ItemAdd类(加法组合项类):

    4.1) ArrayList<String> addList = breakDown(string, "+-");

    4.2)对addList每一项判断

      4.2.1)若string为表达式因子之外的因子,直接求导,以stringBuilder返回值

      4.2.2)其他情况调用itemMultiIply类,进入下一轮递归调用

 ItemMultiIply itemMultiIply = new ItemMultiIply(addList.get(i), depth + 1);
stringBuilder.append(itemMultiIply.derivation());

  5)ItemMultilply类(乘法组合项类):

    5.1) ArrayList<String> multList = super.breakDown(string, "*");

    5.2)链式求导,调用itemNesting类

  6)itemNesting类(嵌套组合项类):

    6.1)判断是否有嵌套,同时判断WF

    6.2)若有()类嵌套,调用itemAdd

    6.3)若有sin()、cos()类嵌套

      6.3.1)如果内含为表达式因子之外的因子则直接返回stringBuilder

      6.3.2)否则调用itemAdd类(用多flag参数的构造函数并设flag=1)和FactorTri类

    6.4)其他情况

       6.4.1)flag = 0则调用itemAdd

       6.4.2)flag = 1则WF

OutputHandler类:

  1)防止输出空字符串

  2)输出String

(2)程序BUG分析

1.  强测中未被查出BUG,但为了保证正确性,没有做优化,性能分为0。

2. 互测中被查出1个BUG,如下:

输入
 -(+(+1*cos(x)))*cos((x-cos(x))) 
我的输出
 -(+(((+(((+0+(-1*sin(x)*1)*1))))))*cos((x-cos(x)))+(-1*sin((x-cos(x)))*((1--1*sin(x))))*(+(+1cos(x)))) 
错误原因  我在处理连乘项的时候,用 replaceFirst("\\*", ""); 取代第一个乘号,但第一项前面没有*,所以替换了一二项间的*,导致出错
解决方案 用 replaceALL("^\\*", ""); 代替了上述代码,解决问题

  这个BUG属于考虑不全面造成的错误,测试时也未覆盖到(测试样例太少,复杂测试样例更少)。 

(3)程序测试分析

  测试方法:我用之前构造的测试样例先大致测试一遍,在观察一些易考察的部分(如:有无使用BigInteger包),进行针对性测试。

  反思:全程手动,无自动化工具,所以效率不高,希望以后能学习使用自动化测试技术。

  debug的部分情况如下:

输入 输出 原因
 13412312235423432 
  WRONG FORMAT!   没用BigInteger
  ---2 * x  
 2 ---识别为+
 - x^+4*sin(x)^7+12*x^0001+ + +12*x-123- - x+12
  WRONG FORMAT!  无法识别+ + +12
 - x^+4*sin(x)^7+12*x^0001+ + +12*x-123- - x+12
 -((7*sin(x)^6*cos(x)*(+1))*1+0)*(x^4)+sin(x)^7*1*(4*x^3)+12+12-0+1+0 
计算错误
((sin (x ^ +1) ^ +10000)) 
  WRONG FORMAT!  +10000认为>10000 
((sin (x ^ +1) ^ +10000)) 
  WRONG FORMAT!  中间tab无法识别 

((sin (x ^ +1) ^ +10000)) 
 java报错

创建了0长度的BigInteger


Applying Creational Pattern

第三次作业中用到了继承,但是没有对象构建的模式,仍旧是面向过程式的想用某个项时,特殊调用某个项。借鉴了各路大神的思路,有了初步的想法。通过一个工厂函数,将当前字符串输入,返回一个对应类的对象。代码如下:

 public static Factor factorFactory(String str) {
if (str.contains("sin")) {
return new FactorSin(str);
} else if (str.contains("cos")) {
return new FactorCos(str);
} else {
return new FactorX(str);
}
}

总结

1)面向对象的思维在三次作业中逐渐建立起来,但是代码实际上还是面向过程,有待改进。

2)对于java一些包的使用不熟练,只会用几个基本的包(BigInteger、ArrayList、StringBuilder等)。

3)优化太少,且多为面向数据的优化,很少建立优化规则。

4)手造测试数据太随便,应该进行分模块的覆盖性测试。

5)代码耦合度太高,需要解耦

6)好的构造思路远比“打补丁”高效

希望多思考,多实践,多看大佬分享的思路,OO加油啊~

OO第一单元总结__多项式求导问题的更多相关文章

  1. OO第一单元作业总结——表达式求导

    OO第一单元作业总结 第一次作业 基于度量分析代码结构 基本算法 第一次作业是简单多项式导函数求解,不需要对输入数据的合法性进行判定, 基本思想是用 (coeff, expo)表示二元组 coeff* ...

  2. OO第一单元总结(表达式求导)

    写在前边:第一次接触面向对象语言,编程思想仍然不可避免的有以前面向过程的影子.从第一次作业的完全面向过程,到第二次学会剥离各个类互不影响到第三次作业的先构思面向对象的基本程序架构再编程.虽然程序有些地 ...

  3. OO第一单元总结-多项式求导

    OO第一单元总结-多项式求导 一.第一.第二次作业总结 因为前两次作业设计复杂度差别不大,因而放在这里统一总结. 基于度量分析程序结构: 前两次作业确实存在缺乏可拓展设计的构想,基本还是面向过程的思维 ...

  4. OO第一单元(求导)单元总结

    OO第一单元(求导)单元总结 这是我们oo课程的第一个单元,也是意在让我们接触了解掌握oo思想的一个单元,这个单元的作业以求导为主题,从一开始的加减多项式求导再到最后的嵌套多项式求导,难度逐渐提高,编 ...

  5. 2020 OO 第一单元总结 表达式求导

    title: BUAA-OO 第一单元总结 date: 2020-03-19 20:53:41 tags: OO categories: 学习 OO第一单元通过三次递进式的作业让我们实现表达式求导,在 ...

  6. OO_多项式求导_单元总结

    概述: 面向对象第一单元的作业是三次难度依次递增的多项式求导.第一次作业是仅包含带符号整数和幂函数的多项式求导,例如:-1+xˆ233-xˆ06:第二次是在前面的基础上增加了三角函数的求导,例如:-1 ...

  7. 多项式求导系列——OO Unit1分析和总结

    一.摘要 本文是BUAA OO课程Unit1在课程讲授.三次作业完成.自测和互测时发现的问题,以及倾听别人的思路分享所引起个人的一些思考的总结性博客.本文第二部分介绍三次作业的设计思路,主要以类图的形 ...

  8. OO第一单元作业总结

    oo第一单元的作业是对多项式的求导.下面就是对三次作业分别进行分析. 第一次作业 分析 第一次作业相对来讲比较简单,甚至不用面向对象的思想都能十分轻松的完成(实际上自己就没有使用),包含的内容只有常数 ...

  9. OO第一单元总结

    OO第一单元作业总结 一.前言 开学四周,不知不觉已经做了三次OO作业.事实上,每一次作业对我来说都是很大的挑战,需要花费大量的时间和精力来学习. 虽然学得很艰苦,但最后还是连滚带爬地完成了.(好惨一 ...

随机推荐

  1. 【codeforces 805D】Minimum number of steps

    [题目链接]:http://codeforces.com/contest/805/problem/D [题意] 给你一个字符串; 里面只包括a和b; 让你把里面的"ab"子串全都去 ...

  2. Jquery Math ceil()、floor()、round()比较与用法

    Math.ceil():向上取值 如:Math.ceil(2.1) --  结果为  3 Math.ceil(-2.1)  -- 结果为-2 结论:正入 负舍 Math.floor(): 先下取值 入 ...

  3. [Design]Adobe CS6 2%错误问题

    错误描述:FATAL: Payload '{3F023875-4A52-4605-9DB6-A88D4A813E8D} Camera Profiles Installer 6.0.98.0' info ...

  4. APP为什么签名,使用keytool jarsigner进行签名

    签名(sign):在应用程序的特定字段写入特定的标记信息,表示该软件已经通过了签署者的审核.过程:使用私有密钥数字地签署一个给定的应用程序 作用: 识别应用程序作者 检測应用程序是否发生改变 有种程序 ...

  5. Ubuntu12.04 下 GTK3.xx 的安装、编译和測试

    用此方法成功在UBUNTU 12.04下安装GTK 3.xxx. 一.安装 1.安装gcc/g++/gdb/make 等基本编程工具 $sudo apt-get install build-essen ...

  6. Yarn架构基本概况(二)

    在概况(一)中,主要简单的对Yarn的情况作了简单的介绍,今天花一定时间在某些详细的模块上呈现下面Yarn的总体情况.帮助大家更好的理解Yarn. 1)ResourceManager 在Yarn的总体 ...

  7. mysql基础综述(四)

    1.数据库的简单介绍 1.1 数据库,就是一个文件系统,使用标准sql对数据库进行操作 1.2 常见的数据库 oracle  是oracle公司的数据库,是一个收费的大型的数据库 DB2,是IBM公司 ...

  8. hdu3966_树链剖分

    近期在强化知识点深度.发现树链剖分不是非常会写了. 回想一下改动操作: 若两个点在同一条链上,则直接改动这段区间. 若不在同一条链上,改动深度较大的点到其链顶端的区间,同一时候将这个点变为他所在链顶端 ...

  9. [Android 性能优化系列]内存之基础篇--Android怎样管理内存

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...

  10. 0x18 总结与练习

    这一章不太满意啊.. 还是有点痛苦,但就是做的挺慢啊... 1.就是例题 2.括号画家 感觉这种提高组类型的细节题都没什么信心啊,fail了几次才A #include<cstdio> #i ...