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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go语言中的`sync`包同步原语

通过sync包掌握Go语言的并发 并发是现代软件开发的基本方面&#xff0c;而Go&#xff08;也称为Golang&#xff09;为并发编程提供了一套强大的工具。在Go中用于管理并发的基本包之一是sync包。在本文中&#xff0c;我们将概述sync包&#xff0c;并深入探讨其最关键的同步原语…

AdaBoost 算法 入门

AdaBoost 是一种迭代算法&#xff0c;其核心思想是针对同一个训练集训练不同的分类器&#xff0c;即弱分类器&#xff0c;然后把这些弱分类器集合起来&#xff0c;构造一个更强的最终分类器。算法的适应性在于前一个基本分类器分错的样本会得到加强&#xff0c;加权后的全体样本…

第一单元总结

一、作业分析 第一次作业 与后两次作业相比&#xff0c;第一次作业非常简单&#xff0c;仅要求对由常数项和幂函数组成的多项式求导。但由于缺少面向对象编程经验&#xff0c;我在这次作业中栽了不少跟头。 &#xff08;1&#xff09;度量分析 在第一次作业中&#xff0c;我还没…

牛客16426 玩具谜题

题目描述 南有一套可爱的玩具小人&#xff0c;它们各有不同的职业。 有一天&#xff0c;这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈&#xff0c;它们有的面朝圈内&#xff0c;有的面朝圈外&#xff0c;如下图&#xff1a; 这时 singer 告诉小南一个谜…

牛客16438 回文日期

date1 input() date2 input()""" 判断是否是闰年 """ def isLeap(year):if (year%4 0 and year%100 ! 0) or (year%400 0):return 1else:return 0""" 判断是否是回文数 """ def isPalindrome(year):for i in …

Codeforces 1139F Dish Shopping 树状数组套平衡树 || 平衡树

Dish Shopping 将每个物品拆成p 和 s 再加上人排序。 然后问题就变成了&#xff0c; 对于一个线段(L - R)&#xff0c; 问有多少个(li, ri)满足 L > li && R > ri&#xff0c; 这个东西可以直接树状数组套平衡树维护。 但是这个题目有个特殊性&#xff0c;因为排…

牛客16494 生活大爆炸版石头剪刀布

题目描述 石头剪刀布是常见的猜拳游戏&#xff1a;石头胜剪刀&#xff0c;剪刀胜布&#xff0c;布胜石头。如果两个人出拳一样&#xff0c;则不分胜负。在《生活大爆炸》第二季第8集中出现了一种石头剪刀布的升级版游戏。升级版游戏在传统的石头剪刀布游戏的基础上&#xff0c;…

codeforces 1073E

题解&#xff1a; 考虑数位DP,状压出现过的数字集合S&#xff0c;f ( l , x , S , pz , lim )表示到第 l 位&#xff0c;数字为x&#xff0c; 数字集合为S &#xff0c;是否为前导0&#xff0c;是否贴上界 然后同时定义g为该状态下的数字和&#xff0c;利用 10^(l-1) * f(l , x…

时空AI技术:深度强化学习在智能城市领域应时空AI技术:深度强化学习在智能城市领域应用介绍...

来源&#xff1a;海豚数据科学实验室作者&#xff1a;京东科技 时空AI团队深度强化学习是近年来热起来的一项技术。深度强化学习的控制与决策流程必须包含状态&#xff0c;动作&#xff0c;奖励是三要素。在建模过程中&#xff0c;智能体根据环境的当前状态信息输出动作作用于环…

牛客16500 珠心算测试

题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练&#xff0c;既能够开发智力&#xff0c;又能够为日常生活带来很多便利&#xff0c;因而在很多学校得到普及。 某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成…

读书笔记007:《伤寒论》- 手少阴心经

手少阴脉起心中&#xff0c;下膈直与小肠通&#xff0c;支者还从肺系走&#xff0c;直上喉咙系目瞳。直者上肺出腋下&#xff0c;臑后肘内少海从&#xff0c;臂内后廉抵掌中&#xff0c;锐骨之端注少冲。多气少血属此经&#xff0c;是动心脾痛难任&#xff0c;渴欲饮水咽干燥&a…

牛客16585 统计单词数

题目描述 一般的文本编辑器都有查找单词的功能&#xff0c;该功能可以快速定位特定单词在文章中的位置&#xff0c;有的还能统计出特定单词在文章中出现的次数。 现在&#xff0c;请你编程实现这一功能&#xff0c;具体要求是&#xff1a;给定一个单词&#xff0c;请你输出它在…

牛客21312 神秘餐馆

题目描述 一家神秘餐馆准备开放N天&#xff0c;牛牛 和 牛妹听到这个消息后&#xff0c;准备尽可能多的一起去吃午饭 餐馆有M道菜&#xff0c;牛牛和牛妹每次来只允许点一道菜&#xff0c;如果在第i天买了第j道菜 那么第i7天也只能买第j道菜 第i天第j道菜的价格为price[i][j] …

牛客21297 手机号码

题目描述 给你一个整数n表示手机号码的位数 再给你m个字符串表示保留的号码,比如911 110 120等 问你一共有多少的手机号码不以保留号码开头 n, m map(int, input().split()) s [] for _ in range(m):s.append(input())sum pow(10, n) num 0for i in range(m):flag Falsefo…

牛客16785 Cantor表

先找到第N个数在第几行第几列&#xff0c;然后根据规律进行计算 N int(input())t 1 while N-t > 0:N N-tt 1if t%2 0:print("%d/%d"%(N,t-N1)) else:print("%d/%d"%(t-N1,N))

Echarts富文本rich及格式化工具formatter的使用

Echarts官网上说&#xff0c;ECharts&#xff0c;一个使用 JavaScript 实现的开源可视化库&#xff0c;可以流畅的运行在 PC 和移动设备上&#xff0c;兼容当前绝大部分浏览器&#xff08;IE8/9/10/11&#xff0c;Chrome&#xff0c;Firefox&#xff0c;Safari等&#xff09;&a…

国拨经费约31.48亿!科技部发布科技创新2030 —“脑科学与类脑研究”重大项目2021年度项目申报指南...

来源&#xff1a;科技部科技部关于发布科技创新 2030 —“脑科学与类脑研究”重大项目 2021年度项目申报指南的通知国科发资〔2021〕265号各省、自治区、直辖市及计划单列市科技厅&#xff08;委、局&#xff09;&#xff0c;新疆生产建设兵团科技局&#xff0c;国务院各有关部…

牛客16662 津津的储蓄计划

题目描述 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱&#xff0c;津津会预算这个月的花销&#xff0c;并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄&#xff0c;妈妈提出&#xff0c;津津可以随时把整百的钱存在她那里&#xff0c;到了年末她…

Hinton获2021迪克森科学奖:他改变了AI,改变了世界

来源&#xff1a;AI科技评论作者&#xff1a;维克多编辑&#xff1a;青暮据卡内基梅隆大学&#xff08;CMU&#xff09;官方消息&#xff0c;Geoffrey Hinton 获得了2021年的迪克森科学奖&#xff08;The Dickson Prize in Science&#xff09;。此奖项设立于1969年&#xff0c…

牛客21783 牛牛的星际旅行

题目描述 在一个遥远的星球上&#xff0c;每周有N天&#xff0c;牛牛去了这个星球旅游&#xff0c;他恰好只带了N件不同的衣服&#xff0c;编号为1到N 每一天他会穿其中的某一件衣服&#xff0c;一周之内不能穿同一件衣服两次&#xff0c;而且假如某件衣服是在第x天穿的&#x…