buaaoo第一次博客

经历了四周的oo课程学习,对本单元进行一个总结。

因为前两次的作业对类的划分提醒的都很明确,所以在总体设计上并没有遇到太大的困难,不过由于自身把握的不到位,老是想着一个类的目的,所以导致一个类里面的属性和方法都很单一,类之间的交互也极其少,说直接点就是更像是写得一个应用了正则表达式的过程式程序,看不出什么面向对象的思想。

前两次的设计思路

前两次的作业是相对简单的,因为可以将其转化成一般的范式进行过程式处理。函数中出现的因子只有三种类型:sin(x),cos(x),x;出现的项也只有四种:*[+-]k,*sin(x)^b,*cos(x)^c,*x^a;所以我只需要统计这四种形式的函数最终的指数,化简成x^a*sin(x)^b*cos(x)^c这种形式,输出要是不考虑化简的话甚至可以一步得出(a * x ^ (a - 1) * sin(x) ^ b + x ^ a * b * cos(x) * sin(x) ^ (b - 1)) * cos(x) ^ c - sin(x) ^ (b + 1) * x ^ a * c * cos(x) ^ (c - 1)这种统一的形式,这样一看好像第二次作业考虑化简的问题可以说需要做的只有判断正则形式+统计各个函数的次数+合并相同指数的项。其表达式如下:

而第三次作业因为耽误了时间没有做出来:不过它是不同于以往两次的作业,需要去构造各种因子的类并且采用递归向下分析方式来处理一个表达式。一开始的思路来源是:借鉴编译中递归下降子程序法思路的表达式提取实现方法。

针对正则表达式很难切分出项的问题,采用建立表达式树的方式来存储并求导。

对象建立的思路来自指导书的提示。建立一个统一的类来存储规则以及函数,扩展一个规则类以及扩展得到的三个规则,扩展一个函数类并扩展得到三个函数。

首先按照题目要求把所有能够识别的格式写成文法的形式:

例如:表达式 由加法和减法运算符等若干项组成

<表达式>:=(+|-)<项>[+|-]<表达式>|<项>

然后对每一个尖括号内的东西写一个子程序,返回识别后的(树)

例如:(伪代码)

   exp expression(){
        flag();
        t1 = term();
        while(flag()){
          t2 =  term();
          ans = setTree(t1,t2);
          t1 = ans;
        }
      return ans;
    }

对不在尖括号内的进行正则表达式识别,若没有出现则报错。

这种模式的优点是很适合数据结构是树的表达式的提取,并且逻辑十分顺畅。

缺点是不能进行模块的测试,必须全部写完才能进行测试,并且十分不容易进行性能的优化。

注意程序要严格按照文法要求来进行编写。

bug相关

 前两次作业几乎没有遇到什么bug,最大的bug的话大概就是来自于数据的溢出。还有一些语法上允许,但是自己疏忽的一些bug。

猜你喜欢

转载自www.cnblogs.com/yzg312/p/10586549.html