(1) 基于度量来分析本身的程序结构正则表达式
方法和类的复杂度分析图片中ev(G),iv(G),v(G),OCavg,WMC含义以下:算法
ev(G)即Essentail Complexity,用来表示一个方法的结构化程度,范围在[1,v(G)]之间,值越大则程序的结构越“病态”,其计算过程和图的“缩点”有关。数组
iv(G)即Design Complexity,用来表示一个方法和他所调用的其余方法的紧密程度,范围也在[1,v(G)]之间,值越大联系越紧密。优化
v(G)即循环复杂度,能够理解为穷尽程序流程每一条路径所须要的试验次数。spa
OCavg表明类的方法的平均循环复杂度。设计
WMC表明类的总循环复杂度。orm
第一次做业对象
类图blog
方法以及类的复杂度递归
思路分析:第一次做业中使用了四个类。Main类负责输入表达式正确性的判断,首先是利用正则匹配,直接对表达式进行判断,后来发现出现爆栈的问题,出现爆栈的缘由是由于正则的贪婪特性,以后便改成用替换的方法,先将首项替换为空字符串,再将其余项替换为空字符串,最后和空字符串比较,二者比较结果为真则输入正确;Pushtoarr类将表达式分离为项,经过ArrayList保存,再将项中系数和指数经过动态数组保存,最后进行求导并保存结果;Remove类主要是去除数的前导0,但互测时才发现这一步多余,将字符串转换为BigInteger类型不须要去除前导0;Jianhua类主要是将求导后的表达式简化,合并同类项,对指数为0,1,系数为0,1,-1的项进行优化处理。
优势:学到了正则表达式的用法,使用了四个类,虽说还未摆脱掉c语言代码风格,但经过此次做业了解并应用了对象与类。
缺点:正则表达式过长,出现bug后难以定位。类中许多方法都使用了许多if else语句,致使代码量较多。
第二次做业
类图
方法以及类的复杂度
思路分析:第二次做业使用了五个类,Main类进行输入,输出;Judgeregex类利用正则判断表达式的正确性,改进了第一次的正则写法,写出因子的正则,而后合并为项的正则,判断正确性则是与第一次做业同样;Cutterm类经过split将项与项分离;Splitfactor类将项分割成系数,x的指数,sinx的指数,cosx的指数。Derivative类进行求导,合并和优化。
优势:将项化为了x,sinx,cosx,便于之后的求导,合并,优化,对于类中的属性,只能经过get()的方法读取,封装得较好。
缺点:未能用到同窗课上介绍到的try-catch,不熟悉其用法,Derivative类中进行了求导优化化简,方法太多,代码量较多。
第三次做业
类图
方法以及类的复杂度
思路分析:这次做业写出的程序与第一次和第二次做业有了较大的区别,表达式正确性的判断并非提早处理,而是边建树边判断,运用到了五个类,Main类进行输入输出,Wrongformat类进行预处理,提早处理一些显而易见的错误,以及将空白字符给去掉,便于之后的数据处理,Expression类属性为ArrayList,储存Term对象,Term类属性为ArrayList,储存Factor对象,Factor属性为me和ArrayList,属性me区分数,x,sin,cos,表达式因子,ArrayList存储可能存在的嵌套因子(Factor对象)或者表达式(Expression对象)。将树创建后,进行求导。
优势:学会了用try-catch机制,应用递归建树。
缺点:未能进行合并优化,未能用到接口。
(2)本身程序的bug
第二次做业:互测时发现了一个bug,未能仔细阅读题目,忽略了项与项之间能够存在三个正负号的问题,
第三次做业:强测时,输入x*+x未能输出相应结果,预处理时忽略了这一状况。
互测时,输入sin(-7)未能得出正确结果,在程序中将-+也当成了因子,因此会程序错误。
(3)发现别人程序bug所采用的策略
第一次经过爆栈,空格超时,以及阅读他人正则表达式时发现了一些bug。
第二次经过阅读正则表达式(例如缺乏\t)以及表达式输出找到了bug。
第三次主要是经过设计正确的输入来找bug。
(4)Applying Creational Pattern
第三次做业创建了树的概念,若增长其余数学符号tan等,能够在原有代码上增长少许代码便可将树创建起来,但第三次做业未能实现一个求导的接口,未能描述类之间的共性行为,而且在求导时,因子与因子之间只考虑了乘法,若是增长其余的运算法则,则难以扩展,所以应该实现一个求导的接口,加强程序的可扩展性。