代码改变世界

OO第一次总结

2019-03-27 14:28  淑芬狗带  阅读(192)  评论(0编辑  收藏  举报

一、  基于度量分析程序

第一次作业

刚刚拿到这个作业,我开始简单的认为可以直接使用split方法将表达式字符串按照“+”和“-”

分割,但是后面经过细看,发现问题不这么简单,必须使用正则表达式。

  1. 1.     关于设计部分:由于这次作业的表达式每一个项只有一个系数和关于x的幂函数的乘积,写起来比较简单。

建立项对象,存储表达式所有的项包括系数,指数;使用Derivation_operation类调用Terms类线建立项数组。

这里我最开始的设计有问题,我开始将系数指数转化为整数存储,但是这样在出现超长整数时处理就比较麻烦,于是后面改进时就直接用字符串来存,在进行计算时另建方法(如:add_int())全部当作超长整数处理。

然后再调用derivate()方法进行求导处理,在Terms类中实现derivateString()方法将每个项指数系数进行更新,并返回项字符串(在系数指数为1,0时进行特殊处理简化输出)。

但是这次作业我没有进行合并同类项的优化,其实这个实现很简单,在Derivation_operation类中建立了项数组后先合并同类项(判断如果指数相等,就进行合并)再进行求导。

  1. 2.     错误处理部分

在输入字符串后,先进行初步的正确性判定,判断是否有非法输入(比如数字串之间有空格、2x、x2、xx这种比较好判断的错误),对于某些未知错误,我在使用正则表达式匹配项串时没匹配到一次就删除匹配到的串,最后如果输入合法输入字符串会成为空串,否则就报错。

  1. 3.     UML图及复杂度

 

  

 

   第二次作业

第二次作业相比第一次作业增加了三角函数,正则表达式就会比第一次作业的更加复杂。并且由于项不再只有x幂函数,于是我增加了Factors对象类,存储因子,Terms类是项类。

 

  1. 1.     设计和优化:由于这次因子只包括整数和以sin(x),cos(x),x为底数的幂函数,所以我就将项类的属性简化为系数,x的指数sin(x)的指数cos(x)的指数,这样在Derivation_operation类实现求导方法,根据求导规则,对一个项进行求导会产生几个新项,每个项对一个因子进行求导。于是项的求导过程就简化成了:复制三次该项每个项、系数和各个因子的指数的计算。这样对所有项求导之后,根据各项的因子指数进行合并同类项。然后将项转化为字符串,系数为0的项直接跳过,指数为0的因子就省略,指数为1时省略指数部分。

 

这里我要指出我的问题,我是先将所有项和因子先拆分出来然后再进行求导合并处理。这样动态数组会占用较多内存。有种改进方法就是在识别生成项和因子的同时进行项求导以及合并,这样做不会占用太多运行内存,运行时间也相差不多。

  1. 2.     UML图及复杂度

   

 

  第三次作业

          1.1.     设计和优化:这次作业与前两次都不一样,就是因为添加了一个表达式因子以及三角函数的因子嵌套。由于正则表达式不能递归匹配,而且最难处理的时多层因子嵌套,既然是嵌套括号的运用就很多,于是我就想到了利用括号匹配来识别嵌套的因子,这就是一个自动机。然后使用自顶向下的分析方法提取了各种项以及因子进行计算。

    括号匹配:读到第一个括号开始计数,计算左括号和右括号的数目,当第一次左括号右括号相等时就表明括号匹配完成(如果读到最后一个字符都没有匹配则报错)

    因子就几种类型:sin(...)[^整数]  cos(...)[^整数]  (....)  x[^整数]  整数 前三种必须依靠括号匹配识别,后面两种就比较简单了

    自顶向下是编译器的知识。

      1.2.     UML图及复杂度

 

二、分析bug

 

   第一次作业:这次bug的产生基本上都是对错误输入的情况没有考虑完全,因为比较简单逻辑不复杂,没有什么其他的问题。我在互测中由于没有什么经验,我就使用我出过问题的测试点进行测试,这样还是hack到了很多人。  

  第二次作业:在第一次的作业基础上加了三角函数,因子还可以为带符号整数。我这次的bug主要原因是优化,我想将1*x这种优化成x于是我就简单粗暴的直接删除字符串所有(+|-)1*这样的串,于是乎x^+1*x这样的就出错了,后面我修改了一下输出方法使其更合理。

  第三次作业:这次的bug还是因为优化,我的优化是循环优化:将(12)这样的因子的括号去掉,合并底相同的因子,合并除系数外所有项相同的同类项。由于开始设计指数绝对值不能超过10000,有的测试点合并因子后出现了超过10000的指数,我的程序就报错了。(x)*(x)这样的因子我合并成了(x)^2这样也会报错

后面我修改了处理指数的方法修改了第一个bug,第二个bug我直接设计成带括号的因子不合并

三、分析别人bug的方法

    先使用使用我的测试点去测他们的程序

     阅读被测者的正则表达式,发现可能出现的bug

四、Applying Creational Pattern 

 后两次次的作业我都进行过重构

第二次作业在第一次的计出上添加了Factors类用于存储多种因子,

第三次又使用继承为不同的因子创建各自的类,还建立了创建因子的类FactorConstruction,使用接口封装了公用的求导方法以及导出字符串方法