OO第一单元总结__多项式求导问题
作业一、含幂函数的简单多项式的求导
(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++):
1 if (depth > 95) { 2 System.out.println("WRONG FORMAT!"); 3 System.exit(0); 4 }
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类,进入下一轮递归调用
1 ItemMultiIply itemMultiIply = new ItemMultiIply(addList.get(i), depth + 1); 2 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
第三次作业中用到了继承,但是没有对象构建的模式,仍旧是面向过程式的想用某个项时,特殊调用某个项。借鉴了各路大神的思路,有了初步的想法。通过一个工厂函数,将当前字符串输入,返回一个对应类的对象。代码如下:
1 public static Factor factorFactory(String str) { 2 if (str.contains("sin")) { 3 return new FactorSin(str); 4 } else if (str.contains("cos")) { 5 return new FactorCos(str); 6 } else { 7 return new FactorX(str); 8 } 9 }
总结
1)面向对象的思维在三次作业中逐渐建立起来,但是代码实际上还是面向过程,有待改进。
2)对于java一些包的使用不熟练,只会用几个基本的包(BigInteger、ArrayList、StringBuilder等)。
3)优化太少,且多为面向数据的优化,很少建立优化规则。
4)手造测试数据太随便,应该进行分模块的覆盖性测试。
5)代码耦合度太高,需要解耦
6)好的构造思路远比“打补丁”高效
希望多思考,多实践,多看大佬分享的思路,OO加油啊~
转载于:https://www.cnblogs.com/Guo-mengqi/p/10598929.html
OO第一单元总结__多项式求导问题相关推荐
- OO第一单元作业总结
OO第一单元作业总结 第一次作业 结构 OO第一次作业是简单的多项式求导,在这次多项式求导中,仅包含了幂函数和带符号整数的一些简单求导运算.在经过自己的一些简单分析后,我认为第一次作业最重要的部分是判 ...
- OO第一单元总结博客
OO第一单元作业总结 本单元的三次作业内容为多项式求导.第一次作业中,表达式支持因子形式为带符号整数,以x为底数的幂函数.第二次作业中,表达式因子形式在第一次作业的基础上,支持标准三角函数(sin(x ...
- 不学无术的下场——OO第一单元总结
第一单元OO作业总结 第一次作业 第一次作业的要求是对仅有常数和幂函数的式子进行求导. 由于是第一次接触JAVA,对很多东西都还不熟悉,尤其是正则表达式做得不好.当时我的思路如下: 建立Pol ...
- oo第一单元总结~~
OO第一单元总结~~ 经历了三次oo作业的洗礼,我感觉我的IDEA已经是一个成熟的IDE了,应该学会-(划掉).总之学习面向对象编程是一个思路慢慢转变的过程,最开始的时候我觉得其本质就是封装,类的函数 ...
- 面向对象多项式求导总结
在过去的四个星期中,面向对象的作业以多项式求导为主题.通过这三次作业,我对面向对象程序设计有了一些入门的感觉,这三次作业的设计也越来越有面向对象的感觉,但是看完别人的设计后觉得自己还是有太多东西要学习 ...
- matlab对多项式求导,matlab中多项式求导
1 0.5 0 -0.5 -1 -1.5 -2 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 4.对比用多项式函数的 polyder 函数及符号函数中的 diff 函数,求导 x2+2x ...
- 多项式乘积求导 c语言,c语言实现多项式求导.docx
c语言实现多项式求导 #include #include//动态申请空间的函数的头文件typedef struct node //定义节点类型{ float coef; //多项式的系数 int ex ...
- 神奇的多项式求导矩阵与积分矩阵
线性代数是一门有趣又有用的学科.基于机器学习.深度学习等技术的人工智能的核心数学知识就包含数理统计.微积分与线性代数. 通过 求导矩阵 对多项式求导: 例: f(x)=4x2+3x+2f(x) = 4 ...
- OO第一单元总结——多项式求导
一.基于度量来分析自己的程序结构 1.第一次作业 UML类图 OO度量 这次作业我写了3个类,其中class Struct是Polynomial的内部类,这个类有2个属性:coe.index,分别代表 ...
最新文章
- 一文读懂神经网络(附解读案例)
- java中接口适配器实现,12.1.8 Java中的应用-AWT事件适配器(接口的适配器模式)...
- hadoop2.x的安装
- curl put方法 测试http_HTTP接口调试利器!4.8万Star的HTTP命令行客户端!
- exls导入数据库 php_PHP读取excel文件并导入数据库
- JQuery全选反选 随其他checkbox自动勾选全选反选
- 国产数据库发展十策(二):数据库难在研发还是难在生态?
- 互联网秒杀业务架构设计
- 【定位问题】基于matlab RSSI和模拟退火优化粒子群算法求解无线传感器网络定位问题【含Matlab源码 1766期】
- 朴素贝叶斯在文本分类中的应用之 伯努利
- Unity Shader数学基础——笛卡尔坐标,点,矢量
- Postfix权威指南阅读笔记
- 阿里云服务器能抗ddos攻击吗
- edge浏览器,无法继续下载,提示检测到病毒的问题
- 网络爬虫(一):爬虫基础原理
- 【kafka 监控】Kafka_exporter+prometheus 监控kafka数据
- 关于迅盘Turbo Memory的ReadyDrive功能被禁用的思考
- EDA原理及应用 Quartus II 13建工程 个人笔记
- idea使用svn报错-Error:Can not get current revision for file D:/IDEADire...
- 越来越多地使用 SLO 来实现可观测性
热门文章
- 在php中怎么用js跳转页面跳转,在php中怎么用redirect实现页面跳转?
- ReverseFind
- linux中sort命令实例,Linux命令之排序命令sort使用实例
- mysql命令导入导出数据库_MYSQL命令行导入导出数据库详解
- 二、uniapp项目(分段器的使用、scroll-view、视频下载、转发)
- Vue项目部署,打包发布上线
- 二、mongodb数据库系列——聚合操作 索引操作 权限管理
- LeetCode MySQL 1777. 每家商店的产品价格(行列转换)
- LeetCode 587. 安装栅栏 / LintCode 1152. 安装栅栏(凸包检测:排序+叉积正负判断+正反扫描+去重)
- 05.序列模型 W1.循环序列模型(作业:手写RNN+恐龙名字生成)